content: [build-system]
  requires = ["hatchling>=1.21.0", "hatch-vcs>=0.4.0"]
  build-backend = "hatchling.build"
  
  [project]
  name = "graphtage"
  description = "A utility to diff tree-like files such as JSON and XML."
  readme = "README.md"
  requires-python = ">=3.8"
  license = {text = "LGPL-3.0-or-later"}
  authors = [
      {name = "Trail of Bits"},
  ]
  classifiers = [
      "Development Status :: 4 - Beta",
      "Environment :: Console",
      "Intended Audience :: Science/Research",
      "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
      "Programming Language :: Python :: 3 :: Only",
      "Programming Language :: Python :: 3.8",
      "Programming Language :: Python :: 3.9",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Topic :: Utilities",
  ]
  dependencies = [
      "colorama",
      "fickling>=0.1.3",
      "intervaltree",
      "json5==0.9.5",
      "numpy>=1.19.4",
      "PyYAML",
      "scipy>=1.4.0",
      "tqdm",
      "typing_extensions>=3.7.4.3",
  ]
  dynamic = ["version"]
  
  [project.optional-dependencies]
  dev = [
      "pytest>=7.0.0",
      "ruff>=0.1.0",
      "sphinx>=5.0.0",
      "sphinx_rtd_theme==3.0.2",
      "twine>=4.0.0",
  ]
  
  [project.scripts]
  graphtage = "graphtage.__main__:main"
  
  [project.urls]
  Homepage = "https://github.com/trailofbits/graphtage"
  Documentation = "https://trailofbits.github.io/graphtage"
  Issues = "https://github.com/trailofbits/graphtage/issues"
  Source = "https://github.com/trailofbits/graphtage"
  
  [tool.hatch.version]
  path = "graphtage/version.py"
  
  [tool.hatch.build]
  include = [
      "graphtage/**/*.py",
      "LICENSE",
      "README.md",
  ]
  
  [tool.hatch.build.targets.sdist]
  include = [
      "graphtage/**/*.py",
      "test/**/*.py",
      "LICENSE",
      "README.md",
      "pyproject.toml",
  ]
  
  [tool.hatch.build.targets.wheel]
  packages = ["graphtage"]
  
  [tool.ruff]
  target-version = "py38"
  line-length = 120
  select = [
      "E",     # pycodestyle errors
      "W",     # pycodestyle warnings
      "F",     # pyflakes
      "I",     # isort
      "UP",    # pyupgrade
      "B",     # flake8-bugbear
      "C4",    # flake8-comprehensions
      "SIM",   # flake8-simplify
      "TID",   # flake8-tidy-imports
      "RUF",   # Ruff-specific rules
  ]
  ignore = [
      "E501",  # line too long (handled by formatter)
      "B008",  # do not perform function calls in argument defaults
      "B904",  # raise without from inside except
      "SIM108", # use ternary operator instead of if-else block
  ]
  
  [tool.ruff.per-file-ignores]
  "test/**/*.py" = [
      "F401",  # unused imports in tests
      "F841",  # unused variables in tests
  ]
  
  [tool.ruff.isort]
  known-first-party = ["graphtage"]
  
  [tool.pytest.ini_options]
  testpaths = ["test"]
  python_files = "test_*.py"
  python_classes = "Test*"
  python_functions = "test_*"