Prints Fizz, Buzz or FizzBuzz for each number you give it. Deliberately overengineered — see
Design.
- mise — installs and pins every other tool.
- Python 3.15, pinned in
.python-versionand fetched byuv.
mise trust
mise installmise install is the whole bootstrap: it installs the pinned tools, then syncs the dependencies from
the lockfile and installs the git hooks, which run the formatters and the type checker before each
commit. mise trust is needed once per clone, because mise refuses to read an untrusted config.
Pass one or more numbers. Each prints on its own line, in the order given.
just run 15
just run 17 21 547 4 3 1517
Fizz
547
4
Fizz
FizzBuzz
Both divisors are options:
| Option | Default | Meaning |
|---|---|---|
--fizz-divisor | 3 | Divisor that yields Fizz |
--buzz-divisor | 5 | Divisor that yields Buzz |
just run 9 --fizz-divisor 9Two argument rules:
- click parses a leading dash as an option, so a negative number needs the POSIX separator:
just run -- -3 -15. - With no arguments it prompts for a number. With no terminal, it exits non-zero and names the argument to pass.
The command is installed as fizzbuzz, so uv run fizzbuzz 15 does the same as just run 15.
| Recipe | Purpose |
|---|---|
just run <numbers> | Run the CLI |
just fix | Run every autofixer |
just check | Run every read-only gate, then the tests |
just lint | Run the read-only gate alone |
just test | Run the test suite |
just setup | Install dependencies from the lockfile |
just dev-setup | Install the git hooks |
just upgrade | Refresh the lockfile to the newest allowed versions |
just fix fixes every finding just check reports that a tool can fix. If a fixable finding
remains after just fix, then just fix is missing that tool.
- Markers combine.
Markeris the free monoid over label parts, withUNMARKEDas its identity.classifyfolds one marker per rule, so no conditional selects the result. - Rules are data. Adding a
DivisorRuleadds a divisor, and neither the types nor the control flow change. - The empty case is a value. A number matching no rule gets
UNMARKED, the identity element, so noSignal | Noneappears anywhere. - Input errors are return values. The input boundary returns
Result, sequenced withResult.doand unwrapped once at the CLI edge.bindandlashare unused: they type-check only under thereturnsmypy plugin, and this project usesty.