content: [project]
  name = "vendetect"
  dynamic = ["version"]
  description = "Command-line tool for automatically detecting vendored and copy/pasted code"
  readme = "README.md"
  license = { file = "LICENSE" }
  authors = [
      { name = "Trail of Bits", email = "opensource@trailofbits.com" },
  ]
  classifiers = [
      "Programming Language :: Python :: 3",
      "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
  ]
  dependencies = [
      "copydetect>=0.5.0",
      "rich>=14.0.0",
  ]
  requires-python = ">=3.11"
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [tool.hatch.version]
  path = "src/vendetect/__init__.py"
  
  [tool.hatch.build.targets.wheel]
  packages = ["src/vendetect"]
  
  [tool.hatch.build.targets.sdist]
  include = [
      "/Makefile",
      "/test",
      "/src",
      "/LICENSE",
      "/README.md"
  ]
  
  [tool.setuptools.dynamic]
  version = { attr = "vendetect.__version__" }
  
  [dependency-groups]
  doc = ["pdoc"]
  test = ["pytest", "pytest-cov", "pretend", "coverage[toml]"]
  lint = [
      # NOTE: ruff is under active development, so we pin conservatively here
      # and let Dependabot periodically perform this update.
      "ruff ~= 0.12.3",
      "mypy >= 1.0",
      "types-html5lib",
      "types-requests",
      "types-toml",
  ]
  dev = [
      {include-group = "doc"},
      {include-group = "test"},
      {include-group = "lint"},
      "twine",
      "build"
  ]
  
  [project.scripts]
  "vendetect" = "vendetect._cli:main"
  
  [project.urls]
  Homepage = "https://pypi.org/project/vendetect"
  Documentation = "https://trailofbits.github.io/vendetect/"
  Issues = "https://github.com/trailofbits/vendetect/issues"
  Source = "https://github.com/trailofbits/vendetect"
  
  [tool.coverage.run]
  # don't attempt code coverage for the CLI entrypoints
  omit = ["src/vendetect/_cli.py"]
  
  [tool.mypy]
  mypy_path = "src"
  packages = "vendetect"
  allow_redefinition = true
  check_untyped_defs = true
  disallow_incomplete_defs = true
  disallow_untyped_defs = true
  ignore_missing_imports = true
  no_implicit_optional = true
  show_error_codes = true
  sqlite_cache = true
  strict_equality = true
  warn_no_return = true
  warn_redundant_casts = true
  warn_return_any = true
  warn_unreachable = true
  warn_unused_configs = true
  warn_unused_ignores = true
  
  [tool.ruff]
  line-length = 120
  include = ["src/**/*.py", "test/**/*.py"]
  
  [tool.ruff.lint]
  select = ["ALL"]
  # D203 and D213 are incompatible with D211 and D212 respectively.
  # COM812 and ISC001 can cause conflicts when using ruff as a formatter.
  # See https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules.
  ignore = ["ANN001", "ANN204", "D100", "D101", "D102", "D103", "D105", "D107", "D203", "D213", "COM812", "ISC001", "PGH003", "PT009"]
  
  [tool.ruff.lint.per-file-ignores]
  "src/vendetect/_cli.py" = [
      "T201", # allow `print` in cli module
  ]
  "test/**/*.py" = [
      "D",    # no docstrings in tests
      "S101", # asserts are expected in tests
  ]
  