content: [build-system]
  build-backend = "mesonpy"
  requires = [
    "meson-python>=0.16.0",
    'ninja',
    # `wheel` is needed for non-isolated builds, given that `meson-python`
    # doesn't list it as a runtime requirement (at least in 0.10.0)
    # See https://github.com/FFY00/meson-python/blob/main/pyproject.toml#L4
    "wheel",
    "setuptools<=65.5",
    "packaging",
    "Cython>=3.0.10",
    "scikit-learn>=1.6.0",
    "scipy>=1.5.0",
    "numpy>=1.25; python_version>='3.9'"
  ]
  
  [project]
  name = "treeple"
  version = "0.10.3"
  description = "Modern decision trees in Python"
  maintainers = [
    {name = "Neurodata", email = "adam.li@columbia.edu"}
  ]
  documentation = "https://treeple.ai"
  repository = "https://github.com/neurodata/treeple"
  readme = "README.md"
  requires-python = ">=3.9"
  classifiers = [
    'Development Status :: 4 - Beta',
    "Intended Audience :: Science/Research",
    "Intended Audience :: Developers",
    "License :: Free for non-commercial use",
    "Programming Language :: C",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    'Programming Language :: Python :: 3.9',
    'Programming Language :: Python :: 3.10',
    'Programming Language :: Python :: 3.11',
    'Programming Language :: Python :: 3.12',
    "Topic :: Scientific/Engineering",
    "Operating System :: Microsoft :: Windows",
    "Operating System :: POSIX :: Linux",
    "Operating System :: POSIX",
    "Operating System :: Unix",
    "Operating System :: MacOS"
  ]
  keywords = ['tree', 'oblique trees', 'manifold-learning', 'scikit-learn']
  include = [
    {path = "meson.build", format = "sdist"}
  ]
  dependencies = [
    'numpy>=1.25.0',
    'scipy>=1.5.0',
    'scikit-learn>=1.6.0'
  ]
  
  [project.optional-dependencies]
  all = [
    'treeple[build]',
    'treeple[doc]',
    'treeple[style]',
    'treeple[test]',
    'treeple[extra]'
  ]
  build = [
    'build',
    'twine',
    'meson',
    'meson-python',
    'spin>=0.12',
    'doit',
    'scikit-learn>=1.6.0',
    'Cython>=3.0.10',
    'ninja',
    'numpy>=1.25.0',
    'rich-click',
    'pydevtool'
  ]
  doc = [
    'memory-profiler',
    'numpydoc',
    'pooch',
    'pydata-sphinx-theme==0.14.1',
    'sphinx==7.2.6',
    'sphinx-copybutton',
    'sphinx-design',
    'sphinx-gallery',
    'sphinx-issues',
    'sphinx_autodoc_typehints',
    'sphinxcontrib-bibtex',
    'portray',
    'matplotlib',
    'ipython',
    'nbsphinx',
    'memory_profiler',
    'pandas',
    'seaborn',
    'joblib'
  ]
  style = [
    "pre-commit",
    'black',
    'codespell',
    'isort',
    'pydocstyle',
    'pydocstyle[toml]',
    'rstcheck',
    'ruff',
    'toml-sort',
    'yamllint',
    'mypy',
    'flake8',
    'bandit',
    'toml',
    'cython-lint'
  ]
  test = [
    'joblib',
    'pandas',
    'pytest',
    'pytest-cov',
    'memory_profiler',
    'flaky',
    'tqdm'
  ]
  extra = [
    'bottleneck'
  ]
  
  [tool.bandit]
  exclude_dirs = ["treeple/tests", "treeple/**/tests/*", 'treeple/_build_utils/*', 'treeple/_lib/*']
  skips = ['B404', 'B603']
  
  [tool.black]
  line-length = 100
  target-version = ['py38']
  include = '\.pyi?$'
  extend-exclude = '''
  (
        __pycache__
      | \.github
      | treeple/_lib
      | .asv
      | env
      | build-install
  )
  '''
  
  [tool.codespell]
  builtin = "clear,rare,informal,names,usage"
  ignore-words = ".codespellignore"
  skip = "doc/references.bib,treeple/_lib/"
  
  [tool.coverage.report]
  exclude_lines = ['pragma: no cover', 'if __name__ == .__main__.:']
  precision = 2
  
  [tool.coverage.run]
  branch = true
  cover_pylib = false
  source = ['treeple']
  omit = ['**/__init__.py', '**/tests/**', 'treeple/_build_utils/*', 'treeple/_lib/*']
  
  [tool.cython-lint]
  # Ignore the same error codes as flake8
  # + E501 (line too long) because keeping it < 88 in cython
  # often makes code less readable.
  ignore = [
    # check ignored by default in flake8. Meaning unclear.
    'E24',
    # space before : (needed for how black formats slicing)
    'E203',
    # line too long
    'E501',
    # do not assign a lambda expression, use a def
    'E731',
    # do not use variables named 'l', 'O', or 'I'
    'E741',
    # line break before binary operator
    'W503',
    # line break after binary operator
    'W504'
  ]
  
  [tool.isort]
  profile = 'black'
  multi_line_output = 3
  line_length = 100
  py_version = 38
  extend_skip_glob = ['treeple/__init__.py', 'treeple/_lib/*', '.asv/*', 'env/*', 'build-install/*']
  
  [tool.mypy]
  ignore_missing_imports = true
  no_site_packages = true
  exclude = [
    'treeple/_lib/',
    'benchmarks_nonasv/'
  ]
  
  [tool.pydocstyle]
  convention = 'numpy'
  ignore-decorators = '(copy_doc|property|.*setter|.*getter)'
  match = '^(?!setup|__init__|test_|_lib).*\.py'
  match-dir = '^treeple*'
  add_ignore = 'D100,D104,D105,D107'
  
  [tool.pytest.ini_options]
  minversion = '6.0'
  addopts = '--durations 20 --junit-xml=junit-results.xml --verbose --ignore=treeple/_lib/ -k "not slowtest"'
  filterwarnings = [
    'ignore:Using sklearn tree so store_leaf_values cannot be set.*'
  ]
  
  [tool.rstcheck]
  ignore_directives = [
    "autoclass",
    "autofunction",
    "automodule",
    "autosummary",
    "bibliography",
    "cssclass",
    "currentmodule",
    "dropdown",
    "footbibliography",
    "glossary",
    "graphviz",
    "grid",
    "highlight",
    "minigallery",
    "rst-class",
    "tab-set",
    "tabularcolumns",
    "toctree",
    "auto_examples"
  ]
  ignore_messages = "^.*(Unknown target name|Undefined substitution referenced)[^`]*$"
  ignore_roles = [
    "attr",
    "class",
    "doc",
    "eq",
    "exc",
    "file",
    "footcite",
    "footcite:t",
    "func",
    "gh",
    "kbd",
    "meth",
    "mod",
    "newcontrib",
    "pr",
    "py:mod",
    "ref",
    "samp",
    "term",
    "doi",
    "arxiv"
  ]
  report_level = "WARNING"
  ignore = ["SEVERE/4"]
  
  [tool.ruff]
  extend-exclude = [
    'benchmarks',
    'doc',
    'validation'
  ]
  line-length = 88
  
  [tool.ruff.lint]
  ignore = ['E731']
  
  [tool.ruff.lint.per-file-ignores]
  '__init__.py' = ['F401']
  
  [tool.spin]
  package = 'treeple'
  
  [tool.spin.commands]
  Build = [
    ".spin/cmds.py:build",
    ".spin/cmds.py:setup_submodule",
    "spin.cmds.meson.test",
    "spin.cmds.pip.install"
  ]
  Environments = [
    'spin.cmds.meson.shell',
    'spin.cmds.meson.ipython',
    'spin.cmds.meson.python'
  ]
  Documentation = [
    'spin.cmds.meson.docs'
  ]
  Metrics = [
    '.spin/cmds.py:coverage',
    '.spin/cmds.py:asv'
  ]
  