[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "staffml-vault" version = "0.1.0" description = "CLI for the StaffML question vault — authoring, building, and releasing the corpus." readme = "README.md" requires-python = ">=3.12" authors = [{ name = "Vijay Janapa Reddi" }] license = { text = "MIT" } keywords = ["staffml", "vault", "ml-systems", "interviews"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Education", "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Database", ] dependencies = [ "typer>=0.12", "rich>=13", "pydantic>=2.7", "pyyaml>=6", "click>=8", ] [project.optional-dependencies] dev = [ "pytest>=8", "pytest-cov>=5", "pytest-timeout>=2", "mypy>=1.10", "ruff>=0.5", ] [project.scripts] vault = "vault_cli.main:app" [project.urls] Homepage = "https://staffml.mlsysbook.ai" Architecture = "https://github.com/harvard-edge/cs249r_book/blob/dev/interviews/vault/ARCHITECTURE.md" Review-Ledger = "https://github.com/harvard-edge/cs249r_book/blob/dev/interviews/vault/REVIEWS.md" [tool.hatch.build.targets.wheel] packages = ["src/vault_cli"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-x --strict-markers --timeout=60" [tool.ruff] line-length = 100 target-version = "py312" [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP", "N", "SIM"] ignore = [ "E501", # line-length handled by formatter "B008", # function-call-in-default-argument — this is THE Typer idiom # (`typer.Option(...)` / `typer.Argument(...)` at parameter # default position). Lint doesn't know that. "UP042", # replace-str-enum — Python 3.12 StrEnum differs semantically; # our (str, Enum) mixins stay for explicit behavior. ] [tool.ruff.lint.per-file-ignores] # Scripts that run standalone insert sys.path before importing vault_cli; # that's intentional so they work both as modules and as scripts. "scripts/*.py" = ["E402"] # Cycle-detection colors WHITE/GRAY/BLACK are a conventional constant set, # and are local to one function. "src/vault_cli/validator.py" = ["N806"] # sqlite3.Row iterates as values, not keys; SIM118 fires a false positive. "src/vault_cli/commands/diff_cmd.py" = ["SIM118"] "src/vault_cli/commands/serve_api.py" = ["SIM118"] [tool.mypy] python_version = "3.12" strict = true