content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [dependency-groups]
  dev = [
      "hypothesis>=6.138.8",
      "localstack>=4.7.0",
      "pre-commit>=4.1.0",
      "pyright>=1.1.397",
      "pytest-asyncio>=0.26.0",
      "pytest-cov>=6.0.0",
      "pytest-xdist>=3.8.0",
      "ruff>=0.12.7",
      "types-aioboto3-lite[s3]>=1.38.10",
  ]
  
  [project]
  name = "cloud-autopkg-runner"
  version = "0.20.17"
  description = "A Python library designed to level-up your AutoPkg automations with a focus on CI/CD performance."
  readme = { file = "README.md", content-type = "text/markdown" }
  requires-python = ">=3.10"
  license = "MIT"
  license-files = ["LICENSE.md"]
  authors = [{ name = "Scott Blake", email = "mitchelsblake@gmail.com" }]
  keywords = ["autopkg"]
  classifiers = [
      "Development Status :: 4 - Beta",
      "Intended Audience :: Developers",
      "Intended Audience :: Information Technology",
      "Intended Audience :: System Administrators",
      "License :: OSI Approved :: MIT License",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Programming Language :: Python :: 3.14",
      "Topic :: System :: Software Distribution",
      "Operating System :: MacOS",
      "Operating System :: MacOS :: MacOS X",
      "Typing :: Typed",
  ]
  dependencies = ["pyyaml>=6.0.2", "xattr>=1.1.4"]
  
  [project.scripts]
  cloud-autopkg-runner = "cloud_autopkg_runner.__main__:main"
  
  [project.entry-points."cloud_autopkg_runner.cache"]
  default = "cloud_autopkg_runner.cache.json_cache:AsyncJsonFileCache"
  azure = "cloud_autopkg_runner.cache.azure_blob_cache:AsyncAzureBlobCache"
  gcs = "cloud_autopkg_runner.cache.gcs_cache:AsyncGCSCache"
  json = "cloud_autopkg_runner.cache.json_cache:AsyncJsonFileCache"
  s3 = "cloud_autopkg_runner.cache.s3_cache:AsyncS3Cache"
  sqlite = "cloud_autopkg_runner.cache.sqlite_cache:AsyncSQLiteCache"
  
  [project.optional-dependencies]
  azure = ["azure-identity", "azure-storage-blob[aio]"]
  gcs = ["google-cloud-storage"]
  json = []
  s3 = ["aioboto3"]
  sqlite = []
  
  [project.urls]
  Homepage = "https://github.com/MScottBlake/cloud-autopkg-runner"
  Documentation = "https://github.com/MScottBlake/cloud-autopkg-runner/wiki"
  Repository = "https://github.com/MScottBlake/cloud-autopkg-runner.git"
  Issues = "https://github.com/MScottBlake/cloud-autopkg-runner/issues"
  
  [tool.coverage.report]
  fail_under = 80
  
  [tool.coverage.xml]
  output = "artifacts/coverage.xml"
  
  [tool.coverage.run]
  branch = true
  data_file = "artifacts/.coverage"
  source = ["src"]
  
  [tool.pyright]
  extraPaths = ["src"]
  include = ["src"]
  ignore = ["tests"]
  typeCheckingMode = "strict"
  venvPath = "."
  venv = ".venv"
  
  [tool.pytest.ini_options]
  cache_dir = ".cache/pytest"
  junit_family = "xunit1"
  addopts = [
      "--color=yes",
      "--cov",
      "--cov-append",
      "--cov-report=term-missing",
      "--cov-report=xml",
      "--junit-xml=artifacts/test_results.xml",
      "--verbosity=1",
  ]
  
  [tool.ruff]
  cache-dir = ".cache/ruff"
  include = ["pyproject.toml", "{src,tests}/**/*.py"]
  extend-exclude = [".venv"]
  
  [tool.ruff.lint]
  unfixable = ["ALL"]
  select = [
      "A",     # flake8-builtins
      "ANN",   # flake8-annotations
      "ARG",   # flake8-unused-arguments
      "ASYNC", # flake8-async
      "B",     # flake8-bugbear
      "BLE",   # flake8-bare-except
      "C4",    # flake8-comprehensions
      "C90",   # mccabe
      "D",     # pydocstyle
      "DOC",   # pydoclint
      "DTZ",   # flake8-datetimez
      "E",     # pycodestyle error
      "F",     # Pyflakes
      "FBT",   # flake8-boolean-trap
      "FLY",   # flynt
      "FIX",   # flake8-fixme
      "G",     # flake8-logging-format
      "I",     # isort
      "LOG",   # flake8-logging
      "N",     # pep8-naming
      "PERF",  # Perflint
      "PIE",   # flake8-pie
      "PL",    # Pylint
      "PT",    # flake8-pytest-style
      "PTH",   # flake8-use-pathlib
      "Q",     # flake8-quotes
      "RET",   # flake8-return
      "RSE",   # flake8-raise
      "RUF",   # Ruff-specific rules
      "S",     # flake8-bandit
      "SIM",   # flake8-simplify
      "SLF",   # flake8-self
      "T20",   # flake8-print
      "TC",    # flake8-type-checking
      "TID",   # flake8-tidy-imports
      "TRY",   # tryceratops
      "UP",    # pyupgrade
      "W",     # pycodestyle warning
      "YTT",   # flake8-2020
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "tests/**/*" = ["S101", "S108", "D100", "PLR2004", "PLC2701", "ANN401", "SLF001", "T201", "FBT001"]
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [[tool.uv.index]]
  name = "testpypi"
  url = "https://test.pypi.org/simple/"
  publish-url = "https://test.pypi.org/legacy/"
  explicit = true
  