content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [project]
  name = "borgitory"
  version = "1.0.0"
  description = "A comprehensive web-based management interface for BorgBackup repositories with real-time monitoring, automated scheduling, and cloud synchronization capabilities."
  readme = "README.md"
  license = {file = "LICENSE"}
  authors = [
      {name = "mlapaglia", email = "mlapaglia@users.noreply.github.com"},
  ]
  keywords = ["borgbackup", "backup", "web-interface", "scheduling", "cloud-sync", "archive-management"]
  classifiers = [
      "Development Status :: 4 - Beta",
      "Intended Audience :: System Administrators",
      "License :: OSI Approved :: MIT License",
      "Operating System :: OS Independent",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.13",
      "Topic :: System :: Archiving :: Backup",
      "Topic :: System :: Systems Administration",
  ]
  requires-python = ">=3.13"
  dependencies = [
      "aiofiles>=24.1.0",
      "aiohttp>=3.9.0",
      "aiosqlite>=0.21.0",
      "alembic>=1.16.5",
      "apscheduler>=3.10.4",
      "bcrypt>=4.0.0,<5.0.0",
      "cron-descriptor>=2.0.5",
      "cryptography>=45.0.0",
      "docker>=7.1.0",
      "fastapi>=0.115.0",
      "jinja2>=3.1.4",
      "passlib[bcrypt]>=1.7.4",
      "pydantic>=2.9.0",
      "python-dotenv>=1.0.1",
      "python-multipart>=0.0.12",
      "sqlalchemy>=2.0.35",
      "sse-starlette>=2.1.3",
      "uvicorn[standard]>=0.30.0",
  ]
  
  [project.optional-dependencies]
  dev = [
      "ruff>=0.12.11",
      "djlint>=1.36.4",
      "pytest>=7.4.0",
      "pytest-asyncio>=0.21.0",
      "pytest-cov>=4.0.0",
      "httpx>=0.25.0",
      "mypy>=1.8.0",
      "sqlalchemy[mypy]>=2.0.35",
      "types-passlib>=1.7.7.20240327",
      "types-python-dateutil>=2.8.19.20240106",
      "types-aiofiles>=23.2.0.20240106",
      "debugpy>=1.8.17",
  ]
  
  [project.urls]
  Homepage = "https://github.com/mlapaglia/Borgitory"
  Repository = "https://github.com/mlapaglia/Borgitory"
  Issues = "https://github.com/mlapaglia/Borgitory/issues"
  
  [project.scripts]
  borgitory = "borgitory.cli:main"
  
  [tool.hatch.build.targets.wheel]
  packages = ["src/borgitory"]
  
  [tool.hatch.build.targets.sdist]
  include = [
      "/src",
      "/tests",
      "/README.md",
      "/LICENSE",
      "/pyproject.toml"
  ]
  
  [tool.ruff]
  # Exclude a variety of commonly ignored directories.
  exclude = [
      ".bzr",
      ".direnv",
      ".eggs",
      ".git",
      ".git-rewrite",
      ".hg",
      ".ipynb_checkpoints",
      ".mypy_cache",
      ".nox",
      ".pants.d",
      ".pyenv",
      ".pytest_cache",
      ".pytype",
      ".ruff_cache",
      ".svn",
      ".tox",
      ".venv",
      ".vscode",
      "__pypackages__",
      "_build",
      "buck-out",
      "build",
      "dist",
      "node_modules",
      "site-packages",
      "venv",
  ]
  
  # Same as Black.
  line-length = 88
  indent-width = 4
  
  # Assume Python 3.13+.
  target-version = "py313"
  
  [tool.ruff.lint]
  # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`)  codes by default.
  # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
  # McCabe complexity (`C901`) by default.
  select = ["E4", "E7", "E9", "F"]
  ignore = []
  
  # Allow fix for all enabled rules (when `--fix`) is provided.
  fixable = ["ALL"]
  unfixable = []
  
  # Allow unused variables when underscore-prefixed.
  dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
  
  [tool.ruff.format]
  # Like Black, use double quotes for strings.
  quote-style = "double"
  
  # Like Black, indent with spaces, rather than tabs.
  indent-style = "space"
  
  # Like Black, respect magic trailing commas.
  skip-magic-trailing-comma = false
  
  # Force LF line endings on all platforms.
  line-ending = "lf"
  
  [tool.pytest.ini_options]
  # Test discovery configuration
  testpaths = ["tests"]
  python_files = ["test_*.py"]
  python_classes = ["Test*"]
  python_functions = ["test_*"]
  
  # asyncio plugin configuration
  asyncio_mode = "auto"
  asyncio_default_fixture_loop_scope = "function"
  
  # Custom markers
  markers = [
      "integration: marks tests as integration tests (may require external dependencies)",
  ]
  
  [tool.coverage.run]
  source = ["src/borgitory"]
  omit = [
      "*/tests/*",
      "*/test_*",
      "*/__pycache__/*",
      "*/migrations/*",
      "*/alembic/*",
  ]
  
  [tool.coverage.report]
  exclude_lines = [
      "pragma: no cover",
      "def __repr__",
      "raise AssertionError",
      "raise NotImplementedError",
      "if __name__ == .__main__.:",
  ]
  
  [tool.mypy]
  # Basic settings
  python_version = "3.13"
  strict = true
  
  # Display options
  pretty = true
  show_column_numbers = true
  show_error_codes = true
  
  # Any-related rules
  disallow_any_explicit = false
  disallow_any_unimported = true
  warn_return_any = true
  
  # Other strict rules
  implicit_reexport = false
  namespace_packages = true
  strict_concatenate = true
  warn_incomplete_stub = true
  
  # File configuration
  exclude = [
      "^alembic/",
      "^htmlcov/",
      "^\\.",
  ]
  files = ["src"]
  
  # Plugins
  plugins = [
      "pydantic.mypy",
      "sqlalchemy.ext.mypy.plugin",
  ]
  
  [tool.pydantic-mypy]
  init_forbid_extra = true
  init_typed = true
  warn_required_dynamic_aliases = true
  warn_untyped_fields = true
  
  [[tool.mypy.overrides]]
  module = [
      "aiofiles.*",
      "aiohttp.*",
      "alembic.*",
      "apscheduler.*",
      "bcrypt.*",
      "cron_descriptor.*",
      "cryptography.*",
      "docker.*",
      "passlib.*",
      "sqlalchemy.*",
      "sse_starlette.*",
  ]
  ignore_missing_imports = true
  
  [tool.djlint]
  profile = "jinja"
  indent = 4
  max_line_length = 88
  per_file_ignores = [
      "src/borgitory/templates/partials/archives/directory_contents.html:J018",
      "src/borgitory/templates/partials/auth/login_form_active.html:J018",
      "src/borgitory/templates/partials/auth/register_form_active.html:J018",
      "src/borgitory/templates/partials/repositories/modal/details_modal.html:J018",
      "src/borgitory/templates/base.html:J004",
  ]
  ignore="H021,J004,J018"
  
  [tool.pyright]
  include = ["src", "tests"]
  extraPaths = ["src"]
  pythonVersion = "3.13"
  pythonPlatform = "All"