diff --git a/pyproject.toml b/pyproject.toml index 90cf32389..bc9fca341 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,82 @@ -# For more information about this pyproject.toml file, see -# PEP 518: https://www.python.org/dev/peps/pep-0518/ +################################################################################ +# PEP 621 Project Metadata # +################################################################################ + +# see https://peps.python.org/pep-0621/ + +[project] +name = "probnum" +description = "Probabilistic Numerics in Python." +readme = "README.md" +requires-python = ">=3.8,<3.11" +license = {file = "LICENSE.txt"} +keywords = [ + "probabilistic-numerics", + "machine-learning", + "numerical-methods", +] +classifiers = [ + "Development Status :: 4 - Beta", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", +] +dependencies = [ + "numpy>=1.20", "numpy>=1.21.3; python_version>='3.10'", + "scipy>=1.4", "scipy>=1.8.0; python_version>='3.10'", +] +dynamic = [ + "version", + "optional-dependencies", +] + +# TODO (pypa/setuptools#3221): Optional dependencies that reference one another +# don't seem to be supported yet. Migrate the optional dependencies in `setup.py` +# here, once this is supported. +# [project.optional-dependencies] +# ... +# full = [ +# "%(jax)s", +# "%(zoo)s", +# "%(pls_calib)s", +# ] + +[project.urls] +homepage = "https://probnum.readthedocs.io/en/stable/" +github = "https://github.com/probabilistic-numerics/probnum" +documentation = "https://probnum.readthedocs.io/en/stable/" +benchmarks = "https://probabilistic-numerics.github.io/probnum-benchmarks/benchmarks/" + +################################################################################ +# PEP 518 Build System Configuration # +################################################################################ + +# see https://peps.python.org/pep-0518/ [build-system] requires = [ - "setuptools>=42", + "setuptools>=61", "wheel", "setuptools_scm[toml]>=6.0", ] build-backend = "setuptools.build_meta" +# see https://setuptools.pypa.io/en/stable/userguide/pyproject_config.html#setuptools-specific-configuration + +[tool.setuptools] +platforms = [ + "any", +] +zip-safe = false +packages = ["probnum"] +package-dir = { "" = "src" } +include-package-data = true + +[tool.setuptools.dynamic] +version = { attr = "probnum._version.version" } + [tool.setuptools_scm] local_scheme = "dirty-tag" write_to = "src/probnum/_version.py" @@ -20,7 +88,13 @@ write_to_template = """ version = \"{version}\" """ -# PyTest configuration +################################################################################ +# Testing Configuration # +################################################################################ + +# see https://docs.pytest.org/en/stable/reference/customize.html +# see https://docs.pytest.org/en/stable/reference/reference.html#ini-options-ref + [tool.pytest.ini_options] addopts = [ "--verbose", @@ -44,28 +118,22 @@ filterwarnings = [ "ignore:the imp module is deprecated in favour of importlib.*:DeprecationWarning:flatbuffers.*" ] +################################################################################ +# Linting Configuration # +################################################################################ -# Configuration of the black code style checker -# For more information about Black's usage of this file, see -# https://github.com/psf/black#pyprojecttoml -[tool.black] -include = '\.pyi?$' -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | _build - | buck-out - | build - | dist -)/ -''' +[tool.pylint.master] +extension-pkg-whitelist = [ + "numpy", +] +load-plugins = [ + "pylint.extensions.check_elif", + "pylint.extensions.docparams", + "pylint.extensions.docstyle", + "pylint.extensions.overlapping_exceptions", + "pylint.extensions.mccabe", +] -# Pylint configuration [tool.pylint.messages_control] disable = [ # Exceptions suggested by Black: @@ -84,18 +152,6 @@ disable = [ [tool.pylint.format] max-line-length = "88" -[tool.pylint.master] -extension-pkg-whitelist = [ - "numpy", -] -load-plugins = [ - "pylint.extensions.check_elif", - "pylint.extensions.docparams", - "pylint.extensions.docstyle", - "pylint.extensions.overlapping_exceptions", - "pylint.extensions.mccabe", -] - [tool.pylint.design] max-args = 10 max-complexity = 14 @@ -104,12 +160,31 @@ max-locals = 20 [tool.pylint.similarities] ignore-imports = "yes" -# isort configuration +################################################################################ +# Formatting Configuration # +################################################################################ + +# see https://black.readthedocs.io/en/stable/usage_and_configuration/index.html + +[tool.black] +include = '\.pyi?$' +# If `exclude` is not set, `black` excludes all files listed in `.gitignore`. +# The following option extends this list of ignored files. +# see https://black.readthedocs.io/en/stable/usage_and_configuration/file_collection_and_discovery.html#gitignore +extend-exclude = ''' +# A regex preceded with ^/ will apply only to files and directories in the root +# of the project. +/( + \.git + | \.hg +)/ +''' + +# see https://pycqa.github.io/isort/docs/configuration/config_files.html +# see https://pycqa.github.io/isort/docs/configuration/options.html + [tool.isort] -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -line_length = 88 +# see https://pycqa.github.io/isort/docs/configuration/profiles.html#black +profile = "black" combine_as_imports = true force_sort_within_sections = true diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8fcf3e78c..000000000 --- a/requirements.txt +++ /dev/null @@ -1,16 +0,0 @@ -# ============================================================================= -# DEPRECATION WARNING: -# -# This file exists purely for convenience so that requirements can be easily -# installed with -# -# pip install -r requirements.txt -# -# and so that they show up on GitHub. Requirements of the package are -# specified in setup.cfg. Currently parsing of requirements.txt files is not -# supported by setup.cfg. -# -# If you make changes here, make sure to edit setup.cfg as well! -# ============================================================================= -numpy>=1.20 -scipy>=1.4 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 22a92cf53..000000000 --- a/setup.cfg +++ /dev/null @@ -1,102 +0,0 @@ -# This file is used to configure your project. -# Read more about the various options under: -# http://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files - -[metadata] -name = probnum -description = Probabilistic Numerics in Python. -url = https://github.com/probabilistic-numerics/probnum -author = ProbNum Authors -author_email = -license = MIT -long_description = file: README.md -long_description_content_type = text/markdown -keywords = probabilistic-numerics, machine-learning, numerical-methods -# Change if running only on Windows, Mac or Linux (comma-separated) -platforms = any -# Add here all kinds of additional classifiers as defined under -# https://pypi.python.org/pypi?%3Aaction=list_classifiers -classifiers = - Development Status :: 4 - Beta - License :: OSI Approved :: MIT License - Operating System :: OS Independent - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - -[options] -zip_safe = False -packages = find: -include_package_data = True -setup_requires = - setuptools_scm -package_dir = - =src -# Dependencies of the project (semicolon/line-separated): -install_requires = - numpy>=1.20 - numpy>=1.21.3; python_version>="3.10" - scipy>=1.4 - scipy>=1.8.0; python_version>="3.10" -# The usage of test_requires is discouraged, see `Dependency Management` docs -# tests_require = pytest; pytest-cov -# Require a specific Python version, e.g. Python 2.7 or >= 3.6 -python_requires = >=3.8,<3.11 - -[options.packages.find] -where = src -exclude = - tests - -[options.extras_require] -# Add here additional requirements for extra features, to install with: -# `pip install probnum[PDF]` like: -# PDF = ReportLab; RXP - -# Autodiff backends -jax = - jax[cpu]<0.3.5; platform_system!="Windows" - -# Problem zoo dependencies -zoo = - %(jax)s - tqdm>=4.0 - requests>=2.0 - -# Calibration in the probabilistic linear solver -pls_calib = - GPy - # GPy can't be imported without matplotlib. - # This is and should not be a ProbNum dependency. - matplotlib - -# Full installation -full = - %(jax)s - %(zoo)s - %(pls_calib)s - -[options.entry_points] -# Add here console scripts like: -# console_scripts = -# script_name = probnum.module:function -# For example: -# console_scripts = -# fibonacci = probnum.skeleton:run - -[test] -# py.test options when running `python setup.py test` -# addopts = --verbose -extras = True - -[aliases] -dists = bdist_wheel - -[bdist_wheel] -# Use this option if your package is pure-python -universal = 1 - -[build_sphinx] -source_dir = docs -build_dir = build/sphinx -warning-is-error = 1 diff --git a/setup.py b/setup.py index 38ffa7532..3a02420e4 100644 --- a/setup.py +++ b/setup.py @@ -5,5 +5,28 @@ """ from setuptools import setup +# TODO (pypa/setuptools#3221): Migrate this to `[project.optional-dependencies]` in +# `pyproject.toml`, once optional dependencies defined there can reference one another +extras_require = dict() +extras_require["jax"] = [ + "jax[cpu]<0.3.5; platform_system!='Windows'", +] +extras_require["zoo"] = [ + "tqdm>=4.0", + "requests>=2.0", +] + extras_require["jax"] +extras_require["pls_calib"] = [ + "GPy", + # GPy can't be imported without matplotlib. + # This is and should not be a ProbNum dependency. + "matplotlib", +] +extras_require["full"] = ( + extras_require["jax"] + extras_require["zoo"] + extras_require["pls_calib"] +) + + if __name__ == "__main__": - setup() + setup( + extras_require=extras_require, + )