[project]
name = "Sith"
version = "3"
description = "Le web Sith de l'AE"
readme = "README.md"
authors = [
    { name = "Skia", email = "skia@hya.sk" },
    { name = "klmp200", email = "antoine@bartuccio.fr" },
    { name = "Krophil", email = "pierre.brunet@krophil.fr" },
    { name = "Maréchal", email = "thgirod@hotmail.com" },
    { name = "Och", email = "francescowitz68@gmail.com" },
    { name = "tleb", email = "tleb@openmailbox.org" },
    { name = "Soldat", email = "ryan-68@live.fr" },
    { name = "Nabos", email = "gnikwo@hotmail.com" },
    { name = "Terre", email = "jbaptiste.lenglet+git@gmail.com" },
    { name = "Lo-J", email = "renaudg779@gmail.com" },
    { name = "Vial", email = "robin.trioux@utbm.fr" },
]
license = { text = "GPL-3.0-only" }
requires-python = "<4.0,>=3.12"
dependencies = [
    "django>=5.2.15,<6.0.0",
    "django-ninja>=1.6.2,<2.0.0",
    "django-ninja-extra>=0.31.5",
    "Pillow>=12.2.0,<13.0.0",
    "aemark>=0.1.1",
    "django-jinja<3.0.0,>=2.11.0",
    "cryptography>=49.0.0,<50.0.0",
    "django-phonenumber-field>=8.4.0,<9.0.0",
    "phonenumbers>=9.0.33,<10.0.0",
    "reportlab>=5.0.0,<6.0.0",
    "django-haystack>=3.4.0,<4.0.0",
    "xapian-haystack>=4.0.0,<5.0.0",
    "libsass>=0.23.0,<1.0.0",
    "django-ordered-model>=3.7.4,<4.0.0",
    "django-simple-captcha>=0.6.3,<1.0.0",
    "python-dateutil>=2.9.0.post0,<3.0.0.0",
    "sentry-sdk>=2.63.0,<3.0.0",
    "jinja2>=3.1.6,<4.0.0",
    "django-countries>=9.0.0,<10.0.0",
    "dict2xml>=1.7.8,<2.0.0",
    "Sphinx>=9.1.0,<10", # Used by xapian during installation
    "tomli>=2.4.1,<3.0.0",
    "django-honeypot>=1.3.0,<2",
    "pydantic-extra-types>=2.11.1,<3.0.0",
    "ical>=12.0.0,<14.0.0",
    "redis[hiredis]>=6.4.0,<9.0.0",
    "environs[django]>=15.0.1,<16",
    "requests>=2.34.2,<3.0.0",
    "honcho>=2.0.0",
    "psutil>=7.2.2,<8.0.0",
    "celery[redis]>=5.6.3,<8",
    "django-celery-results>=2.6.0",
    "django-celery-beat>=2.9.0",
]

[project.urls]
homepage = "https://ae.utbm.fr/"
documentation = "https://sith-ae.readthedocs.io/"

[dependency-groups]
prod = [
    "psycopg[c]>=3.3.4,<4.0.0",
]
dev = [
    "django-debug-toolbar>=7.0.0,<8",
    "ipython>=9.14.1,<10.0.0",
    "pre-commit>=4.6.0,<5.0.0",
    "ruff>=0.15.19,<1.0.0",
    "djhtml>=3.0.11,<4.0.0",
    "faker>=40.23.0,<41.0.0",
    "rjsmin>=1.2.5,<2.0.0",
]
tests = [
    "freezegun>=1.5.5,<2.0.0",
    "pytest>=9.1.1,<10.0.0",
    "pytest-cov>=7.1.0,<8.0.0",
    "pytest-django>=4.12.0,<5.0.0",
    "model-bakery>=1.24.0,<2.0.0",
    "beautifulsoup4>=4.15.0,<5",
    "lxml>=6.1.1,<7",
]
docs = [
    "mkdocs>=1.6.1,<2.0.0",
    "mkdocs-material>=9.7.6,<10.0.0",
    "mkdocstrings>=1.0.4,<2.0.0",
    "mkdocstrings-python>=2.0.4,<3.0.0",
    "mkdocs-include-markdown-plugin>=7.3.0,<8.0.0",
]

[tool.uv]
default-groups = ["dev", "tests", "docs"]

[tool.xapian]
version = "2.0.0"
# Those hashes are here to protect against supply chains attacks
# See `https://ae-utbm.github.io/sith/howto/xapian/` for more information
core-sha256 = "6cea3f49952a47224439a40bdb3608f928d121ad8721b9921cc42802d548ecf8"
bindings-sha256 = "9a544b69c31355a92edbcd4102cf0f1ec4407fd0a4645f4870fb52300b736910"

[tool.ruff]
output-format = "concise" # makes ruff error logs easier to read

[tool.ruff.lint]
select = [
    "A", # shadowing of Python builtins
    "B",
    "C4", # use comprehensions when possible
    "DJ", # django-specific rules,
    "E", # pycodestyle (https://docs.astral.sh/ruff/rules/#pycodestyle-e-w)
    "ERA", # commented code
    "F", # pyflakes (https://docs.astral.sh/ruff/rules/#pyflakes-f)
    "FBT", # boolean trap
    "FLY", # f-string instead of str.join
    "FURB", # https://docs.astral.sh/ruff/rules/#refurb-furb
    "I", # isort
    "INT", # gettext
    "PERF", # performance
    "PLW", # pylint warnings (https://docs.astral.sh/ruff/rules/#pylint-pl)
    "RUF", # Ruff specific rules
    "SIM", # simplify (https://docs.astral.sh/ruff/rules/#flake8-simplify-sim)
    "T100", # breakpoint()
    "T2", # print statements
    "TCH", # type-checking block
    "UP008", # Use super() instead of super(__class__, self)
    "UP009", # utf-8 encoding declaration is unnecessary
]

ignore = [
    "DJ001", # null=True in CharField/TextField. this one would require a migration
    "E501", # line too long. The rule is too harsh, and the formatter deals with it in most cases
    "RUF012"  # mutable class attributes. This rule doesn't integrate well with django
]

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

[build-system] # A build system is needed to register a pytest plugin
requires = ["hatchling"]
build-backend = "hatchling.build"

[project.entry-points.pytest11]
sith = "sith.pytest"

[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "sith.settings"
python_files = ["tests.py", "test_*.py", "*_tests.py"]
markers = ["slow"]
