diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eb01c5806..ac33357b2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,6 +15,21 @@ on: jobs: + build-package: + name: Build & verify package + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: hynek/build-and-inspect-python-package@v2 + id: baipp + + outputs: + python-versions: ${{ steps.baipp.outputs.supported_python_classifiers_json_array }} + run-tests: name: Run tests for ${{ matrix.os }} on ${{ matrix.python-version }} diff --git a/.gitignore b/.gitignore index d5e3ea27b..f7ba9054e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ src/_pytask/_version.py *.pkl tests/test_jupyter/*.txt +.venv diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e5e222812..ac4020908 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -93,12 +93,6 @@ repos: - id: codespell additional_dependencies: [tomli] exclude: (\.ipynb) -- repo: https://github.com/mgedmin/check-manifest - rev: "0.49" - hooks: - - id: check-manifest - args: [--no-build-isolation] - additional_dependencies: [setuptools-scm, toml, wheel] - repo: meta hooks: - id: check-hooks-apply diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..8531a3b7e --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12.2 diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 1478786a6..e9f6b797f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,7 +3,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.10" + python: "3.12" sphinx: configuration: docs/source/conf.py diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 033b54aa5..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,15 +0,0 @@ -include CITATION -include LICENSE - -recursive-include src *.pyi -recursive-include src py.typed - -exclude .coveragerc -exclude *.yaml -exclude *.yml -exclude tox.ini - -prune docs -prune docs_src -prune scripts -prune tests diff --git a/docs/source/changes.md b/docs/source/changes.md index 34b8abaef..5416f1f0a 100644 --- a/docs/source/changes.md +++ b/docs/source/changes.md @@ -39,6 +39,7 @@ releases are available on [PyPI](https://pypi.org/project/pytask) and - {pull}`593` recreate `PythonNode`s every run since they carry the `_NoDefault` enum as the value whose state is `None`. - {pull}`594` publishes `NodeLoadError`. +- {pull}`596` add project management with rye. ## 0.4.7 - 2024-03-19 diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 5a74fc50a..000000000 --- a/environment.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: pytask - -channels: - - conda-forge - - nodefaults - -dependencies: - - python >=3.8 - - pip - - setuptools_scm - - toml - - # Package dependencies - - attrs >=21.3.0 - - click - - click-default-group - - networkx >=2.4 - - pluggy >=1.3.0 - - optree >=0.9 - - rich - - sqlalchemy >=2 - - tomli >=1.0.0 - - typing_extensions - - universal_pathlib >=0.2.2 - - # Misc - - deepdiff - - ipywidgets - - jupyterlab - - matplotlib - - nbmake - - pygraphviz - - pytest - - pytest-cov - - pytest-xdist - - ruff - - syrupy - - tabulate - - tox-uv - - # Documentation - - furo - - myst-parser - - nbsphinx - - sphinx - - sphinx-click - - sphinx-copybutton - - sphinx-design >=0.3.0 - - sphinx-toolbox - - sphinxext-opengraph - - - pip: - - -e . diff --git a/pyproject.toml b/pyproject.toml index 92efc1d14..5fcd58d4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,3 @@ -[build-system] -build-backend = "setuptools.build_meta" -requires = ["setuptools>=64", "setuptools_scm>=8"] - -[tool.setuptools_scm] -version_file = "src/_pytask/_version.py" - [project] name = "pytask" description = "In its highest aspirations, pytask tries to be pytest as a build system." @@ -90,18 +83,30 @@ Tracker = "https://github.com/pytask-dev/pytask/issues" [project.scripts] pytask = "pytask:cli" -[tool.setuptools] -include-package-data = true -zip-safe = false -platforms = ["unix", "linux", "osx", "win32"] -license-files = ["LICENSE"] +[build-system] +requires = ["hatchling", "hatch_vcs"] +build-backend = "hatchling.build" + +[tool.rye] +managed = true +dev-dependencies = [] + +[tool.hatch.build.hooks.vcs] +version-file = "src/_pytask/_version.py" -[tool.setuptools.package-dir] -"" = "src" +[tool.hatch.build.targets.sdist] +exclude = ["tests"] +only-packages = true -[tool.setuptools.packages.find] -where = ["src"] -namespaces = false +[tool.hatch.build.targets.wheel] +only-include = ["src"] +sources = ["src"] + +[tool.hatch.version] +source = "vcs" + +[tool.hatch.metadata] +allow-direct-references = true [tool.ruff] target-version = "py38" @@ -125,7 +130,6 @@ ignore = [ "SLF001", # access private members. ] - [tool.ruff.lint.per-file-ignores] "src/_pytask/_hashlib.py" = ["ALL"] "src/_pytask/capture.py" = ["PGH003"] @@ -173,7 +177,6 @@ no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true - [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false @@ -193,9 +196,6 @@ skip = "*.js,*/termynal.css" [tool.refurb] python_version = "3.8" -[tool.check-manifest] -ignore = ["src/_pytask/_version.py"] - [tool.coverage.report] exclude_also = [ "pragma: no cover", diff --git a/requirements-dev.lock b/requirements-dev.lock new file mode 100644 index 000000000..6b0a2800c --- /dev/null +++ b/requirements-dev.lock @@ -0,0 +1,368 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: true +# with-sources: false + +-e file:. +aiohttp==3.9.4 + # via pytask +aiosignal==1.3.1 + # via aiohttp +alabaster==0.7.16 + # via sphinx +apeye==1.4.1 + # via sphinx-toolbox +apeye-core==1.1.5 + # via apeye +asttokens==2.4.1 + # via stack-data +attrs==23.2.0 + # via aiohttp + # via jsonschema + # via pytask + # via referencing +autodocsumm==0.2.12 + # via sphinx-toolbox +babel==2.14.0 + # via sphinx +beautifulsoup4==4.12.3 + # via furo + # via nbconvert + # via sphinx-toolbox +bleach==6.1.0 + # via nbconvert +cachecontrol==0.14.0 + # via sphinx-toolbox +certifi==2024.2.2 + # via requests +charset-normalizer==3.3.2 + # via requests +click==8.1.7 + # via click-default-group + # via pytask + # via sphinx-click +click-default-group==1.2.4 + # via pytask +comm==0.2.2 + # via ipykernel +contourpy==1.2.1 + # via matplotlib +coverage==7.4.4 + # via pytest-cov +cssutils==2.10.2 + # via dict2css +cycler==0.12.1 + # via matplotlib +debugpy==1.8.1 + # via ipykernel +decorator==5.1.1 + # via ipython +deepdiff==7.0.1 + # via pytask +defusedxml==0.7.1 + # via nbconvert +dict2css==0.3.0.post1 + # via sphinx-toolbox +docutils==0.20.1 + # via myst-parser + # via nbsphinx + # via sphinx + # via sphinx-click + # via sphinx-prompt + # via sphinx-tabs + # via sphinx-toolbox +domdf-python-tools==3.8.0.post2 + # via apeye + # via apeye-core + # via dict2css + # via sphinx-toolbox +execnet==2.1.1 + # via pytest-xdist +executing==2.0.1 + # via stack-data +fastjsonschema==2.19.1 + # via nbformat +filelock==3.13.4 + # via cachecontrol + # via sphinx-toolbox +fonttools==4.51.0 + # via matplotlib +frozenlist==1.4.1 + # via aiohttp + # via aiosignal +fsspec==2024.3.1 + # via universal-pathlib +furo==2024.1.29 + # via pytask +greenlet==3.0.3 + # via sqlalchemy +html5lib==1.1 + # via sphinx-toolbox +idna==3.7 + # via apeye-core + # via requests + # via yarl +imagesize==1.4.1 + # via sphinx +iniconfig==2.0.0 + # via pytest +ipykernel==6.29.4 + # via nbmake +ipython==8.23.0 + # via ipykernel + # via pytask +jedi==0.19.1 + # via ipython +jinja2==3.1.3 + # via myst-parser + # via nbconvert + # via nbsphinx + # via sphinx + # via sphinx-jinja2-compat +jsonschema==4.21.1 + # via nbformat +jsonschema-specifications==2023.12.1 + # via jsonschema +jupyter-client==8.6.1 + # via ipykernel + # via nbclient +jupyter-core==5.7.2 + # via ipykernel + # via jupyter-client + # via nbconvert + # via nbformat +jupyterlab-pygments==0.3.0 + # via nbconvert +kiwisolver==1.4.5 + # via matplotlib +markdown-it-py==3.0.0 + # via mdit-py-plugins + # via myst-parser + # via rich +markupsafe==2.1.5 + # via jinja2 + # via nbconvert + # via sphinx-jinja2-compat +matplotlib==3.8.4 + # via pytask +matplotlib-inline==0.1.6 + # via ipykernel + # via ipython +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mistune==3.0.2 + # via nbconvert +msgpack==1.0.8 + # via cachecontrol +multidict==6.0.5 + # via aiohttp + # via yarl +myst-parser==2.0.0 + # via pytask +natsort==8.4.0 + # via domdf-python-tools +nbclient==0.6.8 + # via nbconvert + # via nbmake +nbconvert==7.16.3 + # via nbsphinx +nbformat==5.10.4 + # via nbclient + # via nbconvert + # via nbmake + # via nbsphinx +nbmake==1.5.3 + # via pytask +nbsphinx==0.9.3 + # via pytask +nest-asyncio==1.6.0 + # via ipykernel + # via nbclient +networkx==3.3 + # via pytask +numpy==1.26.4 + # via contourpy + # via matplotlib +optree==0.11.0 + # via pytask +ordered-set==4.1.0 + # via deepdiff +packaging==24.0 + # via ipykernel + # via matplotlib + # via nbconvert + # via pytask + # via pytest + # via sphinx +pandocfilters==1.5.1 + # via nbconvert +parso==0.8.4 + # via jedi +pexpect==4.9.0 + # via ipython + # via pytask +pillow==10.3.0 + # via matplotlib +platformdirs==4.2.0 + # via apeye + # via jupyter-core +pluggy==1.4.0 + # via pytask + # via pytest +prompt-toolkit==3.0.43 + # via ipython +psutil==5.9.8 + # via ipykernel +ptyprocess==0.7.0 + # via pexpect +pure-eval==0.2.2 + # via stack-data +pygments==2.17.2 + # via furo + # via ipython + # via nbconvert + # via nbmake + # via rich + # via sphinx + # via sphinx-prompt + # via sphinx-tabs +pyparsing==3.1.2 + # via matplotlib +pytest==8.1.1 + # via nbmake + # via pytask + # via pytest-cov + # via pytest-xdist + # via syrupy +pytest-cov==5.0.0 + # via pytask +pytest-xdist==3.5.0 + # via pytask +python-dateutil==2.9.0.post0 + # via jupyter-client + # via matplotlib +pyyaml==6.0.1 + # via myst-parser +pyzmq==25.1.2 + # via ipykernel + # via jupyter-client +referencing==0.34.0 + # via jsonschema + # via jsonschema-specifications +requests==2.31.0 + # via apeye + # via cachecontrol + # via pytask + # via sphinx +rich==13.7.1 + # via pytask +rpds-py==0.18.0 + # via jsonschema + # via referencing +ruamel-yaml==0.18.6 + # via sphinx-toolbox +ruamel-yaml-clib==0.2.8 + # via ruamel-yaml +six==1.16.0 + # via asttokens + # via bleach + # via html5lib + # via python-dateutil +snowballstemmer==2.2.0 + # via sphinx +soupsieve==2.5 + # via beautifulsoup4 +sphinx==7.2.6 + # via autodocsumm + # via furo + # via myst-parser + # via nbsphinx + # via pytask + # via sphinx-autodoc-typehints + # via sphinx-basic-ng + # via sphinx-click + # via sphinx-copybutton + # via sphinx-design + # via sphinx-prompt + # via sphinx-tabs + # via sphinx-toolbox + # via sphinxext-opengraph +sphinx-autodoc-typehints==2.0.1 + # via sphinx-toolbox +sphinx-basic-ng==1.0.0b2 + # via furo +sphinx-click==5.1.0 + # via pytask +sphinx-copybutton==0.5.2 + # via pytask +sphinx-design==0.5.0 + # via pytask +sphinx-jinja2-compat==0.2.0.post1 + # via sphinx-toolbox +sphinx-prompt==1.8.0 + # via sphinx-toolbox +sphinx-tabs==3.4.5 + # via sphinx-toolbox +sphinx-toolbox==3.5.0 + # via pytask +sphinxcontrib-applehelp==1.0.8 + # via sphinx +sphinxcontrib-devhelp==1.0.6 + # via sphinx +sphinxcontrib-htmlhelp==2.0.5 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.7 + # via sphinx +sphinxcontrib-serializinghtml==1.1.10 + # via sphinx +sphinxext-opengraph==0.9.1 + # via pytask +sqlalchemy==2.0.29 + # via pytask +stack-data==0.6.3 + # via ipython +syrupy==4.6.1 + # via pytask +tabulate==0.9.0 + # via sphinx-toolbox +tinycss2==1.2.1 + # via nbconvert +tornado==6.4 + # via ipykernel + # via jupyter-client +traitlets==5.14.2 + # via comm + # via ipykernel + # via ipython + # via jupyter-client + # via jupyter-core + # via matplotlib-inline + # via nbclient + # via nbconvert + # via nbformat + # via nbsphinx +typing-extensions==4.11.0 + # via domdf-python-tools + # via optree + # via sphinx-toolbox + # via sqlalchemy +universal-pathlib==0.2.2 + # via pytask +urllib3==2.2.1 + # via requests +wcwidth==0.2.13 + # via prompt-toolkit +webencodings==0.5.1 + # via bleach + # via html5lib + # via tinycss2 +yarl==1.9.4 + # via aiohttp diff --git a/requirements.lock b/requirements.lock new file mode 100644 index 000000000..6b0a2800c --- /dev/null +++ b/requirements.lock @@ -0,0 +1,368 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: true +# with-sources: false + +-e file:. +aiohttp==3.9.4 + # via pytask +aiosignal==1.3.1 + # via aiohttp +alabaster==0.7.16 + # via sphinx +apeye==1.4.1 + # via sphinx-toolbox +apeye-core==1.1.5 + # via apeye +asttokens==2.4.1 + # via stack-data +attrs==23.2.0 + # via aiohttp + # via jsonschema + # via pytask + # via referencing +autodocsumm==0.2.12 + # via sphinx-toolbox +babel==2.14.0 + # via sphinx +beautifulsoup4==4.12.3 + # via furo + # via nbconvert + # via sphinx-toolbox +bleach==6.1.0 + # via nbconvert +cachecontrol==0.14.0 + # via sphinx-toolbox +certifi==2024.2.2 + # via requests +charset-normalizer==3.3.2 + # via requests +click==8.1.7 + # via click-default-group + # via pytask + # via sphinx-click +click-default-group==1.2.4 + # via pytask +comm==0.2.2 + # via ipykernel +contourpy==1.2.1 + # via matplotlib +coverage==7.4.4 + # via pytest-cov +cssutils==2.10.2 + # via dict2css +cycler==0.12.1 + # via matplotlib +debugpy==1.8.1 + # via ipykernel +decorator==5.1.1 + # via ipython +deepdiff==7.0.1 + # via pytask +defusedxml==0.7.1 + # via nbconvert +dict2css==0.3.0.post1 + # via sphinx-toolbox +docutils==0.20.1 + # via myst-parser + # via nbsphinx + # via sphinx + # via sphinx-click + # via sphinx-prompt + # via sphinx-tabs + # via sphinx-toolbox +domdf-python-tools==3.8.0.post2 + # via apeye + # via apeye-core + # via dict2css + # via sphinx-toolbox +execnet==2.1.1 + # via pytest-xdist +executing==2.0.1 + # via stack-data +fastjsonschema==2.19.1 + # via nbformat +filelock==3.13.4 + # via cachecontrol + # via sphinx-toolbox +fonttools==4.51.0 + # via matplotlib +frozenlist==1.4.1 + # via aiohttp + # via aiosignal +fsspec==2024.3.1 + # via universal-pathlib +furo==2024.1.29 + # via pytask +greenlet==3.0.3 + # via sqlalchemy +html5lib==1.1 + # via sphinx-toolbox +idna==3.7 + # via apeye-core + # via requests + # via yarl +imagesize==1.4.1 + # via sphinx +iniconfig==2.0.0 + # via pytest +ipykernel==6.29.4 + # via nbmake +ipython==8.23.0 + # via ipykernel + # via pytask +jedi==0.19.1 + # via ipython +jinja2==3.1.3 + # via myst-parser + # via nbconvert + # via nbsphinx + # via sphinx + # via sphinx-jinja2-compat +jsonschema==4.21.1 + # via nbformat +jsonschema-specifications==2023.12.1 + # via jsonschema +jupyter-client==8.6.1 + # via ipykernel + # via nbclient +jupyter-core==5.7.2 + # via ipykernel + # via jupyter-client + # via nbconvert + # via nbformat +jupyterlab-pygments==0.3.0 + # via nbconvert +kiwisolver==1.4.5 + # via matplotlib +markdown-it-py==3.0.0 + # via mdit-py-plugins + # via myst-parser + # via rich +markupsafe==2.1.5 + # via jinja2 + # via nbconvert + # via sphinx-jinja2-compat +matplotlib==3.8.4 + # via pytask +matplotlib-inline==0.1.6 + # via ipykernel + # via ipython +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mistune==3.0.2 + # via nbconvert +msgpack==1.0.8 + # via cachecontrol +multidict==6.0.5 + # via aiohttp + # via yarl +myst-parser==2.0.0 + # via pytask +natsort==8.4.0 + # via domdf-python-tools +nbclient==0.6.8 + # via nbconvert + # via nbmake +nbconvert==7.16.3 + # via nbsphinx +nbformat==5.10.4 + # via nbclient + # via nbconvert + # via nbmake + # via nbsphinx +nbmake==1.5.3 + # via pytask +nbsphinx==0.9.3 + # via pytask +nest-asyncio==1.6.0 + # via ipykernel + # via nbclient +networkx==3.3 + # via pytask +numpy==1.26.4 + # via contourpy + # via matplotlib +optree==0.11.0 + # via pytask +ordered-set==4.1.0 + # via deepdiff +packaging==24.0 + # via ipykernel + # via matplotlib + # via nbconvert + # via pytask + # via pytest + # via sphinx +pandocfilters==1.5.1 + # via nbconvert +parso==0.8.4 + # via jedi +pexpect==4.9.0 + # via ipython + # via pytask +pillow==10.3.0 + # via matplotlib +platformdirs==4.2.0 + # via apeye + # via jupyter-core +pluggy==1.4.0 + # via pytask + # via pytest +prompt-toolkit==3.0.43 + # via ipython +psutil==5.9.8 + # via ipykernel +ptyprocess==0.7.0 + # via pexpect +pure-eval==0.2.2 + # via stack-data +pygments==2.17.2 + # via furo + # via ipython + # via nbconvert + # via nbmake + # via rich + # via sphinx + # via sphinx-prompt + # via sphinx-tabs +pyparsing==3.1.2 + # via matplotlib +pytest==8.1.1 + # via nbmake + # via pytask + # via pytest-cov + # via pytest-xdist + # via syrupy +pytest-cov==5.0.0 + # via pytask +pytest-xdist==3.5.0 + # via pytask +python-dateutil==2.9.0.post0 + # via jupyter-client + # via matplotlib +pyyaml==6.0.1 + # via myst-parser +pyzmq==25.1.2 + # via ipykernel + # via jupyter-client +referencing==0.34.0 + # via jsonschema + # via jsonschema-specifications +requests==2.31.0 + # via apeye + # via cachecontrol + # via pytask + # via sphinx +rich==13.7.1 + # via pytask +rpds-py==0.18.0 + # via jsonschema + # via referencing +ruamel-yaml==0.18.6 + # via sphinx-toolbox +ruamel-yaml-clib==0.2.8 + # via ruamel-yaml +six==1.16.0 + # via asttokens + # via bleach + # via html5lib + # via python-dateutil +snowballstemmer==2.2.0 + # via sphinx +soupsieve==2.5 + # via beautifulsoup4 +sphinx==7.2.6 + # via autodocsumm + # via furo + # via myst-parser + # via nbsphinx + # via pytask + # via sphinx-autodoc-typehints + # via sphinx-basic-ng + # via sphinx-click + # via sphinx-copybutton + # via sphinx-design + # via sphinx-prompt + # via sphinx-tabs + # via sphinx-toolbox + # via sphinxext-opengraph +sphinx-autodoc-typehints==2.0.1 + # via sphinx-toolbox +sphinx-basic-ng==1.0.0b2 + # via furo +sphinx-click==5.1.0 + # via pytask +sphinx-copybutton==0.5.2 + # via pytask +sphinx-design==0.5.0 + # via pytask +sphinx-jinja2-compat==0.2.0.post1 + # via sphinx-toolbox +sphinx-prompt==1.8.0 + # via sphinx-toolbox +sphinx-tabs==3.4.5 + # via sphinx-toolbox +sphinx-toolbox==3.5.0 + # via pytask +sphinxcontrib-applehelp==1.0.8 + # via sphinx +sphinxcontrib-devhelp==1.0.6 + # via sphinx +sphinxcontrib-htmlhelp==2.0.5 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.7 + # via sphinx +sphinxcontrib-serializinghtml==1.1.10 + # via sphinx +sphinxext-opengraph==0.9.1 + # via pytask +sqlalchemy==2.0.29 + # via pytask +stack-data==0.6.3 + # via ipython +syrupy==4.6.1 + # via pytask +tabulate==0.9.0 + # via sphinx-toolbox +tinycss2==1.2.1 + # via nbconvert +tornado==6.4 + # via ipykernel + # via jupyter-client +traitlets==5.14.2 + # via comm + # via ipykernel + # via ipython + # via jupyter-client + # via jupyter-core + # via matplotlib-inline + # via nbclient + # via nbconvert + # via nbformat + # via nbsphinx +typing-extensions==4.11.0 + # via domdf-python-tools + # via optree + # via sphinx-toolbox + # via sqlalchemy +universal-pathlib==0.2.2 + # via pytask +urllib3==2.2.1 + # via requests +wcwidth==0.2.13 + # via prompt-toolkit +webencodings==0.5.1 + # via bleach + # via html5lib + # via tinycss2 +yarl==1.9.4 + # via aiohttp