From 86be1a02343c4335a79b4ad16b5489bdbfed1afd Mon Sep 17 00:00:00 2001 From: bloodearnest Date: Fri, 24 Nov 2023 15:39:57 +0000 Subject: [PATCH] Add documentation rendering of package versions This can be enhanced as needed, but the basic versions and tooling is there. Jinja2 is installed in the images, so we re-use the images themselves to render the template. --- Dockerfile | 3 +- justfile | 6 ++ scripts/.render.py.swp | Bin 0 -> 12288 bytes scripts/packages.j2.md | 12 +++ scripts/render.py | 24 +++++ v1/packages.md | 148 ++++++++++++++++++++++++++++++ v2/packages.md | 200 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 scripts/.render.py.swp create mode 100644 scripts/packages.j2.md create mode 100755 scripts/render.py create mode 100644 v1/packages.md create mode 100644 v2/packages.md diff --git a/Dockerfile b/Dockerfile index 5ccef52..7e3eec0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,8 +16,9 @@ RUN mkdir /workspace WORKDIR /workspace ARG MAJOR_VERSION +ARG BASE # ACTION_EXEC sets the default executable for the entrypoint in the base-docker image -ENV ACTION_EXEC=python MAJOR_VERSION=${MAJOR_VERSION} +ENV ACTION_EXEC=python MAJOR_VERSION=${MAJOR_VERSION} BASE=${BASE} COPY ${MAJOR_VERSION}/dependencies.txt /root/dependencies.txt # use space efficient utility from base image diff --git a/justfile b/justfile index 5b4bb6a..cdcf479 100644 --- a/justfile +++ b/justfile @@ -19,6 +19,12 @@ test version *args="tests -v": (build version) # run pip-compile to add new dependencies, or update existing ones with --upgrade update version *args="": (build version) docker-compose --env-file {{ version }}/env run --rm -v $PWD:/workspace base pip-compile {{ args }} {{ version }}/requirements.in -o {{ version }}/requirements.txt + {{ just_executable() }} render {{ version }} + + +# render package version information +render version *args: + docker-compose --env-file {{ version }}/env run --rm -v $PWD:/workspace python ./scripts/render.py {{ args }} > {{ version }}/packages.md # run linters diff --git a/scripts/.render.py.swp b/scripts/.render.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..e5a15ef32eaae2a9504e29c759bb8756903da2ac GIT binary patch literal 12288 zcmeI2O=}ZD7{{NgC!s18#N%{&*_38CFIsD%hbYljZ4(-;NC|P1Op{5Iopol?Hi-BM zyz7V1gXqDV;L)q12fv1QpG|gUTd*E_Dm(*!CiA?{?-q8NxvjNzw&WH7*Cl|DpPz~= zzk4u)N3E2N%>P^0bAG;6xOweHzFj;n*4tNl*Mxpcc&4RgXpN^u&=%SaN5|!nj|dQf z6A~EOo$S&y6bt!WRB4XSvdc4%PFR%Ei2xBG0z`la5CI}U1c(3;I86j>I0Y|p;4|^i zSL1!^$Q~bQBLYN#2oM1xKm>>Y5g-CYfCvx)B0vOAApyS)us99y9u-K%V-D*VlkuYhAe$G7XL0nt+RZP$q-Gt6T=?RV{g zkh0g(2n1Xwm(hzVh)6`^p{J7qyW=&=1B2hsTfHIpW#TYQTCj==lXE z2cgn7U1EV9O$Lag4#7{12rc=k%%paR7wpSsQarjZ%*}d3qrIjKylCodjfErIRY8$u LA2Znrlos#@Aq?|_ literal 0 HcmV?d00001 diff --git a/scripts/packages.j2.md b/scripts/packages.j2.md new file mode 100644 index 0000000..e9dd3e1 --- /dev/null +++ b/scripts/packages.j2.md @@ -0,0 +1,12 @@ +# Package Versions for {{ MAJOR_VERSION }} + +This python:{{ MAJOR_VERSION }} OpenSAFELY image is based on Ubuntu {{ BASE }} with Python {{ PYTHON_VERSION }}. + +## Packages + +It comes pre-installed with a standard set of python packages. + +{% for pkg in PACKAGES -%} + - [{{ pkg | replace("==", ": ")}}](https://pypi.org/project/{{pkg.name}}/{{pkg.specs[0][1]}}/) +{% endfor -%} + diff --git a/scripts/render.py b/scripts/render.py new file mode 100755 index 0000000..f036bfe --- /dev/null +++ b/scripts/render.py @@ -0,0 +1,24 @@ +#!/usr/bin/env -S python3 -W ignore +from pathlib import Path +import os +import sys +import pkg_resources + +from jinja2 import Environment, FileSystemLoader +env = Environment(loader=FileSystemLoader("scripts")) + +version = os.environ["MAJOR_VERSION"] +requirements = Path(version) / "requirements.txt" + +context = { + "MAJOR_VERSION": version, + "BASE": os.environ["BASE"], + "PYTHON_VERSION": "{}.{}.{}".format(*sys.version_info), +} + +with requirements.open() as r: + context["PACKAGES"] = list(pkg_resources.parse_requirements(r)) + +template = env.get_template("packages.j2.md") + +print(template.render(**context)) diff --git a/v1/packages.md b/v1/packages.md new file mode 100644 index 0000000..ea0f6a7 --- /dev/null +++ b/v1/packages.md @@ -0,0 +1,148 @@ +# Package Versions for v1 + +> [!NOTE] +> This file is auto-generated - do not edit. + +This python:v1 OpenSAFELY image is based on Ubuntu 20.04 with Python 3.8.10. + +## Packages + +It comes pre-installed with a standard set of python packages. + +- [astor: 0.8.1](https://pypi.org/project/astor/0.8.1/) +- [attrs: 19.3.0](https://pypi.org/project/attrs/19.3.0/) +- [autograd: 1.3](https://pypi.org/project/autograd/1.3/) +- [autograd-gamma: 0.5.0](https://pypi.org/project/autograd-gamma/0.5.0/) +- [backcall: 0.1.0](https://pypi.org/project/backcall/0.1.0/) +- [bash-kernel: 0.7.2](https://pypi.org/project/bash-kernel/0.7.2/) +- [bleach: 3.1.2](https://pypi.org/project/bleach/3.1.2/) +- [cachetools: 4.0.0](https://pypi.org/project/cachetools/4.0.0/) +- [cairocffi: 1.4.0](https://pypi.org/project/cairocffi/1.4.0/) +- [cairosvg: 2.5.2](https://pypi.org/project/cairosvg/2.5.2/) +- [certifi: 2019.11.28](https://pypi.org/project/certifi/2019.11.28/) +- [cffi: 1.15.1](https://pypi.org/project/cffi/1.15.1/) +- [chardet: 3.0.4](https://pypi.org/project/chardet/3.0.4/) +- [click: 7.0](https://pypi.org/project/click/7.0/) +- [click-plugins: 1.1.1](https://pypi.org/project/click-plugins/1.1.1/) +- [cligj: 0.5.0](https://pypi.org/project/cligj/0.5.0/) +- [coverage: 4.5.4](https://pypi.org/project/coverage/4.5.4/) +- [cssselect2: 0.7.0](https://pypi.org/project/cssselect2/0.7.0/) +- [cycler: 0.10.0](https://pypi.org/project/cycler/0.10.0/) +- [decorator: 4.4.1](https://pypi.org/project/decorator/4.4.1/) +- [defusedxml: 0.6.0](https://pypi.org/project/defusedxml/0.6.0/) +- [descartes: 1.1.0](https://pypi.org/project/descartes/1.1.0/) +- [ebmdatalab: 0.0.30](https://pypi.org/project/ebmdatalab/0.0.30/) +- [entrypoints: 0.3](https://pypi.org/project/entrypoints/0.3/) +- [fiona: 1.8.13](https://pypi.org/project/fiona/1.8.13/) +- [formulaic: 0.2.4](https://pypi.org/project/formulaic/0.2.4/) +- [future: 0.18.2](https://pypi.org/project/future/0.18.2/) +- [geopandas: 0.6.3](https://pypi.org/project/geopandas/0.6.3/) +- [google-api-core: 1.16.0](https://pypi.org/project/google-api-core/1.16.0/) +- [google-auth: 1.11.0](https://pypi.org/project/google-auth/1.11.0/) +- [google-auth-oauthlib: 0.4.1](https://pypi.org/project/google-auth-oauthlib/0.4.1/) +- [google-cloud-bigquery: 1.24.0](https://pypi.org/project/google-cloud-bigquery/1.24.0/) +- [google-cloud-core: 1.3.0](https://pypi.org/project/google-cloud-core/1.3.0/) +- [google-resumable-media: 0.5.0](https://pypi.org/project/google-resumable-media/0.5.0/) +- [googleapis-common-protos: 1.51.0](https://pypi.org/project/googleapis-common-protos/1.51.0/) +- [idna: 2.8](https://pypi.org/project/idna/2.8/) +- [interface-meta: 1.2.4](https://pypi.org/project/interface-meta/1.2.4/) +- [ipykernel: 5.1.4](https://pypi.org/project/ipykernel/5.1.4/) +- [ipython: 7.12.0](https://pypi.org/project/ipython/7.12.0/) +- [ipython-genutils: 0.2.0](https://pypi.org/project/ipython-genutils/0.2.0/) +- [ipywidgets: 7.5.1](https://pypi.org/project/ipywidgets/7.5.1/) +- [jedi: 0.16.0](https://pypi.org/project/jedi/0.16.0/) +- [jinja2: 2.11.1](https://pypi.org/project/jinja2/2.11.1/) +- [joblib: 1.0.1](https://pypi.org/project/joblib/1.0.1/) +- [json5: 0.9.0](https://pypi.org/project/json5/0.9.0/) +- [jsonschema: 3.2.0](https://pypi.org/project/jsonschema/3.2.0/) +- [jupyter: 1.0.0](https://pypi.org/project/jupyter/1.0.0/) +- [jupyter-client: 5.3.4](https://pypi.org/project/jupyter-client/5.3.4/) +- [jupyter-console: 6.1.0](https://pypi.org/project/jupyter-console/6.1.0/) +- [jupyter-core: 4.6.1](https://pypi.org/project/jupyter-core/4.6.1/) +- [jupyterlab: 1.2.6](https://pypi.org/project/jupyterlab/1.2.6/) +- [jupyterlab-server: 1.0.6](https://pypi.org/project/jupyterlab-server/1.0.6/) +- [jupytext: 1.3.3](https://pypi.org/project/jupytext/1.3.3/) +- [kaleido: 0.2.1](https://pypi.org/project/kaleido/0.2.1/) +- [kiwisolver: 1.1.0](https://pypi.org/project/kiwisolver/1.1.0/) +- [lifelines: 0.26.4](https://pypi.org/project/lifelines/0.26.4/) +- [llvmlite: 0.34.0](https://pypi.org/project/llvmlite/0.34.0/) +- [lz4: 3.1.3](https://pypi.org/project/lz4/3.1.3/) +- [markupsafe: 1.1.1](https://pypi.org/project/markupsafe/1.1.1/) +- [matplotlib: 3.1.3](https://pypi.org/project/matplotlib/3.1.3/) +- [mistune: 0.8.4](https://pypi.org/project/mistune/0.8.4/) +- [more-itertools: 8.2.0](https://pypi.org/project/more-itertools/8.2.0/) +- [munch: 2.5.0](https://pypi.org/project/munch/2.5.0/) +- [nbconvert: 5.6.1](https://pypi.org/project/nbconvert/5.6.1/) +- [nbformat: 5.0.4](https://pypi.org/project/nbformat/5.0.4/) +- [nbval: 0.9.4](https://pypi.org/project/nbval/0.9.4/) +- [notebook: 6.0.3](https://pypi.org/project/notebook/6.0.3/) +- [numba: 0.51.2](https://pypi.org/project/numba/0.51.2/) +- [numpy: 1.18.1](https://pypi.org/project/numpy/1.18.1/) +- [oauthlib: 3.1.0](https://pypi.org/project/oauthlib/3.1.0/) +- [opensafely-cohort-extractor: 1.88.0](https://pypi.org/project/opensafely-cohort-extractor/1.88.0/) +- [opensafely-matching: 0.2.0](https://pypi.org/project/opensafely-matching/0.2.0/) +- [packaging: 20.1](https://pypi.org/project/packaging/20.1/) +- [pandas: 1.0.1](https://pypi.org/project/pandas/1.0.1/) +- [pandas-gbq: 0.13.0](https://pypi.org/project/pandas-gbq/0.13.0/) +- [pandocfilters: 1.4.2](https://pypi.org/project/pandocfilters/1.4.2/) +- [parso: 0.6.1](https://pypi.org/project/parso/0.6.1/) +- [patsy: 0.5.1](https://pypi.org/project/patsy/0.5.1/) +- [pep517: 0.10.0](https://pypi.org/project/pep517/0.10.0/) +- [pexpect: 4.8.0](https://pypi.org/project/pexpect/4.8.0/) +- [pickleshare: 0.7.5](https://pypi.org/project/pickleshare/0.7.5/) +- [pillow: 8.1.0](https://pypi.org/project/pillow/8.1.0/) +- [pip-tools: 6.2.0](https://pypi.org/project/pip-tools/6.2.0/) +- [plotly: 4.5.0](https://pypi.org/project/plotly/4.5.0/) +- [pluggy: 0.13.1](https://pypi.org/project/pluggy/0.13.1/) +- [prometheus-client: 0.7.1](https://pypi.org/project/prometheus-client/0.7.1/) +- [prompt-toolkit: 3.0.3](https://pypi.org/project/prompt-toolkit/3.0.3/) +- [protobuf: 3.11.3](https://pypi.org/project/protobuf/3.11.3/) +- [ptyprocess: 0.6.0](https://pypi.org/project/ptyprocess/0.6.0/) +- [py: 1.8.1](https://pypi.org/project/py/1.8.1/) +- [pyarrow: 3.0.0](https://pypi.org/project/pyarrow/3.0.0/) +- [pyasn1: 0.4.8](https://pypi.org/project/pyasn1/0.4.8/) +- [pyasn1-modules: 0.2.8](https://pypi.org/project/pyasn1-modules/0.2.8/) +- [pycparser: 2.21](https://pypi.org/project/pycparser/2.21/) +- [pydata-google-auth: 0.3.0](https://pypi.org/project/pydata-google-auth/0.3.0/) +- [pygments: 2.5.2](https://pypi.org/project/pygments/2.5.2/) +- [pyparsing: 2.4.6](https://pypi.org/project/pyparsing/2.4.6/) +- [pyproj: 2.4.2.post1](https://pypi.org/project/pyproj/2.4.2.post1/) +- [pyrsistent: 0.15.7](https://pypi.org/project/pyrsistent/0.15.7/) +- [pytest: 5.3.5](https://pypi.org/project/pytest/5.3.5/) +- [python-dateutil: 2.8.1](https://pypi.org/project/python-dateutil/2.8.1/) +- [pytz: 2019.3](https://pypi.org/project/pytz/2019.3/) +- [pyyaml: 5.3](https://pypi.org/project/pyyaml/5.3/) +- [pyzmq: 18.1.1](https://pypi.org/project/pyzmq/18.1.1/) +- [qtconsole: 4.6.0](https://pypi.org/project/qtconsole/4.6.0/) +- [requests: 2.22.0](https://pypi.org/project/requests/2.22.0/) +- [requests-oauthlib: 1.3.0](https://pypi.org/project/requests-oauthlib/1.3.0/) +- [retry: 0.9.2](https://pypi.org/project/retry/0.9.2/) +- [retrying: 1.3.3](https://pypi.org/project/retrying/1.3.3/) +- [rsa: 4.0](https://pypi.org/project/rsa/4.0/) +- [scikit-learn: 0.24.1](https://pypi.org/project/scikit-learn/0.24.1/) +- [scipy: 1.4.1](https://pypi.org/project/scipy/1.4.1/) +- [seaborn: 0.10.0](https://pypi.org/project/seaborn/0.10.0/) +- [send2trash: 1.5.0](https://pypi.org/project/send2trash/1.5.0/) +- [shapely: 1.7.0](https://pypi.org/project/shapely/1.7.0/) +- [six: 1.14.0](https://pypi.org/project/six/1.14.0/) +- [sqlparse: 0.4.1](https://pypi.org/project/sqlparse/0.4.1/) +- [statsmodels: 0.11.0](https://pypi.org/project/statsmodels/0.11.0/) +- [structlog: 20.2.0](https://pypi.org/project/structlog/20.2.0/) +- [tabulate: 0.8.7](https://pypi.org/project/tabulate/0.8.7/) +- [terminado: 0.8.3](https://pypi.org/project/terminado/0.8.3/) +- [testpath: 0.4.4](https://pypi.org/project/testpath/0.4.4/) +- [threadpoolctl: 2.1.0](https://pypi.org/project/threadpoolctl/2.1.0/) +- [tinycss2: 1.2.1](https://pypi.org/project/tinycss2/1.2.1/) +- [toml: 0.10.2](https://pypi.org/project/toml/0.10.2/) +- [tornado: 6.0.3](https://pypi.org/project/tornado/6.0.3/) +- [tqdm: 4.42.1](https://pypi.org/project/tqdm/4.42.1/) +- [traitlets: 4.3.3](https://pypi.org/project/traitlets/4.3.3/) +- [upsetplot: 0.6.1](https://pypi.org/project/upsetplot/0.6.1/) +- [urllib3: 1.25.8](https://pypi.org/project/urllib3/1.25.8/) +- [venn: 0.1.3](https://pypi.org/project/venn/0.1.3/) +- [wcwidth: 0.1.8](https://pypi.org/project/wcwidth/0.1.8/) +- [webencodings: 0.5.1](https://pypi.org/project/webencodings/0.5.1/) +- [wheel: 0.36.2](https://pypi.org/project/wheel/0.36.2/) +- [widgetsnbextension: 3.5.1](https://pypi.org/project/widgetsnbextension/3.5.1/) +- [wrapt: 1.13.3](https://pypi.org/project/wrapt/1.13.3/) + diff --git a/v2/packages.md b/v2/packages.md new file mode 100644 index 0000000..61176a1 --- /dev/null +++ b/v2/packages.md @@ -0,0 +1,200 @@ +# Package Versions for v2 + +> [!NOTE] +> This file is auto-generated - do not edit. + +This python:v2 OpenSAFELY image is based on Ubuntu 22.04 with Python 3.10.12. + +## Packages + +It comes pre-installed with a standard set of python packages. + +- [anyio: 4.0.0](https://pypi.org/project/anyio/4.0.0/) +- [argon2-cffi: 23.1.0](https://pypi.org/project/argon2-cffi/23.1.0/) +- [argon2-cffi-bindings: 21.2.0](https://pypi.org/project/argon2-cffi-bindings/21.2.0/) +- [arrow: 1.3.0](https://pypi.org/project/arrow/1.3.0/) +- [astor: 0.8.1](https://pypi.org/project/astor/0.8.1/) +- [asttokens: 2.4.1](https://pypi.org/project/asttokens/2.4.1/) +- [async-lru: 2.0.4](https://pypi.org/project/async-lru/2.0.4/) +- [attrs: 23.1.0](https://pypi.org/project/attrs/23.1.0/) +- [autograd: 1.6.2](https://pypi.org/project/autograd/1.6.2/) +- [autograd-gamma: 0.5.0](https://pypi.org/project/autograd-gamma/0.5.0/) +- [babel: 2.13.1](https://pypi.org/project/babel/2.13.1/) +- [bash-kernel: 0.9.1](https://pypi.org/project/bash-kernel/0.9.1/) +- [beautifulsoup4: 4.12.2](https://pypi.org/project/beautifulsoup4/4.12.2/) +- [bleach: 6.1.0](https://pypi.org/project/bleach/6.1.0/) +- [build: 1.0.3](https://pypi.org/project/build/1.0.3/) +- [cachetools: 5.3.2](https://pypi.org/project/cachetools/5.3.2/) +- [cairocffi: 1.6.1](https://pypi.org/project/cairocffi/1.6.1/) +- [cairosvg: 2.7.1](https://pypi.org/project/cairosvg/2.7.1/) +- [certifi: 2023.11.17](https://pypi.org/project/certifi/2023.11.17/) +- [cffi: 1.16.0](https://pypi.org/project/cffi/1.16.0/) +- [charset-normalizer: 3.3.2](https://pypi.org/project/charset-normalizer/3.3.2/) +- [click: 8.1.7](https://pypi.org/project/click/8.1.7/) +- [click-plugins: 1.1.1](https://pypi.org/project/click-plugins/1.1.1/) +- [cligj: 0.7.2](https://pypi.org/project/cligj/0.7.2/) +- [comm: 0.2.0](https://pypi.org/project/comm/0.2.0/) +- [contourpy: 1.2.0](https://pypi.org/project/contourpy/1.2.0/) +- [coverage: 7.3.2](https://pypi.org/project/coverage/7.3.2/) +- [cssselect2: 0.7.0](https://pypi.org/project/cssselect2/0.7.0/) +- [cycler: 0.12.1](https://pypi.org/project/cycler/0.12.1/) +- [db-dtypes: 1.1.1](https://pypi.org/project/db-dtypes/1.1.1/) +- [debugpy: 1.8.0](https://pypi.org/project/debugpy/1.8.0/) +- [decorator: 5.1.1](https://pypi.org/project/decorator/5.1.1/) +- [defusedxml: 0.7.1](https://pypi.org/project/defusedxml/0.7.1/) +- [descartes: 1.1.0](https://pypi.org/project/descartes/1.1.0/) +- [ebmdatalab: 0.0.30](https://pypi.org/project/ebmdatalab/0.0.30/) +- [exceptiongroup: 1.2.0](https://pypi.org/project/exceptiongroup/1.2.0/) +- [executing: 2.0.1](https://pypi.org/project/executing/2.0.1/) +- [fastjsonschema: 2.19.0](https://pypi.org/project/fastjsonschema/2.19.0/) +- [fiona: 1.9.5](https://pypi.org/project/fiona/1.9.5/) +- [fonttools: 4.45.0](https://pypi.org/project/fonttools/4.45.0/) +- [formulaic: 0.6.6](https://pypi.org/project/formulaic/0.6.6/) +- [fqdn: 1.5.1](https://pypi.org/project/fqdn/1.5.1/) +- [future: 0.18.3](https://pypi.org/project/future/0.18.3/) +- [geopandas: 0.14.1](https://pypi.org/project/geopandas/0.14.1/) +- [google-api-core[grpc]: 2.14.0](https://pypi.org/project/google-api-core/2.14.0/) +- [google-auth: 2.23.4](https://pypi.org/project/google-auth/2.23.4/) +- [google-auth-oauthlib: 1.1.0](https://pypi.org/project/google-auth-oauthlib/1.1.0/) +- [google-cloud-bigquery: 3.13.0](https://pypi.org/project/google-cloud-bigquery/3.13.0/) +- [google-cloud-bigquery-storage: 2.22.0](https://pypi.org/project/google-cloud-bigquery-storage/2.22.0/) +- [google-cloud-core: 2.3.3](https://pypi.org/project/google-cloud-core/2.3.3/) +- [google-crc32c: 1.5.0](https://pypi.org/project/google-crc32c/1.5.0/) +- [google-resumable-media: 2.6.0](https://pypi.org/project/google-resumable-media/2.6.0/) +- [googleapis-common-protos: 1.61.0](https://pypi.org/project/googleapis-common-protos/1.61.0/) +- [grpcio: 1.59.3](https://pypi.org/project/grpcio/1.59.3/) +- [grpcio-status: 1.59.3](https://pypi.org/project/grpcio-status/1.59.3/) +- [idna: 3.4](https://pypi.org/project/idna/3.4/) +- [iniconfig: 2.0.0](https://pypi.org/project/iniconfig/2.0.0/) +- [interface-meta: 1.3.0](https://pypi.org/project/interface-meta/1.3.0/) +- [ipykernel: 6.27.0](https://pypi.org/project/ipykernel/6.27.0/) +- [ipython: 8.17.2](https://pypi.org/project/ipython/8.17.2/) +- [ipywidgets: 8.1.1](https://pypi.org/project/ipywidgets/8.1.1/) +- [isoduration: 20.11.0](https://pypi.org/project/isoduration/20.11.0/) +- [jedi: 0.19.1](https://pypi.org/project/jedi/0.19.1/) +- [jinja2: 3.1.2](https://pypi.org/project/jinja2/3.1.2/) +- [joblib: 1.3.2](https://pypi.org/project/joblib/1.3.2/) +- [json5: 0.9.14](https://pypi.org/project/json5/0.9.14/) +- [jsonpointer: 2.4](https://pypi.org/project/jsonpointer/2.4/) +- [jsonschema[format-nongpl]: 4.20.0](https://pypi.org/project/jsonschema/4.20.0/) +- [jsonschema-specifications: 2023.11.1](https://pypi.org/project/jsonschema-specifications/2023.11.1/) +- [jupyter: 1.0.0](https://pypi.org/project/jupyter/1.0.0/) +- [jupyter-client: 8.6.0](https://pypi.org/project/jupyter-client/8.6.0/) +- [jupyter-console: 6.6.3](https://pypi.org/project/jupyter-console/6.6.3/) +- [jupyter-core: 5.5.0](https://pypi.org/project/jupyter-core/5.5.0/) +- [jupyter-events: 0.9.0](https://pypi.org/project/jupyter-events/0.9.0/) +- [jupyter-lsp: 2.2.0](https://pypi.org/project/jupyter-lsp/2.2.0/) +- [jupyter-server: 2.11.0](https://pypi.org/project/jupyter-server/2.11.0/) +- [jupyter-server-terminals: 0.4.4](https://pypi.org/project/jupyter-server-terminals/0.4.4/) +- [jupyterlab: 4.0.9](https://pypi.org/project/jupyterlab/4.0.9/) +- [jupyterlab-pygments: 0.2.2](https://pypi.org/project/jupyterlab-pygments/0.2.2/) +- [jupyterlab-server: 2.25.2](https://pypi.org/project/jupyterlab-server/2.25.2/) +- [jupyterlab-widgets: 3.0.9](https://pypi.org/project/jupyterlab-widgets/3.0.9/) +- [jupytext: 1.15.2](https://pypi.org/project/jupytext/1.15.2/) +- [kaleido: 0.2.1](https://pypi.org/project/kaleido/0.2.1/) +- [kiwisolver: 1.4.5](https://pypi.org/project/kiwisolver/1.4.5/) +- [lifelines: 0.27.8](https://pypi.org/project/lifelines/0.27.8/) +- [llvmlite: 0.41.1](https://pypi.org/project/llvmlite/0.41.1/) +- [lz4: 4.3.2](https://pypi.org/project/lz4/4.3.2/) +- [markdown-it-py: 3.0.0](https://pypi.org/project/markdown-it-py/3.0.0/) +- [markupsafe: 2.1.3](https://pypi.org/project/markupsafe/2.1.3/) +- [matplotlib: 3.8.2](https://pypi.org/project/matplotlib/3.8.2/) +- [matplotlib-inline: 0.1.6](https://pypi.org/project/matplotlib-inline/0.1.6/) +- [mdit-py-plugins: 0.4.0](https://pypi.org/project/mdit-py-plugins/0.4.0/) +- [mdurl: 0.1.2](https://pypi.org/project/mdurl/0.1.2/) +- [mistune: 3.0.2](https://pypi.org/project/mistune/3.0.2/) +- [nbclient: 0.9.0](https://pypi.org/project/nbclient/0.9.0/) +- [nbconvert: 7.11.0](https://pypi.org/project/nbconvert/7.11.0/) +- [nbformat: 5.9.2](https://pypi.org/project/nbformat/5.9.2/) +- [nbval: 0.10.0](https://pypi.org/project/nbval/0.10.0/) +- [nest-asyncio: 1.5.8](https://pypi.org/project/nest-asyncio/1.5.8/) +- [notebook: 7.0.6](https://pypi.org/project/notebook/7.0.6/) +- [notebook-shim: 0.2.3](https://pypi.org/project/notebook-shim/0.2.3/) +- [numba: 0.58.1](https://pypi.org/project/numba/0.58.1/) +- [numpy: 1.26.2](https://pypi.org/project/numpy/1.26.2/) +- [oauthlib: 3.2.2](https://pypi.org/project/oauthlib/3.2.2/) +- [opensafely-cohort-extractor: 1.90.0](https://pypi.org/project/opensafely-cohort-extractor/1.90.0/) +- [opensafely-matching: 0.2.0](https://pypi.org/project/opensafely-matching/0.2.0/) +- [overrides: 7.4.0](https://pypi.org/project/overrides/7.4.0/) +- [packaging: 23.2](https://pypi.org/project/packaging/23.2/) +- [pandas: 2.1.3](https://pypi.org/project/pandas/2.1.3/) +- [pandas-gbq: 0.19.2](https://pypi.org/project/pandas-gbq/0.19.2/) +- [pandocfilters: 1.5.0](https://pypi.org/project/pandocfilters/1.5.0/) +- [parso: 0.8.3](https://pypi.org/project/parso/0.8.3/) +- [patsy: 0.5.3](https://pypi.org/project/patsy/0.5.3/) +- [pexpect: 4.8.0](https://pypi.org/project/pexpect/4.8.0/) +- [pillow: 10.1.0](https://pypi.org/project/pillow/10.1.0/) +- [pip-tools: 7.3.0](https://pypi.org/project/pip-tools/7.3.0/) +- [platformdirs: 4.0.0](https://pypi.org/project/platformdirs/4.0.0/) +- [plotly: 5.18.0](https://pypi.org/project/plotly/5.18.0/) +- [pluggy: 1.3.0](https://pypi.org/project/pluggy/1.3.0/) +- [prometheus-client: 0.19.0](https://pypi.org/project/prometheus-client/0.19.0/) +- [prompt-toolkit: 3.0.41](https://pypi.org/project/prompt-toolkit/3.0.41/) +- [proto-plus: 1.22.3](https://pypi.org/project/proto-plus/1.22.3/) +- [protobuf: 4.25.1](https://pypi.org/project/protobuf/4.25.1/) +- [psutil: 5.9.6](https://pypi.org/project/psutil/5.9.6/) +- [ptyprocess: 0.7.0](https://pypi.org/project/ptyprocess/0.7.0/) +- [pure-eval: 0.2.2](https://pypi.org/project/pure-eval/0.2.2/) +- [py: 1.11.0](https://pypi.org/project/py/1.11.0/) +- [pyarrow: 14.0.1](https://pypi.org/project/pyarrow/14.0.1/) +- [pyasn1: 0.5.1](https://pypi.org/project/pyasn1/0.5.1/) +- [pyasn1-modules: 0.3.0](https://pypi.org/project/pyasn1-modules/0.3.0/) +- [pycparser: 2.21](https://pypi.org/project/pycparser/2.21/) +- [pydata-google-auth: 1.8.2](https://pypi.org/project/pydata-google-auth/1.8.2/) +- [pygments: 2.17.1](https://pypi.org/project/pygments/2.17.1/) +- [pyparsing: 3.1.1](https://pypi.org/project/pyparsing/3.1.1/) +- [pyproj: 3.6.1](https://pypi.org/project/pyproj/3.6.1/) +- [pyproject-hooks: 1.0.0](https://pypi.org/project/pyproject-hooks/1.0.0/) +- [pytest: 7.4.3](https://pypi.org/project/pytest/7.4.3/) +- [python-dateutil: 2.8.2](https://pypi.org/project/python-dateutil/2.8.2/) +- [python-json-logger: 2.0.7](https://pypi.org/project/python-json-logger/2.0.7/) +- [pytz: 2023.3.post1](https://pypi.org/project/pytz/2023.3.post1/) +- [pyyaml: 6.0.1](https://pypi.org/project/pyyaml/6.0.1/) +- [pyzmq: 25.1.1](https://pypi.org/project/pyzmq/25.1.1/) +- [qtconsole: 5.5.1](https://pypi.org/project/qtconsole/5.5.1/) +- [qtpy: 2.4.1](https://pypi.org/project/qtpy/2.4.1/) +- [referencing: 0.31.0](https://pypi.org/project/referencing/0.31.0/) +- [requests: 2.31.0](https://pypi.org/project/requests/2.31.0/) +- [requests-oauthlib: 1.3.1](https://pypi.org/project/requests-oauthlib/1.3.1/) +- [retry: 0.9.2](https://pypi.org/project/retry/0.9.2/) +- [rfc3339-validator: 0.1.4](https://pypi.org/project/rfc3339-validator/0.1.4/) +- [rfc3986-validator: 0.1.1](https://pypi.org/project/rfc3986-validator/0.1.1/) +- [rpds-py: 0.13.1](https://pypi.org/project/rpds-py/0.13.1/) +- [rsa: 4.9](https://pypi.org/project/rsa/4.9/) +- [scikit-learn: 1.3.2](https://pypi.org/project/scikit-learn/1.3.2/) +- [scipy: 1.11.4](https://pypi.org/project/scipy/1.11.4/) +- [seaborn: 0.13.0](https://pypi.org/project/seaborn/0.13.0/) +- [send2trash: 1.8.2](https://pypi.org/project/send2trash/1.8.2/) +- [shapely: 2.0.2](https://pypi.org/project/shapely/2.0.2/) +- [six: 1.16.0](https://pypi.org/project/six/1.16.0/) +- [sniffio: 1.3.0](https://pypi.org/project/sniffio/1.3.0/) +- [soupsieve: 2.5](https://pypi.org/project/soupsieve/2.5/) +- [sqlparse: 0.4.4](https://pypi.org/project/sqlparse/0.4.4/) +- [stack-data: 0.6.3](https://pypi.org/project/stack-data/0.6.3/) +- [statsmodels: 0.14.0](https://pypi.org/project/statsmodels/0.14.0/) +- [structlog: 23.2.0](https://pypi.org/project/structlog/23.2.0/) +- [tabulate: 0.9.0](https://pypi.org/project/tabulate/0.9.0/) +- [tenacity: 8.2.3](https://pypi.org/project/tenacity/8.2.3/) +- [terminado: 0.18.0](https://pypi.org/project/terminado/0.18.0/) +- [threadpoolctl: 3.2.0](https://pypi.org/project/threadpoolctl/3.2.0/) +- [tinycss2: 1.2.1](https://pypi.org/project/tinycss2/1.2.1/) +- [toml: 0.10.2](https://pypi.org/project/toml/0.10.2/) +- [tomli: 2.0.1](https://pypi.org/project/tomli/2.0.1/) +- [tornado: 6.3.3](https://pypi.org/project/tornado/6.3.3/) +- [tqdm: 4.66.1](https://pypi.org/project/tqdm/4.66.1/) +- [traitlets: 5.13.0](https://pypi.org/project/traitlets/5.13.0/) +- [types-python-dateutil: 2.8.19.14](https://pypi.org/project/types-python-dateutil/2.8.19.14/) +- [typing-extensions: 4.8.0](https://pypi.org/project/typing-extensions/4.8.0/) +- [tzdata: 2023.3](https://pypi.org/project/tzdata/2023.3/) +- [upsetplot: 0.8.0](https://pypi.org/project/upsetplot/0.8.0/) +- [uri-template: 1.3.0](https://pypi.org/project/uri-template/1.3.0/) +- [urllib3: 2.1.0](https://pypi.org/project/urllib3/2.1.0/) +- [venn: 0.1.3](https://pypi.org/project/venn/0.1.3/) +- [wcwidth: 0.2.11](https://pypi.org/project/wcwidth/0.2.11/) +- [webcolors: 1.13](https://pypi.org/project/webcolors/1.13/) +- [webencodings: 0.5.1](https://pypi.org/project/webencodings/0.5.1/) +- [websocket-client: 1.6.4](https://pypi.org/project/websocket-client/1.6.4/) +- [wheel: 0.41.3](https://pypi.org/project/wheel/0.41.3/) +- [widgetsnbextension: 4.0.9](https://pypi.org/project/widgetsnbextension/4.0.9/) +- [wrapt: 1.16.0](https://pypi.org/project/wrapt/1.16.0/) +