[project] name = "shelfmark" version = "0.1.0" description = "Shelfmark - Book Downloader" requires-python = ">=3.14" dependencies = [ "flask", "flask-cors", "flask-socketio", "python-socketio", "requests[socks]", "defusedxml", "beautifulsoup4", "tqdm", "dnspython", "gunicorn", "gevent", "gevent-websocket", "psutil", "emoji", "rarfile", "qbittorrent-api>=2026.8.0", "transmission-rpc", "authlib>=1.7.2,<1.8", "apprise>=1.12.0", ] [project.optional-dependencies] browser = [ "pyvirtualdisplay", "pyautogui", "seleniumbase==4.51.11", "python-xlib", ] [dependency-groups] dev = [ "basedpyright>=1.39.9", "prek", "pytest", "pytest-cov", "pytest-xdist>=3.8.0", "ruff==0.16.2", "vulture>=2.14", ] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-v", "--tb=short", "-n", "auto", ] markers = [ "integration: marks tests that require running services (deselect with '-m \"not integration\"')", "slow: marks tests as slow (deselect with '-m \"not slow\"')", "e2e: marks end-to-end tests that require the full application stack", ] [tool.ruff] line-length = 100 extend-exclude = [".local"] [tool.ruff.lint] select = [ "F", "I", "UP", "B", "C4", "SIM", "PTH", "RET", "PIE", "FURB", "PERF", "TRY", "A", "DTZ", "N", "BLE001", "ANN001", "ANN002", "ANN003", "ANN201", "ANN202", "ANN204", "E402", "ERA001", "E731", "S101", "S110", "S105", "S108", "S311", "S324", "S607", "S608", "G003", "G004", "PGH003", "PLC0414", "PLR1714", "PLW1510", "PLW2901", "PLW0108", "PT028", "PYI034", "Q000", "RUF005", "RUF012", "RUF013", "RUF059", "RUF100", "TC001", "TC002", "TC003", ] ignore = ["D", "EM", "FBT", "PLR2004", "UP035", "TRY003", "E501", "TD002", "S104", "S603"] [tool.ruff.lint.per-file-ignores] "scripts/**/*.py" = [ "BLE001", "S", "TRY", ] "tests/**/*.py" = [ "ANN", "BLE001", "B010", "B017", "B028", "DTZ", "E402", "E731", "ERA001", "FURB", "G003", "G004", "PERF", "PIE", "PLC0414", "PLW0108", "PLW1510", "PLW2901", "PTH", "PT028", "PYI034", "Q000", "RET", "RUF012", "S", "SIM", "TC001", "TC002", "TC003", "TRY", "UP028", ] [tool.basedpyright] include = ["shelfmark"] exclude = [".local", "tests", "**/__pycache__", "**/node_modules"] pythonVersion = "3.14" typeCheckingMode = "standard" [tool.vulture] paths = ["shelfmark"] exclude = [".local", "tests"] ignore_decorators = [ "@app.route", "@app.before_request", "@app.after_request", "@app.errorhandler", "@socketio.on", "@register_provider", "@register_provider_kwargs", "@register_settings", "@register_source", "@register_handler", "@register_client", "@register_output", ] min_confidence = 90 sort_by_size = true [tool.coverage.run] source = ["shelfmark"] branch = true [tool.coverage.report] show_missing = true skip_empty = true [tool.uv] package = false