content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [project]
  name = "typechat"
  dynamic = ["version"]
  description = 'TypeChat is a library that makes it easy to build natural language interfaces using types.'
  readme = "README.md"
  requires-python = ">=3.11"
  license = "MIT"
  keywords = []
  authors = [
    { name = "Microsoft Corporation" },
  ]
  classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
  ]
  dependencies = [
    "pydantic>=2.5.2",
    "pydantic_core>=2.16.3",
    "httpx>=0.27.0",
    "typing_extensions>=4.10.0",
  ]
  
  [project.optional-dependencies]
  # Development-time dependencies.
  dev = [
    "coverage[toml]>=6.5",
    "pytest>=8.0.2",
    "syrupy>=4.6.1",
  ]
  
  # Dependencies for examples.
  examples = [
    "python-dotenv>=1.0.0",
    "spotipy",
  ]
  
  [project.urls]
  Documentation = "https://github.com/microsoft/TypeChat#readme"
  Issues = "https://github.com/microsoft/TypeChat/issues"
  Source = "https://github.com/microsoft/TypeChat"
  
  [tool.hatch.version]
  path = "src/typechat/__about__.py"
  
  [tool.hatch.envs.default]
  # While users can always look up the virtual environment
  # to select the right interpreter for their editor, often editors can
  # automatically pick up on a local `.venv` or at least hint towards using it.
  # The only catch is that this tends to only kick in at the workspace root.
  type = "virtual"
  path = "../.venv"
  
  # Include dependencies from optional-dependencies for
  # development of the core package along with examples.
  features = [
    "dev",
    "examples"
  ]
  
  [tool.hatch.envs.default.scripts]
  test = "pytest {args:tests}"
  test-cov = "coverage run -m pytest {args:tests}"
  cov-report = [
    "- coverage combine",
    "coverage report",
  ]
  cov = [
    "test-cov",
    "cov-report",
  ]
  
  [[tool.hatch.envs.all.matrix]]
  python = ["3.11", "3.12"]
  
  [tool.hatch.envs.lint]
  detached = true
  dependencies = [
    "black>=23.1.0",
    "mypy>=1.0.0",
    "ruff>=0.0.243",
  ]
  [tool.hatch.envs.lint.scripts]
  typing = [
    "npx pyright",
    # mypy should not include tests, as it does not fully support
    # PEP 695 (type aliases, type parameters, etc.)
    # https://github.com/python/mypy/issues/1523895
    "mypy --install-types --non-interactive {args:src/typechat}"
  ]
  style = [
    "ruff {args:.}",
    "black --check --diff {args:.}",
  ]
  fmt = [
    "black {args:.}",
    "ruff --fix {args:.}",
    "style",
  ]
  all = [
    "style",
    "typing",
  ]
  
  [tool.mypy]
  python_version = "3.11"
  untyped_calls_exclude  = ["spotipy"]
  
  [tool.black]
  target-version = ["py311"]
  line-length = 120
  skip-string-normalization = true
  
  [tool.ruff]
  target-version = "py311"
  line-length = 120
  select = [
    "A",
    "ARG",
    "B",
    "C",
    "DTZ",
    "E",
    "EM",
    "F",
    "FBT",
    "I",
    "ICN",
    "ISC",
    "N",
    "PLC",
    "PLE",
    "PLR",
    "PLW",
    "Q",
    "RUF",
    "S",
    "T",
    "TID",
    "UP",
    "W",
    "YTT",
  ]
  ignore = [
    # # Allow non-abstract empty methods in abstract base classes
    # "B027",
    # # Allow boolean positional values in function calls, like `dict.get(... True)`
    # "FBT003",
    # # Ignore checks for possible passwords
    # "S105", "S106", "S107",
    # # Ignore complexity
    # "C901", "PLR0911", "PLR0912", "PLR0913", "PLR0915",
  ]
  unfixable = [
    # # Don't touch unused imports
    # "F401",
  ]
  
  [tool.ruff.isort]
  known-first-party = ["typechat"]
  
  [tool.ruff.flake8-tidy-imports]
  ban-relative-imports = "all"
  
  [tool.ruff.per-file-ignores]
  # Tests can use magic values, assertions, and relative imports
  "tests/**/*" = ["PLR2004", "S101", "TID252"]
  
  [tool.coverage.run]
  source_pkgs = ["typechat", "tests"]
  branch = true
  parallel = true
  omit = [
    "src/typechat/__about__.py",
  ]
  
  [tool.coverage.paths]
  typechat = ["src/typechat", "*/typechat/src/typechat"]
  tests = ["tests", "*/typechat/tests"]
  
  [tool.coverage.report]
  exclude_lines = [
    "no cov",
    "if __name__ == .__main__.:",
    "if TYPE_CHECKING:",
  ]
  