[project]
name = "ows-abacus-state"
version = "1.0.0"
description = "ows-abacus-state"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
    "abacus-common-logic~=5.13",
    "annotated-types~=0.7.0",
    "anyio~=4.10.0",
    "backoff~=2.2.1",
    "blinker~=1.9.0",
    "bloom-filter2~=2.0.0",
    "boto3~=1.40",
    "botocore~=1.40",
    "bytecode~=0.16",
    "cachelib~=0.13.0",
    "certifi~=2026.1",
    "charset-normalizer~=3.4",
    "click~=8.2.1",
    "ddtrace~=3.19",
    "docopt~=0.6.2",
    "envier~=0.6.1",
    "flask>=3.1.3",
    "flask-marshmallow~=1.2.1",
    "flask-sqlalchemy~=3.0.5",
    "future~=1.0.0",
    "h11~=0.16.0",
    "httpcore~=1.0.9",
    "httpx~=0.27.2",
    "idna~=3.10",
    "importlib-metadata~=8.7.0",
    "itsdangerous~=2.2.0",
    "jinja2~=3.1.6",
    "jmespath~=1.0.1",
    "jwtauth~=0.2.0",
    "markupsafe~=2.1.5",
    "marshmallow~=3.26.1",
    "marshmallow-sqlalchemy~=1.0.0",
    "mmh3cffi~=0.2.1",
    "opentelemetry-api~=1.36.0",
    "owsclient~=0.7",
    "owslogger~=4.3.0",
    "owsrequest==2.10.1",
    "owsresponse~=3.0.4",
    "packaging~=25.0",
    "protobuf~=6.33",
    "pycparser~=2.22",
    "pydantic~=2.11.7",
    "pydantic-core~=2.33.2",
    "pymysql~=1.1.2",
    "python-common-apispec~=0.2.0",
    "python-dateutil~=2.9.0.post0",
    "python-dotenv>=1.2.2",
    "python-json-logger~=3.3.0",
    "python-pdp-sdk~=5.3.0",
    "pyyaml~=6.0.2",
    "requests~=2.33.0",
    "requests-futures~=1.0.2",
    "respx~=0.21.1",
    "retrying~=1.4.2",
    "s3transfer~=0.16",
    "secrets_manager~=1.4.6",
    "sentry-sdk~=2.50",
    "setuptools~=80.9.0",
    "six~=1.17.0",
    "sniffio~=1.3.1",
    "splitio-client~=10.4.0",
    "sqlalchemy~=1.4.54",
    "typing-extensions~=4.15.0",
    "typing-inspection~=0.4.1",
    "urllib3>=2.7.0",
    "uwsgi~=2.0",
    "werkzeug~=3.1",
    "wheel~=0.47",
    "wrapt~=1.17.3",
    "xmltodict~=0.15",
    "zipp~=3.23.0",
]

[dependency-groups]
dev = [
    "factory-boy~=3.3.3",
    "flasgger~=0.9.7.1",
    "ipdb~=0.13.13",
    "ipython~=9.5.0",
    "mypy>=2.1.0",
    "pytest~=9.0.3",
    "pytest-cov~=7.1.0",
    "pytest-jira~=0.3.22",
    "pytest-mock~=3.15.1",
    "pytest-randomly~=3.16.0",
    "pytest-xdist~=3.8.0",
    "ruff~=0.14",
]
integration = [
    {include-group = "dev"},
    "qa-utils-grass==0.6.1",
    "qa-testing-utils==3.1.1",
]

[tool.uv]
default-groups = []

[[tool.uv.index]]
name = "the-orchard-registry"
url = "https://pypi.theorchard.io/pypi/"

[tool.ruff]
line-length = 88
indent-width = 4

[tool.ruff.lint]
select = [
    # pycodestyle
    "E",
    "W",
    # pydocstyle
    "D",
    # isort
    "I",
    # builtins
    "A",
    # quotes
    "Q"
]
ignore = [
    # missing-blank-line-after-last-section
    "D413",
    # incorrect-blank-line-before-class, conflicts with D211
    "D203",
    # multi-line-summary-second-line, conflicts with D212
    "D213",
    # line-too-long, the formatter makes a best-effort at wrapping lines
    "E501",
]

[tool.ruff.lint.isort]
combine-as-imports = true
forced-separate = ["tests"]

[tool.ruff.lint.flake8-quotes]
inline-quotes = "single"

[tool.ruff.format]
quote-style = "single"

[tool.mypy]
# This setting avoids us having to add a __init__.py file for every module
explicit_package_bases = true

# Enable strict mode
# We don't fully comply yet so we disable some rules for now
strict = true

# These 4 rules are disabled because of untyped librairies
ignore_missing_imports = true
disallow_subclassing_any = false
disallow_untyped_decorators = false
no_implicit_reexport = false

# We don't have types for 100% of our code so we disable some rules
# We do it on a per-module basis to make it easier to progressively add types
[[tool.mypy.overrides]]
module = "abacus_state.api"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.config"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.schemas.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.blueprints.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.logic.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.models.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.utils.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false

[[tool.mypy.overrides]]
module = "abacus_state.connectors.*"
disallow_untyped_calls = false
disallow_incomplete_defs = false
disallow_untyped_defs = false
