content: [build-system]
  requires = ["setuptools >= 42", "versioningit >= 1,< 4", "wheel"]
  build-backend = "setuptools.build_meta"
  
  [project]
  name = "jobflow"
  description = "jobflow is a library for writing computational workflows"
  readme = "README.md"
  keywords = ["high-throughput", "workflow"]
  license = { text = "modified BSD" }
  authors = [{ name = "Alex Ganose", email = "a.ganose@imperial.ac.uk" }]
  dynamic = ["version"]
  classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Intended Audience :: Information Technology",
      "Intended Audience :: Science/Research",
      "Intended Audience :: System Administrators",
      "Operating System :: OS Independent",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Topic :: Database :: Front-Ends",
      "Topic :: Other/Nonlisted Topic",
      "Topic :: Scientific/Engineering",
  ]
  requires-python = ">=3.10"
  dependencies = [
      "PyYAML>=6.0.1",
      "maggma>=0.72.0",
      "monty>=2023.9.25",
      "networkx>=3.2.1",
      "pydantic-settings>=2.0.3",
      "pydantic>=2.4",
      "pydash>=8.0.1",
  ]
  
  [project.optional-dependencies]
  ulid = ["python-ulid"]
  docs = [
      "autodoc_pydantic==2.2.0",
      "furo==2025.9.25",
      "ipython==9.3.0",
      "myst_parser==4.0.1",
      "nbsphinx==0.9.7",
      "sphinx-copybutton==0.5.2",
      "sphinx==8.1.3",
  ]
  dev = ["pre-commit>=2.12.1", "typing_extensions; python_version < '3.11'"]
  tests = ["moto==5.1.14", "pytest-cov==7.0.0", "pytest==8.4.2"]
  vis = ["matplotlib", "pydot"]
  fireworks = ["FireWorks"]
  strict = [
      "FireWorks==2.0.5",
      "PyYAML==6.0.3",
      "maggma==0.72.0",
      "matplotlib==3.10.6",
      "monty==2025.3.3",
      "moto==5.1.14",
      "networkx==3.4.2",
      "pydantic-settings==2.11.0",
      "pydantic==2.11.10",
      "pydash==8.0.5",
      "pydot==4.0.1",
      "python-ulid==3.1.0",
      "typing-extensions==4.15.0",
  ]
  
  [project.urls]
  homepage = "https://materialsproject.github.io/jobflow/"
  repository = "https://github.com/materialsproject/jobflow"
  documentation = "https://materialsproject.github.io/jobflow/"
  changelog = "https://github.com/materialsproject/jobflow/blob/main/CHANGELOG.md"
  
  [tool.setuptools.package-data]
  jobflow = ["py.typed"]
  
  [tool.versioningit.vcs]
  method = "git"
  default-tag = "0.0.1"
  
  [tool.flake8]
  max-line-length = 88
  max-doc-length = 88
  select = "C, E, F, W, B"
  extend-ignore = "E203, W503, E501, F401, RST21"
  min-python-version = "3.10.0"
  docstring-convention = "numpy"
  rst-roles = "class, func, ref, obj"
  
  [tool.mypy]
  ignore_missing_imports = true
  no_strict_optional = true
  
  [tool.pytest.ini_options]
  filterwarnings = [
      "ignore:.*POTCAR.*:UserWarning",
      "ignore:.*input structure.*:UserWarning",
      "ignore:.*is not gzipped.*:UserWarning",
      "ignore:.*magmom.*:UserWarning",
      "ignore::DeprecationWarning",
  ]
  
  [tool.coverage.run]
  include = ["src/*"]
  parallel = true
  branch = true
  
  [tool.coverage.paths]
  source = ["src/"]
  
  [tool.coverage.report]
  skip_covered = true
  show_missing = true
  exclude_lines = [
      '^\s*@overload( |$)',
      '^\s*assert False(,|$)',
      'if TYPE_CHECKING:',
      'if typing.TYPE_CHECKING:',
  ]
  
  [tool.ruff]
  target-version = "py39"
  output-format = "concise"
  
  [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 = [
      "B028",
      "COM812",
      "DTZ005",
      "FBT001",
      "FBT002",
      "ISC001",
      "PLC0415", # import should be at the top-level of a file
      "PLR0911", # too-many-return-statements
      "PLR0912", # too-many-branches
      "PLR0913", # too-many-arguments
      "PLR0915", # too-many-statements
      "PLW0603",
      "PTH",
      "RUF013",
  ]
  pydocstyle.convention = "numpy"
  isort.known-first-party = ["jobflow"]
  
  [tool.ruff.lint.per-file-ignores]
  # F401: unused import
  "__init__.py" = ["F401"]
  # D: pydocstyle
  # PLR2004: magic-value-comparison
  # PT004: pytest-missing-fixture-name-underscore
  
  "**/tests/*" = ["ANN", "ARG001", "D", "PLR2004", "PT004", "S101"]
  "docs/tutorials/*" = ["D", "PLR2004"]
  