blob: 96e2fa59934d79071390dc3276f6de360d7f5c8f [file]
[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"