1.2.10
yacron2 now parses cron expressions itself. This release retires the
third-party crontab (parse-crontab) library in favor of a small,
stdlib-only engine that lives in the tree -- so the scheduler owns the one
piece of syntax every job depends on, the dialect is documented and tested
where it is implemented, and the install carries one dependency fewer.
Compatibility is not aspirational: it is pinned by golden vectors recorded
from the old library across 180+ expressions and fixed instants (DST
transitions, leap days, month/year boundaries, the year cap, ambiguous
fall-back folds). Nothing changes for existing configs -- the dialect, the
timezone model, and the strictly-future fire semantics are all preserved
vector-by-vector.
-
yacron2/cronexpr.py: the built-in cron engine. A newCronTabclass
parses the crontab dialect yacron2 has always accepted (5/6/7 fields,
ranges, steps including bare-start5/15, lists, case-insensitive
jan/monnames,0-7weekdays with6-0wrap,L-last-day and
L5-last-Friday forms,@-nicknames) and answers the scheduler's two
questions:next()(strictly future, DST-correct across UTC-offset
changes, capped at the 2099 horizon so dead schedules drop from the index)
andtest(). A stdlib-only leaf module --calendaranddatetime, no
third-party imports. -
The
crontabdependency is dropped. Removed frompyproject.tomland
every import site (config.py,cron.py,crontabs.py,dagrun.py,
prometheus.py); classic crontab-file loading and YAMLschedulestrings
now share the same in-house engine, so both formats still accept identical
expressions. -
Golden-vector compatibility harness.
tests/gen_cron_golden.py
recordsnext()/test()answers from the original parse-crontab library
intotests/data/cron_golden.json;tests/test_cronexpr.pyreplays them
against the new engine so any behavioral drift fails the suite. This is
the proof that "behavior-compatible" is a fact, not a hope. -
mergedictsreimplemented. The config defaults-merge helper is
rewritten with the identical semantics -- dicts merge recursively, an empty
YAML section (None) never wipes a populated default,environmentand
secretslists merge by key/name, sentryfingerprintreplaces rather
than appends, and all other lists concatenate -- and now returns adict
directly, retiring thedict(mergedicts(...))wrappers at every call site. -
Dashboard accessibility pass. The web UI gains an interface font
toggle (the terminal monospace, or a proportional sans "reader mode" for
easier reading, with logs and cron strings kept monospace either way),
app-level color-vision palettes (deutan / tritan status-color remaps,
status glyphs always distinct too), whole-UI zoom, and a
reduce-motion switch, each reachable from Settings and the command
palette and persisted across sessions. -
Docs. The "Schedules and Timezones" wiki page now documents the full
dialect the engine owns -- the day-of-month-AND-day-of-week rule (Friday
the 13th, deliberately kept over Vixie's OR), theLforms, the
1970-2099 year horizon -- and Installation, Migration-from-yacron,
Classic-Crontabs, Architecture-and-Internals, and the README are updated to
point at the built-in engine instead of the removed library.
Full Changelog: 1.2.9...1.2.10