diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 712a25c..28df7af 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: jobs: - uv-example: + python: name: python runs-on: ubuntu-latest strategy: @@ -31,8 +31,31 @@ jobs: run: uv python install ${{ matrix.python-version }} - name: Install the project - run: uv sync --all-extras --dev + run: make install-tests - name: Run tests run: | uv run pytest tests + + notebooks: + name: notebooks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + version: "0.7.4" + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: Set up Python + run: uv python install 3.13 + + - name: Install the project + run: make install-test-notebooks + + - name: Run notebooks + run: | + make test-notebooks diff --git a/Makefile b/Makefile index f2e1b59..fed0ed0 100644 --- a/Makefile +++ b/Makefile @@ -3,30 +3,41 @@ SHELL = /bin/bash .PHONY: help help: @echo "Commands:" - @echo "install : install dependencies into virtual environment." - @echo "install-dev : install all, including dev, dependencies into virtual environment for local development." - @echo "update : Install new requriements into the virtual environment." - @echo "test : Run pytests." - @echo "coverage : Run pytest with coverage report" + @echo "install : Install dependencies into virtual environment." + @echo "install-dev : Install all, including dev, dependencies into virtual environment for local development." + @echo "update : Install new requriements into the virtual environment." + @echo "test : Run pytests." + @echo "test-notebooks : Execute all notebooks in nbs/." + @echo "coverage : Run pytest with coverage report" -.PHONY: install -install: +.PHONY: install-tests +install-tests: uv sync +.PHONY: install-test-notebooks +install-test-notebooks: + uv sync --group nb + .PHONY: install-dev install-dev: - uv sync --all-extras --dev && \ + uv sync --all-extras && \ uv run pre-commit install .PHONY: update update: - uv sync --reinstall + uv sync --reinstall --group dev .PHONY: test test: uv run pytest -vx tests +.PHONY: test-notebooks +test-notebooks: + set -e; for notebook in nbs/core/*.ipynb; do \ + uv run jupyter execute --timeout=60 "$$notebook"; \ + done + .PHONY: coverage coverage: uv run pytest --cov=src --cov-report html tests diff --git a/README.md b/README.md index fe32187..8629902 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ * `src/random_tree_models/` -> python implementation of tree algorithms * `tests/` -> unit tests -* `nbs/` -> jupyter notebooks to play with the tree algorithms +* `nbs/` + * `nbs/core` -> core jupyter notebooks to play with the tree algorithms + * `nbs/dev` -> other jupyter notebooks for other activities * `config/` -> requirements.txt ## setup diff --git a/nbs/decision-tree.ipynb b/nbs/core/decision-tree.ipynb similarity index 100% rename from nbs/decision-tree.ipynb rename to nbs/core/decision-tree.ipynb diff --git a/nbs/extra-trees.ipynb b/nbs/core/extra-trees.ipynb similarity index 100% rename from nbs/extra-trees.ipynb rename to nbs/core/extra-trees.ipynb diff --git a/nbs/gradient-boosted-trees.ipynb b/nbs/core/gradient-boosted-trees.ipynb similarity index 100% rename from nbs/gradient-boosted-trees.ipynb rename to nbs/core/gradient-boosted-trees.ipynb diff --git a/nbs/isolation-forest.ipynb b/nbs/core/isolation-forest.ipynb similarity index 100% rename from nbs/isolation-forest.ipynb rename to nbs/core/isolation-forest.ipynb diff --git a/nbs/random-forest.ipynb b/nbs/core/random-forest.ipynb similarity index 100% rename from nbs/random-forest.ipynb rename to nbs/core/random-forest.ipynb diff --git a/nbs/robust-random-cut-forest.ipynb b/nbs/core/robust-random-cut-forest.ipynb similarity index 100% rename from nbs/robust-random-cut-forest.ipynb rename to nbs/core/robust-random-cut-forest.ipynb diff --git a/nbs/xgboost.ipynb b/nbs/core/xgboost.ipynb similarity index 100% rename from nbs/xgboost.ipynb rename to nbs/core/xgboost.ipynb diff --git a/nbs/xgboost-profiling-histogramming-yay-or-nay.ipynb b/nbs/dev/xgboost-profiling-histogramming-yay-or-nay.ipynb similarity index 93% rename from nbs/xgboost-profiling-histogramming-yay-or-nay.ipynb rename to nbs/dev/xgboost-profiling-histogramming-yay-or-nay.ipynb index 9bd8e30..899d2ed 100644 --- a/nbs/xgboost-profiling-histogramming-yay-or-nay.ipynb +++ b/nbs/dev/xgboost-profiling-histogramming-yay-or-nay.ipynb @@ -112,9 +112,7 @@ ") -> pd.DataFrame:\n", " execution_stats = []\n", "\n", - " for n_samples, n_features in itertools.product(\n", - " n_samples_arr, n_features_arr\n", - " ):\n", + " for n_samples, n_features in itertools.product(n_samples_arr, n_features_arr):\n", " X, y = sk_datasets.make_classification(\n", " n_samples=n_samples,\n", " n_features=n_features,\n", @@ -125,9 +123,7 @@ " )\n", " # sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, alpha=0.3);\n", "\n", - " model = xgboost.XGBoostClassifier(\n", - " use_hist=use_hist, n_bins=n_bins, max_depth=4\n", - " )\n", + " model = xgboost.XGBoostClassifier(use_hist=use_hist, n_bins=n_bins, max_depth=4)\n", "\n", " t0 = time.time()\n", " model.fit(X, y)\n", @@ -240,9 +236,7 @@ ")\n", "ax.set(title=\"score\", ylabel=\"score [roc auc]\")\n", "\n", - "plt.suptitle(\n", - " \"Time DecisionTreeClassifier.* took based on n_samples and n_features\"\n", - ")\n", + "plt.suptitle(\"Time DecisionTreeClassifier.* took based on n_samples and n_features\")\n", "plt.tight_layout()" ] }, @@ -315,9 +309,7 @@ ") -> pd.DataFrame:\n", " execution_stats = []\n", "\n", - " for n_samples, n_features in itertools.product(\n", - " n_samples_arr, n_features_arr\n", - " ):\n", + " for n_samples, n_features in itertools.product(n_samples_arr, n_features_arr):\n", " X, y = sk_datasets.make_classification(\n", " n_samples=n_samples,\n", " n_features=n_features,\n", @@ -328,9 +320,7 @@ " )\n", " # sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, alpha=0.3);\n", "\n", - " model = xgboost.XGBoostRegressor(\n", - " use_hist=use_hist, n_bins=n_bins, max_depth=4\n", - " )\n", + " model = xgboost.XGBoostRegressor(use_hist=use_hist, n_bins=n_bins, max_depth=4)\n", "\n", " t0 = time.time()\n", " model.fit(X, y)\n", @@ -444,9 +434,7 @@ ")\n", "ax.set(title=\"score\", ylabel=\"score [mse]\")\n", "\n", - "plt.suptitle(\n", - " \"Time DecisionTreeRegressor.* took based on n_samples and n_features\"\n", - ")\n", + "plt.suptitle(\"Time DecisionTreeRegressor.* took based on n_samples and n_features\")\n", "plt.tight_layout()" ] }, @@ -501,11 +489,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", diff --git a/pyproject.toml b/pyproject.toml index d567a60..494de84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,12 +13,14 @@ dependencies = [ "rich>=13.3.5", "scikit-learn>=1.2.2", "seaborn>=0.12.2", - ] [project.scripts] random-tree-models = "random_tree_models:main" +[tool.uv] +default-groups = ["test"] + [tool.maturin] module-name = "random_tree_models._core" python-packages = ["random_tree_models"] @@ -29,15 +31,19 @@ requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [dependency-groups] -dev = [ +test = [ "pytest>=7.3.1", - "black>=23.3.0", +] +nb = [ "ipywidgets>=8.0.6", - "isort>=5.12.0", "jupyter-contrib-nbextensions>=0.7.0", "jupyterlab>=4.0.0", +] +dev = [ "pre-commit>=3.3.2", "snakeviz>=2.2.0", "pip-audit>=2.9.0", "pytest-cov>=6.2.1", + {include-group = "nb"}, + {include-group = "test"}, ] diff --git a/uv.lock b/uv.lock index ff4a7dc..b5eb83e 100644 --- a/uv.lock +++ b/uv.lock @@ -184,40 +184,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] -[[package]] -name = "black" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419, upload-time = "2025-01-29T05:37:06.642Z" }, - { url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080, upload-time = "2025-01-29T05:37:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886, upload-time = "2025-01-29T04:18:24.432Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404, upload-time = "2025-01-29T04:19:04.296Z" }, - { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" }, - { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" }, - { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" }, - { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, - { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, - { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, - { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, - { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" }, - { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" }, - { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" }, - { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, -] - [[package]] name = "bleach" version = "6.2.0" @@ -401,18 +367,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] -[[package]] -name = "click" -version = "8.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -1050,15 +1004,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, ] -[[package]] -name = "isort" -version = "6.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955, upload-time = "2025-02-26T21:13:16.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186, upload-time = "2025-02-26T21:13:14.911Z" }, -] - [[package]] name = "jedi" version = "0.19.2" @@ -1801,15 +1746,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341, upload-time = "2025-06-13T06:52:27.835Z" }, ] -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - [[package]] name = "nbclient" version = "0.10.2" @@ -2156,15 +2092,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, ] -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, -] - [[package]] name = "pexpect" version = "4.9.0" @@ -2790,9 +2717,7 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "black" }, { name = "ipywidgets" }, - { name = "isort" }, { name = "jupyter-contrib-nbextensions" }, { name = "jupyterlab" }, { name = "pip-audit" }, @@ -2801,6 +2726,14 @@ dev = [ { name = "pytest-cov" }, { name = "snakeviz" }, ] +nb = [ + { name = "ipywidgets" }, + { name = "jupyter-contrib-nbextensions" }, + { name = "jupyterlab" }, +] +test = [ + { name = "pytest" }, +] [package.metadata] requires-dist = [ @@ -2813,9 +2746,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "black", specifier = ">=23.3.0" }, { name = "ipywidgets", specifier = ">=8.0.6" }, - { name = "isort", specifier = ">=5.12.0" }, { name = "jupyter-contrib-nbextensions", specifier = ">=0.7.0" }, { name = "jupyterlab", specifier = ">=4.0.0" }, { name = "pip-audit", specifier = ">=2.9.0" }, @@ -2824,6 +2755,12 @@ dev = [ { name = "pytest-cov", specifier = ">=6.2.1" }, { name = "snakeviz", specifier = ">=2.2.0" }, ] +nb = [ + { name = "ipywidgets", specifier = ">=8.0.6" }, + { name = "jupyter-contrib-nbextensions", specifier = ">=0.7.0" }, + { name = "jupyterlab", specifier = ">=4.0.0" }, +] +test = [{ name = "pytest", specifier = ">=7.3.1" }] [[package]] name = "referencing"