Repository navigation
A finished CLI.
Installable from a package, running on Windows, macOS and Linux, on low-end and high-end hardware alike.
pip install tango-anki
tango install-model fr
tango run <video-id> --deck "French" --language frThe promise this release makes
docs/COMPATIBILITY.md is in force from here. The notetype, the twelve commands and their options, the exit codes, the configuration keys, the on-disk schemas and the output filename cannot change without a 2.0.0. It is not prose: tests/test_compatibility.py reads that document and checks it against the running code in both directions, so a command that ships without being frozen fails the build as loudly as a promise that is broken.
Section 8 of the same document says how a frozen thing changes when it has to: deprecate with a named replacement, wait at least one minor release, remove only in a major. Two things never get that path, and both are stated: a security fix, and something that never worked.
One addition, argued
Shell completion, --install-completion and --show-completion. This release forbids new features and this is the exception. Typer supplies them for nothing, they sat switched off with no comment and no recorded reason, and a twelve-command CLI that cannot complete its own subcommand names is not a finished one. They are frozen in the compatibility document like everything else, so it is the last.
Two fixes
- The declared Python floor was tested on one platform of three. CI ran 3.10, 3.11 and 3.12 on Linux but only 3.12 on macOS and Windows, so the minimum this project promises went unchecked on two thirds of the platforms it promises it for. Both now run the floor.
- Nothing checked the options on the top-level command. The compatibility test covered four subcommands and skipped
tangoitself, so enabling completion put two options into the public surface and every test still passed. That direction, a promise nobody made, is the one the test exists for.
What 1.0.0 does not carry
Recorded rather than forgotten. The base install is 316 MB against a 300 MB target that was set below what the architecture allows, since spaCy and the numeric stack are 160 MB of it. The dictionary index could shed roughly 20% of its bytes at the cost of a full re-download per language, 288 MB German and 682 MB French. That is a real price and it is not being paid to meet a date.
Where the quality bar sits
1402 unit tests, 89% line coverage, and a mutation score of 92.6% on the module that writes your deck and 87.6% on the one that resolves languages, excluding mutants that change only a log line. make benchmark holds each phase to a threshold; make mutation re-runs it. bandit is clean at every severity.
Full history in CHANGELOG.md.