<feed xmlns='http://www.w3.org/2005/Atom'>
<title>chime/tests/test-chime-declined-events-predicate.el, branch main</title>
<subtitle>Emacs chimes, notifications, and modeline reminders so you don't miss events
</subtitle>
<id>https://git.cjennings.net/chime/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/chime/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/'/>
<updated>2026-05-05T17:39:55+00:00</updated>
<entry>
<title>refactor!: collapse six filter defcustoms into include/exclude alists</title>
<updated>2026-05-05T17:39:55+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T17:39:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=3019a33d391912120a78cad43a49eb34c4a1d044'/>
<id>urn:sha1:3019a33d391912120a78cad43a49eb34c4a1d044</id>
<content type='text'>
Six per-axis filter variables (keyword/tags/predicate × whitelist/blacklist)
were carrying parallel structure for what's really one decision: include
events that look like X, exclude events that look like Y. I merged them
into two alists, `chime-include-filters' and `chime-exclude-filters', each
keyed by axis (`keywords', `tags', `predicates').

Default for `chime-exclude-filters' keeps the same out-of-the-box
behavior — done items and declined Google Calendar invites stay
filtered:

  ((predicates . (chime-done-keywords-predicate
                  chime-declined-events-predicate)))

Implementation: one shared `chime--filter-predicates' helper that walks
the alist and emits a marker-taking predicate per non-empty axis. The
public callers — now `chime--apply-include-filters' and
`chime--apply-exclude-filters' — wrap that helper with
`-orfn'-then-`-filter' and `-orfn'-then-`-remove' respectively. The
async-environment regex injection list shrank from six names to two,
and the debug config dump in chime-debug.el follows.

The terminology shift (whitelist/blacklist → include/exclude) drops
loaded language for descriptive intent. The internal helpers and the
public function names all moved together.

Tests: 700-ish lines across five test files (test-chime-apply-whitelist,
test-chime-apply-blacklist, test-chime-whitelist-blacklist-conflicts,
test-chime-environment-regex, test-chime-declined-events-predicate)
were rewritten to bind the new alists. The dedup-conflict tests still
exercise the same precedence rule (exclude wins on overlap). README's
filtering section was rewritten end-to-end with new examples.

Migration:
  (setq chime-keyword-whitelist '("TODO"))
  ;; -&gt;
  (setq chime-include-filters '((keywords . ("TODO"))))

  (setq chime-predicate-blacklist '(my-pred))
  ;; -&gt;
  (setq chime-exclude-filters '((predicates . (my-pred))))

This brings the consolidation pass to 37 -&gt; 29 defcustoms, the target
from .ai/settings-consolidation.org.
</content>
</entry>
<entry>
<title>fix: skip declined events in tooltip, modeline, and notifications</title>
<updated>2026-05-05T10:15:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:15:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e4a254453dedacafcca883a3b20302762c872280'/>
<id>urn:sha1:e4a254453dedacafcca883a3b20302762c872280</id>
<content type='text'>
org-gcal writes `:STATUS: declined' on calendar entries the user has declined,
and chime was happily showing them in the tooltip, modeline, and notification
stream — which defeats the whole point of declining a meeting.

I added `chime-declined-events-predicate', mirroring the shape of
`chime-done-keywords-predicate', and put it on the default
`chime-predicate-blacklist'. The match is on the literal lowercase value
because that's what real org-gcal exports use; uppercase or other values pass
through. Users who want declined events back can pop the predicate off the
blacklist.

Tests cover all four STATUS values seen in real org-gcal data (accepted,
declined, needs-action, tentative), plus the no-property, empty-property,
todo-keyword-still-attached, gibberish-value, case-sensitivity, and
default-blacklist-membership cases.
</content>
</entry>
</feed>
