content: [project]
  name = "llm-ci-runner"
  version = "1.5.4"
  description = "A simple CI/CD utility for running LLM tasks with Semantic Kernel"
  readme = "README.md"
  license = {text = "MIT"}
  authors = [
      {name = "Benjamin Linnik", email = "Benjamin@Linnik.IT"},
  ]
  requires-python = ">=3.10"
  dependencies = [
      "semantic-kernel>=1.32.0",
      "rich>=14.0.0",
      "azure-identity>=1.23.0",
      "azure-core>=1.35.0",
      "pydantic>=2.11.0",
      "aiohttp>=3.12.0",
      "openai>=1.93.0",
      "tenacity>=9.1.2",
      "json-schema-to-pydantic>=0.4.0",
      "ruamel-yaml>=0.18.14",
  ]
  classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Intended Audience :: Developers",
      "License :: OSI Approved :: MIT License",
      "Operating System :: OS Independent",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Topic :: Software Development :: Libraries :: Python Modules",
      "Topic :: Software Development :: Quality Assurance",
      "Topic :: System :: Systems Administration",
      "Topic :: Utilities",
  ]
  keywords = ["llm", "ai", "devops", "ci-cd", "semantic-kernel", "azure-openai", "automation"]
  
  [project.urls]
  Homepage = "https://technologyworkroom.blogspot.com/2025/06/building-ai-first-devops.html"
  Repository = "https://github.com/Nantero1/ai-first-devops-toolkit"
  Documentation = "https://github.com/Nantero1/ai-first-devops-toolkit"
  "Bug Tracker" = "https://github.com/Nantero1/ai-first-devops-toolkit/issues"
  Source = "https://github.com/Nantero1/ai-first-devops-toolkit"
  Changelog = "https://github.com/Nantero1/ai-first-devops-toolkit/releases"
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [tool.hatch.build.targets.wheel]
  packages = ["llm_ci_runner"]
  
  [project.scripts]
  llm-ci-runner = "llm_ci_runner:cli_main"
  
  [dependency-groups]
  dev = [
      "pytest>=8.0.0",
      "pytest-asyncio>=1.0.0",
      "pytest-mock>=3.14.0",
      "pytest-cov>=5.0.0",
      "respx>=0.21.0",
      "mypy>=1.16.0",
      "ruff>=0.12.0",
      "pip-audit>=2.8.0",
      "build>=1.2.0",
      "twine>=5.0.0",
  ]
  
  [tool.uv]
  # Use system Python instead of managing Python versions
  # python-downloads = "manual"
  # Only install main dependencies by default (no dev dependencies)
  default-groups = []
  
  [tool.ruff]
  line-length = 120
  target-version = "py312"
  
  [tool.ruff.lint]
  select = [
      "E",   # pycodestyle errors
      "W",   # pycodestyle warnings
      "F",   # pyflakes
      "I",   # isort
      "B",   # flake8-bugbear
      "C4",  # flake8-comprehensions
      "UP",  # pyupgrade
  ]
  ignore = [
      "E501",  # line too long, handled by black
      "B008",  # do not perform function calls in argument defaults
  ]
  
  [tool.ruff.format]
  quote-style = "double"
  indent-style = "space"
  skip-magic-trailing-comma = false
  line-ending = "auto"
  
  [tool.pytest.ini_options]
  minversion = "7.0"
  addopts = "-ra -q --strict-markers --cov=llm_ci_runner --cov-report=term-missing --cov-report=xml --cov-report=html --cov-fail-under=85"
  testpaths = [
      "tests",
  ]
  markers = [
      "slow: marks tests as slow (deselect with '-m \"not slow\"')",
      "integration: marks tests as integration tests",
  ]
  
  [tool.coverage.run]
  source = ["llm_ci_runner"]
  branch = true
  relative_files = true
  omit = [
      "*/tests/*",
      "*/test_*",
      "*/__pycache__/*",
      "*/venv/*",
      "*/.*",
      "*/__main__.py",
  ]
  
  [tool.coverage.report]
  precision = 2
  show_missing = true
  skip_covered = false
  exclude_lines = [
      "pragma: no cover",
      "def __repr__",
      "if self.debug:",
      "if settings.DEBUG",
      "raise AssertionError",
      "raise NotImplementedError",
      "if 0:",
      "if __name__ == .__main__.:",
      "class .*\\bProtocol\\):",
      "@(abc\\.)?abstractmethod",
  ]
  
  [tool.mypy]
  python_version = "3.12"
  warn_return_any = true
  warn_unused_configs = true
  disallow_untyped_defs = true
  disallow_incomplete_defs = true
  check_untyped_defs = true
  disallow_untyped_decorators = true
  no_implicit_optional = true
  warn_redundant_casts = true
  warn_unused_ignores = true
  warn_no_return = true
  warn_unreachable = true
  strict_equality = true 
  