From a8d84d57b7f3b43fdc0460eb252da45c76ab2baa Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Sat, 31 Oct 2026 11:42:24 +0100 Subject: feat: an optional allow_archive field on a tagging rule Both readers learn it together, as the rule format requires. No version bump: the field is optional, and each writer emits it only on a rule that removes inbox, so a file without one saves unchanged. Co-Authored-By: Claude Opus 5.5 --- assets/hooks/mailrules.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'assets/hooks/mailrules.py') diff --git a/assets/hooks/mailrules.py b/assets/hooks/mailrules.py index dbb80a5..fbd615b 100755 --- a/assets/hooks/mailrules.py +++ b/assets/hooks/mailrules.py @@ -41,7 +41,8 @@ DEFAULT_STAGE = 50 # Fields this version understands. Anything else in a rule object is kept in # `unknown` and written back untouched, which is what makes the file neutral # rather than this tool's file that another program may read. -KNOWN_KEYS = {"id", "stage", "enabled", "add", "remove", "query", "note"} +KNOWN_KEYS = {"id", "stage", "enabled", "add", "remove", "query", "note", + "allow_archive"} # An id is a handle, not a display name: a UI selects on it and a diff tracks # it. Tags may contain '/' and may be renamed; ids may not. @@ -57,6 +58,7 @@ class Rule: stage: int = DEFAULT_STAGE enabled: bool = True note: str = "" + allow_archive: bool = False unknown: dict = field(default_factory=dict) @@ -194,6 +196,10 @@ def _rule_to_dict(rule): "query": rule.query, "note": rule.note, } + # Written only where it does something, matching src/tagrules.cpp, so a + # file without an archiving rule round-trips unchanged (item 213). + if rule.allow_archive and "inbox" in rule.remove: + out["allow_archive"] = True out.update(rule.unknown) return out @@ -257,5 +263,6 @@ def _parse_rule(obj, index, seen, warnings): stage=stage, enabled=bool(obj.get("enabled", True)), note=obj.get("note", "") if isinstance(obj.get("note", ""), str) else "", + allow_archive=obj.get("allow_archive") is True, unknown={k: v for k, v in obj.items() if k not in KNOWN_KEYS}, ) -- cgit v1.2.3