| [build-system] |
| requires = ["setuptools", "wheel"] |
| build-backend = "setuptools.build_meta" |
| |
| [project] |
| name = "b4" |
| version = "0.16-dev" |
| description = "A tool to work with public-inbox and patch archives" |
| readme = "README.rst" |
| keywords = ["git", "public-inbox", "lore.kernel.org", "patch", "email", "workflow"] |
| license = {file = "COPYING"} |
| authors = [ |
| {name = "Konstantin Ryabitsev", email="konstantin@linuxfoundation.org"}, |
| ] |
| requires-python = ">=3.11" |
| classifiers = [ |
| "Environment :: Console", |
| "Operating System :: POSIX :: Linux", |
| "Intended Audience :: Developers", |
| "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", |
| "Topic :: Communications :: Email", |
| "Topic :: Software Development", |
| "Topic :: Utilities", |
| ] |
| dependencies = [ |
| "requests>=2.24,<3.0", |
| "pygit2>=1.15,<2.0", |
| "dkimpy>=1.0,<2.0", |
| "patatt>=0.6,<2.0", |
| "ezgb>=0.1", |
| "liblore>=0.7", |
| ] |
| |
| [dependency-groups] |
| dev = [ |
| "mypy", |
| "pip-tools", |
| "pyright", |
| "pytest", |
| "pytest-asyncio", |
| "ruff", |
| "ty", |
| "types-requests", |
| ] |
| misc = [ |
| "ezpi", |
| "falcon", |
| "instructor", |
| "pydantic", |
| "sqlalchemy", |
| ] |
| |
| [project.optional-dependencies] |
| completion = [ |
| "shtab>=1.8", |
| ] |
| tui = [ |
| "textual[syntax]>=1.0", |
| ] |
| |
| [tool.setuptools.packages.find] |
| where = ['src'] |
| exclude = ['tests*'] |
| |
| [tool.pip-tools] |
| generate_hashes = true |
| |
| [project.urls] |
| Homepage = "https://git.kernel.org/pub/scm/utils/b4/b4.git/" |
| Repository = "https://git.kernel.org/pub/scm/utils/b4/b4.git" |
| Documentation = "https://b4.docs.kernel.org/" |
| |
| [project.scripts] |
| b4 = "b4.command:cmd" |
| |
| [tool.pytest.ini_options] |
| asyncio_mode = "auto" |
| asyncio_default_fixture_loop_scope = "function" |
| filterwarnings = "ignore:.*(pyopenssl|invalid escape sequence).*:DeprecationWarning" |
| norecursedirs = ["tests/helpers", "ezgb", "liblore", "patatt"] |
| log_file = "pytest.log" |
| log_file_level = "DEBUG" |
| log_file_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" |
| log_file_date_format = "%Y-%m-%d %H:%M:%S" |
| |
| [tool.bumpversion] |
| current_version = "0.16-dev" |
| files = [ |
| {filename = "src/b4/__init__.py"}, |
| {filename = "src/b4/man/b4.1.rst"}, |
| {filename = "src/b4/man/b4.1"}, |
| ] |
| |
| [tool.ruff] |
| extend-exclude = ["ezgb", "liblore", "patatt"] |
| |
| [tool.ruff.lint] |
| extend-select = [ |
| "F", # https://docs.astral.sh/ruff/rules/#pyflakes-f |
| "B007", # https://docs.astral.sh/ruff/rules/unused-loop-control-variable/ |
| "B904", # https://docs.astral.sh/ruff/rules/raise-without-from-err/ |
| "DTZ", # https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz |
| "G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g |
| "I", # https://docs.astral.sh/ruff/rules/#isort-i |
| "PERF102", # https://docs.astral.sh/ruff/rules/incorrect-dict-iterator/ |
| "PGH004", # https://docs.astral.sh/ruff/rules/blanket-noqa/ |
| "PIE790", # https://docs.astral.sh/ruff/rules/unnecessary-placeholder/ |
| "PIE810", # https://docs.astral.sh/ruff/rules/multiple-starts-ends-with/ |
| "RET505", # https://docs.astral.sh/ruff/rules/superfluous-else-return/ |
| "RET506", # https://docs.astral.sh/ruff/rules/superfluous-else-raise/ |
| "RET507", # https://docs.astral.sh/ruff/rules/superfluous-else-continue/ |
| "RET508", # https://docs.astral.sh/ruff/rules/superfluous-else-break/ |
| "RUF059", # https://docs.astral.sh/ruff/rules/unused-unpacked-variable/ |
| "RUF100", # https://docs.astral.sh/ruff/rules/unused-noqa/ |
| "SIM103", # https://docs.astral.sh/ruff/rules/needless-bool/ |
| "SIM113", # https://docs.astral.sh/ruff/rules/enumerate-for-loop/ |
| "SIM118", # https://docs.astral.sh/ruff/rules/in-dict-keys/ |
| "SIM201", # https://docs.astral.sh/ruff/rules/negate-equal-op/ |
| ] |
| flake8-quotes.inline-quotes = "single" |
| |
| [tool.ruff.format] |
| quote-style = "single" |
| |
| [tool.mypy] |
| exclude = ["^ezgb/", "^liblore/", "^patatt/"] |
| strict = true |
| warn_unreachable = true |
| |
| [tool.pyright] |
| # pyright automatically ignores virtual environments and other directories, but |
| # once we specify `exclude`, we're on our own. See |
| # https://github.com/microsoft/pyright/issues/9057#issuecomment-2366938099. |
| exclude = [".venv", "ezgb", "liblore", "patatt"] |
| typeCheckingMode = "strict" |
| |
| # Overly strict rules. |
| reportConstantRedefinition = false |
| reportUnknownArgumentType = false |
| reportUnknownLambdaType = false |
| reportUnknownMemberType = false |
| reportUnknownVariableType = false |
| |
| # False positives caused by underscore-prefixed functions used across files. |
| # Might be good to clean this up. |
| reportPrivateUsage = false |
| reportUnusedFunction = false |
| |
| [tool.ty.src] |
| exclude = ["ezgb/", "liblore/", "patatt/"] |
| |
| [tool.ty.rules] |
| all = "error" |