content: [project]
  name = "nonconform"
  dynamic = ["version"]
  description = "Conformal Anomaly Detection"
  authors = [
    { name = "Oliver Hennhoefer", email = "oliver.hennhoefer@mail.de" },
  ]
  maintainers = [
    { name = "Oliver Hennhoefer", email = "oliver.hennhoefer@mail.de" }
  ]
  license = { file = "LICENSE" }
  readme = { file = "docs/README.md", content-type = "text/markdown" }
  keywords = [
      "conformal inference",
      "anomaly detection",
      "uncertainty quantification",
      "false discovery rate",
      "conformal anomaly detection"
  ]
  classifiers = [
      "Programming Language :: Python :: 3.12",
      "License :: OSI Approved :: BSD License",
      "Operating System :: OS Independent",
      "Development Status :: 4 - Beta"
  ]
  requires-python = ">=3.12"
  dependencies = [
      "numpy>=2.2.0,<2.3",
      "pandas>=2.2.1",
      "scikit-learn>=1.5.2,<1.6",
      "pyod==2.0.5",
      "scipy>=1.13.0",
      "tqdm>=4.66.2",
      "ruff>=0.12.9",
      "pre-commit>=4.3.0",
  ]
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [tool.hatch.version]
  path = "nonconform/__init__.py"
  
  [project.optional-dependencies]
  data = [
      "pyarrow>=16.1.0",
  ]
  dev = [
      "ruff",
      "pre-commit",
      "twine",
      "build",
      "mkdocs",
      "mkdocs-material[imaging]",
      "mkdocstrings[python]"
  ]
  deep = [
      "torch>=2.7.0"
  ]
  fdr = [
      "online-fdr>=0.0.3"
  ]
  docs = [
      "mkdocs",
      "mkdocs-material[imaging]",
      "mkdocstrings[python]"
  ]
  all = [
      "nonconform[data,dev,docs,deep,fdr]"
  ]
  
  [project.urls]
  "Homepage" = "https://github.com/OliverHennhoefer/nonconform"
  "Bugs" = "https://github.com/OliverHennhoefer/nonconform/issues"
  
  
  [tool.ruff]
  line-length = 88
  target-version = "py312"
  src = [
      "nonconform", # Specify your source directory explicitly
      "tests",  # Add your tests directory
      "examples", # Add your examples directory
      "."       # For files in root like pyproject.toml, conf.py if not in a subdir
  ]
  include = [
      "*.py",
      "*.pyi",
      "*.ipynb",
      "pyproject.toml", # Ruff can lint pyproject.toml
      "*.md" # Add Markdown files
  ]
  exclude = [
      "**/*.md",
      "paper.bib",
      ".bzr",
      ".direnv",
      ".eggs",
      ".git",
      ".git-rewrite",
      ".hg",
      ".ipynb_checkpoints",
      ".mypy_cache",
      ".nox",
      ".pants.d",
      ".pyenv",
      ".pytest_cache",
      ".pytype",
      ".ruff_cache",
      ".svn",
      ".tox",
      ".venv",
      "__pypackages__",
      "_build",
      "buck-out",
      "build",
      "dist",
      "node_modules",
      "site-packages",
      "venv",
      "docs/build", # Exclude Sphinx build output
      "docs/source/api", # Exclude autoapi generated files from direct linting by Ruff
                         # as their source is Python docstrings.
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "nonconform/estimation/conformal.py" = [
      "E402" # Module level import not at top of file
  ]
  "nonconform/estimation/weighted_conformal.py" = [
      "E402" # Module level import not at top of file
  ]
  "docs/source/conf.py" = [
      "D100", # Missing docstring in public module
      "E402"  # Module level import not at top of file (sys.path.insert)
  ]
  "examples/**/*.py" = [ # Allow more relaxed rules for examples
      "D100", "D103", "D101", "D102", "D104", "D105", "D107",
      "E501" # Line too long, common in example plots/data
  ]
  "tests/**/*.py" = [ # Allow more relaxed rules for tests
      "D100", "D101", "D102", "D103", "D104", "D107",
      "S101" # assert allowed in tests
  ]
  
  
  [tool.ruff.lint]
  select = [
      "E",  # pycodestyle errors
      "F",  # Pyflakes
      "W",  # pycodestyle warnings
      "I",  # isort (import order)
      "D",  # pydocstyle (docstrings)
      "UP", # pyupgrade (modernize Python code)
      "N",  # pep8-naming
      "Q",  # flake8-quotes
      "RUF",# Ruff-specific rules (includes some for Markdown, e.g. RUF200 for bad header increases)
      "NPY" # NumPy-specific rules, for idiomatic NumPy code
  ]
  ignore = [
      "D100", # Missing docstring in public module (can be noisy initially)
      "D104", # Missing docstring in public package (for __init__.py files)
      "D107", # Missing docstring in __init__
      "D203", # 1 blank line required before class docstring (conflicts with D211)
      "D212", # Multi-line docstring summary should start at the first line
      "D213", # Multi-line docstring summary should start at the second line (conflicts with D212, pick one or use formatter)
      "D402", # First line of docstring should not be the function's signature
      "D415", # Ends in ".", "?", "!" (can be too strict)
  ]
  fixable = [
      "ALL"
  ]
  unfixable = []
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.format]
  quote-style = "double"
  indent-style = "space"
  skip-magic-trailing-comma = false
  line-ending = "auto"
  docstring-code-format = true
  docstring-code-line-length = "dynamic"
  