[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "derivepassphrase" description = "An almost faithful Python reimplementation of James Coglan's vault." readme = "README.md" requires-python = ">=3.10" license = "MIT" keywords = [] authors = [ { name = "Marco Ricci", email = "m@the13thletter.info" }, ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] dependencies = [ "click>=8.1", "typing_extensions", ] version = "0.1.3" [project.optional-dependencies] dev = ["black", "coverage", "hatch>=1.10", "mkdocs", "mkdocs-material", "mkdocstrings[python]", "pytest>=8.1", "towncrier>=23.11"] export = [ # The vault configuration exporter relies on cryptography. Version 38 was # the first to include the `algorithms.AES256` interface, instead of only # the `algorithms.AES` interface. "cryptography >= 38.0.0", ] [project.urls] Documentation = "https://the13thletter.info/derivepassphrase/" Issues = "https://github.com/the-13th-letter/derivepassphrase/issues" Source = "https://github.com/the-13th-letter/derivepassphrase" [project.scripts] derivepassphrase = "derivepassphrase.cli:derivepassphrase" derivepassphrase_export = "derivepassphrase.exporter:derivepassphrase_export" [tool.mypy] files = ['src/**/*.py', 'tests/**/*.py'] mypy_path = '$MYPY_CONFIG_FILE_DIR/src' explicit_package_bases = true implicit_reexport = false sqlite_cache = true [tool.pytest.ini_options] addopts = '--doctest-modules' pythonpath = ['src'] testpaths = ['src', 'tests'] xfail_strict = true [tool.hatch.version] path = "src/derivepassphrase/__init__.py" [tool.hatch.build.targets.sdist] exclude = [ 'towncrier.d/[0123456789+]*.md', ] [tool.hatch.build.targets.wheel] packages = ['src/derivepassphrase'] [tool.hatch.envs.hatch-test] default-args = ['src', 'tests'] features = ["export"] [[tool.hatch.envs.hatch-test.matrix]] python = ["3.10", "3.11", "3.12", "pypy3.10"] [tool.hatch.env] requires = [ "hatch-mkdocs", ] [tool.hatch.env.collectors.mkdocs.docs] path = "mkdocs.yml" [tool.hatch.envs.docs] extra-dependencies = [ # Our documentation uses the Material theme. It also uses # `mkdocstrings[python]`, but `hatch-mkdocs` is apparently smart # enough to pick *that* one up from the MkDocs configuration, but not # the selected theme... "mkdocs-material", # Our documentation uses formatted function signatures (i.e. with # formatted type annotations), which requires `black`. "black", # Our documentation is generated in multiple versions, orchestrated by # `mike`. "mike", ] detached = false [tool.hatch.envs.types] extra-dependencies = [ "mypy>=1.0.0", "pytest~=8.1", ] features = [ "export", ] [tool.hatch.envs.types.scripts] check = "mypy --install-types --non-interactive {args:src/derivepassphrase tests}" [tool.coverage.html] directory = "html/coverage" [tool.coverage.run] source_pkgs = ["derivepassphrase", "tests"] branch = true parallel = true omit = [ "__main__.py", ] [tool.coverage.paths] src = ["src"] tests = ["tests"] [tool.coverage.report] skip_covered = false skip_empty = true precision = 3 partial_branches = [ 'pragma: no branch', ] exclude_also = [ "if __name__ == .__main__.:", 'if (?:typing\.)?TYPE_CHECKING:', "raise AssertionError", "raise NotImplementedError", 'assert False', '(?:typing\.)?assert_never\(', ] [tool.ruff] line-length = 79 src = ["src"] extend = "ruff_defaults_v0.5.0.toml" [tool.ruff.format] quote-style = 'single' docstring-code-line-length = "dynamic" preview = true [tool.ruff.lint] preview = true extend-ignore = [ # We use `assert` regularly to appease the type checker, and because # it is the right language tool for this job. 'S101', ] extend-select = [ # Unlike hatch's standard configuration, we care about line length. 'E501', ] [tool.ruff.lint.pydocstyle] convention = 'google' [tool.ruff.lint.flake8-pytest-style] parametrize-names-type = 'list' [tool.ruff.lint.extend-per-file-ignores] "**/tests/**/*" = [ # Our tests are pytest-style tests, which use `assert` liberally. 'A002', # Our tests are regularly parametrized with booleans, for benign # purposes. 'FBT001', # One of our standard modules is called `derivepassphrase._types`. # Importing this from the tests directory would then automatically # trigger `PLC2701`. 'PLC2701', # To fully test the `derivepassphrase.cli` module (and a couple other # things), we need to call and to mock several internal functions, # which would automatically trigger `SLF001`. 'SLF001', ] [tool.hatch.envs.hatch-static-analysis] config-path = "ruff_defaults_v0.5.0.toml" dependencies = ["ruff==0.5.0"] [tool.hatch.envs.release] dependencies = ['towncrier>=23.11'] [tool.hatch.envs.release.scripts] [tool.towncrier] package = 'derivepassphrase' package_dir = 'src' directory = 'towncrier.d' filename = 'docs/changelog.md' template = 'towncrier-template.md' #title_format = '[{version}](https://github.com/the-13th-letter/derivepassphrase/tree/{version}) – {project_date}' underlines = ['', '', ''] issue_format = '[#{issue}]: https://github.com/the-13th-letter/derivepassphrase/{issue}' wrap = true [[tool.towncrier.type]] directory = "security" name = "Security" showcontent = true [[tool.towncrier.type]] directory = "added" name = "Added" showcontent = true [[tool.towncrier.type]] directory = "fixed" name = "Fixed" showcontent = true [[tool.towncrier.type]] directory = "removed" name = "Removed" showcontent = true [[tool.towncrier.type]] directory = "changed" name = "Changed" showcontent = true [[tool.towncrier.type]] directory = "deprecated" name = "Deprecated" showcontent = true