diff --git a/README.md b/README.md index 436ca05b13982951b058034dd1669722c58620bb..ba241d211ae26590d36ca7ec4efe7aed6b5ad089 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,141 @@ You can also find them on this website: http://jobshop.jjvh.nl/ # More Examples For more examples you can have a look at the test files in the `tests` directory. +## Development Setup + +If you want to check out the code and implement new features or fix bugs, you can set up the project as follows: + +### Clone the Repository + +clone the repository in your favorite code editor (for example PyCharm, VSCode, Neovim, etc.) + +using https: +```shell +git clone https://github.com/Alexander-Nasuta/graph-jsp-env +``` +or by using the GitHub CLI: +```shell +gh repo clone Alexander-Nasuta/graph-jsp-env +``` + +if you are using PyCharm, I recommend doing the following additional steps: + +- mark the `src` folder as source root (by right-clicking on the folder and selecting `Mark Directory as` -> `Sources Root`) +- mark the `tests` folder as test root (by right-clicking on the folder and selecting `Mark Directory as` -> `Test Sources Root`) +- mark the `resources` folder as resources root (by right-clicking on the folder and selecting `Mark Directory as` -> `Resources Root`) + +at the end your project structure should look like this: + +todo + +### Create a Virtual Environment (optional) + +Most Developers use a virtual environment to manage the dependencies of their projects. +I personally use `conda` for this purpose. + +When using `conda`, you can create a new environment with the name 'my-graph-jsp-env' following command: + +```shell +conda create -n my-graph-jsp-env python=3.11 +``` + +Feel free to use any other name for the environment or an more recent version of python. +Activate the environment with the following command: + +```shell +conda activate jsp-instance-utils +``` + +Replace `jsp-instance-utils` with the name of your environment, if you used a different name. + +You can also use `venv` or `virtualenv` to create a virtual environment. In that case please refer to the respective documentation. + +### Install the Dependencies + +To install the dependencies for development purposes, run the following command: + +```shell +pip install -r requirements_dev.txt +pip install tox +``` + +The testing package `tox` is not included in the `requirements_dev.txt` file, because it sometimes causes issues when +using github actions. +Github Actions uses an own tox environment (namely 'tox-gh-actions'), which can cause conflicts with the tox environment on your local machine. + +Reference: [Automated Testing in Python with pytest, tox, and GitHub Actions](https://www.youtube.com/watch?v=DhUpxWjOhME). + +### Install the Project in Editable Mode + +To install the project in editable mode, run the following command: + +```shell +pip install -e . +``` + +This will install the project in editable mode, so you can make changes to the code and test them immediately. + +### Run the Tests + +This project uses `pytest` for testing. To run the tests, run the following command: + +```shell +pytest +``` + +For testing with `tox` run the following command: + +```shell +tox +``` + +Tox will run the tests in a separate environment and will also check if the requirements are installed correctly. + +### Building and Publishing the Project to PyPi + +In order to publish the project to PyPi, the project needs to be built and then uploaded to PyPi. + +To build the project, run the following command: + +```shell +python -m build +``` + +It is considered good practice use the tool `twine` for checking the build and uploading the project to PyPi. +By default the build command creates a `dist` folder with the built project files. +To check all the files in the `dist` folder, run the following command: + +```shell +twine check dist/** +``` + +If the check is successful, you can upload the project to PyPi with the following command: + +```shell +twine upload dist/** +``` + +### Documentation +This project uses `sphinx` for generating the documentation. +It also uses a lot of sphinx extensions to make the documentation more readable and interactive. +For example the extension `myst-parser` is used to enable markdown support in the documentation (instead of the usual .rst-files). +It also uses the `sphinx-autobuild` extension to automatically rebuild the documentation when changes are made. +By running the following command, the documentation will be automatically built and served, when changes are made (make sure to run this command in the root directory of the project): + +```shell +sphinx-autobuild ./docs/source/ ./docs/build/html/ +``` + +This project features most of the extensions featured in this Tutorial: [Document Your Scientific Project With Markdown, Sphinx, and Read the Docs | PyData Global 2021](https://www.youtube.com/watch?v=qRSb299awB0). + + + +## Contact + +If you have any questions or feedback, feel free to contact me via [email](mailto:alexander.nasuta@wzl-iqs.rwth-aachen.de) or open an issue on repository. + + + # License Distributed under the MIT License. See `LICENSE.txt` for more information. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d0c3cbf1020d5c292abdedf27627c6abe25e2293 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000000000000000000000000000000000..dc1312ab09ca6fb0267dee6b28a38e69c253631a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css new file mode 100644 index 0000000000000000000000000000000000000000..45dc49150a3c482a77ed5cfedc99d7fb6fadda14 --- /dev/null +++ b/docs/source/_static/custom.css @@ -0,0 +1,23 @@ +:root { + --logo-light: url("_static/logo-light.png"); + --logo-dark: url("_static/logo-dark.png"); +} + + +/* custom_admonitions.css */ +.admonition.custom-tip { + background-color: #e7f4e4; + border-left: 4px solid #4caf50; + padding: 10px; +} + +.admonition.custom-note { + background-color: #e7e4f4; + border-left: 4px solid #4caf50; + padding: 10px; +} + +p.block-mode { + display: block; + white-space: pre-wrap; +} \ No newline at end of file diff --git a/docs/source/_static/logo-light.png b/docs/source/_static/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d352a677689c4bcbe42bfb7ec3a60c355df87c Binary files /dev/null and b/docs/source/_static/logo-light.png differ diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..5b1e595415bec63a290c6deb2364ee60a1e216a0 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,54 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'jsp-instance-utils' +copyright = '2025, Alexander Nasuta' +author = 'Alexander Nasuta' +release = '1.0.2' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "myst_parser", + "sphinx.ext.duration", + "sphinx_copybutton", + + "sphinx.ext.autosectionlabel", + + "sphinx.ext.autosummary", + "sphinx.ext.doctest", + + "sphinx.ext.autodoc", + + "sphinx.ext.napoleon", +] + +templates_path = ['_templates'] +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'furo' +html_title = f"Graph Job Shop Environment" +html_static_path = ['_static'] +html_theme_options = { + "light_logo": "logo-light.png", + "dark_logo": "logo-light.png", +} +html_css_files = [ + 'custom.css', +] + +# Configure autosectionlabel +autosectionlabel_prefix_document = True +autosectionlabel_maxdepth = 2 + +# Exclude specific files +autosectionlabel_exclude_files = ['README.md'] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..5738bd35b0b6abe9e634f8419c2410dbe2092fe2 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,17 @@ +.. jsp-instance-utils documentation master file, created by + sphinx-quickstart on Wed Mar 19 16:40:55 2025. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +jsp-instance-utils documentation +================================ + +Add your content using ``reStructuredText`` syntax. See the +`reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html>`_ +documentation for details. + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + diff --git a/examples/JSSEnv_example.py b/examples/JSSEnv_example.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/examples/graph-jsp-env_example.py b/examples/graph-jsp-env_example.py new file mode 100644 index 0000000000000000000000000000000000000000..35094613377c69e5077e1cf119d87302b244ade1 --- /dev/null +++ b/examples/graph-jsp-env_example.py @@ -0,0 +1,30 @@ +from jsp_instance_utils.instances import ft06, ft06_makespan +from graph_jsp_env.disjunctive_graph_jsp_env import DisjunctiveGraphJspEnv +import numpy as np + + +def main(): + env = DisjunctiveGraphJspEnv( + jps_instance=ft06, + reward_function_parameters={ + "scaling_divisor": ft06_makespan + }, + ) + + done = False + info = {} + while not done: + # get valid action mask. sample expects it to be a numpy array of type int8 + mask = np.array(env.valid_action_mask()).astype(np.int8) + action = env.action_space.sample(mask=mask) + state, reward, terminated, truncated, info = env.step(action) + + done = terminated or truncated + + # console rendering + env.render(show=["gantt_console", "graph_console"]) + print(f"makespan: {info['makespan']}") + + +if __name__ == '__main__': + main() diff --git a/examples/graph-matrix-jsp-env_example.py b/examples/graph-matrix-jsp-env_example.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/examples/kemmerling_example.py b/examples/kemmerling_example.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/examples/or-tools_example.py b/examples/or-tools_example.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pyproject.toml b/pyproject.toml index 1dbc6a1e4f72fce19a13a7d81dd1cdad603cfd22..d51716980abaa561bd8763d69e2a24aa4e43ede8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,25 @@ dev = [ "pytest", "pytest-cov", "tox", - "twine" + "twine", + # for examples + "gym", + "gymnasium", + "JSSEnv", + "graph-jsp-env", + # documentation + "sphinx", + "myst-parser", # .md support for sphinx + "sphinx-autobuild", + # + "furo", # cool theme + "twine", + "sphinx-copybutton", # for code copy buttons + "nbsphinx", # for jupyter notebook support in sphinx + # for converting examples to notebooks + "jupytext", + "notebook", + "typing_extensions>=4.12.0", ] [project.urls] diff --git a/requirements_dev.txt b/requirements_dev.txt index b578fe418db6441f52c1874dbaa0f8399f9a5a8b..bf7b28df2a690efdcf914841681b5146e1843989 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,36 +6,145 @@ # absl-py==2.1.0 # via ortools +alabaster==1.0.0 + # via sphinx +anyio==4.9.0 + # via + # httpx + # jupyter-server + # starlette + # watchfiles +argon2-cffi==23.1.0 + # via jupyter-server +argon2-cffi-bindings==21.2.0 + # via argon2-cffi +arrow==1.3.0 + # via isoduration +asttokens==3.0.0 + # via stack-data +async-lru==2.0.5 + # via jupyterlab +attrs==25.3.0 + # via + # jsonschema + # referencing +babel==2.17.0 + # via + # jupyterlab-server + # sphinx backports-tarfile==1.1.0 # via jaraco-context beautifulsoup4==4.12.3 - # via jsp-instance-utils (pyproject.toml) + # via + # furo + # jsp-instance-utils (pyproject.toml) + # nbconvert +bleach[css]==6.2.0 + # via nbconvert build==1.2.1 # via pip-tools cachetools==5.3.3 # via tox certifi==2024.2.2 - # via requests + # via + # httpcore + # httpx + # requests +cffi==1.17.1 + # via argon2-cffi-bindings chardet==5.2.0 # via tox charset-normalizer==3.3.2 # via requests click==8.1.7 - # via pip-tools + # via + # pip-tools + # uvicorn +cloudpickle==3.1.1 + # via + # gym + # gymnasium +codecov==2.1.13 + # via jssenv colorama==0.4.6 - # via tox + # via + # build + # click + # ipython + # pytest + # sphinx + # sphinx-autobuild + # tox +comm==0.2.2 + # via ipykernel +contourpy==1.3.1 + # via matplotlib coverage[toml]==7.4.4 - # via pytest-cov + # via + # codecov + # pytest-cov +cycler==0.12.1 + # via matplotlib +debugpy==1.8.13 + # via ipykernel +decorator==5.2.1 + # via ipython +defusedxml==0.7.1 + # via nbconvert distlib==0.3.8 # via virtualenv docutils==0.21.1 - # via readme-renderer + # via + # myst-parser + # nbsphinx + # readme-renderer + # sphinx +executing==2.2.0 + # via stack-data +farama-notifications==0.0.4 + # via gymnasium +fastjsonschema==2.21.1 + # via nbformat filelock==3.13.4 # via # tox # virtualenv +fonttools==4.56.0 + # via matplotlib +fqdn==1.5.1 + # via jsonschema +furo==2024.8.6 + # via jsp-instance-utils (pyproject.toml) +graph-jsp-env==1.0.0 + # via jsp-instance-utils (pyproject.toml) +gym==0.26.2 + # via + # jsp-instance-utils (pyproject.toml) + # jssenv +gym-notices==0.0.8 + # via gym +gymnasium==1.1.1 + # via + # graph-jsp-env + # jsp-instance-utils (pyproject.toml) +h11==0.14.0 + # via + # httpcore + # uvicorn +httpcore==1.0.7 + # via httpx +httpx==0.28.1 + # via jupyterlab idna==3.7 - # via requests + # via + # anyio + # httpx + # jsonschema + # requests +imageio==2.37.0 + # via jssenv +imagesize==1.4.1 + # via sphinx immutabledict==4.2.0 # via ortools importlib-metadata==7.1.0 @@ -44,57 +153,248 @@ importlib-metadata==7.1.0 # twine iniconfig==2.0.0 # via pytest +ipykernel==6.29.5 + # via jupyterlab +ipython==9.0.2 + # via ipykernel +ipython-pygments-lexers==1.1.1 + # via ipython +isoduration==20.11.0 + # via jsonschema jaraco-classes==3.4.0 # via keyring jaraco-context==5.3.0 # via keyring jaraco-functools==4.0.0 # via keyring +jedi==0.19.2 + # via ipython +jinja2==3.1.6 + # via + # jupyter-server + # jupyterlab + # jupyterlab-server + # myst-parser + # nbconvert + # nbsphinx + # sphinx +json5==0.10.0 + # via jupyterlab-server +jsonpointer==3.0.0 + # via jsonschema +jsonschema[format-nongpl]==4.23.0 + # via + # jupyter-events + # jupyterlab-server + # nbformat +jsonschema-specifications==2024.10.1 + # via jsonschema +jsp-vis==1.1.0 + # via jsp-instance-utils (pyproject.toml) +jssenv==1.0.2 + # via jsp-instance-utils (pyproject.toml) +jupyter-client==8.6.3 + # via + # ipykernel + # jupyter-server + # nbclient +jupyter-core==5.7.2 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterlab + # nbclient + # nbconvert + # nbformat +jupyter-events==0.12.0 + # via jupyter-server +jupyter-lsp==2.2.5 + # via jupyterlab +jupyter-server==2.15.0 + # via + # jupyter-lsp + # jupyterlab + # jupyterlab-server + # notebook + # notebook-shim +jupyter-server-terminals==0.5.3 + # via jupyter-server +jupyterlab==4.3.6 + # via notebook +jupyterlab-pygments==0.3.0 + # via nbconvert +jupyterlab-server==2.27.3 + # via + # jupyterlab + # notebook +jupytext==1.16.7 + # via jsp-instance-utils (pyproject.toml) +kaleido==0.2.1 + # via + # graph-jsp-env + # jsp-vis + # jssenv keyring==25.1.0 # via twine +kiwisolver==1.4.8 + # via matplotlib markdown-it-py==3.0.0 - # via rich + # via + # jupytext + # mdit-py-plugins + # myst-parser + # rich +markupsafe==3.0.2 + # via + # jinja2 + # nbconvert +matplotlib==3.8.4 + # via + # graph-jsp-env + # jsp-vis +matplotlib-inline==0.1.7 + # via + # ipykernel + # ipython +mdit-py-plugins==0.4.2 + # via + # jupytext + # myst-parser mdurl==0.1.2 # via markdown-it-py +mistune==3.1.2 + # via nbconvert more-itertools==10.2.0 # via # jaraco-classes # jaraco-functools +myst-parser==4.0.1 + # via jsp-instance-utils (pyproject.toml) +narwhals==1.31.0 + # via plotly +nbclient==0.10.2 + # via nbconvert +nbconvert==7.16.6 + # via + # jupyter-server + # nbsphinx +nbformat==5.10.4 + # via + # jupyter-server + # jupytext + # nbclient + # nbconvert + # nbsphinx +nbsphinx==0.9.7 + # via jsp-instance-utils (pyproject.toml) +nest-asyncio==1.6.0 + # via ipykernel +networkx==3.4.2 + # via graph-jsp-env nh3==0.2.17 # via readme-renderer +notebook==7.3.3 + # via jsp-instance-utils (pyproject.toml) +notebook-shim==0.2.4 + # via + # jupyterlab + # notebook numpy==1.26.4 # via + # contourpy + # graph-jsp-env + # gym + # gymnasium + # imageio # jsp-instance-utils (pyproject.toml) + # jsp-vis + # jssenv + # matplotlib + # opencv-python # ortools # pandas +opencv-python==4.11.0.86 + # via + # graph-jsp-env + # jsp-vis ortools==9.9.3963 # via jsp-instance-utils (pyproject.toml) +overrides==7.7.0 + # via jupyter-server packaging==24.0 # via # build + # ipykernel + # jupyter-events + # jupyter-server + # jupyterlab + # jupyterlab-server + # jupytext + # matplotlib + # nbconvert + # plotly # pyproject-api # pytest + # sphinx # tox pandas==2.2.2 - # via ortools + # via + # graph-jsp-env + # jsp-vis + # jssenv + # ortools +pandocfilters==1.5.1 + # via nbconvert +parso==0.8.4 + # via jedi +pillow==11.1.0 + # via + # imageio + # matplotlib pip-tools==7.4.1 # via jsp-instance-utils (pyproject.toml) pkginfo==1.10.0 # via twine platformdirs==4.2.0 # via + # jupyter-core # tox # virtualenv +plotly==6.0.1 + # via + # graph-jsp-env + # jsp-vis + # jssenv pluggy==1.4.0 # via # pytest # tox +prometheus-client==0.21.1 + # via jupyter-server +prompt-toolkit==3.0.50 + # via ipython protobuf==5.26.1 # via ortools +psutil==7.0.0 + # via + # ipykernel + # jssenv +pure-eval==0.2.3 + # via stack-data +pycparser==2.22 + # via cffi pygments==2.17.2 # via + # furo + # ipython + # ipython-pygments-lexers + # nbconvert # readme-renderer # rich + # sphinx +pyparsing==3.2.1 + # via matplotlib pyproject-api==1.6.1 # via tox pyproject-hooks==1.0.0 @@ -104,42 +404,186 @@ pyproject-hooks==1.0.0 pytest==8.1.1 # via # jsp-instance-utils (pyproject.toml) + # jssenv # pytest-cov pytest-cov==5.0.0 # via jsp-instance-utils (pyproject.toml) python-dateutil==2.9.0.post0 - # via pandas + # via + # arrow + # jupyter-client + # matplotlib + # pandas +python-json-logger==3.3.0 + # via jupyter-events pytz==2024.1 # via pandas +pywin32==310 + # via jupyter-core +pywin32-ctypes==0.2.3 + # via keyring +pywinpty==2.0.15 + # via + # jupyter-server + # jupyter-server-terminals + # terminado +pyyaml==6.0.2 + # via + # jupyter-events + # jupytext + # myst-parser +pyzmq==26.3.0 + # via + # ipykernel + # jupyter-client + # jupyter-server readme-renderer==43.0 # via twine +referencing==0.36.2 + # via + # jsonschema + # jsonschema-specifications + # jupyter-events requests==2.31.0 # via + # codecov # jsp-instance-utils (pyproject.toml) + # jssenv + # jupyterlab-server # requests-toolbelt + # sphinx # twine requests-toolbelt==1.0.0 # via twine +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events rfc3986==2.0.0 # via twine +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events rich==13.7.1 - # via twine + # via + # graph-jsp-env + # twine +rpds-py==0.23.1 + # via + # jsonschema + # referencing +send2trash==1.8.3 + # via jupyter-server six==1.16.0 - # via python-dateutil + # via + # python-dateutil + # rfc3339-validator +sniffio==1.3.1 + # via anyio +snowballstemmer==2.2.0 + # via sphinx soupsieve==2.5 # via beautifulsoup4 +sphinx==8.1.3 + # via + # furo + # jsp-instance-utils (pyproject.toml) + # myst-parser + # nbsphinx + # sphinx-autobuild + # sphinx-basic-ng + # sphinx-copybutton +sphinx-autobuild==2024.10.3 + # via jsp-instance-utils (pyproject.toml) +sphinx-basic-ng==1.0.0b2 + # via furo +sphinx-copybutton==0.5.2 + # via jsp-instance-utils (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +stack-data==0.6.3 + # via ipython +starlette==0.46.1 + # via sphinx-autobuild +terminado==0.18.1 + # via + # jupyter-server + # jupyter-server-terminals +tinycss2==1.4.0 + # via bleach +tornado==6.4.2 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterlab + # notebook + # terminado tox==4.14.2 # via jsp-instance-utils (pyproject.toml) +traitlets==5.14.3 + # via + # comm + # ipykernel + # ipython + # jupyter-client + # jupyter-core + # jupyter-events + # jupyter-server + # jupyterlab + # matplotlib-inline + # nbclient + # nbconvert + # nbformat + # nbsphinx twine==5.0.0 # via jsp-instance-utils (pyproject.toml) +types-python-dateutil==2.9.0.20241206 + # via arrow +typing-extensions==4.12.2 + # via + # anyio + # gymnasium + # ipython + # jsp-instance-utils (pyproject.toml) + # referencing tzdata==2024.1 # via pandas +uri-template==1.3.0 + # via jsonschema urllib3==2.2.1 # via # requests # twine +uvicorn==0.34.0 + # via sphinx-autobuild virtualenv==20.25.3 # via tox +watchfiles==1.0.4 + # via sphinx-autobuild +wcwidth==0.2.13 + # via prompt-toolkit +webcolors==24.11.1 + # via jsonschema +webencodings==0.5.1 + # via + # bleach + # tinycss2 +websocket-client==1.8.0 + # via jupyter-server +websockets==15.0.1 + # via sphinx-autobuild wheel==0.43.0 # via pip-tools zipp==3.18.1