content: [build-system]
  requires = ["setuptools>=42", "wheel", "setuptools-git-versioning"]
  build-backend = "setuptools.build_meta"
  
  [project]
  name = "reaction-network"
  description = "Reaction-network is a Python package for synthesis planning and predicting chemical reaction pathways in inorganic materials synthesis."
  readme = "README.md"
  keywords = [
      "reaction",
      "network",
      "computational",
      "graph",
      "inorganic",
      "materials",
      "retrosynthesis",
      "synthesis",
      "planning",
  ]
  license = { text = "modified BSD" }
  authors = [{ name = "Matthew McDermott", email = "mcdermott@berkeley.edu" }]
  dynamic = ["version"]
  classifiers = [
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Intended Audience :: Science/Research",
      "License :: OSI Approved :: BSD License",
      "Operating System :: OS Independent",
      "Topic :: Scientific/Engineering :: Information Analysis",
      "Topic :: Scientific/Engineering :: Physics",
      "Topic :: Scientific/Engineering :: Chemistry",
      "Topic :: Software Development :: Libraries :: Python Modules",
  ]
  requires-python = ">=3.10"
  dependencies = [
      "pymatgen>=2024.11.13",
      "numba>=0.60.0",
      "jobflow>=0.1.18",
      "ray>=2.36.0",
      "rustworkx>=0.15.1",
      "pymongo<=4.10.1", # TODO: remove this temporary fix due to `sort` kwarg required by pymongo>=4.11
  ]
  
  [project.optional-dependencies]
  docs = [
      "autodoc_pydantic==2.0.1",
      "furo==2023.9.10",
      "ipython==8.16.1",
      "myst_parser==2.0.0",
      "nbsphinx==0.9.3",
      "sphinx-copybutton==0.5.2",
      "sphinx==7.2.6",
  ]
  tests = [
      "mp-api==0.45.0",  # required for testing get_entry_set job
      "pytest==8.3.3",
      "pytest-cov==5.0.0",
      "pytest-xdist==3.6.1",
  ]
  strict = [
      "pymatgen==2024.11.13",
      "numba==0.60.0",
      "jobflow==0.1.18",
      "ray==2.36.0",
      "rustworkx==0.15.1",
  ]
  
  [project.urls]
  homepage = "https://materialsproject.github.io/reaction-network/"
  documentation = "https://materialsproject.github.io/reaction-network/"
  repository = "https://github.com/materialsproject/reaction-network"
  changelog = "https://github.com/materialsproject/reaction-network/blob/main/docs/CHANGELOG.md"
  
  [tool.coverage.run]
  include = ["src/*"]
  parallel = true
  branch = false
  
  [tool.coverage.paths]
  source = ["src/"]
  
  [tool.coverage.report]
  show_missing = true
  skip_covered = true
  exclude_also = [
      '\#\s*pragma: no cover',
      '^\s*assert False(,|$)',
      'if typing.TYPE_CHECKING:',
      '^\s*@overload( |$)',
      'if TYPE_CHECKING:',
  ]
  omit = [
      "src/rxn_network/data/nist/generate_janaf_data.py",
      "src/rxn_network/network/visualize.py",
      "src/rxn_network/pathways/plotting.py",
  ]
  
  [tool.ruff]
  target-version = "py310"
  line-length = 120
  extend-exclude = ["*.ipynb", "tests/**"]
  
  [tool.ruff.lint]
  select = [
      "B",      # flake8-bugbear
      "C4",     # flake8-comprehensions
      "D",      # pydocstyle
      "E",      # pycodestyle error
      "EXE",    # flake8-executable
      "F",      # pyflakes
      "FA",     # flake8-future-annotations
      "FBT003", # boolean-positional-value-in-call
      "FLY",    # flynt
      "I",      # isort
      "ICN",    # flake8-import-conventions
      "ISC",    # flake8-implicit-str-concat
      "PD",     # pandas-vet
      "PERF",   # perflint
      "PIE",    # flake8-pie
      "PL",     # pylint
      "PT",     # flake8-pytest-style
      "PYI",    # flakes8-pyi
      "Q",      # flake8-quotes
      "RET",    # flake8-return
      "RSE",    # flake8-raise
      "RUF",    # Ruff-specific rules
      "SIM",    # flake8-simplify
      "SLOT",   # flake8-slots
      "TCH",    # flake8-type-checking
      "TID",    # flake8-tidy-imports
      "UP",     # pyupgrade
      "W",      # pycodestyle warning
      "YTT",    # flake8-2020
  ]
  ignore = [
      "B023",    # Function definition does not bind loop variable
      "B028",    # No explicit stacklevel keyword argument found
      "B904",    # Within an except clause, raise exceptions with ...
      "C408",    # unnecessary-collection-call
      "D105",    # Missing docstring in magic method
      "D205",    # 1 blank line required between summary line and description
      "D212",    # Multi-line docstring summary should start at the first line
      "PD011",   # pandas-use-of-dot-values
      "PD901",   # pandas-df-variable-name
      "PERF203", # try-except-in-loop
      "PERF401", # manual-list-comprehension (TODO fix these or wait for autofix)
      "PLC0206",
      "PLR",     # pylint-refactor
      "PLW2901", # Outer for loop variable overwritten by inner assignment target
      "PT006",   # pytest-parametrize-names-wrong-type
      "PT013",   # pytest-incorrect-pytest-import
      "PYI024",  # collections-named-tuple (TODO should maybe fix these)
      "RUF012",  # Disable checks for mutable class args. This is a non-problem.
      "RUF013",  # implicit-optional
      "SIM105",  # Use contextlib.suppress(OSError) instead of try-except-pass
  ]
  pydocstyle.convention = "google"
  
  [tool.ruff.lint.per-file-ignores]
  "**/schema.py" = ["FA", "TCH", "UP007"]
  
  [tool.mypy]
  ignore_missing_imports = true
  namespace_packages = true
  explicit_package_bases = true
  no_implicit_optional = false
  follow_imports = "skip"
  disable_error_code = "annotation-unchecked"
  
  [tool.pytest]
  addopts = "--durations=10"
  
  [tool.pytest.ini_options]
  addopts = "-n auto"
  
  [tool.setuptools.package-data]
  rxn_network = ["py.typed"]
  
  [tool.setuptools-git-versioning]
  enabled = true
  