Releases: JeremyL691/freshcal
Releases · JeremyL691/freshcal
Release list
FreshCal 0.1.3
First release on PyPI: pip install "freshcal[duckdb]". No change to verdicts, messages or
exit codes.
Changed
- Releases are published to PyPI from GitHub Actions with trusted publishing (no stored
token); the same workflow creates the GitHub Release. - The README installs from PyPI first, and its links are absolute so they also work on the
PyPI project page; the documentation test checks those links against the repository. - The configuration schema's error mapping is a table of per-keyword handlers instead of
one long function; every issue code and message is unchanged. - Code comments describe their reasons in plain language instead of internal references.
FreshCal 0.1.2
First public release on GitHub. Second audit: nine confirmed findings are fixed, each with
a regression test, including a cron form that could report a missed release as ON_TIME
and a diagnostic that echoed a database password.
Fixed
- A cron expression with a restricted day-of-month and an nth-weekday day-of-week
(0 9 1 * 1#1) dropped the day-of-month branch and could report a missed release as
ON_TIME. Both fields are now the standard OR alternatives: the two branches are merged,
an occurrence both name is emitted once, and a branch that can never fire no longer fails
the schedule. - An invalid structured
name(a list or mapping, including a YAML alias graph) was
stringified into the source ID and produced a multi-megabyte report; such an entry is now
namedsources[index]and valid identifiers are untouched. - A DSN pasted into
dsn_envwas echoed by theE106diagnostic, userinfo and password
included. The message now carries the field location and the environment-variable-name
hint only — never the value. - A closed stdout pipe (
freshcal … | head) raisedBrokenPipeErrorduring interpreter
shutdown, replacing the report's exit code with 120; the report's own code now survives
. - A malformed explicit YAML tag (
version: !!int nope) escaped asE599/exit 3; it is now
E100naming the tag, a bounded value and the line and column. - A duration with a 5000-digit component hit CPython's digit limit and aborted the run;
it is now a per-sourceE203and the other sources are still evaluated. - An embedded NUL in
connection.path,dbt.manifest, the config path or an override path
escaped asE599; each boundary now reportsE106,E302,E110orE404with the
reason and a control-character-safe rendering. - An embedded NUL in a path is reported as
embedded null byteon every supported
Python; Python 3.13 and later word the underlying error differently, which leaked into
the diagnostic. - The check that decides whether a DST transition is near a search window now also
samples the window's midpoint. Linux tzdata keeps pre-1970 history in which a zone
changes its offset twice within four days and returns to the old one (Africa/Freetown,
1939); sampling only both ends could miss such a pair.
Changed
- CI runs on GitHub Actions (Ubuntu 24.04, Python 3.11-3.14); the performance budgets
run in their own step without coverage instrumentation. - The full 10 000-case differential campaign runs in a dedicated CI job instead of being
excluded by the default marker selection, and a guard test proves the workflow's own
command selects it. - The differential comparator evaluates the implementation and the independent oracle
separately for every operation, so a one-sided failure is reported instead of being read
as agreement, and the oracle matches the nth-weekday grammar with its own field matching
.
Documentation
- The README is rewritten for first-time users (install from GitHub, badges, status), the
documentation and the architecture decision records no longer refer to internal
development files, anddocs/adr/README.mdindexes the decisions. - The reporters' drift guards compare against frozen copies of the specified schemas and
example reports intests/fixtures/spec/.
Packaging
- Not published to PyPI: install from the
v0.1.2tag or the release assets on GitHub.
Package metadata gains the project URLs.
Install (not on PyPI):
uv tool install "freshcal[duckdb] @ git+https://github.com/JeremyL691/freshcal@v0.1.2"