pyproject.toml

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "iohmm-evac"
version = "0.1.0"
description = "Synthetic hurricane-evacuation household behavior DGP for IO-HMM fitting."
readme = "README.md"
requires-python = ">=3.11"
license = { text = "AGPL-3.0-only" }
license-files = ["LICENSE"]
authors = [{ name = "Ron" }]
classifiers = [
    "License :: OSI Approved :: GNU Affero General Public License v3",
]
dependencies = [
    "joblib>=1.5.3",
    "matplotlib>=3.8",
    "numpy>=2.0",
    "pandas>=2.2",
    "pyarrow>=16.0",
    "scipy>=1.13",
    "tomli-w>=1.0",
]

[project.scripts]
iohmm-evac = "iohmm_evac.cli:main"

[dependency-groups]
dev = [
    "pytest>=8.0",
    "pytest-cov>=5.0",
    "ruff>=0.6",
    "mypy>=1.10",
    "pygments>=2.19",
]

[tool.hatch.build.targets.wheel]
packages = ["src/iohmm_evac"]

[tool.ruff]
line-length = 100
target-version = "py311"
src = ["src", "tests"]
extend-exclude = ["smoke.py"]

[tool.ruff.lint]
select = ["E", "F", "W", "I", "B", "UP", "SIM", "RUF", "D"]
ignore = [
    "D203",  # one-blank-line-before-class (pep257 chooses D211)
    "D213",  # multi-line-summary-second-line (pep257 chooses D212)
    "D107",  # no docstring needed on __init__
    # Greek letters are intentional throughout this project (α, β, γ, σ, λ, …);
    # the "ambiguous character" rules trip on standard mathematical notation.
    "RUF001",
    "RUF002",
    "RUF003",
]

[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["D"]
"src/iohmm_evac/__init__.py" = ["D104"]

[tool.ruff.lint.pydocstyle]
convention = "pep257"

[tool.mypy]
python_version = "3.11"
strict = true
files = ["src", "tests"]
plugins = []
warn_unused_configs = true
warn_unreachable = true

[[tool.mypy.overrides]]
module = [
    "pyarrow",
    "pyarrow.*",
    "tomli_w",
    "matplotlib",
    "matplotlib.*",
    "pandas",
    "scipy",
    "scipy.*",
    "joblib",
]
ignore_missing_imports = true

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q"

[tool.coverage.run]
source = ["src/iohmm_evac"]
branch = false

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "if TYPE_CHECKING:",
    "raise NotImplementedError",
    "\\.\\.\\.",
]