diff --git a/pyproject.toml b/pyproject.toml index c89b8a8..f247509 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,15 +1,126 @@ [build-system] -requires = [ - "setuptools>=42", - "setuptools_scm[toml]>=3.4", - "setuptools_scm_git_archive", - "wheel" +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + + +[project] +name = "zfit_physics" +description = "Physics extension to zfit" +readme = "README.rst" +author = "zfit" +author_email = "zfit@physik.uzh.ch" +maintainer = "zfit" +maintainer_email = "zfit@physik.uzh.ch" +license.file = "LICENSE" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: MacOS", + "Operating System :: Unix", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: Implementation :: CPython", + "Topic :: Scientific/Engineering :: Physics", +] +keywords = ["TensorFlow, model, fitting, scalable, HEP, physics"] + +requires-python = ">=3.9" + +dependencies = ["zfit>=0.20"] +dynamic = ["version"] + +[project.optional-dependencies] +dev = [ + "bumpversion>=0.5.3", + "coverage>=4.5.1", + "flake8>=3.5.0", + "jupyter-sphinx", + "myst-nb", + "numba-stats", + "pip>=9.0.1", + "pre-commit", + "pydata-sphinx-theme>=0.9", # new dark theme configuration + "pytest>=3.4.2", + "pytest-cov", + "pytest-rerunfailures>=6", + "pytest-runner>=2.11.1", + "pytest-xdist", + "seed_intersphinx_mapping", + "setupext-janitor", + "Sphinx>=3.5.4", + "sphinx-autodoc-typehints", + "sphinx-copybutton", + "sphinx-panels", + "sphinx_togglebutton", + "sphinxcontrib-applehelp<1.0.8", # needs sphinx>=0.5, why are we still stuck at <0.5? + "sphinxcontrib-images", + "sphinxcontrib-youtube>=1.0.0,<1.2.0", + "tox>=2.9.1", + "twine>=1.10.0", + "watchdog>=0.8.3", + "wheel>=0.29.0", +] + +[project.urls] +Documentation = "https://zfit-physics.readthedocs.io/en/latest/" +Repository = "https://github.com/zfit/zfit-physics" +"Bug Tracker" = "https://github.com/zfit/zfit-physics/issues" +Discussions = "https://github.com/zfit/zfit-physics/discussions" +Changelog = "https://github.com/zfit/zfit-physics/blob/main/CHANGELOG.rst" + + + + + + + + +[tool.hatch] +version.source = "vcs" +build.hooks.vcs.version-file = "src/zfit_physics/_version.py" + +[tool.pytest.ini_options] +minversion = "6.0" +#addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] +#xfail_strict = true +#filterwarnings = [ +# "error", +#] +log_cli_level = "INFO" +testpaths = [ + "tests", ] -build-backend = "setuptools.build_meta" +[tool.coverage] +run.source = ["zfit_physics"] +report.exclude_also = [ + '\.\.\.', + 'if typing.TYPE_CHECKING:', +] + +[tool.mypy] +files = ["src", "tests"] +python_version = "3.8" +warn_unused_configs = true +strict = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] +warn_unreachable = true +disallow_untyped_defs = false +disallow_incomplete_defs = false + +[[tool.mypy.overrides]] +module = "zfit_pwa.*" +disallow_untyped_defs = true +disallow_incomplete_defs = true [tool.ruff] -#src = ["src"] +src = ["src"] line-length = 120 exclude = [ ".tox/*", @@ -19,41 +130,41 @@ exclude = [ ] [tool.ruff.lint] extend-select = [ - "B", # flake8-bugbear - "I", # isort - "ARG", # flake8-unused-arguments - "C4", # flake8-comprehensions - "EM", # flake8-errmsg - "ICN", # flake8-import-conventions - "G", # flake8-logging-format - "PGH", # pygrep-hooks - "PIE", # flake8-pie - "PL", # pylint - "PT", # flake8-pytest-style - "PTH", # flake8-use-pathlib - "RET", # flake8-return - "RUF", # Ruff-specific - "SIM", # flake8-simplify - "T20", # flake8-print - "UP", # pyupgrade - "YTT", # flake8-2020 - "EXE", # flake8-executable - "NPY", # NumPy specific rules - "PD", # pandas-vet + "B", # flake8-bugbear + "I", # isort + "ARG", # flake8-unused-arguments + "C4", # flake8-comprehensions + "EM", # flake8-errmsg + "ICN", # flake8-import-conventions + "G", # flake8-logging-format + "PGH", # pygrep-hooks + "PIE", # flake8-pie + "PL", # pylint + "PT", # flake8-pytest-style + "PTH", # flake8-use-pathlib + "RET", # flake8-return + "RUF", # Ruff-specific + "SIM", # flake8-simplify + "T20", # flake8-print + "UP", # pyupgrade + "YTT", # flake8-2020 + "EXE", # flake8-executable + "NPY", # NumPy specific rules + "PD", # pandas-vet ] ignore = [ - "UP007", # type annotation upgrade, breaks pydantic for Python 3.9 (remove once above) - "PLR09", # Too many <...> - "PLR2004", # Magic value used in comparison - "ISC001", # Conflicts with formatter - "RET505", # This is sometimes wanted, protets against accidental intendation - "PD901", # "avoid using `df[...].values`" -> no, this is a very good name if there is only one df - "PD011", # "replace `df[...].values` with `df[...].to_numpy()`" -> not yet, it's not deprecated. + "UP007", # type annotation upgrade, breaks pydantic for Python 3.9 (remove once above) + "PLR09", # Too many <...> + "PLR2004", # Magic value used in comparison + "ISC001", # Conflicts with formatter + "RET505", # This is sometimes wanted, protets against accidental intendation + "PD901", # "avoid using `df[...].values`" -> no, this is a very good name if there is only one df + "PD011", # "replace `df[...].values` with `df[...].to_numpy()`" -> not yet, it's not deprecated. # Prefer to have a single way to access the data if we don't care about whether it's a numpy array or not. - "PLW0603", # updating global variables with a function is bad, but we use it for - "PLW2901", # "for loop overwritten by assignment" -> we use this to update the loop variable - "PD013", # "melt over stack": df function, but triggers on tensors - "NPY002", # "Use rnd generator in numpy" -> we use np.random for some legacy stuff but do use the new one where we can + "PLW0603", # updating global variables with a function is bad, but we use it for + "PLW2901", # "for loop overwritten by assignment" -> we use this to update the loop variable + "PD013", # "melt over stack": df function, but triggers on tensors + "NPY002", # "Use rnd generator in numpy" -> we use np.random for some legacy stuff but do use the new one where we can ] isort.required-imports = ["from __future__ import annotations"] @@ -61,3 +172,16 @@ isort.required-imports = ["from __future__ import annotations"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["T20"] "noxfile.py" = ["T20"] + +[tool.pylint] +py-version = "3.8" +ignore-paths = [".*/_version.py"] +reports.output-format = "colorized" +similarities.ignore-imports = "yes" +messages_control.disable = [ + "design", + "fixme", + "line-too-long", + "missing-module-docstring", + "wrong-import-position", +] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 0fde880..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -zfit>=0.20 diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index 423bec5..0000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,28 +0,0 @@ -bumpversion>=0.5.3 -coverage>=4.5.1 -flake8>=3.5.0 -jupyter-sphinx -myst-nb -numba-stats -pip>=9.0.1 -pre-commit -pydata-sphinx-theme>=0.9 # new dark theme configuration -pytest>=3.4.2 -pytest-cov -pytest-rerunfailures>=6 -pytest-runner>=2.11.1 -pytest-xdist -seed_intersphinx_mapping -setupext-janitor -Sphinx>=3.5.4 -sphinx-autodoc-typehints -sphinx-copybutton -sphinx-panels -sphinx_togglebutton -sphinxcontrib-applehelp<1.0.8 # needs sphinx>=0.5, why are we still stuck at <0.5? -sphinxcontrib-images -sphinxcontrib-youtube>=1.0.0,<1.2.0 -tox>=2.9.1 -twine>=1.10.0 -watchdog>=0.8.3 -wheel>=0.29.0 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index c58c207..0000000 --- a/setup.cfg +++ /dev/null @@ -1,61 +0,0 @@ -[metadata] -name = zfit_physics -description = Physics extension to zfit -long_description = file: README.rst -long_description_content_type = text/x-rst -url = https://github.com/zfit/zfit-physics -author = zfit -author_email = zfit@physik.uzh.ch -maintainer = zfit -maintainer_email = zfit@physik.uzh.ch -license = BSD-3-Clause -license_files = LICENSE -classifiers = - Development Status :: 4 - Beta - Intended Audience :: Science/Research - License :: OSI Approved :: BSD License - Natural Language :: English - Operating System :: MacOS - Operating System :: Unix - Programming Language :: Python :: 3 - Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - Programming Language :: Python :: 3.12 - Programming Language :: Python :: Implementation :: CPython - Topic :: Scientific/Engineering :: Physics -keywords = TensorFlow, model, fitting, scalable, HEP, physics - -[options] -python_requires = >=3.9 - -[bdist_wheel] -universal = 1 - -[flake8] -exclude = - docs, - examples, - dist, - building, - build, - legacy, - utils -max-line-length = 120 -statistics = True -max-complexity = 30 - -[aliases] -test = pytest - -[tool:pytest] -collect_ignore = ['setup.py'] - -[isort] -multi_line_output = 3 -include_trailing_comma = True -force_grid_wrap = 0 -use_parentheses = True -ensure_newline_before_comments = True -line_length = 120 diff --git a/setup.py b/setup.py deleted file mode 100644 index 0572597..0000000 --- a/setup.py +++ /dev/null @@ -1,36 +0,0 @@ -"""The setup script.""" - -from __future__ import annotations - -from pathlib import Path - -from setuptools import find_packages, setup - -here = Path(__file__).parent.resolve() -with Path(here / "requirements.txt").open(encoding="utf-8") as requirements_file: - requirements = requirements_file.read().splitlines() - -with Path(here / "requirements_dev.txt").open(encoding="utf-8") as requirements_dev_file: - dev_requirements = requirements_dev_file.read().splitlines() - -with Path(here / "README.rst").open(encoding="utf-8") as readme_file: - readme = readme_file.read() - -setup( - install_requires=requirements, - long_description=readme, - include_package_data=True, - packages=find_packages( - include=[ - "zfit_physics", - "zfit_physics.models", - "zfit_physics.unstable", - "zfit_physics.pyhf", - "zfit_physics.roofit", - ] - ), - test_suite="tests", - extras_require={"dev": dev_requirements}, - use_scm_version=True, - zip_safe=False, -) diff --git a/zfit_physics/__init__.py b/src/zfit_physics/__init__.py similarity index 100% rename from zfit_physics/__init__.py rename to src/zfit_physics/__init__.py diff --git a/zfit_physics/models/__init__.py b/src/zfit_physics/models/__init__.py similarity index 100% rename from zfit_physics/models/__init__.py rename to src/zfit_physics/models/__init__.py diff --git a/zfit_physics/models/pdf_argus.py b/src/zfit_physics/models/pdf_argus.py similarity index 100% rename from zfit_physics/models/pdf_argus.py rename to src/zfit_physics/models/pdf_argus.py diff --git a/zfit_physics/models/pdf_cmsshape.py b/src/zfit_physics/models/pdf_cmsshape.py similarity index 100% rename from zfit_physics/models/pdf_cmsshape.py rename to src/zfit_physics/models/pdf_cmsshape.py diff --git a/zfit_physics/models/pdf_conv.py b/src/zfit_physics/models/pdf_conv.py similarity index 100% rename from zfit_physics/models/pdf_conv.py rename to src/zfit_physics/models/pdf_conv.py diff --git a/zfit_physics/models/pdf_cruijff.py b/src/zfit_physics/models/pdf_cruijff.py similarity index 100% rename from zfit_physics/models/pdf_cruijff.py rename to src/zfit_physics/models/pdf_cruijff.py diff --git a/zfit_physics/models/pdf_erfexp.py b/src/zfit_physics/models/pdf_erfexp.py similarity index 100% rename from zfit_physics/models/pdf_erfexp.py rename to src/zfit_physics/models/pdf_erfexp.py diff --git a/zfit_physics/models/pdf_example.py b/src/zfit_physics/models/pdf_example.py similarity index 100% rename from zfit_physics/models/pdf_example.py rename to src/zfit_physics/models/pdf_example.py diff --git a/zfit_physics/models/pdf_kde.py b/src/zfit_physics/models/pdf_kde.py similarity index 100% rename from zfit_physics/models/pdf_kde.py rename to src/zfit_physics/models/pdf_kde.py diff --git a/zfit_physics/models/pdf_novosibirsk.py b/src/zfit_physics/models/pdf_novosibirsk.py similarity index 100% rename from zfit_physics/models/pdf_novosibirsk.py rename to src/zfit_physics/models/pdf_novosibirsk.py diff --git a/zfit_physics/models/pdf_relbw.py b/src/zfit_physics/models/pdf_relbw.py similarity index 100% rename from zfit_physics/models/pdf_relbw.py rename to src/zfit_physics/models/pdf_relbw.py diff --git a/zfit_physics/models/pdf_tsallis.py b/src/zfit_physics/models/pdf_tsallis.py similarity index 100% rename from zfit_physics/models/pdf_tsallis.py rename to src/zfit_physics/models/pdf_tsallis.py diff --git a/zfit_physics/pdf.py b/src/zfit_physics/pdf.py similarity index 100% rename from zfit_physics/pdf.py rename to src/zfit_physics/pdf.py diff --git a/zfit_physics/unstable/__init__.py b/src/zfit_physics/unstable/__init__.py similarity index 100% rename from zfit_physics/unstable/__init__.py rename to src/zfit_physics/unstable/__init__.py diff --git a/zfit_physics/unstable/pdf.py b/src/zfit_physics/unstable/pdf.py similarity index 100% rename from zfit_physics/unstable/pdf.py rename to src/zfit_physics/unstable/pdf.py