Skip to content

Releases: JeremyL691/freshcal

FreshCal 0.1.3

Choose a tag to compare

@github-actions github-actions released this 01 Oct 00:08

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

Choose a tag to compare

@JeremyL691 JeremyL691 released this 30 Sep 22:19

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
    named sources[index] and valid identifiers are untouched.
  • A DSN pasted into dsn_env was echoed by the E106 diagnostic, 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) raised BrokenPipeError during 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 as E599/exit 3; it is now
    E100 naming 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-source E203 and the other sources are still evaluated.
  • An embedded NUL in connection.path, dbt.manifest, the config path or an override path
    escaped as E599; each boundary now reports E106, E302, E110 or E404 with the
    reason and a control-character-safe rendering.
  • An embedded NUL in a path is reported as embedded null byte on 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, and docs/adr/README.md indexes the decisions.
  • The reporters' drift guards compare against frozen copies of the specified schemas and
    example reports in tests/fixtures/spec/.

Packaging

  • Not published to PyPI: install from the v0.1.2 tag 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"