[build-system] requires = ["hatchling>=1.25"] build-backend = "hatchling.build" [project] name = "netmover" dynamic = ["version"] description = "Web-GUI für NFS/SMB-Mounts und zeitgesteuertes Verschieben von Dateien" readme = "README.md" requires-python = ">=3.12" license = { text = "MIT" } authors = [{ name = "Florian Wilde", email = "fw@wildeflorian.de" }] dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.30", "sqlalchemy>=2.0.30", "alembic>=1.13", "jinja2>=3.1", "python-multipart>=0.0.9", "apscheduler>=3.10,<4", "cryptography>=43", "argon2-cffi>=23.1", "pydantic>=2.7", "pydantic-settings>=2.3", "itsdangerous>=2.2", "httpx>=0.27", "paramiko>=3.4", ] [project.optional-dependencies] dev = [ "pytest>=8.2", "ruff>=0.6", "mypy>=1.11", "types-paramiko", ] [project.scripts] netmover = "netmover.cli:main" [tool.hatch.version] path = "src/netmover/__init__.py" [tool.hatch.build.targets.wheel] packages = ["src/netmover"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra" [tool.ruff] line-length = 100 target-version = "py312" src = ["src", "tests"] [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP", "S", "SIM", "RUF"] ignore = [ "S603", # subprocess ohne shell=True ist genau das gewünschte Muster "RUF001", "RUF002", "RUF003", # deutsche Texte mit Typografie ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S101", "S105", "S106", "S107", "S108"] "src/netmover/migrations/**" = ["E501"] [tool.mypy] python_version = "3.12" strict = true mypy_path = "src" packages = ["netmover"] plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] module = ["apscheduler.*"] ignore_missing_imports = true