pyproject.toml (109 lines of code) (raw):
[tool.poetry]
name = "jbi"
version = "0"
description = "jira-bugzilla-integration"
authors = ["@mozilla/jbi-core"]
license = "MPL"
[tool.poetry.dependencies]
python = ">=3.12, <3.14"
fastapi = "^0.115.12"
pydantic = {version = "^2.11.4", extras = ["email"]}
uvicorn = {extras = ["standard"], version = "^0.34.2"}
atlassian-python-api = "^4.0.3"
dockerflow = {extras = ["fastapi"], version = "2024.4.2"}
Jinja2 = "^3.1.6"
sentry-sdk = {extras = ["fastapi"], version = "^2.27.0"}
pydantic-yaml = "^1.4.0"
backoff = "^2.2.1"
statsd = "^4.0.1"
requests = "^2.32.3"
pydantic-settings = "^2.9.1"
pypandoc = "^1.15"
[tool.poetry.group.dev.dependencies]
click = "^8.1.8"
pre-commit = "^4.2.0"
coverage = {extras = ["toml"], version = "^7.8"}
mypy = "^1.15"
detect-secrets = "^1.5.0"
bandit = "^1.8.3"
pytest = "^8.3.5"
yamllint = "^1.37.1"
pytest-dotenv = "^0.5.2"
types-requests = "^2.32.0"
responses = "^0.25.7"
httpx = "^0.28.1"
factory-boy = "^3.3.3"
pytest-factoryboy = "^2.7.0"
ruff = "^0.11.8"
pytest-mock = "^3.14.0"
pytest-asyncio = "^0.26.0"
[tool.poetry.scripts]
jbi = "jbi.__main__:cli"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.ruff]
target-version = "py312"
lint.extend-select = ["I"]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]
[tool.pytest.ini_options]
testpaths = [
"tests/unit",
]
env_override_existing_values = true
env_files = [
".env.example"
]
markers = [
"no_mocked_bugzilla",
"no_mocked_jira",
]
[tool.mypy]
python_version = "3.13"
# Warn when returning Any from function with non-Any return
warn_return_any = true
plugins = "pydantic.mypy"
[[tool.mypy.overrides]]
module = ["ruamel", "bugzilla", "atlassian", "atlassian.rest_client", "statsd.defaults.env", "dockerflow.*"]
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = [
"jbi.app"
]
disallow_any_generics = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_unused_ignores = true
warn_return_any = true
no_implicit_reexport = true
strict_equality = true
strict_concatenate = true
[tool.coverage]
# https://github.com/nedbat/coveragepy
[tool.coverage.run]
omit = [
'*/.local/*',
'/usr/*',
'*/.venv/*',
'*/.tox/*',
'*/virtualenvs/*',
]
[tool.coverage.report]
exclude_lines = [
"# noqa",
"raise NotImplementedError",
"pragma: no cover",
"def __repr__",
"if .debug:",
"raise NotImplementedError",
"if __name__ == .__main__.:",
"logger.",
"from",
"import"
]