From 15939084dcc8064b458cc61e8cba72e15ce442b1 Mon Sep 17 00:00:00 2001 From: Fons van der Plas Date: Mon, 28 Oct 2024 12:26:39 +0100 Subject: [PATCH 001/299] julia_project.py: fix Pkg REPL api warning --- repo2docker/buildpacks/julia/julia_project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/julia/julia_project.py b/repo2docker/buildpacks/julia/julia_project.py index 0985a33e6..9fc5b2cd5 100644 --- a/repo2docker/buildpacks/julia/julia_project.py +++ b/repo2docker/buildpacks/julia/julia_project.py @@ -177,7 +177,7 @@ def get_assemble_scripts(self): "${NB_USER}", r""" JULIA_PROJECT="" julia -e "using Pkg; Pkg.add(\"IJulia\"); using IJulia; installkernel(\"Julia\", \"--project={project}\");" && \ - julia --project={project} -e 'using Pkg; Pkg.instantiate(); Pkg.resolve(); pkg"precompile"' + julia --project={project} -e 'using Pkg; Pkg.instantiate(); Pkg.resolve(); Pkg.instantiate()' """.format( project=self.project_dir ), From f4fac2587d71275568f7c867be8ac1a52370c9dd Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 26 Nov 2024 14:24:21 -0800 Subject: [PATCH 002/299] Use self.log rather than logging module directly Using logging.info or .debug directly sets up the root logger, and after that call every single message is duplicated! This showed up only when using the dataverse provider. With this, no messages are duplicated --- repo2docker/contentproviders/doi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/contentproviders/doi.py b/repo2docker/contentproviders/doi.py index 065602b7a..64b93202f 100644 --- a/repo2docker/contentproviders/doi.py +++ b/repo2docker/contentproviders/doi.py @@ -58,7 +58,7 @@ def doi2url(self, doi): # Reraise any other errors because if the DOI service is down (or # we hit a rate limit) we don't want to silently continue to the # default Git provider as this leads to a misleading error. - logging.error(f"DOI {doi} does not resolve: {e}") + self.log.error(f"DOI {doi} does not resolve: {e}") raise return resp.url else: @@ -70,7 +70,7 @@ def fetch_file(self, file_ref, host, output_dir, unzip=False): # file related to a record file_url = deep_get(file_ref, host["download"]) fname = deep_get(file_ref, host["filename"]) - logging.debug(f"Downloading file {file_url} as {fname}\n") + self.log.debug(f"Downloading file {file_url} as {fname}\n") yield f"Requesting {file_url}\n" resp = self._request(file_url, stream=True) From 4b33d0f395538f1445df2f69fe5dfccfa92d1ee2 Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 28 Nov 2024 13:35:09 +0100 Subject: [PATCH 003/299] call close_handlers before garbage collection avoids bug when this is called by `Application.__del__` --- repo2docker/__main__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/repo2docker/__main__.py b/repo2docker/__main__.py index a61ef918a..fb4e78460 100644 --- a/repo2docker/__main__.py +++ b/repo2docker/__main__.py @@ -482,6 +482,15 @@ def main(): if r2d.log_level == logging.DEBUG: r2d.log.exception(e) sys.exit(1) + finally: + # workaround bug in traitlets Application.__del__: + # https://github.com/ipython/traitlets/pull/912 + # make sure close_handlers is called before process teardown + try: + r2d.close_handlers() + except AttributeError: + # traitlets < 5.10 + pass if __name__ == "__main__": From 504367f4fad04c7e86d8a4212e9f8a6684b0db4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 05:28:56 +0000 Subject: [PATCH 004/299] build(deps): bump codecov/codecov-action from 4 to 5 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d5d8dc03a..6f7001d2c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -93,4 +93,4 @@ jobs: run: | pytest --verbose --color=yes --durations=10 --cov=repo2docker tests/${{ matrix.repo_type }} - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 From f41329fb3076d51ee876d09c5139367a0cfaa01a Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Thu, 12 Dec 2024 09:15:48 +0100 Subject: [PATCH 005/299] Upgraded to micromamba 2.0.5 --- repo2docker/buildpacks/conda/activate-conda.sh | 4 +++- repo2docker/buildpacks/conda/install-base-env.bash | 6 +++--- tests/conda/py35-binder-dir/verify | 9 +++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/repo2docker/buildpacks/conda/activate-conda.sh b/repo2docker/buildpacks/conda/activate-conda.sh index 48372318e..312646575 100755 --- a/repo2docker/buildpacks/conda/activate-conda.sh +++ b/repo2docker/buildpacks/conda/activate-conda.sh @@ -1,7 +1,9 @@ # enable conda and activate the notebook environment -eval $(micromamba shell hook -s posix -p ${CONDA_DIR}) +set -ex +eval $(micromamba shell hook -s posix -r ${CONDA_DIR}) for name in conda mamba; do CONDA_PROFILE="${CONDA_DIR}/etc/profile.d/${name}.sh" + echo "Activating profile: ${CONDA_PROFILE}" test -f $CONDA_PROFILE && . $CONDA_PROFILE done if [[ "${KERNEL_PYTHON_PREFIX}" != "${NB_PYTHON_PREFIX}" ]]; then diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index 4eb93f00c..a26eff596 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,8 +5,8 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION=1.5.9 -export CONDA_VERSION=24.5.0 +export MAMBA_VERSION="2.0.5" +export CONDA_VERSION=24.11.0 URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" @@ -21,7 +21,7 @@ time wget -qO- ${URL} | tar -xvj bin/micromamba mv bin/micromamba "$MICROMAMBA_EXE" chmod 0755 "$MICROMAMBA_EXE" -eval "$(${MICROMAMBA_EXE} shell hook -p ${CONDA_DIR} -s posix)" +eval "$(${MICROMAMBA_EXE} shell hook --root-prefix ${CONDA_DIR} -s posix)" micromamba activate diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index ef166558f..5b01d9a92 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -16,13 +16,10 @@ v = out.split()[1] assert v[:3] == "3.5", out out = sh(["micromamba", "--version"]) -assert out == "1.5.9", out +assert out == "2.0.5", out out = sh(["mamba", "--version"]) -assert ( - out - == """mamba 1.5.9 -conda 24.5.0""" -), out +assert out == "2.0.5", out + sh([kernel_python, "-c", "import numpy"]) From 91242e5150bf0d2c4cd64bf3a0c447fdd16b5b2b Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 12:53:34 -0800 Subject: [PATCH 006/299] Use the doi.org API to resolve URLs --- repo2docker/contentproviders/doi.py | 35 +++++++++++++++++------------ 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/repo2docker/contentproviders/doi.py b/repo2docker/contentproviders/doi.py index 64b93202f..130368ba5 100644 --- a/repo2docker/contentproviders/doi.py +++ b/repo2docker/contentproviders/doi.py @@ -46,21 +46,28 @@ def doi2url(self, doi): # Transform a DOI to a URL # If not a doi, assume we have a URL and return if is_doi(doi): - doi = normalize_doi(doi) - - try: - resp = self._request(f"https://doi.org/{doi}") - resp.raise_for_status() - except HTTPError as e: - # If the DOI doesn't exist, just return URL - if e.response.status_code == 404: - return doi - # Reraise any other errors because if the DOI service is down (or - # we hit a rate limit) we don't want to silently continue to the - # default Git provider as this leads to a misleading error. - self.log.error(f"DOI {doi} does not resolve: {e}") + normalized_doi = normalize_doi(doi) + + # Use the doi.org resolver API + # documented at https://www.doi.org/the-identifier/resources/factsheets/doi-resolution-documentation#5-proxy-server-rest-api + req_url = f"https://doi.org/api/handles/{normalize_doi}" + resp = self._request(req_url) + if resp.status_code == 404: + # Not a doi, return what we were passed in + return doi + elif resp.status_code == 200: + data = resp.json() + # Pick the first URL we find from the doi response + for v in data["values"]: + if v["type"] == "URL": + return v["data"]["string"] + + # No URLs found for this doi, what do we do? + self.log.error("DOI {normalized_doi} doesn't point to any URLs") + return doi + else: + # If we get any other status codes, raise error raise - return resp.url else: # Just return what is actulally just a URL return doi From 52eeb8f16126ab6d36b91988c71197ddafaa54d9 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 14:51:39 -0800 Subject: [PATCH 007/299] Stop mocking dataverse contentprovider test As I was debugging https://github.com/jupyterhub/repo2docker/pull/1388, I realized that PR actually broke the dataverse provider, but the existing test was mocking so much that we didn't actually catch it! IMO, since the point of contentproviders is to integrate with external content providers, they should be integration tests so we can catch issues with them more easily. Integration tests would have caught https://jupyter.zulipchat.com/#narrow/channel/103349-ask-anything/topic/Binder.20Dataverse.20error more cleanly than how it happened for example. This PR removes all mocks from the dataverse test, and we immediately benefit - it shows us that the dataverse provider *only* actually handles DOIs, and not direct URLs! So even though we technically had tests earlier that showed our dataverse provider supporting direct dataverse URLs, it simply was not true. So we actually catch the failure. I will try to see if we can use a demo or test instance for the fetch test though, so we don't screw up download stats even more for the existing test doi we use. --- .github/workflows/test.yml | 1 + tests/contentproviders/test_dataverse.py | 54 ++++++ tests/unit/contentproviders/test_dataverse.py | 160 ------------------ 3 files changed, 55 insertions(+), 160 deletions(-) create mode 100644 tests/contentproviders/test_dataverse.py delete mode 100644 tests/unit/contentproviders/test_dataverse.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6f7001d2c..300458514 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -60,6 +60,7 @@ jobs: - r - unit - venv + - contentproviders include: # The actions/setup-python action with Python version 3.6 isn't # possible to use with the ubuntu-22.04 runner, so we use ubuntu-20.04 diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py new file mode 100644 index 000000000..16ee2151c --- /dev/null +++ b/tests/contentproviders/test_dataverse.py @@ -0,0 +1,54 @@ +import hashlib +import os +from tempfile import TemporaryDirectory + +import pytest + +from repo2docker.contentproviders import Dataverse + +test_dv = Dataverse() +harvard_dv = next(_ for _ in test_dv.hosts if _["name"] == "Harvard Dataverse") +cimmyt_dv = next(_ for _ in test_dv.hosts if _["name"] == "CIMMYT Research Data") + +@pytest.mark.parametrize( + ("doi", "resolved"), + [ + ("doi:10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), + ("10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), + ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), + ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), + ("/some/random/string", None), + ("https://example.com/path/here", None), + # Non dataverse DOIs + ("https://doi.org/10.21105/joss.01277", None) + ] +) +def test_detect(doi, resolved): + assert Dataverse().detect(doi) == resolved + + +def test_dataverse_fetch(): + spec = {"host": harvard_dv, "record": "doi:10.7910/DVN/TJCLKP"} + + dv = Dataverse() + + with TemporaryDirectory() as d: + output = [] + for l in dv.fetch(spec, d): + output.append(l) + + # Verify two directories + assert set(os.listdir(d)) == {"data", "code"} + + # Verify sha256sum of three files + expected_sha = { + 'data/primary/primary-data.zip': '880f99a1e1d54a2553be61301f92e06b29236785b8d4d1b7ad0b4595d9d7512b', + 'data/2023-01-03.tsv': 'cc9759e8e6bc076dd7c1a8eb53a7ea3d38e8697fa9f544d15768db308516cc5f', + 'code/language.py': '1ffb3b3cdc9de01279779f3fc88824672c8ec3ab1c41ecdd5c1b59a9b0202215' + } + + for subpath, expected_sha in expected_sha.items(): + with open(os.path.join(d, subpath), 'rb') as f: + h = hashlib.sha256() + h.update(f.read()) + assert h.hexdigest() == expected_sha \ No newline at end of file diff --git a/tests/unit/contentproviders/test_dataverse.py b/tests/unit/contentproviders/test_dataverse.py deleted file mode 100644 index abdfe456d..000000000 --- a/tests/unit/contentproviders/test_dataverse.py +++ /dev/null @@ -1,160 +0,0 @@ -import json -import os -import re -from io import BytesIO -from tempfile import TemporaryDirectory -from unittest.mock import patch -from urllib.parse import urlsplit -from urllib.request import Request, urlopen - -import pytest - -from repo2docker.contentproviders import Dataverse - -test_dv = Dataverse() -harvard_dv = next(_ for _ in test_dv.hosts if _["name"] == "Harvard Dataverse") -cimmyt_dv = next(_ for _ in test_dv.hosts if _["name"] == "CIMMYT Research Data") -test_hosts = [ - ( - [ - "doi:10.7910/DVN/6ZXAGT/3YRRYJ", - "10.7910/DVN/6ZXAGT", - "https://dataverse.harvard.edu/api/access/datafile/3323458", - "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", - ], - [ - {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}, - {"host": cimmyt_dv, "record": "hdl:11529/10016"}, - ], - ) -] -doi_responses = { - "https://doi.org/10.7910/DVN/6ZXAGT/3YRRYJ": ( - "https://dataverse.harvard.edu/file.xhtml" - "?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ" - ), - "https://doi.org/10.7910/DVN/6ZXAGT": ( - "https://dataverse.harvard.edu/dataset.xhtml" - "?persistentId=doi:10.7910/DVN/6ZXAGT" - ), - "https://dataverse.harvard.edu/api/access/datafile/3323458": ( - "https://dataverse.harvard.edu/api/access/datafile/3323458" - ), - "https://doi.org/10.21105/joss.01277": ( - "https://joss.theoj.org/papers/10.21105/joss.01277" - ), -} - - -@pytest.mark.parametrize("test_input, expected", test_hosts) -def test_detect_dataverse(test_input, expected, requests_mock): - def doi_resolver(req, context): - resp = doi_responses.get(req.url) - # doi responses are redirects - if resp is not None: - context.status_code = 302 - context.headers["Location"] = resp - return resp - - requests_mock.get(re.compile("https://"), json=doi_resolver) - requests_mock.get( - "https://dataverse.harvard.edu/api/search?q=entityId:3323458&type=file", - json={ - "data": { - "count_in_response": 1, - "items": [{"dataset_persistent_id": "doi:10.7910/DVN/6ZXAGT"}], - } - }, - ) - - assert requests_mock.call_count == 0 - # valid Dataverse DOIs trigger this content provider - assert Dataverse().detect(test_input[0]) == expected[0] - # 4: doi resolution (302), File, doi resolution (302), then dataset - assert requests_mock.call_count == 4 - requests_mock.reset_mock() - - assert Dataverse().detect(test_input[1]) == expected[0] - # 2: doi (302), dataset - assert requests_mock.call_count == 2 - requests_mock.reset_mock() - - assert Dataverse().detect(test_input[2]) == expected[0] - # 1: datafile (search dataverse for the file id) - assert requests_mock.call_count == 1 - requests_mock.reset_mock() - - assert Dataverse().detect(test_input[3]) == expected[1] - requests_mock.reset_mock() - - # Don't trigger the Dataverse content provider - assert Dataverse().detect("/some/path/here") is None - assert Dataverse().detect("https://example.com/path/here") is None - # don't handle DOIs that aren't from Dataverse - assert Dataverse().detect("https://doi.org/10.21105/joss.01277") is None - - -@pytest.fixture -def dv_files(tmpdir): - f1 = tmpdir.join("some-file.txt") - f1.write("some content") - - f2 = tmpdir.mkdir("directory").join("some-other-file.txt") - f2.write("some other content") - - f3 = tmpdir.join("directory").mkdir("subdirectory").join("the-other-file.txt") - f3.write("yet another content") - - return [f1, f2, f3] - - -def test_dataverse_fetch(dv_files, requests_mock): - mock_response = { - "data": { - "latestVersion": { - "files": [ - {"dataFile": {"id": 1}, "label": "some-file.txt"}, - { - "dataFile": {"id": 2}, - "label": "some-other-file.txt", - "directoryLabel": "directory", - }, - { - "dataFile": {"id": 3}, - "label": "the-other-file.txt", - "directoryLabel": "directory/subdirectory", - }, - ] - } - } - } - - spec = {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"} - - def mock_filecontent(req, context): - parts = urlsplit(req.url) - file_no = int(parts.path.split("/")[-1]) - 1 - return open(dv_files[file_no], "rb").read() - - requests_mock.get( - "https://dataverse.harvard.edu/api/datasets/" - ":persistentId?persistentId=doi:10.7910/DVN/6ZXAGT", - json=mock_response, - ) - requests_mock.get( - re.compile("https://dataverse.harvard.edu/api/access/datafile"), - content=mock_filecontent, - ) - - dv = Dataverse() - - with TemporaryDirectory() as d: - output = [] - for l in dv.fetch(spec, d): - output.append(l) - unpacked_files = set(os.listdir(d)) - expected = {"directory", "some-file.txt"} - assert expected == unpacked_files - assert os.path.isfile( - os.path.join(d, "directory", "subdirectory", "the-other-file.txt") - ) From bf40856c8315ab1fa693fdc4f2c1225ef09035ac Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 15:02:00 -0800 Subject: [PATCH 008/299] Fix text fixtures --- tests/contentproviders/test_dataverse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index 16ee2151c..b5457c692 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -15,8 +15,8 @@ [ ("doi:10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), ("10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), - ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), - ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), + ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "record": "doi:10.7910/DVN/3MJ7IR"}), + ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "record": "hdl:11529/10016"}), ("/some/random/string", None), ("https://example.com/path/here", None), # Non dataverse DOIs From 172f8b017d82b4bcad55448882804e4a24a737af Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 16:05:30 -0800 Subject: [PATCH 009/299] [WIP] Cleanup dataverse contentprovider --- repo2docker/contentproviders/dataverse.py | 111 ++++++++++++++-------- repo2docker/contentproviders/doi.py | 4 +- tests/contentproviders/test_dataverse.py | 23 ++++- 3 files changed, 92 insertions(+), 46 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 9054f53ce..a8ee69fca 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -3,7 +3,7 @@ import shutil from urllib.parse import parse_qs, urlparse, urlunparse -from ..utils import copytree, deep_get +from ..utils import copytree, deep_get, is_doi from .doi import DoiProvider @@ -23,10 +23,11 @@ def __init__(self): self.hosts = json.load(fp)["installations"] super().__init__() - def detect(self, doi, ref=None, extra_args=None): - """Trigger this provider for things that resolve to a Dataverse dataset. + def detect(self, spec, ref=None, extra_args=None): + """ + Detect if given spec is hosted on dataverse - Handles: + The spec can be: - DOI pointing to {siteURL}/dataset.xhtml?persistentId={persistentId} - DOI pointing to {siteURL}/file.xhtml?persistentId={persistentId}&... - URL {siteURL}/api/access/datafile/{fileId} @@ -35,9 +36,11 @@ def detect(self, doi, ref=None, extra_args=None): - https://dataverse.harvard.edu/api/access/datafile/3323458 - doi:10.7910/DVN/6ZXAGT - doi:10.7910/DVN/6ZXAGT/3YRRYJ - """ - url = self.doi2url(doi) + if is_doi(spec): + url = self.doi2url(spec) + else: + url = spec # Parse the url, to get the base for later API calls parsed_url = urlparse(url) @@ -53,51 +56,77 @@ def detect(self, doi, ref=None, extra_args=None): if host is None: return - query_args = parse_qs(parsed_url.query) - # Corner case handling - if parsed_url.path.startswith("/file.xhtml"): - # There's no way of getting file information using its persistentId, the only thing we can do is assume that doi - # is structured as "doi:/" and try to handle dataset that way. - new_doi = doi.rsplit("/", 1)[0] - if new_doi == doi: - # tough luck :( Avoid inifite recursion and exit. - return - return self.detect(new_doi) - elif parsed_url.path.startswith("/api/access/datafile"): - # Raw url pointing to a datafile is a typical output from an External Tool integration + # At this point, we *know* this is a dataverse URL, because: + # 1. The DOI resolved to a particular host (if using DOI) + # 2. The host is in the list of known dataverse installations + # + # We don't know exactly what kind of dataverse object this is, but + # that can be figured out during fetch as needed + return {"host": host, "url": url} + + def get_persistent_id_from_url(self, url: str) -> str: + """ + Return the persistentId for given dataverse URL. + + Supports the following *dataset* URL styles: + - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP + - /dataset.xhtml: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP + + Supports the following *file* URL styles: + - /api/access/datafile: https://dataverse.harvard.edu/api/access/datafile/3323458 + + Supports a subset of the following *file* URL styles: + - /file.xhtml: https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ + + If a URL can not be parsed, throw an exception + """ + parsed_url = urlparse(url) + path = parsed_url.path + qs = parse_qs(parsed_url.query) + + # https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP + # https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP + if path.startswith("/citation") or path.startswith("/dataset.xhtml"): + return qs["persistentId"][0] + # https://dataverse.harvard.edu/api/access/datafile/3323458 + elif path.startswith("/api/access/datafile"): + # What we have here is an entity id, which we can use to get a persistentId entity_id = os.path.basename(parsed_url.path) - search_query = "q=entityId:" + entity_id + "&type=file" - # Knowing the file identifier query search api to get parent dataset - search_url = urlunparse( + # FIXME: Should we be URL Encoding something here to protect from path traversal + # or similar attacks? + search_query = f"q=entityId:{entity_id}&type=file" + search_api_url = urlunparse( parsed_url._replace(path="/api/search", query=search_query) ) - self.log.debug("Querying Dataverse: " + search_url) - data = self.urlopen(search_url).json()["data"] + self.log.debug("Querying Dataverse: " + search_api_url) + data = self.urlopen(search_api_url).json()["data"] if data["count_in_response"] != 1: - self.log.debug( - f"Dataverse search query failed!\n - doi: {doi}\n - url: {url}\n - resp: {json.dump(data)}\n" + raise ValueError( + f"Dataverse search query failed!\n - url: {url}\n - resp: {json.dumps(data)}\n" ) - return - - self.record_id = deep_get(data, "items.0.dataset_persistent_id") - elif ( - parsed_url.path.startswith("/dataset.xhtml") - and "persistentId" in query_args - ): - self.record_id = deep_get(query_args, "persistentId.0") + return data["items"][0]["dataset_persistent_id"] + elif parsed_url.path.startswith("/file.xhtml"): + file_persistent_id = qs['persistentId'][0] + dataset_persistent_id = file_persistent_id.rsplit("/", 1)[0] + if file_persistent_id == dataset_persistent_id: + # We can't figure this one out, throw an error + raise ValueError(f"Could not find dataset id for {url}") + return dataset_persistent_id - if hasattr(self, "record_id"): - return {"record": self.record_id, "host": host} + raise ValueError(f"Could not determine persistent id for dataverse URL {url}") def fetch(self, spec, output_dir, yield_output=False): """Fetch and unpack a Dataverse dataset.""" - record_id = spec["record"] + url = spec["url"] host = spec["host"] - yield f"Fetching Dataverse record {record_id}.\n" - url = f'{host["url"]}/api/datasets/:persistentId?persistentId={record_id}' + persistent_id = self.get_persistent_id_from_url(url) + + yield f"Fetching Dataverse record {persistent_id}.\n" + url = f'{host["url"]}/api/datasets/:persistentId?persistentId={persistent_id}' resp = self.urlopen(url, headers={"accept": "application/json"}) + print(resp.json()) record = resp.json()["data"] for fobj in deep_get(record, "latestVersion.files"): @@ -126,7 +155,11 @@ def fetch(self, spec, output_dir, yield_output=False): copytree(os.path.join(output_dir, d), output_dir) shutil.rmtree(os.path.join(output_dir, d)) + + # Save persistent id + self.persitent_id = persistent_id + @property def content_id(self): """The Dataverse persistent identifier.""" - return self.record_id + return self.persistent_id diff --git a/repo2docker/contentproviders/doi.py b/repo2docker/contentproviders/doi.py index 130368ba5..cf43a1578 100644 --- a/repo2docker/contentproviders/doi.py +++ b/repo2docker/contentproviders/doi.py @@ -50,7 +50,7 @@ def doi2url(self, doi): # Use the doi.org resolver API # documented at https://www.doi.org/the-identifier/resources/factsheets/doi-resolution-documentation#5-proxy-server-rest-api - req_url = f"https://doi.org/api/handles/{normalize_doi}" + req_url = f"https://doi.org/api/handles/{normalized_doi}" resp = self._request(req_url) if resp.status_code == 404: # Not a doi, return what we were passed in @@ -60,7 +60,7 @@ def doi2url(self, doi): # Pick the first URL we find from the doi response for v in data["values"]: if v["type"] == "URL": - return v["data"]["string"] + return v["data"]["value"] # No URLs found for this doi, what do we do? self.log.error("DOI {normalized_doi} doesn't point to any URLs") diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index b5457c692..3fcefd328 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -13,10 +13,11 @@ @pytest.mark.parametrize( ("doi", "resolved"), [ - ("doi:10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), - ("10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"}), - ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "record": "doi:10.7910/DVN/3MJ7IR"}), - ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "record": "hdl:11529/10016"}), + ("doi:10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ"}), + ("10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ"}), + ("10.7910/DVN/TJCLKP", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP"}), + ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/api/access/datafile/3323458"}), + ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "url": "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016"}), ("/some/random/string", None), ("https://example.com/path/here", None), # Non dataverse DOIs @@ -27,10 +28,22 @@ def test_detect(doi, resolved): assert Dataverse().detect(doi) == resolved +@pytest.mark.parametrize( + ("url", "persistent_id"), + [ + ("https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", "doi:10.7910/DVN/6ZXAGT"), + ("https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", "doi:10.7910/DVN/TJCLKP"), + ("https://dataverse.harvard.edu/api/access/datafile/3323458", "doi:10.7910/DVN/3MJ7IR"), + ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", "hdl:11529/10016"), + ] +) +def test_get_persistent_id(url, persistent_id): + assert Dataverse().get_persistent_id_from_url(url) == persistent_id + def test_dataverse_fetch(): - spec = {"host": harvard_dv, "record": "doi:10.7910/DVN/TJCLKP"} dv = Dataverse() + spec = dv.detect("doi:10.7910/DVN/TJCLKP") with TemporaryDirectory() as d: output = [] From 1260a5a394665d8de7ca8de09b18ddecb0ebfa3b Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 17:02:25 -0800 Subject: [PATCH 010/299] Support fetcing single files in dataverse --- repo2docker/contentproviders/dataverse.py | 42 ++++++-- tests/contentproviders/test_dataverse.py | 113 ++++++++++++++++------ 2 files changed, 118 insertions(+), 37 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index a8ee69fca..9b42b07f8 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -106,7 +106,7 @@ def get_persistent_id_from_url(self, url: str) -> str: ) return data["items"][0]["dataset_persistent_id"] elif parsed_url.path.startswith("/file.xhtml"): - file_persistent_id = qs['persistentId'][0] + file_persistent_id = qs["persistentId"][0] dataset_persistent_id = file_persistent_id.rsplit("/", 1)[0] if file_persistent_id == dataset_persistent_id: # We can't figure this one out, throw an error @@ -115,6 +115,38 @@ def get_persistent_id_from_url(self, url: str) -> str: raise ValueError(f"Could not determine persistent id for dataverse URL {url}") + def get_datafiles(self, host: str, persistent_id: str) -> list[dict]: + """ + Return a list of dataFiles for given persistent_id + """ + dataset_url = f"{host}/api/datasets/:persistentId?persistentId={persistent_id}" + + resp = self._request(dataset_url, headers={"accept": "application/json"}) + # Assume it's a dataset + is_dataset = True + if resp.status_code == 404: + # It's possible this is a *file* persistent_id, not a dataset one + file_url = f"{host}/api/files/:persistentId?persistentId={persistent_id}" + resp = self._request(file_url, headers={"accept": "application/json"}) + + if resp.status_code == 404: + # This persistent id is just not here + raise ValueError(f"{persistent_id} on {host} is not found") + + # It's not a dataset, it's a file! + is_dataset = False + + # We already handled 404, raise error for everything else + resp.raise_for_status() + + data = resp.json()["data"] + + if is_dataset: + return data["latestVersion"]["files"] + else: + # Only one file object + return [data] + def fetch(self, spec, output_dir, yield_output=False): """Fetch and unpack a Dataverse dataset.""" url = spec["url"] @@ -123,13 +155,8 @@ def fetch(self, spec, output_dir, yield_output=False): persistent_id = self.get_persistent_id_from_url(url) yield f"Fetching Dataverse record {persistent_id}.\n" - url = f'{host["url"]}/api/datasets/:persistentId?persistentId={persistent_id}' - - resp = self.urlopen(url, headers={"accept": "application/json"}) - print(resp.json()) - record = resp.json()["data"] - for fobj in deep_get(record, "latestVersion.files"): + for fobj in self.get_datafiles(host["url"], persistent_id): file_url = ( # without format=original you get the preservation format (plain text, tab separated) f'{host["url"]}/api/access/datafile/{deep_get(fobj, "dataFile.id")}?format=original' @@ -155,7 +182,6 @@ def fetch(self, spec, output_dir, yield_output=False): copytree(os.path.join(output_dir, d), output_dir) shutil.rmtree(os.path.join(output_dir, d)) - # Save persistent id self.persitent_id = persistent_id diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index 3fcefd328..e0c7e1788 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -10,19 +10,50 @@ harvard_dv = next(_ for _ in test_dv.hosts if _["name"] == "Harvard Dataverse") cimmyt_dv = next(_ for _ in test_dv.hosts if _["name"] == "CIMMYT Research Data") + @pytest.mark.parametrize( ("doi", "resolved"), [ - ("doi:10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ"}), - ("10.7910/DVN/6ZXAGT/3YRRYJ", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ"}), - ("10.7910/DVN/TJCLKP", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP"}), - ("https://dataverse.harvard.edu/api/access/datafile/3323458", {"host": harvard_dv, "url": "https://dataverse.harvard.edu/api/access/datafile/3323458"}), - ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", {"host": cimmyt_dv, "url": "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016"}), + ( + "doi:10.7910/DVN/6ZXAGT/3YRRYJ", + { + "host": harvard_dv, + "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + }, + ), + ( + "10.7910/DVN/6ZXAGT/3YRRYJ", + { + "host": harvard_dv, + "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + }, + ), + ( + "10.7910/DVN/TJCLKP", + { + "host": harvard_dv, + "url": "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", + }, + ), + ( + "https://dataverse.harvard.edu/api/access/datafile/3323458", + { + "host": harvard_dv, + "url": "https://dataverse.harvard.edu/api/access/datafile/3323458", + }, + ), + ( + "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", + { + "host": cimmyt_dv, + "url": "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", + }, + ), ("/some/random/string", None), ("https://example.com/path/here", None), # Non dataverse DOIs - ("https://doi.org/10.21105/joss.01277", None) - ] + ("https://doi.org/10.21105/joss.01277", None), + ], ) def test_detect(doi, resolved): assert Dataverse().detect(doi) == resolved @@ -31,37 +62,61 @@ def test_detect(doi, resolved): @pytest.mark.parametrize( ("url", "persistent_id"), [ - ("https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", "doi:10.7910/DVN/6ZXAGT"), - ("https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", "doi:10.7910/DVN/TJCLKP"), - ("https://dataverse.harvard.edu/api/access/datafile/3323458", "doi:10.7910/DVN/3MJ7IR"), - ("https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", "hdl:11529/10016"), - ] + ( + "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + "doi:10.7910/DVN/6ZXAGT", + ), + ( + "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", + "doi:10.7910/DVN/TJCLKP", + ), + ( + "https://dataverse.harvard.edu/api/access/datafile/3323458", + "doi:10.7910/DVN/3MJ7IR", + ), + ( + "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", + "hdl:11529/10016", + ), + ], ) def test_get_persistent_id(url, persistent_id): assert Dataverse().get_persistent_id_from_url(url) == persistent_id -def test_dataverse_fetch(): +@pytest.mark.parametrize( + ("spec", "md5tree"), + [ + ( + "doi:10.7910/DVN/TJCLKP", + { + "data/primary/primary-data.zip": "a8f6fc3fc58f503cd48e23fa8b088694", + "data/2023-01-03.tsv": "6fd497bf13dab9a06fe737ebc22f1917", + "code/language.py": "9d61582bcf497c83bbd1ed0eed3c772e", + }, + ), + ( + # A citation targeting a single file + "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + { + "ARCHAEOGLOBE_CONSENSUS_ASSESSMENT.tab": "17a91888ed8e91dfb63acbbab6127ac5" + } + ) + ], +) +def test_fetch(spec, md5tree): dv = Dataverse() - spec = dv.detect("doi:10.7910/DVN/TJCLKP") with TemporaryDirectory() as d: output = [] - for l in dv.fetch(spec, d): + for l in dv.fetch(dv.detect(spec), d): output.append(l) - # Verify two directories - assert set(os.listdir(d)) == {"data", "code"} - - # Verify sha256sum of three files - expected_sha = { - 'data/primary/primary-data.zip': '880f99a1e1d54a2553be61301f92e06b29236785b8d4d1b7ad0b4595d9d7512b', - 'data/2023-01-03.tsv': 'cc9759e8e6bc076dd7c1a8eb53a7ea3d38e8697fa9f544d15768db308516cc5f', - 'code/language.py': '1ffb3b3cdc9de01279779f3fc88824672c8ec3ab1c41ecdd5c1b59a9b0202215' - } - - for subpath, expected_sha in expected_sha.items(): - with open(os.path.join(d, subpath), 'rb') as f: - h = hashlib.sha256() + # Verify md5 sum of the files we expect to find + # We are using md5 instead of something more secure because that is what + # dataverse itself uses + for subpath, expected_sha in md5tree.items(): + with open(os.path.join(d, subpath), "rb") as f: + h = hashlib.md5() h.update(f.read()) - assert h.hexdigest() == expected_sha \ No newline at end of file + assert h.hexdigest() == expected_sha From b7050ba096eea7f1e2ae96ba438783ea982ba4bd Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 16 Dec 2024 19:55:23 -0800 Subject: [PATCH 011/299] Always fetch entire dataset for dataverse --- repo2docker/contentproviders/dataverse.py | 94 ++++++++++++----------- tests/contentproviders/test_dataverse.py | 72 ++++++++++++----- 2 files changed, 103 insertions(+), 63 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 9b42b07f8..88640a2a9 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -64,6 +64,26 @@ def detect(self, spec, ref=None, extra_args=None): # that can be figured out during fetch as needed return {"host": host, "url": url} + def get_dataset_id_from_file_id(self, host: str, file_id: str) -> str: + """ + Return the persistent_id (DOI) that a given file_id (int or doi) belongs to + """ + if file_id.isdigit(): + # the file_id is an integer, rather than a persistent id (DOI) + api_url = f"{host}/api/files/{file_id}?returnDatasetVersion=true" + else: + # the file_id is a doi itself + api_url = f"{host}/api/files/:persistentId?persistentId={file_id}&returnDatasetVersion=true" + + resp = self._request(api_url) + if resp.status_code == 404: + raise ValueError(f"File with id {file_id} not found in {host}") + + resp.raise_for_status() + + data = resp.json()["data"] + return data["datasetVersion"]["datasetPersistentId"] + def get_persistent_id_from_url(self, url: str) -> str: """ Return the persistentId for given dataverse URL. @@ -80,72 +100,56 @@ def get_persistent_id_from_url(self, url: str) -> str: If a URL can not be parsed, throw an exception """ + + def get_datafiles(self, dataverse_host: str, url: str) -> list[dict]: + """ + Return a list of dataFiles for given persistent_id + """ + parsed_url = urlparse(url) path = parsed_url.path qs = parse_qs(parsed_url.query) + dataverse_host = f"{parsed_url.scheme}://{parsed_url.netloc}" + url_kind = None + persistent_id = None + is_ambiguous = False # https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP + if path.startswith("/citation"): + is_ambiguous = True + persistent_id = qs["persistentId"][0] # https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP - if path.startswith("/citation") or path.startswith("/dataset.xhtml"): - return qs["persistentId"][0] + elif path.startswith("/dataset.xhtml"): # https://dataverse.harvard.edu/api/access/datafile/3323458 + persistent_id = qs["persistentId"][0] elif path.startswith("/api/access/datafile"): # What we have here is an entity id, which we can use to get a persistentId - entity_id = os.path.basename(parsed_url.path) - # FIXME: Should we be URL Encoding something here to protect from path traversal - # or similar attacks? - search_query = f"q=entityId:{entity_id}&type=file" - search_api_url = urlunparse( - parsed_url._replace(path="/api/search", query=search_query) - ) - self.log.debug("Querying Dataverse: " + search_api_url) - data = self.urlopen(search_api_url).json()["data"] - if data["count_in_response"] != 1: - raise ValueError( - f"Dataverse search query failed!\n - url: {url}\n - resp: {json.dumps(data)}\n" - ) - return data["items"][0]["dataset_persistent_id"] + file_id = os.path.basename(parsed_url.path) + persistent_id = self.get_dataset_id_from_file_id(dataverse_host, file_id) elif parsed_url.path.startswith("/file.xhtml"): file_persistent_id = qs["persistentId"][0] - dataset_persistent_id = file_persistent_id.rsplit("/", 1)[0] - if file_persistent_id == dataset_persistent_id: - # We can't figure this one out, throw an error - raise ValueError(f"Could not find dataset id for {url}") - return dataset_persistent_id - - raise ValueError(f"Could not determine persistent id for dataverse URL {url}") - - def get_datafiles(self, host: str, persistent_id: str) -> list[dict]: - """ - Return a list of dataFiles for given persistent_id - """ - dataset_url = f"{host}/api/datasets/:persistentId?persistentId={persistent_id}" + persistent_id = self.get_dataset_id_from_file_id(dataverse_host, file_persistent_id) + else: + raise ValueError(f"Could not determine persistent id for dataverse URL {url}") - resp = self._request(dataset_url, headers={"accept": "application/json"}) - # Assume it's a dataset - is_dataset = True - if resp.status_code == 404: + dataset_api_url = f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + resp = self._request(dataset_api_url, headers={"accept": "application/json"}) + if resp.status_code == 404 and is_ambiguous: # It's possible this is a *file* persistent_id, not a dataset one - file_url = f"{host}/api/files/:persistentId?persistentId={persistent_id}" - resp = self._request(file_url, headers={"accept": "application/json"}) + persistent_id = self.get_dataset_id_from_file_id(dataverse_host, persistent_id) + dataset_api_url = f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + resp = self._request(dataset_api_url, headers={"accept": "application/json"}) if resp.status_code == 404: # This persistent id is just not here - raise ValueError(f"{persistent_id} on {host} is not found") - - # It's not a dataset, it's a file! - is_dataset = False + raise ValueError(f"{persistent_id} on {dataverse_host} is not found") # We already handled 404, raise error for everything else resp.raise_for_status() data = resp.json()["data"] - if is_dataset: - return data["latestVersion"]["files"] - else: - # Only one file object - return [data] + return data["latestVersion"]["files"] def fetch(self, spec, output_dir, yield_output=False): """Fetch and unpack a Dataverse dataset.""" @@ -156,7 +160,7 @@ def fetch(self, spec, output_dir, yield_output=False): yield f"Fetching Dataverse record {persistent_id}.\n" - for fobj in self.get_datafiles(host["url"], persistent_id): + for fobj in self.get_datafiles(host["url"], url): file_url = ( # without format=original you get the preservation format (plain text, tab separated) f'{host["url"]}/api/access/datafile/{deep_get(fobj, "dataFile.id")}?format=original' diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index e0c7e1788..2ab9ec69e 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -85,10 +85,13 @@ def test_get_persistent_id(url, persistent_id): @pytest.mark.parametrize( - ("spec", "md5tree"), + ("specs", "md5tree"), [ ( - "doi:10.7910/DVN/TJCLKP", + ( + "doi:10.7910/DVN/TJCLKP", + "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", + ), { "data/primary/primary-data.zip": "a8f6fc3fc58f503cd48e23fa8b088694", "data/2023-01-03.tsv": "6fd497bf13dab9a06fe737ebc22f1917", @@ -96,27 +99,60 @@ def test_get_persistent_id(url, persistent_id): }, ), ( - # A citation targeting a single file - "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + ( + "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", + "doi:10.7910/DVN/6ZXAGT/3YRRYJ" + ), { - "ARCHAEOGLOBE_CONSENSUS_ASSESSMENT.tab": "17a91888ed8e91dfb63acbbab6127ac5" + 'ArchaeoGLOBE-master/analysis/figures/1_response_distribution.png': '243c6a3dd66bc3c84102829b277ef333', + 'ArchaeoGLOBE-master/analysis/figures/2_trends_map_knowledge.png': '2ace6ae9d470dda6cf2f9f9a6588171a', + 'ArchaeoGLOBE-master/analysis/figures/3_trends_global.png': '63ccd0a7b2d20440cd8f418d4ee88c4d', + 'ArchaeoGLOBE-master/analysis/figures/4_consensus_transitions.png': 'facfaedabeac77c4496d4b9e962a917f', + 'ArchaeoGLOBE-master/analysis/figures/5_ArchaeoGLOBE_HYDE_comparison.png': '8e002e4d50f179fc1808f562b1353588', + 'ArchaeoGLOBE-master/apt.txt': 'b4224032da6c71d48f46c9b78fc6ed77', + 'ArchaeoGLOBE-master/analysis/archaeoglobe.pdf': 'f575be4790efc963ef1bd40d097cc06d', + 'ArchaeoGLOBE-master/analysis/archaeoglobe.Rmd': 'f37d5f7993fde9ebd64d16b20fc22905', + 'ArchaeoGLOBE-master/ArchaeoGLOBE.Rproj': 'd0250e7918993bab1e707358fe5633e0', + 'ArchaeoGLOBE-master/CONDUCT.md': 'f87ef290340322089c32b4e573d8f1e8', + 'ArchaeoGLOBE-master/.circleci/config.yml': '6eaa54073a682b3195d8fab3a9dd8344', + 'ArchaeoGLOBE-master/CONTRIBUTING.md': 'b3a6abfc749dd155a3049f94a855bf9f', + 'ArchaeoGLOBE-master/DESCRIPTION': '745ef979494999e483987de72c0adfbd', + 'ArchaeoGLOBE-master/dockerfile': 'aedce68e5a7d6e79cbb24c9cffeae593', + 'ArchaeoGLOBE-master/.binder/Dockerfile': '7564a41246ba99b60144afb1d3b6d7de', + 'ArchaeoGLOBE-master/.gitignore': '62c1482e4febbd35dc02fb7e2a31246b', + 'ArchaeoGLOBE-master/analysis/data/derived-data/hyde_crop_prop.RDS': '2aea7748b5586923b0de9d13af58e59d', + 'ArchaeoGLOBE-master/analysis/data/derived-data/kk_anthro_prop.RDS': '145a9e5dd2c95625626a720b52178b70', + 'ArchaeoGLOBE-master/LICENSE.md': '3aa9d41a92a57944bd4590e004898445', + 'ArchaeoGLOBE-master/analysis/data/derived-data/placeholder': 'd41d8cd98f00b204e9800998ecf8427e', + 'ArchaeoGLOBE-master/.Rbuildignore': 'df15e4fed49abd685b536fef4472b01f', + 'ArchaeoGLOBE-master/README.md': '0b0faabe580c4d76a0e0d64a4f54bca4', + 'ArchaeoGLOBE-master/analysis/data/derived-data/README.md': '547fd1a6e874f6178b1cf525b5b9ae72', + 'ArchaeoGLOBE-master/analysis/figures/S1_FHG_consensus.png': 'd2584352e5442b33e4b23e361ca70fe1', + 'ArchaeoGLOBE-master/analysis/figures/S2_EXAG_consensus.png': '513eddfdad01fd01a20263a55ca6dbe3', + 'ArchaeoGLOBE-master/analysis/figures/S3_INAG_consensus.png': 'b16ba0ecd21b326f873209a7e55a8deb', + 'ArchaeoGLOBE-master/analysis/figures/S4_PAS_consensus.png': '05695f9412337a00c1cb6d1757d0ec5c', + 'ArchaeoGLOBE-master/analysis/figures/S5_URBAN_consensus.png': '10119f7495d3b8e7ad7f8a0770574f15', + 'ArchaeoGLOBE-master/analysis/figures/S6_trends_map_landuse.png': 'b1db7c97f39ccfc3a9e094c3e6307af0', + 'ArchaeoGLOBE-master/analysis/figures/S7_ArchaeoGLOBE_KK10_comparison.png': '30341748324f5f66acadb34c114c3e9d', } ) ], ) -def test_fetch(spec, md5tree): +def test_fetch(specs: list[str], md5tree): dv = Dataverse() - with TemporaryDirectory() as d: - output = [] - for l in dv.fetch(dv.detect(spec), d): - output.append(l) + for spec in specs: + with TemporaryDirectory() as d: + output = [] + for l in dv.fetch(dv.detect(spec), d): + output.append(l) - # Verify md5 sum of the files we expect to find - # We are using md5 instead of something more secure because that is what - # dataverse itself uses - for subpath, expected_sha in md5tree.items(): - with open(os.path.join(d, subpath), "rb") as f: - h = hashlib.md5() - h.update(f.read()) - assert h.hexdigest() == expected_sha + # Verify md5 sum of the files we expect to find + # We are using md5 instead of something more secure because that is what + # dataverse itself uses + for subpath, expected_sha in md5tree.items(): + with open(os.path.join(d, subpath), "rb") as f: + h = hashlib.md5() + h.update(f.read()) + assert h.hexdigest() == expected_sha From fde74efc2e1c3881d0dd41e95d41826c642e15fc Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 09:14:32 -0800 Subject: [PATCH 012/299] Fix content_id for dataverse URLs --- repo2docker/contentproviders/dataverse.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 88640a2a9..902157481 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -1,6 +1,7 @@ import json import os import shutil +import hashlib from urllib.parse import parse_qs, urlparse, urlunparse from ..utils import copytree, deep_get, is_doi @@ -56,6 +57,9 @@ def detect(self, spec, ref=None, extra_args=None): if host is None: return + # Used only for content_id + self.url = url + # At this point, we *know* this is a dataverse URL, because: # 1. The DOI resolved to a particular host (if using DOI) # 2. The host is in the list of known dataverse installations @@ -84,9 +88,9 @@ def get_dataset_id_from_file_id(self, host: str, file_id: str) -> str: data = resp.json()["data"] return data["datasetVersion"]["datasetPersistentId"] - def get_persistent_id_from_url(self, url: str) -> str: + def get_datafiles(self, dataverse_host: str, url: str) -> list[dict]: """ - Return the persistentId for given dataverse URL. + Return a list of dataFiles for given persistent_id Supports the following *dataset* URL styles: - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP @@ -101,11 +105,6 @@ def get_persistent_id_from_url(self, url: str) -> str: If a URL can not be parsed, throw an exception """ - def get_datafiles(self, dataverse_host: str, url: str) -> list[dict]: - """ - Return a list of dataFiles for given persistent_id - """ - parsed_url = urlparse(url) path = parsed_url.path qs = parse_qs(parsed_url.query) @@ -156,9 +155,7 @@ def fetch(self, spec, output_dir, yield_output=False): url = spec["url"] host = spec["host"] - persistent_id = self.get_persistent_id_from_url(url) - - yield f"Fetching Dataverse record {persistent_id}.\n" + yield f"Fetching Dataverse record {url}.\n" for fobj in self.get_datafiles(host["url"], url): file_url = ( @@ -186,10 +183,7 @@ def fetch(self, spec, output_dir, yield_output=False): copytree(os.path.join(output_dir, d), output_dir) shutil.rmtree(os.path.join(output_dir, d)) - # Save persistent id - self.persitent_id = persistent_id - @property def content_id(self): """The Dataverse persistent identifier.""" - return self.persistent_id + return self.url From 96057f98216ba364d671f615fab34ad5462bd25d Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 09:30:53 -0800 Subject: [PATCH 013/299] Use List from typing --- repo2docker/contentproviders/dataverse.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 902157481..5797aacc6 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -2,7 +2,8 @@ import os import shutil import hashlib -from urllib.parse import parse_qs, urlparse, urlunparse +from urllib.parse import parse_qs, urlparse +from typing import List from ..utils import copytree, deep_get, is_doi from .doi import DoiProvider @@ -88,7 +89,7 @@ def get_dataset_id_from_file_id(self, host: str, file_id: str) -> str: data = resp.json()["data"] return data["datasetVersion"]["datasetPersistentId"] - def get_datafiles(self, dataverse_host: str, url: str) -> list[dict]: + def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: """ Return a list of dataFiles for given persistent_id From fda5339bd4026bbb6b736ea90f53e5b25d7bd6d3 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 09:30:59 -0800 Subject: [PATCH 014/299] Use hash for content_id --- repo2docker/contentproviders/dataverse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 5797aacc6..220f147e0 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -187,4 +187,4 @@ def fetch(self, spec, output_dir, yield_output=False): @property def content_id(self): """The Dataverse persistent identifier.""" - return self.url + return hashlib.sha256(self.url.encode()).hexdigest() From f6037cab744c85722150de4c232b3aaec64978c2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:31:18 +0000 Subject: [PATCH 015/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/contentproviders/dataverse.py | 26 ++++++--- tests/contentproviders/test_dataverse.py | 66 +++++++++++------------ 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 220f147e0..125af7a56 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -1,9 +1,9 @@ +import hashlib import json import os import shutil -import hashlib -from urllib.parse import parse_qs, urlparse from typing import List +from urllib.parse import parse_qs, urlparse from ..utils import copytree, deep_get, is_doi from .doi import DoiProvider @@ -120,7 +120,7 @@ def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: persistent_id = qs["persistentId"][0] # https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP elif path.startswith("/dataset.xhtml"): - # https://dataverse.harvard.edu/api/access/datafile/3323458 + # https://dataverse.harvard.edu/api/access/datafile/3323458 persistent_id = qs["persistentId"][0] elif path.startswith("/api/access/datafile"): # What we have here is an entity id, which we can use to get a persistentId @@ -128,17 +128,27 @@ def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: persistent_id = self.get_dataset_id_from_file_id(dataverse_host, file_id) elif parsed_url.path.startswith("/file.xhtml"): file_persistent_id = qs["persistentId"][0] - persistent_id = self.get_dataset_id_from_file_id(dataverse_host, file_persistent_id) + persistent_id = self.get_dataset_id_from_file_id( + dataverse_host, file_persistent_id + ) else: - raise ValueError(f"Could not determine persistent id for dataverse URL {url}") + raise ValueError( + f"Could not determine persistent id for dataverse URL {url}" + ) - dataset_api_url = f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + dataset_api_url = ( + f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + ) resp = self._request(dataset_api_url, headers={"accept": "application/json"}) if resp.status_code == 404 and is_ambiguous: # It's possible this is a *file* persistent_id, not a dataset one - persistent_id = self.get_dataset_id_from_file_id(dataverse_host, persistent_id) + persistent_id = self.get_dataset_id_from_file_id( + dataverse_host, persistent_id + ) dataset_api_url = f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" - resp = self._request(dataset_api_url, headers={"accept": "application/json"}) + resp = self._request( + dataset_api_url, headers={"accept": "application/json"} + ) if resp.status_code == 404: # This persistent id is just not here diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index 2ab9ec69e..cb5e06f3a 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -102,41 +102,41 @@ def test_get_persistent_id(url, persistent_id): ( "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", - "doi:10.7910/DVN/6ZXAGT/3YRRYJ" + "doi:10.7910/DVN/6ZXAGT/3YRRYJ", ), { - 'ArchaeoGLOBE-master/analysis/figures/1_response_distribution.png': '243c6a3dd66bc3c84102829b277ef333', - 'ArchaeoGLOBE-master/analysis/figures/2_trends_map_knowledge.png': '2ace6ae9d470dda6cf2f9f9a6588171a', - 'ArchaeoGLOBE-master/analysis/figures/3_trends_global.png': '63ccd0a7b2d20440cd8f418d4ee88c4d', - 'ArchaeoGLOBE-master/analysis/figures/4_consensus_transitions.png': 'facfaedabeac77c4496d4b9e962a917f', - 'ArchaeoGLOBE-master/analysis/figures/5_ArchaeoGLOBE_HYDE_comparison.png': '8e002e4d50f179fc1808f562b1353588', - 'ArchaeoGLOBE-master/apt.txt': 'b4224032da6c71d48f46c9b78fc6ed77', - 'ArchaeoGLOBE-master/analysis/archaeoglobe.pdf': 'f575be4790efc963ef1bd40d097cc06d', - 'ArchaeoGLOBE-master/analysis/archaeoglobe.Rmd': 'f37d5f7993fde9ebd64d16b20fc22905', - 'ArchaeoGLOBE-master/ArchaeoGLOBE.Rproj': 'd0250e7918993bab1e707358fe5633e0', - 'ArchaeoGLOBE-master/CONDUCT.md': 'f87ef290340322089c32b4e573d8f1e8', - 'ArchaeoGLOBE-master/.circleci/config.yml': '6eaa54073a682b3195d8fab3a9dd8344', - 'ArchaeoGLOBE-master/CONTRIBUTING.md': 'b3a6abfc749dd155a3049f94a855bf9f', - 'ArchaeoGLOBE-master/DESCRIPTION': '745ef979494999e483987de72c0adfbd', - 'ArchaeoGLOBE-master/dockerfile': 'aedce68e5a7d6e79cbb24c9cffeae593', - 'ArchaeoGLOBE-master/.binder/Dockerfile': '7564a41246ba99b60144afb1d3b6d7de', - 'ArchaeoGLOBE-master/.gitignore': '62c1482e4febbd35dc02fb7e2a31246b', - 'ArchaeoGLOBE-master/analysis/data/derived-data/hyde_crop_prop.RDS': '2aea7748b5586923b0de9d13af58e59d', - 'ArchaeoGLOBE-master/analysis/data/derived-data/kk_anthro_prop.RDS': '145a9e5dd2c95625626a720b52178b70', - 'ArchaeoGLOBE-master/LICENSE.md': '3aa9d41a92a57944bd4590e004898445', - 'ArchaeoGLOBE-master/analysis/data/derived-data/placeholder': 'd41d8cd98f00b204e9800998ecf8427e', - 'ArchaeoGLOBE-master/.Rbuildignore': 'df15e4fed49abd685b536fef4472b01f', - 'ArchaeoGLOBE-master/README.md': '0b0faabe580c4d76a0e0d64a4f54bca4', - 'ArchaeoGLOBE-master/analysis/data/derived-data/README.md': '547fd1a6e874f6178b1cf525b5b9ae72', - 'ArchaeoGLOBE-master/analysis/figures/S1_FHG_consensus.png': 'd2584352e5442b33e4b23e361ca70fe1', - 'ArchaeoGLOBE-master/analysis/figures/S2_EXAG_consensus.png': '513eddfdad01fd01a20263a55ca6dbe3', - 'ArchaeoGLOBE-master/analysis/figures/S3_INAG_consensus.png': 'b16ba0ecd21b326f873209a7e55a8deb', - 'ArchaeoGLOBE-master/analysis/figures/S4_PAS_consensus.png': '05695f9412337a00c1cb6d1757d0ec5c', - 'ArchaeoGLOBE-master/analysis/figures/S5_URBAN_consensus.png': '10119f7495d3b8e7ad7f8a0770574f15', - 'ArchaeoGLOBE-master/analysis/figures/S6_trends_map_landuse.png': 'b1db7c97f39ccfc3a9e094c3e6307af0', - 'ArchaeoGLOBE-master/analysis/figures/S7_ArchaeoGLOBE_KK10_comparison.png': '30341748324f5f66acadb34c114c3e9d', - } - ) + "ArchaeoGLOBE-master/analysis/figures/1_response_distribution.png": "243c6a3dd66bc3c84102829b277ef333", + "ArchaeoGLOBE-master/analysis/figures/2_trends_map_knowledge.png": "2ace6ae9d470dda6cf2f9f9a6588171a", + "ArchaeoGLOBE-master/analysis/figures/3_trends_global.png": "63ccd0a7b2d20440cd8f418d4ee88c4d", + "ArchaeoGLOBE-master/analysis/figures/4_consensus_transitions.png": "facfaedabeac77c4496d4b9e962a917f", + "ArchaeoGLOBE-master/analysis/figures/5_ArchaeoGLOBE_HYDE_comparison.png": "8e002e4d50f179fc1808f562b1353588", + "ArchaeoGLOBE-master/apt.txt": "b4224032da6c71d48f46c9b78fc6ed77", + "ArchaeoGLOBE-master/analysis/archaeoglobe.pdf": "f575be4790efc963ef1bd40d097cc06d", + "ArchaeoGLOBE-master/analysis/archaeoglobe.Rmd": "f37d5f7993fde9ebd64d16b20fc22905", + "ArchaeoGLOBE-master/ArchaeoGLOBE.Rproj": "d0250e7918993bab1e707358fe5633e0", + "ArchaeoGLOBE-master/CONDUCT.md": "f87ef290340322089c32b4e573d8f1e8", + "ArchaeoGLOBE-master/.circleci/config.yml": "6eaa54073a682b3195d8fab3a9dd8344", + "ArchaeoGLOBE-master/CONTRIBUTING.md": "b3a6abfc749dd155a3049f94a855bf9f", + "ArchaeoGLOBE-master/DESCRIPTION": "745ef979494999e483987de72c0adfbd", + "ArchaeoGLOBE-master/dockerfile": "aedce68e5a7d6e79cbb24c9cffeae593", + "ArchaeoGLOBE-master/.binder/Dockerfile": "7564a41246ba99b60144afb1d3b6d7de", + "ArchaeoGLOBE-master/.gitignore": "62c1482e4febbd35dc02fb7e2a31246b", + "ArchaeoGLOBE-master/analysis/data/derived-data/hyde_crop_prop.RDS": "2aea7748b5586923b0de9d13af58e59d", + "ArchaeoGLOBE-master/analysis/data/derived-data/kk_anthro_prop.RDS": "145a9e5dd2c95625626a720b52178b70", + "ArchaeoGLOBE-master/LICENSE.md": "3aa9d41a92a57944bd4590e004898445", + "ArchaeoGLOBE-master/analysis/data/derived-data/placeholder": "d41d8cd98f00b204e9800998ecf8427e", + "ArchaeoGLOBE-master/.Rbuildignore": "df15e4fed49abd685b536fef4472b01f", + "ArchaeoGLOBE-master/README.md": "0b0faabe580c4d76a0e0d64a4f54bca4", + "ArchaeoGLOBE-master/analysis/data/derived-data/README.md": "547fd1a6e874f6178b1cf525b5b9ae72", + "ArchaeoGLOBE-master/analysis/figures/S1_FHG_consensus.png": "d2584352e5442b33e4b23e361ca70fe1", + "ArchaeoGLOBE-master/analysis/figures/S2_EXAG_consensus.png": "513eddfdad01fd01a20263a55ca6dbe3", + "ArchaeoGLOBE-master/analysis/figures/S3_INAG_consensus.png": "b16ba0ecd21b326f873209a7e55a8deb", + "ArchaeoGLOBE-master/analysis/figures/S4_PAS_consensus.png": "05695f9412337a00c1cb6d1757d0ec5c", + "ArchaeoGLOBE-master/analysis/figures/S5_URBAN_consensus.png": "10119f7495d3b8e7ad7f8a0770574f15", + "ArchaeoGLOBE-master/analysis/figures/S6_trends_map_landuse.png": "b1db7c97f39ccfc3a9e094c3e6307af0", + "ArchaeoGLOBE-master/analysis/figures/S7_ArchaeoGLOBE_KK10_comparison.png": "30341748324f5f66acadb34c114c3e9d", + }, + ), ], ) def test_fetch(specs: list[str], md5tree): From b854b77be55c4ff20f3b8b1b21e896f405a80b8c Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 11:50:10 -0800 Subject: [PATCH 016/299] Fix tests --- repo2docker/contentproviders/dataverse.py | 87 ++++++++++++++--------- tests/contentproviders/test_dataverse.py | 40 ++++------- 2 files changed, 64 insertions(+), 63 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 125af7a56..3cf8cb202 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -2,7 +2,7 @@ import json import os import shutil -from typing import List +from typing import List, Tuple from urllib.parse import parse_qs, urlparse from ..utils import copytree, deep_get, is_doi @@ -67,53 +67,44 @@ def detect(self, spec, ref=None, extra_args=None): # # We don't know exactly what kind of dataverse object this is, but # that can be figured out during fetch as needed - return {"host": host, "url": url} + return url - def get_dataset_id_from_file_id(self, host: str, file_id: str) -> str: + def get_dataset_id_from_file_id(self, base_url: str, file_id: str) -> str: """ Return the persistent_id (DOI) that a given file_id (int or doi) belongs to """ if file_id.isdigit(): # the file_id is an integer, rather than a persistent id (DOI) - api_url = f"{host}/api/files/{file_id}?returnDatasetVersion=true" + api_url = f"{base_url}/api/files/{file_id}?returnDatasetVersion=true" else: # the file_id is a doi itself - api_url = f"{host}/api/files/:persistentId?persistentId={file_id}&returnDatasetVersion=true" + api_url = f"{base_url}/api/files/:persistentId?persistentId={file_id}&returnDatasetVersion=true" resp = self._request(api_url) if resp.status_code == 404: - raise ValueError(f"File with id {file_id} not found in {host}") + raise ValueError(f"File with id {file_id} not found in {base_url}") resp.raise_for_status() data = resp.json()["data"] return data["datasetVersion"]["datasetPersistentId"] - def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: + def parse_dataverse_url(self, url: str) -> Tuple[str, bool]: """ - Return a list of dataFiles for given persistent_id - - Supports the following *dataset* URL styles: - - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP - - /dataset.xhtml: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP + Parse the persistent id out of a dataverse URL - Supports the following *file* URL styles: - - /api/access/datafile: https://dataverse.harvard.edu/api/access/datafile/3323458 - - Supports a subset of the following *file* URL styles: - - /file.xhtml: https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ + persistent_id can point to either a dataset or a file. The second return + value is False if we know that the persistent id is a file or a dataset, + and True if it is ambiguous. - If a URL can not be parsed, throw an exception + Raises a ValueError if we can not parse the url """ - - parsed_url = urlparse(url) + parsed_url= urlparse(url) path = parsed_url.path qs = parse_qs(parsed_url.query) - dataverse_host = f"{parsed_url.scheme}://{parsed_url.netloc}" - url_kind = None - persistent_id = None - is_ambiguous = False + base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" + is_ambiguous = False # https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP if path.startswith("/citation"): is_ambiguous = True @@ -124,35 +115,59 @@ def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: persistent_id = qs["persistentId"][0] elif path.startswith("/api/access/datafile"): # What we have here is an entity id, which we can use to get a persistentId - file_id = os.path.basename(parsed_url.path) - persistent_id = self.get_dataset_id_from_file_id(dataverse_host, file_id) + file_id = os.path.basename(path) + persistent_id = self.get_dataset_id_from_file_id(base_url, file_id) elif parsed_url.path.startswith("/file.xhtml"): file_persistent_id = qs["persistentId"][0] persistent_id = self.get_dataset_id_from_file_id( - dataverse_host, file_persistent_id + base_url, file_persistent_id ) else: raise ValueError( f"Could not determine persistent id for dataverse URL {url}" ) + return persistent_id, is_ambiguous + + def get_datafiles(self, url: str) -> List[dict]: + """ + Return a list of dataFiles for given persistent_id + + Supports the following *dataset* URL styles: + - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP + - /dataset.xhtml: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP + + Supports the following *file* URL styles: + - /api/access/datafile: https://dataverse.harvard.edu/api/access/datafile/3323458 + + Supports a subset of the following *file* URL styles: + - /file.xhtml: https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ + + If a URL can not be parsed, throw an exception + """ + + parsed_url = urlparse(url) + base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" + + persistent_id, is_ambiguous = self.parse_dataverse_url(url) + dataset_api_url = ( - f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + f"{base_url}/api/datasets/:persistentId?persistentId={persistent_id}" ) resp = self._request(dataset_api_url, headers={"accept": "application/json"}) if resp.status_code == 404 and is_ambiguous: # It's possible this is a *file* persistent_id, not a dataset one persistent_id = self.get_dataset_id_from_file_id( - dataverse_host, persistent_id + base_url, persistent_id ) - dataset_api_url = f"{dataverse_host}/api/datasets/:persistentId?persistentId={persistent_id}" + dataset_api_url = f"{base_url}/api/datasets/:persistentId?persistentId={persistent_id}" resp = self._request( dataset_api_url, headers={"accept": "application/json"} ) if resp.status_code == 404: # This persistent id is just not here - raise ValueError(f"{persistent_id} on {dataverse_host} is not found") + raise ValueError(f"{persistent_id} on {base_url} is not found") # We already handled 404, raise error for everything else resp.raise_for_status() @@ -163,15 +178,17 @@ def get_datafiles(self, dataverse_host: str, url: str) -> List[dict]: def fetch(self, spec, output_dir, yield_output=False): """Fetch and unpack a Dataverse dataset.""" - url = spec["url"] - host = spec["host"] + url = spec + parsed_url = urlparse(url) + # FIXME: Support determining API URL better + base_url = f'{parsed_url.scheme}://{parsed_url.netloc}' yield f"Fetching Dataverse record {url}.\n" - for fobj in self.get_datafiles(host["url"], url): + for fobj in self.get_datafiles(url): file_url = ( # without format=original you get the preservation format (plain text, tab separated) - f'{host["url"]}/api/access/datafile/{deep_get(fobj, "dataFile.id")}?format=original' + f'{base_url}/api/access/datafile/{deep_get(fobj, "dataFile.id")}?format=original' ) filename = fobj["label"] original_filename = fobj["dataFile"].get("originalFileName", None) diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index cb5e06f3a..7b6d1f604 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -6,48 +6,28 @@ from repo2docker.contentproviders import Dataverse -test_dv = Dataverse() -harvard_dv = next(_ for _ in test_dv.hosts if _["name"] == "Harvard Dataverse") -cimmyt_dv = next(_ for _ in test_dv.hosts if _["name"] == "CIMMYT Research Data") - - @pytest.mark.parametrize( ("doi", "resolved"), [ ( "doi:10.7910/DVN/6ZXAGT/3YRRYJ", - { - "host": harvard_dv, - "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", - }, + "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", ), ( "10.7910/DVN/6ZXAGT/3YRRYJ", - { - "host": harvard_dv, - "url": "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", - }, + "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", ), ( "10.7910/DVN/TJCLKP", - { - "host": harvard_dv, - "url": "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", - }, + "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", ), ( "https://dataverse.harvard.edu/api/access/datafile/3323458", - { - "host": harvard_dv, - "url": "https://dataverse.harvard.edu/api/access/datafile/3323458", - }, + "https://dataverse.harvard.edu/api/access/datafile/3323458", ), ( "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", - { - "host": cimmyt_dv, - "url": "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", - }, + "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", ), ("/some/random/string", None), ("https://example.com/path/here", None), @@ -60,28 +40,32 @@ def test_detect(doi, resolved): @pytest.mark.parametrize( - ("url", "persistent_id"), + ("url", "persistent_id", "is_ambiguous"), [ ( "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", "doi:10.7910/DVN/6ZXAGT", + False ), ( "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", "doi:10.7910/DVN/TJCLKP", + True ), ( "https://dataverse.harvard.edu/api/access/datafile/3323458", "doi:10.7910/DVN/3MJ7IR", + False ), ( "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", "hdl:11529/10016", + False ), ], ) -def test_get_persistent_id(url, persistent_id): - assert Dataverse().get_persistent_id_from_url(url) == persistent_id +def test_get_persistent_id(url, persistent_id, is_ambiguous): + assert Dataverse().parse_dataverse_url(url) == (persistent_id, is_ambiguous) @pytest.mark.parametrize( From f9e3d706dbb36df7d43c91e9d67ec74200ea37b7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:51:31 +0000 Subject: [PATCH 017/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/contentproviders/dataverse.py | 10 +++++----- tests/contentproviders/test_dataverse.py | 9 +++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 3cf8cb202..e786fe24a 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -99,7 +99,7 @@ def parse_dataverse_url(self, url: str) -> Tuple[str, bool]: Raises a ValueError if we can not parse the url """ - parsed_url= urlparse(url) + parsed_url = urlparse(url) path = parsed_url.path qs = parse_qs(parsed_url.query) base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" @@ -157,10 +157,10 @@ def get_datafiles(self, url: str) -> List[dict]: resp = self._request(dataset_api_url, headers={"accept": "application/json"}) if resp.status_code == 404 and is_ambiguous: # It's possible this is a *file* persistent_id, not a dataset one - persistent_id = self.get_dataset_id_from_file_id( - base_url, persistent_id + persistent_id = self.get_dataset_id_from_file_id(base_url, persistent_id) + dataset_api_url = ( + f"{base_url}/api/datasets/:persistentId?persistentId={persistent_id}" ) - dataset_api_url = f"{base_url}/api/datasets/:persistentId?persistentId={persistent_id}" resp = self._request( dataset_api_url, headers={"accept": "application/json"} ) @@ -181,7 +181,7 @@ def fetch(self, spec, output_dir, yield_output=False): url = spec parsed_url = urlparse(url) # FIXME: Support determining API URL better - base_url = f'{parsed_url.scheme}://{parsed_url.netloc}' + base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" yield f"Fetching Dataverse record {url}.\n" diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index 7b6d1f604..9ca25852f 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -6,6 +6,7 @@ from repo2docker.contentproviders import Dataverse + @pytest.mark.parametrize( ("doi", "resolved"), [ @@ -45,22 +46,22 @@ def test_detect(doi, resolved): ( "https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ", "doi:10.7910/DVN/6ZXAGT", - False + False, ), ( "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", "doi:10.7910/DVN/TJCLKP", - True + True, ), ( "https://dataverse.harvard.edu/api/access/datafile/3323458", "doi:10.7910/DVN/3MJ7IR", - False + False, ), ( "https://data.cimmyt.org/dataset.xhtml?persistentId=hdl:11529/10016", "hdl:11529/10016", - False + False, ), ], ) From 53fba84e18d1af7edadbceb01462c9f916c283e7 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 11:52:45 -0800 Subject: [PATCH 018/299] Add note about supporting /citation --- repo2docker/contentproviders/dataverse.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index e786fe24a..fb050800f 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -137,11 +137,10 @@ def get_datafiles(self, url: str) -> List[dict]: - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP - /dataset.xhtml: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP - Supports the following *file* URL styles: + Supports the following *file* URL styles (entire dataset file belongs to will be fetched): - /api/access/datafile: https://dataverse.harvard.edu/api/access/datafile/3323458 - - Supports a subset of the following *file* URL styles: - /file.xhtml: https://dataverse.harvard.edu/file.xhtml?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ + - /citation: https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/6ZXAGT/3YRRYJ If a URL can not be parsed, throw an exception """ From f4d58dcd2fee7a1d4e9976133b717d3cd61765db Mon Sep 17 00:00:00 2001 From: Yuvi Panda Date: Tue, 17 Dec 2024 11:54:10 -0800 Subject: [PATCH 019/299] Describe what kind of DOI is being returned Co-authored-by: Philip Durbin --- repo2docker/contentproviders/dataverse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index fb050800f..0d652c087 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -71,7 +71,7 @@ def detect(self, spec, ref=None, extra_args=None): def get_dataset_id_from_file_id(self, base_url: str, file_id: str) -> str: """ - Return the persistent_id (DOI) that a given file_id (int or doi) belongs to + Return the persistent_id (DOI) of a dataset that a given file_id (int or doi) belongs to """ if file_id.isdigit(): # the file_id is an integer, rather than a persistent id (DOI) From d71efb892db240759d5a09749c9b0e2808c370f0 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 12:52:47 -0800 Subject: [PATCH 020/299] Fix figshare unit test --- tests/unit/contentproviders/test_figshare.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tests/unit/contentproviders/test_figshare.py b/tests/unit/contentproviders/test_figshare.py index b4f42de31..760c0e487 100644 --- a/tests/unit/contentproviders/test_figshare.py +++ b/tests/unit/contentproviders/test_figshare.py @@ -21,16 +21,9 @@ @pytest.mark.parametrize("link,expected", test_content_ids) -def test_content_id(link, expected, requests_mock): - def mocked_get(req, context): - if req.url.startswith("https://doi.org"): - context.status_code = 302 - context.headers["Location"] = link - return link - - requests_mock.get(re.compile("https://"), text=mocked_get) +def test_content_id(link, expected): fig = Figshare() - fig.detect("10.6084/m9.figshare.9782777") + fig.detect(link) assert fig.content_id == expected From f7dfff18762337b355cb7e911ee6b73c4e806cab Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 12:56:36 -0800 Subject: [PATCH 021/299] Fix hydroshare tests --- .../unit/contentproviders/test_hydroshare.py | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/tests/unit/contentproviders/test_hydroshare.py b/tests/unit/contentproviders/test_hydroshare.py index 0c8acfd14..41e234cd1 100755 --- a/tests/unit/contentproviders/test_hydroshare.py +++ b/tests/unit/contentproviders/test_hydroshare.py @@ -34,20 +34,14 @@ def doi_resolver(req, context): } -def test_content_id(requests_mock): - requests_mock.get(re.compile("https://"), json=hydroshare_data) - requests_mock.get(re.compile("https://doi.org"), json=doi_resolver) - +def test_content_id(): hydro = Hydroshare() hydro.detect("10.4211/hs.b8f6eae9d89241cf8b5904033460af61") - assert hydro.content_id == "b8f6eae9d89241cf8b5904033460af61.v1569427757" - + assert hydro.content_id == "b8f6eae9d89241cf8b5904033460af61.v1585005408" -def test_detect_hydroshare(requests_mock): - requests_mock.get(re.compile("https://"), json=hydroshare_data) - requests_mock.get(re.compile("https://doi.org"), json=doi_resolver) +def test_detect_hydroshare(): # valid Hydroshare DOIs trigger this content provider expected = { "host": { @@ -59,7 +53,7 @@ def test_detect_hydroshare(requests_mock): "version": "https://www.hydroshare.org/hsapi/resource/{}/scimeta/elements", }, "resource": "b8f6eae9d89241cf8b5904033460af61", - "version": "1569427757", + "version": "1585005408", } assert ( @@ -68,16 +62,10 @@ def test_detect_hydroshare(requests_mock): ) == expected ) - # assert a call to urlopen was called to fetch version - assert requests_mock.call_count == 1 - requests_mock.reset_mock() assert ( Hydroshare().detect("10.4211/hs.b8f6eae9d89241cf8b5904033460af61") == expected ) - # assert 3 calls were made, 2 to resolve the DOI (302 + 200) and another to fetch the version - assert requests_mock.call_count == 3 - requests_mock.reset_mock() assert ( Hydroshare().detect( @@ -85,9 +73,6 @@ def test_detect_hydroshare(requests_mock): ) == expected ) - # assert 3 more calls were made, 2 to resolve the DOI and another to fetch the version - assert requests_mock.call_count == 3 - requests_mock.reset_mock() # Don't trigger the Hydroshare content provider assert Hydroshare().detect("/some/path/here") is None From 3be6ca99c21473bb7a80a0186a7c8f54c1e520ab Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 12:58:01 -0800 Subject: [PATCH 022/299] Fix zenodo tests --- tests/unit/contentproviders/test_zenodo.py | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/tests/unit/contentproviders/test_zenodo.py b/tests/unit/contentproviders/test_zenodo.py index 38737ae1a..a1e1226fb 100644 --- a/tests/unit/contentproviders/test_zenodo.py +++ b/tests/unit/contentproviders/test_zenodo.py @@ -21,18 +21,7 @@ } -def doi_resolver(req, context): - resp = doi_responses.get(req.url) - # doi responses are redirects - if resp is not None: - context.status_code = 302 - context.headers["Location"] = resp - return resp - - -def test_content_id(requests_mock): - requests_mock.get(re.compile("https://"), json=doi_resolver) - +def test_content_id(): zen = Zenodo() zen.detect("10.5281/zenodo.3232985") assert zen.content_id == "3232985" @@ -60,15 +49,11 @@ def test_content_id(requests_mock): @pytest.mark.parametrize("test_input,expected", test_hosts) -def test_detect_zenodo(test_input, expected, requests_mock): - requests_mock.get(re.compile("https://"), json=doi_resolver) +def test_detect_zenodo(test_input, expected): # valid Zenodo DOIs trigger this content provider assert Zenodo().detect(test_input[0]) == expected assert Zenodo().detect(test_input[1]) == expected assert Zenodo().detect(test_input[2]) == expected - # only two of the three calls above have to resolve a DOI (2 req per doi resolution) - assert requests_mock.call_count == 4 - requests_mock.reset_mock() # Don't trigger the Zenodo content provider assert Zenodo().detect("/some/path/here") is None From 60c0d70f373fc1ec1ee9542709757b681717e8ac Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 17 Dec 2024 13:10:54 -0800 Subject: [PATCH 023/299] Fix doi provider test We no longer follow redirects, so this is the canonical URL --- tests/unit/contentproviders/test_doi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/contentproviders/test_doi.py b/tests/unit/contentproviders/test_doi.py index 301b50beb..58cae5f5b 100644 --- a/tests/unit/contentproviders/test_doi.py +++ b/tests/unit/contentproviders/test_doi.py @@ -33,7 +33,7 @@ def test_url_headers(requests_mock): @pytest.mark.parametrize( "requested_doi, expected", [ - ("10.5281/zenodo.3242074", "https://zenodo.org/records/3242074"), + ("10.5281/zenodo.3242074", "https://zenodo.org/record/3242074"), # Unresolving DOI: ("10.1/1234", "10.1/1234"), ], From e48f5b773e3687faf9b8fb3ebb5846bd8a3686cd Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 19 Dec 2024 12:08:10 -0800 Subject: [PATCH 024/299] Switch back to using DOI as persistent_id --- repo2docker/contentproviders/dataverse.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 0d652c087..248a3f3a2 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -58,9 +58,6 @@ def detect(self, spec, ref=None, extra_args=None): if host is None: return - # Used only for content_id - self.url = url - # At this point, we *know* this is a dataverse URL, because: # 1. The DOI resolved to a particular host (if using DOI) # 2. The host is in the list of known dataverse installations @@ -171,6 +168,10 @@ def get_datafiles(self, url: str) -> List[dict]: # We already handled 404, raise error for everything else resp.raise_for_status() + # We know the exact persistent_id of the dataset we fetched now + # Save it for use as content_id + self.persistent_id = persistent_id + data = resp.json()["data"] return data["latestVersion"]["files"] @@ -212,5 +213,9 @@ def fetch(self, spec, output_dir, yield_output=False): @property def content_id(self): - """The Dataverse persistent identifier.""" - return hashlib.sha256(self.url.encode()).hexdigest() + """ + The Dataverse persistent identifier. + + Only valid if called after a succesfull fetch + """ + return self.persistent_id From e463ca9dab0e04b1674a5dca00f22e9642149640 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 20 Dec 2024 15:42:02 -0800 Subject: [PATCH 025/299] Remove unused _urlopen method This was never used anywhere, and actually didn't even import - 'request' is actually urllib.request, not requests. It was never imported but used here! --- repo2docker/contentproviders/doi.py | 13 ------------- tests/unit/contentproviders/test_figshare.py | 1 - tests/unit/contentproviders/test_swhid.py | 4 ---- 3 files changed, 18 deletions(-) diff --git a/repo2docker/contentproviders/doi.py b/repo2docker/contentproviders/doi.py index cf43a1578..306248021 100644 --- a/repo2docker/contentproviders/doi.py +++ b/repo2docker/contentproviders/doi.py @@ -29,19 +29,6 @@ def _request(self, url, **kwargs): urlopen = _request - def _urlopen(self, req, headers=None): - """A urlopen() helper""" - # someone passed a string, not a request - if not isinstance(req, request.Request): - req = request.Request(req) - - req.add_header("User-Agent", f"repo2docker {__version__}") - if headers is not None: - for key, value in headers.items(): - req.add_header(key, value) - - return request.urlopen(req) - def doi2url(self, doi): # Transform a DOI to a URL # If not a doi, assume we have a URL and return diff --git a/tests/unit/contentproviders/test_figshare.py b/tests/unit/contentproviders/test_figshare.py index 760c0e487..9b8229e46 100644 --- a/tests/unit/contentproviders/test_figshare.py +++ b/tests/unit/contentproviders/test_figshare.py @@ -129,7 +129,6 @@ def test_fetch_zip(requests_mock): ) requests_mock.get(f"file://{fig_path}", content=open(fig_path, "rb").read()) - # with patch.object(Figshare, "urlopen", new=mock_urlopen): with TemporaryDirectory() as d: output = [] for l in test_fig.fetch(test_spec, d): diff --git a/tests/unit/contentproviders/test_swhid.py b/tests/unit/contentproviders/test_swhid.py index 56fee1dfc..0de5be68b 100644 --- a/tests/unit/contentproviders/test_swhid.py +++ b/tests/unit/contentproviders/test_swhid.py @@ -56,10 +56,6 @@ def test_detect(swhid, expected): assert provider.detect(swhid) == expected -def fake_urlopen(req): - print(req) - return req.headers - def test_unresolving_swhid(): provider = Swhid() From 0305dabdb634324898cb8679676da841e5b4d89a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 23:52:58 +0000 Subject: [PATCH 026/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/unit/contentproviders/test_swhid.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/contentproviders/test_swhid.py b/tests/unit/contentproviders/test_swhid.py index 0de5be68b..edf68af4b 100644 --- a/tests/unit/contentproviders/test_swhid.py +++ b/tests/unit/contentproviders/test_swhid.py @@ -56,7 +56,6 @@ def test_detect(swhid, expected): assert provider.detect(swhid) == expected - def test_unresolving_swhid(): provider = Swhid() From 025277d5a6a622e194c11147defb0329f169cfba Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sun, 8 Dec 2024 00:22:51 -0800 Subject: [PATCH 027/299] Use self.log.warning instead of warnings.warn warnings.warn sidesteps all the json logging bits we do, and repo2docker will produce non-json output that binderhub then struggles to consume. --- repo2docker/app.py | 2 +- repo2docker/buildpacks/conda/__init__.py | 2 +- repo2docker/utils.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 71171405d..5feba05a6 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -267,7 +267,7 @@ def _platform_default(self): """ p = get_platform() if p == "linux/arm64": - warnings.warn( + self.log.warning( "Building for linux/arm64 is experimental. " "To use the recommended platform set --Repo2Docker.platform=linux/amd64. " "To silence this warning set --Repo2Docker.platform=linux/arm64." diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index 2a3e694df..a9c6670ec 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -355,7 +355,7 @@ def uses_r(self): @property def py2(self): """Am I building a Python 2 kernel environment?""" - warnings.warn( + self.log.warning( "CondaBuildPack.py2 is deprecated in 2023.2. Use CondaBuildPack.separate_kernel_env.", DeprecationWarning, stacklevel=2, diff --git a/repo2docker/utils.py b/repo2docker/utils.py index 9c2769e1d..443db97e2 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -543,5 +543,4 @@ def get_platform(): # OSX reports arm64 return "linux/arm64" else: - warnings.warn(f"Unexpected platform '{m}', defaulting to linux/amd64") - return "linux/amd64" + raise ValueError("Unsupported platform {m}") From 29ee4c314eae002f1e49cfa5106244fee9a26a14 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 20 Dec 2024 17:20:24 -0800 Subject: [PATCH 028/299] Re-add warnings usage in one place This actually seems appropriate --- repo2docker/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/repo2docker/utils.py b/repo2docker/utils.py index 443db97e2..9c2769e1d 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -543,4 +543,5 @@ def get_platform(): # OSX reports arm64 return "linux/arm64" else: - raise ValueError("Unsupported platform {m}") + warnings.warn(f"Unexpected platform '{m}', defaulting to linux/amd64") + return "linux/amd64" From 9d5084a2fe8f3a0419b430ce61f65c9e995fe187 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sat, 21 Dec 2024 10:52:55 -0800 Subject: [PATCH 029/299] Remove unused imports --- repo2docker/app.py | 1 - repo2docker/buildpacks/conda/__init__.py | 1 - 2 files changed, 2 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 5feba05a6..a2a9a92d6 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -16,7 +16,6 @@ import sys import tempfile import time -import warnings from urllib.parse import urlparse import entrypoints diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index a9c6670ec..57f5d2abe 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -2,7 +2,6 @@ import os import re -import warnings from collections.abc import Mapping from functools import lru_cache From fa016ea65efe90e04c5ce7d8406dcd481bf8014f Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 27 Jan 2025 09:40:33 +0100 Subject: [PATCH 030/299] Upgrade RStudio to 2024.12 --- repo2docker/buildpacks/_r_base.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/repo2docker/buildpacks/_r_base.py b/repo2docker/buildpacks/_r_base.py index de2b7fcb2..f29a1053a 100644 --- a/repo2docker/buildpacks/_r_base.py +++ b/repo2docker/buildpacks/_r_base.py @@ -15,21 +15,24 @@ def rstudio_base_scripts(r_version): shiny_proxy_version = "1.1" shiny_sha256sum = "80f1e48f6c824be7ef9c843bb7911d4981ac7e8a963e0eff823936a8b28476ee" - # RStudio server has different builds based on wether OpenSSL 3 or 1.1 is available in the base - # image. 3 is present Jammy+, 1.1 until then. Instead of hardcoding URLs based on distro, we actually - # check for the dependency itself directly in the code below. You can find these URLs in - # https://posit.co/download/rstudio-server/, toggling between Ubuntu 22 (for openssl3) vs earlier versions (openssl 1.1) + # RStudio server has different builds based on wether OpenSSL 3 or 1.1 is available. + # OpenSSL 3 is present from Ubuntu 22.04 LTS (Jammy). + # OpenSSL 1.1 is present until Ubuntu 21.10. + # Instead of hardcoding URLs based on distro, + # we actually check for the dependency itself directly in the code below. + # You can find these URLs in https://posit.co/download/rstudio-server/, + # toggling between Ubuntu 22 (for openssl3) vs earlier versions (openssl 1.1) # you may forget about openssl, but openssl never forgets you. - rstudio_openssl3_url = "https://download2.rstudio.org/server/jammy/amd64/rstudio-server-2022.12.0-353-amd64.deb" + rstudio_openssl3_url = "https://download2.rstudio.org/server/jammy/amd64/rstudio-server-2024.12.0-467-amd64.deb" rstudio_openssl3_sha256sum = ( - "a5aa2202786f9017a6de368a410488ea2e4fc6c739f78998977af214df0d6288" + "1493188cdabcc1047db27d1bd0e46947e39562cbd831158c7812f88d80e742b3" ) - rstudio_openssl1_url = "https://download2.rstudio.org/server/bionic/amd64/rstudio-server-2022.12.0-353-amd64.deb" + rstudio_openssl1_url = "https://download2.rstudio.org/server/focal/amd64/rstudio-server-2024.12.0-467-amd64.deb" rstudio_openssl1_sha256sum = ( - "bb88e37328c304881e60d6205d7dac145525a5c2aaaf9da26f1cb625b7d47e6e" + "052540a8df135d9ce7569ddc2fc9637671103934179691bc3e43298336fc3a8e" ) - rsession_proxy_version = "2.2.0" + rsession_proxy_version = "2.3.0" return [ ( From 1c1a29712757ac5b4eed1871cc725cdb2b58d74e Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 27 Jan 2025 09:47:34 +0100 Subject: [PATCH 031/299] Upgrade Shiny server to 2024.12 --- repo2docker/buildpacks/_r_base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/_r_base.py b/repo2docker/buildpacks/_r_base.py index de2b7fcb2..bac180fac 100644 --- a/repo2docker/buildpacks/_r_base.py +++ b/repo2docker/buildpacks/_r_base.py @@ -11,9 +11,9 @@ def rstudio_base_scripts(r_version): """Base steps to install RStudio and shiny-server.""" # Shiny server (not the package!) seems to be the same version for all R versions - shiny_server_url = "https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.17.973-amd64.deb" - shiny_proxy_version = "1.1" - shiny_sha256sum = "80f1e48f6c824be7ef9c843bb7911d4981ac7e8a963e0eff823936a8b28476ee" + shiny_server_url = "https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.22.1017-amd64.deb" + shiny_proxy_version = "1.3" + shiny_sha256sum = "0fa40054f038de464a26f3f8c40180a072228454762b7a12ed50568b3256c236" # RStudio server has different builds based on wether OpenSSL 3 or 1.1 is available in the base # image. 3 is present Jammy+, 1.1 until then. Instead of hardcoding URLs based on distro, we actually From d0d87c8c7c91c63f8eafe6f21b4108e15f6c2ef0 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:00:09 -0800 Subject: [PATCH 032/299] Shell out to `docker buildx build` to build images pydocker uses the HTTP API (equivalent to `docker build`) which has been dead for ages. `docker buildx` (the interface to BuildKit) is what we *should* be using, but alas pydocker does not currently support it and I suspect it never will (https://github.com/docker/docker-py/issues/2230). This PR simply shells out, as I think that's the way. Fixes https://github.com/jupyterhub/repo2docker/issues/875 --- repo2docker/docker.py | 52 +++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 830e5c78b..8ebc571c0 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,12 +2,19 @@ Docker container engine for repo2docker """ +import subprocess +import tarfile +import tempfile +from queue import Empty, Queue +from threading import Thread + from iso8601 import parse_date from traitlets import Dict import docker from .engine import Container, ContainerEngine, ContainerEngineException, Image +from .utils import execute_cmd class DockerContainer(Container): @@ -53,7 +60,7 @@ class DockerEngine(ContainerEngine): https://docker-py.readthedocs.io/en/4.2.0/api.html#module-docker.api.build """ - string_output = False + string_output = True extra_init_args = Dict( {}, @@ -82,8 +89,8 @@ def __init__(self, *, parent): def build( self, *, - buildargs=None, - cache_from=None, + buildargs: dict | None = None, + cache_from: list[str] | None = None, container_limits=None, tag="", custom_context=False, @@ -94,22 +101,29 @@ def build( platform=None, **kwargs, ): - return self._apiclient.build( - buildargs=buildargs, - cache_from=cache_from, - container_limits=container_limits, - forcerm=True, - rm=True, - tag=tag, - custom_context=custom_context, - decode=True, - dockerfile=dockerfile, - fileobj=fileobj, - path=path, - labels=labels, - platform=platform, - **kwargs, - ) + args = ["docker", "buildx", "build", "--progress", "plain"] + if buildargs: + for k, v in buildargs.items(): + args += ["--build-arg", f"{k}={v}"] + + if cache_from: + for cf in cache_from: + args += ["--cache-from", cf] + + if dockerfile: + args += ["--file", dockerfile] + + if tag: + args += ["--tag", tag] + + if fileobj: + with tempfile.TemporaryDirectory() as d: + tarf = tarfile.open(fileobj=fileobj) + tarf.extractall(d) + + args += [d] + + yield from execute_cmd(args, True) def images(self): images = self._apiclient.images() From 1ca89b828821bd1d5b9a5e715670784c47808dd6 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:10:26 -0800 Subject: [PATCH 033/299] Remove type hints for now --- repo2docker/docker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 8ebc571c0..29f2acfe9 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -89,8 +89,8 @@ def __init__(self, *, parent): def build( self, *, - buildargs: dict | None = None, - cache_from: list[str] | None = None, + buildargs=None, + cache_from=None, container_limits=None, tag="", custom_context=False, From 258daa7c2089943b3460d479fba5397ee549b130 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:12:09 -0800 Subject: [PATCH 034/299] Automatically load built image to mimic previous behavior --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 29f2acfe9..812199821 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -101,7 +101,7 @@ def build( platform=None, **kwargs, ): - args = ["docker", "buildx", "build", "--progress", "plain"] + args = ["docker", "buildx", "build", "--progress", "plain", "--load"] if buildargs: for k, v in buildargs.items(): args += ["--build-arg", f"{k}={v}"] From 93cb0d757c544f0c2e6d392f9d0395ad88cf0c10 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:14:08 -0800 Subject: [PATCH 035/299] Support `Dockerfile` too --- repo2docker/docker.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 812199821..dc36a0a6a 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -124,6 +124,11 @@ def build( args += [d] yield from execute_cmd(args, True) + else: + # Assume 'path' is passed in + args += [path] + + yield from execute_cmd(args, True) def images(self): images = self._apiclient.images() From 77ed4996809213076f8a03c6c477723f01895314 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:17:45 -0800 Subject: [PATCH 036/299] Support --platform and --labels --- repo2docker/docker.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index dc36a0a6a..8116ae8b9 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -116,6 +116,13 @@ def build( if tag: args += ["--tag", tag] + if labels: + for k, v in labels: + args += ["--label", f"{k}={v}"] + + if platform: + args += ["--platform", platform] + if fileobj: with tempfile.TemporaryDirectory() as d: tarf = tarfile.open(fileobj=fileobj) From 743c9f964cc8ae4c3f01faa41f392d75bc14cfb0 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 19:21:53 -0800 Subject: [PATCH 037/299] Iterate labels as dicts --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 8116ae8b9..64f056ba5 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -117,7 +117,7 @@ def build( args += ["--tag", tag] if labels: - for k, v in labels: + for k, v in labels.items(): args += ["--label", f"{k}={v}"] if platform: From b1cedc4a78a1307e99fd0a92ab5dda1b49687b3a Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 20:29:42 -0800 Subject: [PATCH 038/299] Remove some patched out tests that don't apply anymore --- tests/unit/test_app.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index d37103e60..67cddc07e 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -78,21 +78,6 @@ def test_local_dir_image_name(repo_with_content): ) -def test_build_kwargs(repo_with_content): - upstream, sha1 = repo_with_content - argv = [upstream] - app = make_r2d(argv) - app.extra_build_kwargs = {"somekey": "somevalue"} - - with patch.object(docker.APIClient, "build") as builds: - builds.return_value = [] - app.build() - builds.assert_called_once() - args, kwargs = builds.call_args - assert "somekey" in kwargs - assert kwargs["somekey"] == "somevalue" - - def test_run_kwargs(repo_with_content): upstream, sha1 = repo_with_content argv = [upstream] @@ -107,25 +92,6 @@ def test_run_kwargs(repo_with_content): assert kwargs["somekey"] == "somevalue" -def test_root_not_allowed(): - with TemporaryDirectory() as src, patch("os.geteuid") as geteuid: - geteuid.return_value = 0 - argv = [src] - with pytest.raises(SystemExit) as exc: - app = make_r2d(argv) - assert exc.code == 1 - - with pytest.raises(ValueError): - app = Repo2Docker(repo=src, run=False) - app.build() - - app = Repo2Docker(repo=src, user_id=1000, user_name="jovyan", run=False) - app.initialize() - with patch.object(docker.APIClient, "build") as builds: - builds.return_value = [] - app.build() - builds.assert_called_once() - def test_dryrun_works_without_docker(tmpdir, capsys): with chdir(tmpdir): From 8e20b60c69a598d9bd881d20a22a41440ac5eba6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 04:30:03 +0000 Subject: [PATCH 039/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/unit/test_app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 67cddc07e..7828c3183 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -92,7 +92,6 @@ def test_run_kwargs(repo_with_content): assert kwargs["somekey"] == "somevalue" - def test_dryrun_works_without_docker(tmpdir, capsys): with chdir(tmpdir): with patch.object(docker, "APIClient") as client: From a03bf74d1f5e2ae66a8d054b798846724055869a Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 28 Jan 2025 20:31:26 -0800 Subject: [PATCH 040/299] Add a warning + check to make sure docker is installed --- repo2docker/docker.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 64f056ba5..6bd545a8b 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,11 +2,9 @@ Docker container engine for repo2docker """ -import subprocess +import shutil import tarfile import tempfile -from queue import Empty, Queue -from threading import Thread from iso8601 import parse_date from traitlets import Dict @@ -101,6 +99,8 @@ def build( platform=None, **kwargs, ): + if not shutil.which("docker"): + raise RuntimeError("The docker commandline client must be installed") args = ["docker", "buildx", "build", "--progress", "plain", "--load"] if buildargs: for k, v in buildargs.items(): From d9407061284bda4cdb32e67d47edbf37ae1b1762 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 29 Jan 2025 08:25:23 -0800 Subject: [PATCH 041/299] Add extra_buildx_build_args --- repo2docker/docker.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 6bd545a8b..6d622beca 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -7,7 +7,7 @@ import tempfile from iso8601 import parse_date -from traitlets import Dict +from traitlets import Dict, List, Unicode import docker @@ -74,6 +74,15 @@ class DockerEngine(ContainerEngine): config=True, ) + extra_buildx_build_args = List( + Unicode, + [], + help=""" + Extra commandline arguments to pass to `docker buildx build` when building the image. + """, + help=True + ) + def __init__(self, *, parent): super().__init__(parent=parent) try: @@ -123,6 +132,9 @@ def build( if platform: args += ["--platform", platform] + # place extra args right *before* the path + args += self.extra_buildx_build_args + if fileobj: with tempfile.TemporaryDirectory() as d: tarf = tarfile.open(fileobj=fileobj) From 5b9615643bc612355f5afd9dd0b9cda90e0e7f41 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 29 Jan 2025 08:28:24 -0800 Subject: [PATCH 042/299] Fix trait definition --- repo2docker/docker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 6d622beca..4f51e5fc1 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -75,12 +75,12 @@ class DockerEngine(ContainerEngine): ) extra_buildx_build_args = List( - Unicode, + [Unicode], [], help=""" Extra commandline arguments to pass to `docker buildx build` when building the image. """, - help=True + config=True ) def __init__(self, *, parent): From d7968bbf8eed7007002935493bce7a0aaa63fa0b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:34:40 +0000 Subject: [PATCH 043/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 4f51e5fc1..8fb35011b 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -80,7 +80,7 @@ class DockerEngine(ContainerEngine): help=""" Extra commandline arguments to pass to `docker buildx build` when building the image. """, - config=True + config=True, ) def __init__(self, *, parent): From 6df3ec637757465c1f4d72097c4afb5588a32ed4 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 29 Jan 2025 21:34:54 -0800 Subject: [PATCH 044/299] Fix traitlet again? --- repo2docker/docker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 8fb35011b..e2eeac06c 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -75,7 +75,6 @@ class DockerEngine(ContainerEngine): ) extra_buildx_build_args = List( - [Unicode], [], help=""" Extra commandline arguments to pass to `docker buildx build` when building the image. From 087c332638c578676422268df93c2b22aa45e8ae Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sat, 8 Feb 2025 13:34:56 -0800 Subject: [PATCH 045/299] Specify what kinda list extra_buildx_build_args can be --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index e2eeac06c..7fcbc31e2 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -75,7 +75,7 @@ class DockerEngine(ContainerEngine): ) extra_buildx_build_args = List( - [], + Unicode(), help=""" Extra commandline arguments to pass to `docker buildx build` when building the image. """, From 318e8ed07e2c0d2e691a70c43ed90a80db80612f Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sun, 9 Feb 2025 13:06:25 -0800 Subject: [PATCH 046/299] Stop using datetime.utcnow() to fix warning ``` /Users/yuvipanda/code/repo2docker/./repo2docker/buildpacks/conda/freeze.py:101: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). ``` --- repo2docker/buildpacks/conda/freeze.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index d4697e69e..7799fff6a 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -12,7 +12,7 @@ import os import pathlib from argparse import ArgumentParser -from datetime import datetime +from datetime import datetime, UTC from subprocess import check_call from ruamel.yaml import YAML @@ -68,7 +68,7 @@ def freeze(env_file, frozen_file, platform="linux-64"): f.write( f"# AUTO GENERATED FROM {env_file.relative_to(HERE)}, DO NOT MANUALLY MODIFY\n" ) - f.write(f"# Frozen on {datetime.utcnow():%Y-%m-%d %H:%M:%S UTC}\n") + f.write(f"# Frozen on {datetime.now(UTC):%Y-%m-%d %H:%M:%S UTC}\n") with frozen_tempfile.open() as temp: f.write(temp.read()) @@ -98,7 +98,7 @@ def set_python(py_env_file, py): f.write( f"# AUTO GENERATED FROM {ENV_FILE.relative_to(HERE)}, DO NOT MANUALLY MODIFY\n" ) - f.write(f"# Generated on {datetime.utcnow():%Y-%m-%d %H:%M:%S UTC}\n") + f.write(f"# Generated on {datetime.now(UTC):%Y-%m-%d %H:%M:%S UTC}\n") yaml.dump(env, f) From a4b7f770fd688bb832c664e3e2a5a4c2f3a8ad43 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:07:17 +0000 Subject: [PATCH 047/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/buildpacks/conda/freeze.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index 7799fff6a..d37c834c3 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -12,7 +12,7 @@ import os import pathlib from argparse import ArgumentParser -from datetime import datetime, UTC +from datetime import UTC, datetime from subprocess import check_call from ruamel.yaml import YAML From 65bc82a39bd60f33c44d4aa1dd86f2f736d024ab Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sun, 9 Feb 2025 13:08:51 -0800 Subject: [PATCH 048/299] Refreeze base environment for package upgrades --- .../conda/environment.py-3.10-linux-64.lock | 298 +++++++++-------- .../environment.py-3.10-linux-aarch64.lock | 298 +++++++++-------- .../buildpacks/conda/environment.py-3.10.yml | 2 +- .../conda/environment.py-3.11-linux-64.lock | 300 +++++++++--------- .../environment.py-3.11-linux-aarch64.lock | 300 +++++++++--------- .../buildpacks/conda/environment.py-3.11.yml | 2 +- .../conda/environment.py-3.12-linux-64.lock | 300 +++++++++--------- .../environment.py-3.12-linux-aarch64.lock | 300 +++++++++--------- .../buildpacks/conda/environment.py-3.12.yml | 2 +- .../conda/environment.py-3.8-linux-64.lock | 125 ++++---- .../environment.py-3.8-linux-aarch64.lock | 125 ++++---- .../buildpacks/conda/environment.py-3.8.yml | 2 +- .../conda/environment.py-3.9-linux-64.lock | 300 +++++++++--------- .../environment.py-3.9-linux-aarch64.lock | 300 +++++++++--------- .../buildpacks/conda/environment.py-3.9.yml | 2 +- 15 files changed, 1325 insertions(+), 1331 deletions(-) diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock index 998b18e68..9392cd7be 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock @@ -1,177 +1,175 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:02:53 UTC +# Frozen on 2025-02-09 21:05:17 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 9914f3a970025d1c558275701d8a6a00f78464325df880885601a031faf3452a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda#7e8b914b1062dd4386e3de4d82a3ead6 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hc19f0b3_1.conda#0b86ff6ab7bdce5076269f2bbbf6857d -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.5-py310hea249c9_0.conda#8750c69e97e0d019deb9971adc44e2f2 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py310hf71b8c6_0.conda#9b1dedfc47e1242253d6e2ca3b864693 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.0.3-py310hc6cd4ac_0.conda#fb478fd83c001cbf8ab01c29b857262e -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py310hff52083_0.conda#e546c847260e094f41d0d2f8d17fcbdd -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py310hf71b8c6_1.conda#973d74c46d37ed8bbdbe721fb64a4357 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py310hff52083_1.conda#ce614a01b0aee1b29cee13d606bcb5d5 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h5b4e0ec_0.conda#ad8de7b4ac482217959cc1e8fe0cc56d +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py310h42e942d_0.conda#825361e63187e65a9da05a8b4274a0e1 -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py310h505e2c1_0.conda#3c12053527c50b3f825dd6dd0861832d +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py310hc51659f_0.conda#c5a6aac4a1e0989986d9f06b3c2be2a0 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h2fdcea3_0.conda#6ac912f6208a15d35955ab73a4e5efda -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py310hff52083_0.conda#cb92c27600d5716fd526a206aa43342c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py310h71f11fc_0.conda#a2d7306f56bbef9d203518707ba90e89 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py310h71f11fc_0.conda#7793fb5339be966e5f28971fd6025a9e +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310h2372a71_4.conda#68ee85860502d53c8cbfa0e4cef0f6cb -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py310h4909e49_0.conda#107b81f60a7391acd1f397dc5713d397 -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py310h42e942d_0.conda#51dcc27558e8cbe3aa6d3641cd78aa6d -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.32-py310h5b4e0ec_0.conda#db50567b518bc3dcc5168d51dae66ef4 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310ha75aee5_5.conda#a2da54f3a705d518c95a5b6de8ad8af6 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py310h6c63255_1.conda#30cff8c312637e4b30a4a4f1b7a68ca4 +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py310hcb5633a_0.conda#7314a7344c7e4b5e97f6819a09fa0114 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py310ha75aee5_0.conda#11bb9ab95d526337cb9672fe69209b29 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock index 64472fdbe..8b26b054d 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock @@ -1,176 +1,174 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:03:03 UTC +# Frozen on 2025-02-09 21:05:33 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: f532024d27b7260ff8e8e6db3f3e99af408d28961320c7a5c8046c9b6df251ee @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda#c4c784a1336d72fff54f6b207f3dd75f -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda#59d463d51eda114031e52667843f9665 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-5_cp310.conda#c6694ec383fb171da3ab68cae8d0e8f1 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda#97f754b22f63a943345bd807e1d51e01 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda#7f591390401ad65781372240424ab7fc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c -https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-h9de0dd0_1.conda#ea2fbe77db884c344c72d10c895266d3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.14-hbbe8eec_0_cpython.conda#8a8ee3a8c62032c554debc785a3b5aba -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310hbb3657e_1.conda#5ed52d1d3c480022fe67ae00d1cab792 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.16-h57b00e1_1_cpython.conda#c4b3a08e4d6fc7b070720f75bc883b47 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310he30c3ed_2.conda#3d7dcdcc65649814f571bf0671b5c5c8 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.5-py310hcaf1f41_0.conda#1099ea012f1c41375f9fe38dcf84cfb3 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py310he30c3ed_0.conda#10265307919ae9fccffe9a522047a1a0 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.0.3-py310hbb3657e_0.conda#8666638e8cdaf3a8503c8c86e3a1e667 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py310h4c7bcd0_0.conda#1b1172686c6b9fb6ecd607f41326040b -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py310h7c1f4a2_0.conda#cd83a00c52970ab794e9e991f0b32db4 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py310he30c3ed_1.conda#f0e06167a871874b814d4202f63dc870 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py310h4c7bcd0_1.conda#39313b5bbbd430af02824edd103ed1a7 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py310h66848f9_1.conda#f0f91c0ef87d60f043e00b540293795d +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py310hb299538_0.conda#3f89fc474876c9fd15bb3d9fd51976e6 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py310hb52b2da_0.conda#54c1d90c8f9a926630989465fc01fddb +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py310heeae437_2.conda#b4b5eb2276b14c3a487032bedd1493dc https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.20.0-py310h59d1b7a_0.conda#19ad8b38641c5f52a1ecc5b1c9f51acb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py310hd0ab5f2_0.conda#62a11e8fa75cb4a0b06c8a2c26a7c542 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py310h03727f4_0.conda#92e196159f87f3029f44fca35158d6e8 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py310h78583b1_0.conda#68a2bd5dcbb6feac96dee39f4b49fe0f +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py310h7c0babf_0.conda#87c0d5fba91d5a527b4d7f20f76751ad -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py310h4c7bcd0_0.conda#c73a831af0204c79654ef7e3cda8b212 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py310h55e1596_0.conda#dd93429f1ed04be736bb268b6ac16644 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py310h1451162_0.conda#c845d656240655e00d62f28efccac070 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py310h55e1596_0.conda#2223394e55f512265afd1da3e08b06a9 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py310hb299538_4.conda#f24c78f33054d3c0ce4b73f6155e16a5 -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.0-py310hf601767_0.conda#147a251e0a1251d6628ff43f81536cda -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py310h4719f56_0.conda#54a9b6da1da9302dc9a7f34bc0d9d287 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.32-py310h03727f4_0.conda#0518a1bcd530529900569f20141b6a38 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py310h0cd3344_0.conda#5f47d3b6e39007dc5c97fec8bd2dd860 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py310ha766c32_5.conda#7f6f2689cb20f42767cb421f078a89c2 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py310h42c23b7_1.conda#a4acd1fd7ab3607039adbd819c42885f +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py310hfd680ee_0.conda#21da056dae8a75293731cc07ff64bec8 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py310h78583b1_0.conda#101005bb0bebcbcc96572dd7fd4f0e40 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py310h6a57b22_1.conda#5f992a3d612038e0125b6a1437b35a3c +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10.yml b/repo2docker/buildpacks/conda/environment.py-3.10.yml index b2714cab4..56178fb2b 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.10.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2024-08-29 07:02:53 UTC +# Generated on 2025-02-09 21:05:17 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock index a16494bac..15aa35232 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock @@ -1,178 +1,176 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:03:21 UTC +# Frozen on 2025-02-09 21:05:55 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 5214f3fab8b6c89efc84e2138d15b78e5cad1444f8a79cea06169a23bd87ff15 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda#7e8b914b1062dd4386e3de4d82a3ead6 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hc19f0b3_1.conda#0b86ff6ab7bdce5076269f2bbbf6857d -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.5-py311hf86e51f_0.conda#748a22f229ec0e62963b8045b8e6786c -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py311hfdbb021_0.conda#2a34eab62b5927587e04c7f8beeaf0d7 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.0.3-py311hb755f60_0.conda#6f4b03b4d1e0da0962ea02113382677c -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_0.conda#01a505ab9b4e3af12baa98b82f5fcafa -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py311hfdbb021_1.conda#d44da5fc47328530ad83e190af89576f +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda#5ca76f61b00a15a9be0612d4d883badc +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311hb3a8bbb_0.conda#db475e65fb621c2ec1dcdcc4e170b6f1 -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py311h9e33e62_0.conda#b1f5799ae0cc22198928f09879da01f5 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda#df3aee9c3e44489257a840b8354e77b9 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061_0.conda#f85e78497dfed6f6a4b865191f42de2e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py311h7deb3e3_0.conda#536c998639c24ff56b79e86f9e422272 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda#52457fbaa0aef8136d5dd7bb8a36db9e +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311h459d7ec_4.conda#de5b16869a430949b02161b04b844a30 -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py311hc6616f6_0.conda#f392b3f7a26db16f37cf82996dcfc84d -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py311hb3a8bbb_0.conda#6cb8806e9e920bd9c32205128d848a00 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.32-py311h61187de_0.conda#2248e75f001930ba8389fe91c51be50b -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311h9ecbd09_5.conda#18143eab7fcd6662c604b85850f0db1e +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py311hafd3f86_1.conda#e00f4c7e371b53053b8bf008c25aaf1c +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py311h46250e7_0.conda#99ca132ca705de6765df5e3c4c346572 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py311h9ecbd09_0.conda#abf26162851979957e29e2952b8a62d9 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock index 435925107..aa63b0e66 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock @@ -1,177 +1,175 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:03:31 UTC +# Frozen on 2025-02-09 21:06:11 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 01b1a051ebf91f5c3936a15c8560ba613c4a46024cfd45434b27e1aa53b4d00f @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda#c4c784a1336d72fff54f6b207f3dd75f -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda#59d463d51eda114031e52667843f9665 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda#c2078141f21872cc34d9305123ba08f2 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda#1b9f46b804a2c3c5d7fd6a80b77c35f9 +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda#97f754b22f63a943345bd807e1d51e01 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda#7f591390401ad65781372240424ab7fc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c -https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-h9de0dd0_1.conda#ea2fbe77db884c344c72d10c895266d3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.9-hddfb980_0_cpython.conda#4846e936e27dd709ad78f91fa33a48e8 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h8715677_1.conda#22c060f41b1407ed9f40ce6468bdc338 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.11-h1683364_1_cpython.conda#7e8786cbe7b83e7011e681a4780c9b7f +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h89d996e_2.conda#c62b4c4d3eb1d13dfe16abbe648c28b7 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.5-py311h113a62e_0.conda#ae0e00026f3646e7d0378735d14b217a -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py311h89d996e_0.conda#91d6fac128f753ec214d9fdd4e7a0fd2 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.0.3-py311h8715677_0.conda#4558bf1dc476a6ecc8438d29b5bb2548 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py311hec3470c_0.conda#3a41e40f73e44585e267ea9ea08d22b5 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py311hc8f2f60_0.conda#e0b4d562accc096561afce52343d72d8 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py311h89d996e_1.conda#9878fa7923a54e8b83776b01ba43b198 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py311hec3470c_1.conda#67852e00a2929ce334c6b2f58a1b437a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_1.conda#eb3611be0cc15845bf6e5075adc520ee +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py311hcd402e7_0.conda#858767f880caa447ae640a991ec5ba9e -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py311hf4892ed_0.conda#619e11e109a330e7b2035b8d57fbfe96 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py311h58d527c_2.conda#01b93dc85ced3be09926e04498cbd260 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.20.0-py311h949f54a_0.conda#382d01f4f74e8cf3fa7c42269be26ab9 -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py311h7270cec_0.conda#e2235bd1223f3eaf22cc50e1578e26f4 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py311h323e239_0.conda#8a9c05086dbc79ae0a8d63e6d79b71d6 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py311h5487e9b_0.conda#fe331d12b7fccca2348a114c4742a0e0 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py311h458092e_0.conda#2271597156ba20eeae18b4e634ce28e3 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py311hec3470c_0.conda#eb1788f50737ec7c56c5c730e9dc55d7 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py311h826da9f_0.conda#ae101dc799cda02d3586c0a397437f54 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py311h14e8bb7_0.conda#616d65d1eea809af7e2b5f7ea36350fc +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py311h826da9f_0.conda#919dc1bfa979c20c6358f06e4ee8529f +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py311hcd402e7_4.conda#836640e8a482dc22decea414117bb2ad -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.0-py311h0290c5f_0.conda#c8308816d1ad3fa2d43054d257f07b2d -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py311h4713408_0.conda#b9af63f80e78adc8eef8df6b42b6af63 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.32-py311h323e239_0.conda#b2e51878f80bd2036ddd6fb3d4c8859a -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py311h8938cd4_0.conda#c3c69abb865a71cefe44bcc4bfc3997d -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py311ha879c10_5.conda#1dc6f6a28b06e858d39fb5fb3edcf6e1 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py311h4047cc9_1.conda#0c63f82ee165c4e7d089bfbcc226e3ec +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py311h2bdde80_0.conda#2373c6117c5b60ea238eb56ecec4ae62 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py311h5487e9b_0.conda#6d85aad0cc4b0d548c86da1f560443b2 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py311hd5293d8_1.conda#7a022310d8759b7d251717b09242ee13 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11.yml b/repo2docker/buildpacks/conda/environment.py-3.11.yml index e7ccedcb1..9e8dc7e77 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.11.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2024-08-29 07:03:21 UTC +# Generated on 2025-02-09 21:05:55 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock index 92dc966cb..a2710c909 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock @@ -1,178 +1,176 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:03:48 UTC +# Frozen on 2025-02-09 21:07:33 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 879482ba73e3629ab14f1a6fdd329717bfdaaeb40e99a61c7084b15f78e4cc60 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda#7e8b914b1062dd4386e3de4d82a3ead6 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hc19f0b3_1.conda#0b86ff6ab7bdce5076269f2bbbf6857d -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.5-py312hca68cad_0.conda#6c56579c537feaafdf62d6c3b5424c53 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda#6be6dcb4bffd1d456bdad28341d507bd +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.0.3-py312h30efb56_0.conda#a8a85268e01ddee952f4105f3a8122a4 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_0.conda#320338762418ae59539ae368d4386085 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py312h2ec8cdc_1.conda#38c2f46af8b45f914f55911006cd7056 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda#6b51f7459ea4073eeb5057207e2e1e3d +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda#3facaca6cc0f7988df3250efccd32da3 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h41a817b_0.conda#1779c9cbd9006415ab7bb9e12747e9d1 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py312hf008fa9_0.conda#0735929f1a2a89c62b91d07ef5a76645 -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda#bfb49da0cc9098597d527def04d66f8b +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h9a8786e_0.conda#fd9c83fde763b494f07acee1404c280e -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda#e417822cb989e80a0d2b1b576fdd1657 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h1671c18_0.conda#33dee889f41b0ba6dbe5ddbe70ebf263 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py312h7900ff3_0.conda#eee5a2e3465220ed87196bbb5665f420 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_0.conda#14861767c6836065ee65b45a40be2ed1 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda#7cec8d0dac15a2d9fea8e49879aa779d +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py312h98912ed_4.conda#00536e0a1734dcde9815fe227f32fc5a -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py312h8aaac84_0.conda#08214176ce216a0d6a345593ffa1c16c -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py312hf008fa9_0.conda#8cc8f335b7e355558854236d86b2bea4 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.32-py312h41a817b_0.conda#3ac8df9507553117fd7b9daf79ff1269 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py312h66e93f0_5.conda#1505fc57c305c0a3174ea7aae0a0db25 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py312hda17c39_1.conda#d74f8fee018276daaee383e18b1c6fd1 +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda#bae01b2563030c085f5158c518b84e86 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py312h66e93f0_0.conda#91e345de80d0dc238b598683b69da123 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda#c69f87041cf24dfc8cb6bf64ca7133c7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock index 37665d94d..9710d935c 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock @@ -1,177 +1,175 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:03:58 UTC +# Frozen on 2025-02-09 21:08:25 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e263b45a59d809c19e20cb9963be2bc27bee0b7135e9e5d7b43ae4e6ed990812 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda#c4c784a1336d72fff54f6b207f3dd75f -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda#59d463d51eda114031e52667843f9665 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda#62b20f305498284a07dc6c45fd0e5c87 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda#1b9f46b804a2c3c5d7fd6a80b77c35f9 +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda#97f754b22f63a943345bd807e1d51e01 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda#7f591390401ad65781372240424ab7fc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c -https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-h9de0dd0_1.conda#ea2fbe77db884c344c72d10c895266d3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.5-hb188aa9_0_cpython.conda#29d0b64c0b5e812fe96a42dcb471a7da -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h2aa54b4_1.conda#7253fd6feb797007a3d290bbcfd23a84 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.8-h1683364_1_cpython.conda#09ec612ea05370989eaa3d81abf0f369 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda#e1e9727063057168d95f27a032acd0a4 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.5-py312h7f10901_0.conda#064f2725df3ddc1c1295840a9f512836 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py312h6f74592_0.conda#f54f7b0bad14e9bbba256a21238d2630 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.0.3-py312h2aa54b4_0.conda#68e5a7d27bbe600bc098175e25509351 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_0.conda#c3d6917a5a167cf0121e79a89545ff70 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py312h9ef2f89_0.conda#a00135adde3dfe19b9962c3c767c2129 -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py312h6f74592_1.conda#d9ccd43f6648449f80b098709e2450c7 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_1.conda#2257c5f33024274faadf6a88a7d62807 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda#bc8607ab678073a0441808a31465f4fb +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py312hdd3e373_0.conda#1a87f588762a48fb42311b0c40fa1920 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312h396f95a_0.conda#0d8fb5e4b02256354c754455152d0eb6 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda#4de4a5ff81c941674e08595244e7cd61 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.20.0-py312heb99873_0.conda#4543f8659d413d0a2a7f15fa5ff62bb4 -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py312ha4e36d7_0.conda#4d41b57d0d3933b9cab7ac8c05745123 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py312h5adff4d_0.conda#8d17acc3a7d9542b53880e50c273268d -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda#e28996d9d2d44d777b7e6fb12f63715b +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py312h75e8286_0.conda#c88525d1b103277eb9b47a97842c7077 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py312h996f985_0.conda#a7ef8076152a1490e2e8a519e81660d7 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py312h2427ae1_0.conda#1263d3ca90dcf80d39a9636b8db3ade8 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda#1a256e5581b1099e9295cb84d53db3ea +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda#0520da8de6870d8ff63e818e927d1524 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py312hdd3e373_4.conda#7aebbb1531055d298dc01002e1286f3a -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.0-py312h608731a_0.conda#2c244a4e011232667765a0ce476dcd66 -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py312h3dd116e_0.conda#db340c73d8a147ae99fb521634e8b638 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.32-py312h5adff4d_0.conda#5722a5f2275bd0b6a92ec486afa1afe6 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312h9fc3309_0.conda#1903935398241d9772c260a4d0ee5bc3 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py312hb2c0f52_5.conda#c3b818a44ce51af3de80cf6523cfe216 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py312he723553_1.conda#79d0edec50132197f929147c03d1dba2 +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda#9677f6ab4bf27ba3c2aee70d08c7b27c +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py312h52516f5_0.conda#6432576daff7263e75a7afec80e5effd +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda#ffcb8e97e62af42075e0e5f46bb9856e +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda#c69f87041cf24dfc8cb6bf64ca7133c7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.12.yml b/repo2docker/buildpacks/conda/environment.py-3.12.yml index 7d6eecaba..490e8277b 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.12.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2024-08-29 07:03:48 UTC +# Generated on 2025-02-09 21:07:33 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock index b0ba51e0d..7b02a87db 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock @@ -1,74 +1,80 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:01:59 UTC +# Frozen on 2025-02-09 21:03:25 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: f8b3a4482f740b178955326cfa6805eb6b64fb0f84fab45fc27a59d87113d326 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-5_cp38.conda#7caf714d16205dca32687a95ae71a472 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda#5ab1a0df19c8f3ec00d5e63458e0a420 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda#7e8b914b1062dd4386e3de4d82a3ead6 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda#246840b451f7a66bd68869e56b066dd5 +https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda#a098f9f949af52610fdceb8e35b57513 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hc19f0b3_1.conda#0b86ff6ab7bdce5076269f2bbbf6857d -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.19-hd12c33a_0_cpython.conda#53aabe8cf596487ec6f1ce319c93a741 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda#bb511c87804cf7220246a3a6efc45c22 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda#05ffff2f44ad60b94ecb53d029c6bdf7 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py38h17151c0_1.conda#7a5a699c8992fc51ef25e980f4502c2a https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.5-py38h6d02427_0.conda#41aaa2fe5a415fbf79ce09b0e2746320 https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda#d0441db20c827c11721889a241df1220 https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.0.3-py38h17151c0_0.conda#96428abcd2b3b8e945f8b26e6d9f82f8 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py38h578d9bd_0.conda#35f7346da8d31ccef2c97db678b2c390 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py38h01eb140_0.conda#aeeb09febb02542e020c3ba7084ead01 https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.0-pyhd8ed1ab_0.conda#07e9550ddff45150bfc7da146268e165 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py38h01eb140_0.conda#571da172be3f0f94f49c069e5b775f05 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e @@ -78,19 +84,20 @@ https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py38h2019614_0.conda#47a3b59acbb1626316500e178e25b944 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py38h6c80b9a_0.conda#d16a4460421bc385dfb20dba5314bd29 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py38h4005ec7_0.conda#e18d1fb2fddcc693a91d7dc326916b2b https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py38hfb59056_0.conda#ca6a0889b55d598c8fe154005cee15ef https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241003-pyhff2d567_0.conda#3d326f8a2aa2d14d51d8c513426b5def https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c @@ -98,75 +105,71 @@ https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda#bdb2f437ce62fd2f1fef9119a37a12d9 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda#fee389bf8a4843bd7a2248ce11b7f188 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.5.0-pyhd8ed1ab_0.conda#c720e5c85c349c5cbc99d9dfc4b200f8 https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_0.conda#6d4e9ecca8d88977147e109fc7053184 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py38heb5c249_0.conda#b41a6ee3a5b044185b5f46aaf6082388 https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 +https://conda.anaconda.org/conda-forge/linux-64/h2-4.1.0-py38h578d9bd_0.tar.bz2#aa0b1b3f33dea4c04034c1af2b63fdea +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py38h578d9bd_0.conda#196ff32a507055c7c6457f83262d2803 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda#5dd546fe99b44fda83963d15f84263b7 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda#4c05134c48b6a74f33bbb9938e4a115e https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py38h6c80b9a_0.conda#d16a4460421bc385dfb20dba5314bd29 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py38h01eb140_4.conda#234c813c9d745d4bfc6a2a40514d88a6 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py38hf793753_0.conda#0ec2678d5f680052842221b17da90f0f https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.47-hd8ed1ab_0.conda#3e0c82ddcfe27eb4ae77f887cfd9f45b +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.48-hd8ed1ab_1.conda#bf730bb1f201e3f5a961c1fb2ffc4f05 https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py38h4005ec7_0.conda#7fcbd5ffc4f54bbc3e5e0f87726f8d87 https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.32-py38h2019614_0.conda#d7d8b5b111716b5079b1f72524ef6a86 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py38h62bed22_0.conda#7cdf6cb1dcfbaf868ff42b15189f7e59 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.0-pyhd8ed1ab_0.conda#4882d44aa5f5d9de49ba84266cfe56b1 https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_0.conda#7566bb010833e59fb579ed520b9a7bc5 https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh41d4057_0.conda#acebfd89278ecac2a67b60b657e00d5c https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhff2d567_2.conda#0457fdf55c88e52e0e7b63691eafcc48 https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 @@ -174,5 +177,5 @@ https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock index 1383994a1..79bae4c60 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock @@ -1,73 +1,79 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:02:09 UTC +# Frozen on 2025-02-09 21:04:20 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e0b2884c1574bbc561e310e8ca9cd0e290d8a28c115e948c1aae949cd36da52a @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda#c4c784a1336d72fff54f6b207f3dd75f -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda#59d463d51eda114031e52667843f9665 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.8-5_cp38.conda#2c2cf003fc370241ed16a73f4ee6d798 https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.6.4-h86ecc28_0.conda#e9e33059c0262c70538581e3a2205fb4 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda#97f754b22f63a943345bd807e1d51e01 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda#7f591390401ad65781372240424ab7fc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c -https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-gpl-tools-5.6.4-h2dbfc1b_0.conda#c43dd63b7ffb096cd1de6392b2a6f5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-tools-5.6.4-h86ecc28_0.conda#f99b6cd964d91182b36681fba1170965 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-h9de0dd0_1.conda#ea2fbe77db884c344c72d10c895266d3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.8.19-hbbe8eec_0_cpython.conda#5e5f0e9986cf1e00d2e1c8f32c6c2a0f +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.6.4-h2dbfc1b_0.conda#106b4128bc624409d2685c5a395c6778 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.8.20-hbf90c55_2_cpython.conda#077f3c1075e039bbd186570ea88f42f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py38hb83fbf6_1.conda#481316b31f7fba6fa88cb613f37fecf7 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.5-py38h8529334_0.conda#d080d51fb55cbadfba94202a5210ad9f https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda#d0441db20c827c11721889a241df1220 https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.0.3-py38hb83fbf6_0.conda#1478a14b93a1245fd3c1447e091fa234 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py38he3eb160_0.conda#86fc6edc1871ad3808152ad92a7bfa16 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py38hea3b116_0.conda#33014d4448003d2d713a81f0c9f6b95a https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.0-pyhd8ed1ab_0.conda#07e9550ddff45150bfc7da146268e165 https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py38h9579f32_0.conda#48ba0498b0437fadaae891a0851d1223 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e @@ -77,19 +83,20 @@ https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py38ha5227f9_0.conda#c44c86df86a1b306bac8e1c0227d14c8 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py38h857d6e0_0.conda#74fcae38ab70e4a052759a33db8433bc https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.20.0-py38h3fc512f_0.conda#67d3b9b8e31799316b558ab8c5e6e85f https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py38h34c6dc0_0.conda#d116dc4e4b2ac2f644c1945907303a99 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241003-pyhff2d567_0.conda#3d326f8a2aa2d14d51d8c513426b5def https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c @@ -97,75 +104,71 @@ https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda#bdb2f437ce62fd2f1fef9119a37a12d9 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda#fee389bf8a4843bd7a2248ce11b7f188 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.5.0-pyhd8ed1ab_0.conda#c720e5c85c349c5cbc99d9dfc4b200f8 https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_0.conda#6d4e9ecca8d88977147e109fc7053184 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py38hf2f4906_0.conda#ca4e3c70903a44b1e8ca0871671cf1a6 https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 +https://conda.anaconda.org/conda-forge/linux-aarch64/h2-4.1.0-py38h2063c64_0.tar.bz2#684eb0d9dfdf2909107dc2e561bb1918 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py38he3eb160_0.conda#f9a21df73f706043a100ef0aee02109f +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda#5dd546fe99b44fda83963d15f84263b7 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda#4c05134c48b6a74f33bbb9938e4a115e https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py38h857d6e0_0.conda#74fcae38ab70e4a052759a33db8433bc https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py38h9579f32_4.conda#3460f222597376592b6e1ac5eac0bdce https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.0-py38ha9ee602_0.conda#853ec42a7a7e9917162f81e50a3c23ef https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.47-hd8ed1ab_0.conda#3e0c82ddcfe27eb4ae77f887cfd9f45b +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.48-hd8ed1ab_1.conda#bf730bb1f201e3f5a961c1fb2ffc4f05 https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py38hf0fcd82_0.conda#6937a428ec8d2065e00b8e236f471357 https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.32-py38h34c6dc0_0.conda#40a952bd0720dfede0768ab8db47737f -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py38h134131f_0.conda#c63985d0da2f961ca7f09d683e00ea6b -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.0-pyhd8ed1ab_0.conda#4882d44aa5f5d9de49ba84266cfe56b1 https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_0.conda#7566bb010833e59fb579ed520b9a7bc5 https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh41d4057_0.conda#acebfd89278ecac2a67b60b657e00d5c https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhff2d567_2.conda#0457fdf55c88e52e0e7b63691eafcc48 https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 @@ -173,5 +176,5 @@ https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8.yml b/repo2docker/buildpacks/conda/environment.py-3.8.yml index 44dd7948e..aaaf7a12e 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.8.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2024-08-29 07:01:59 UTC +# Generated on 2025-02-09 21:03:25 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock index 651404ffc..e7e31140f 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock @@ -1,177 +1,177 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:02:26 UTC +# Frozen on 2025-02-09 21:04:41 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: bd4d374cae58bd84b0ba870367f38a90b671ab1c952a6cf4a62296b73b6accc9 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda#7e8b914b1062dd4386e3de4d82a3ead6 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hc19f0b3_1.conda#0b86ff6ab7bdce5076269f2bbbf6857d -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.21-h9c0c6dc_1_cpython.conda#b4807744af026fdbe8c05131758fb4be +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_2.conda#8ea5af6ac902f1a4429190970d9099ce https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.5-py39h98e3656_0.conda#b9255625c117959fc39dd5e28e2800e0 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py39hf88036b_0.conda#fea41cd6f4815e2bdcb7c32e0b2e03ed +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.0.3-py39h3d6467e_0.conda#a240d46f8f326c4af01de1a1d8e615d0 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py39hf3d152e_0.conda#00ff509ce4edc43e9f9181c7f6996ac2 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py39hf88036b_1.conda#a229aa70d1de2f6b7580b7723f3ae33c +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py39hf3d152e_1.conda#ab01fa677a681147a10f39680e6886fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py39h9399b63_1.conda#7821f0938aa629b9f17efd98c300a487 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39hcd6043d_0.conda#40f1dd93ac87fff4b776d6fb8033ddb9 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39h9399b63_2.conda#13fd88296a9f19f5e3ac0c69d4b64cc6 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py39h5cde264_0.conda#9255b3f2a439d3b113ef8e36159a3fde -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py39he612d8f_0.conda#f78f4ac18603f12bcabec0219df9ea15 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39hd3abc70_0.conda#c183e99f9320e5e2d0f9c43efcb3fb22 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py39h8cd3c5a_0.conda#ebfd05ae1501660e995a8b6bbe02a391 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py39h49a4b6b_0.conda#278cc676a7e939cf2561ce4a5cfaa484 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py39hf3d152e_0.conda#612f7a003a8a407955572c0d53952ceb -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py39h4e4fb57_0.conda#68670c3c584e5aae692bac41108d8385 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py39h4e4fb57_0.conda#9e8fb468734ff97268065206ae697ce3 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py39hd1e30aa_4.conda#6a04738e75f877b68552fc19cb045233 -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py39h5c34e2d_0.conda#e060dbcfd38c74d22cc9813d9a57e288 -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py39h5cde264_0.conda#237c3e6f11936e9875c2ba37e8f8be8e -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.32-py39hcd6043d_0.conda#89b3c057e28607bce2d8cb43404b5ccd -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h623c9ba_0.conda#a19d023682384c637cb356d270c276c0 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py39h8cd3c5a_5.conda#ebf59f90740b2b77e3d71c6855a7935d +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py39h7170ec2_1.conda#ebd0f49ef632dd56ecb09a12582bc25c +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.50-hd8ed1ab_0.conda#b5114235809f754b9bff0d14d3d712bc +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py39h9fdd4d6_0.conda#e5ce95bf75a59918fd88f7e2ed487ccf +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py39h8cd3c5a_0.conda#2f97a396b05cd92a3e77d1bbd6515760 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h08a7858_1.conda#cd9fa334e11886738f17254f52210bc3 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.0-pyh41d4057_0.conda#e89d0c5836e45f9e6a66c5c24fc9ef35 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock index 0d3a0878c..45319fc86 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock @@ -1,176 +1,176 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2024-08-29 07:02:36 UTC +# Frozen on 2025-02-09 21:04:56 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 6f3b845e2c93dcbf3f05c9ce5f84b712a90b3d0fe3853e8acd6d5a969499a235 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda#c4c784a1336d72fff54f6b207f3dd75f -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda#59d463d51eda114031e52667843f9665 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-5_cp39.conda#2d2843f11ec622f556137d72d9c72d89 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda#97f754b22f63a943345bd807e1d51e01 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda#7f591390401ad65781372240424ab7fc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c -https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-h9de0dd0_1.conda#ea2fbe77db884c344c72d10c895266d3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.19-h4ac3b42_0_cpython.conda#1501507cd9451472ec8900d587ce872f -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_1.conda#bcee238f99c34ca11add65c1684c5a2d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda#cf85c002319c15e9721934104aaa1137 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h387a81e_1.conda#983fb0d6a8d0ad30f7213dccadea185d +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.21-hb97c71e_1_cpython.conda#49094665d26eac2d8a199169cf0989db +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h7dbf29c_2.conda#adacf334f92a835cb7a055b3e2150502 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.5-py39h6e76b30_0.conda#adc268cb032b4f4d2f270f0ad03ef1bf -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py39h7dbf29c_0.conda#bbbfba6984d0623a8da117ff3f947af9 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.0.3-py39h387a81e_0.conda#e61522dece30c7cd969b11e1f2bcb27d -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda#5d8c241a9261e720a34a07a3e1ac4109 -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py39h4420490_0.conda#e70e714d000a4d164a03c18eb9575d39 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_0.conda#ccea946e6dce9f330fbf7fca97fe8de7 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py39h7cc1d5f_0.conda#d6fda92ac61840449b8053eaee6a682e -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py39h7dbf29c_1.conda#e2bbe9ddbac623ab77834f155d9532e2 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py39h4420490_1.conda#30963643485d0a06b6d4405a6900ac15 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py39h36a3f59_1.conda#1f1db1d0f7440f52e35cba3c061b97f1 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac -https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda#9a19b94034dd3abb2b348c8b93388035 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py39h898b7ef_0.conda#a26ed32a36891fcd36f5ea88f0b8a2f7 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda#0f051f09d992e0d08941706ad519ee0e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda#5ba575830ec18d5c51c59f403310e2c7 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py39he257ee7_0.conda#5f51f36e01c69370f7e4e12829b786d8 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py39hbebea31_2.conda#59d83d45572c9e21d865dd6e4d75c20f https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.20.0-py39hb8f4057_0.conda#4cfe41ec971c5c2c3d1e1980e309c8aa -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda#778594b20097b5a948c59e50ae42482a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py39hda8d5af_0.conda#690276959a2dbb0baa149c704535cd5c +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py39ha3e8b56_0.conda#60ad0fcecca6af49fe5888a408618d8a -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240821-pyhd8ed1ab_0.conda#a0637bb6a2428c10448807b9d87f082c -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 -https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda#0944dc65cb4a9b5b68522c3bb585d41c -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda#68f0738df502a14213624b288c60c9ad -https://conda.anaconda.org/conda-forge/noarch/webcolors-24.8.0-pyhd8ed1ab_0.conda#eb48b812eb4fbb9ff238a6651fdbbcae -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_0.conda#f372c576b8774922da83cda2b12f9d29 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda#6372cd99502721bd7499f8d16b56268d -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.4.0-pyhd8ed1ab_0.conda#1fa97c6e8db1f82c64ff17a5efc4ae8e -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda#3d081de3a6ea9f894bbb585e8e3a4dcb -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py39h3e3acee_0.conda#fdf7a3dc0d7e6ca4cc792f1731d282c4 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py39h26f80ff_0.conda#7313a9f2d6f58cda446f4576293b4ebb -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py39h4420490_0.conda#7d9cb6936e2b7c33480a8890d4f2d41c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py39he601760_0.conda#13be16152d950751929876d918d223d8 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py39hecfc5ed_0.conda#5c431ce74f9fcffca9e9a29990b318e5 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b +https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py39he601760_0.conda#b20ce05e5df88020539cca45c672e6c7 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda#7e9f4612544c8edbfd6afad17f1bd045 -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py39h898b7ef_4.conda#4baffaf857eafd23b03ca7974695df21 -https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda#b77d8c2313158e6e461ca0efb1c2c508 -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.0-py39h33ea94c_0.conda#67d79f30e30e103a7ff11ccffc695cc8 -https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2#642d35437078749ef23a5dca2c9bb1f3 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda#a6b9a0158301e697e4d0a36a3d60e133 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda#219b3833aa8ed91d47d1be6ca03f30be -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda#29fddbfa0e2361636a98de4f46ead2ac -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py39hb170bb1_0.conda#0cde31242b4542eae849bae5b3d4fa43 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.32-py39ha3e8b56_0.conda#c6ae4590cf07decee5164daa469bde5e -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h6b56de1_0.conda#4e9daef09df3b119e1ba338fee682995 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.2-pyhd8ed1ab_0.conda#0045ed5e28a7f2c252a30442408b36c4 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda#3afef1f55a1366b4d3b6a0d92e2235e4 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda#7e9ac3faeebdbd7b53b462c41891e7f7 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761 -https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2#4cb68948e0b8429534380243d063a27a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-pyhd8ed1ab_1.conda#ac4247381b9397ace149d73cd2141b0b +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py39h060674a_5.conda#81bd8f40cdc2ef6d2b60cb7dbfb243d2 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py39h11f9b69_1.conda#7d6d4e06ab5f88240b77994e79b7d55e +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.50-hd8ed1ab_0.conda#b5114235809f754b9bff0d14d3d712bc +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py39hf916c31_0.conda#b90efaf9a210d0ad66efbb459b0d4031 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py39h3e3acee_0.conda#2348cd1b73190bec86e7355cb3ffa0b5 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h5934b9c_1.conda#43f0ab97684dc1facf7acf5bc24919e5 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.0-pyh41d4057_0.conda#e89d0c5836e45f9e6a66c5c24fc9ef35 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_0.conda#a022d34163147d16b27de86dc53e93fc -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_0.conda#16b37612b3a2fd77f409329e213b530c -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.1.0-pyh31011fe_0.conda#8958ebf09fe082db40ec9ab4d6f1a20c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.2-pyhd8ed1ab_0.conda#ca23c71f70a7c7935b3d03f0f1a5801d -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda#885867f6adab3d7ecdf8ab6ca0785f51 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyhd8ed1ab_0.conda#e614f229e0c636b6c55a6f1222684d38 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_0.conda#c64f9b9f15a79239b864c455cc0a67d4 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda#3d85618e2c97ab896b5b5e298d32b5b3 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.1.0-pyh31011fe_0.conda#bb9841dbb34c753706c85cd4264ff710 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.2.2-pyhd8ed1ab_0.conda#c4d5a58f43ce9ffa430e6ecad6c30a42 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f +https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9.yml b/repo2docker/buildpacks/conda/environment.py-3.9.yml index f6c60c1fa..8d74b9820 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.9.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2024-08-29 07:02:26 UTC +# Generated on 2025-02-09 21:04:41 UTC channels: - conda-forge dependencies: From 1daac00e1a6c2a23830c831f2800aa21cac2ebe8 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Tue, 11 Feb 2025 18:31:50 +0000 Subject: [PATCH 049/299] Don't run scheduled workflows on forks --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 300458514..4639cb5a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,6 +42,9 @@ env: jobs: test: + # Don't run scheduled tests on forks + if: ${{ github.repository_owner == 'jupyterhub' || github.event_name != 'schedule' }} + runs-on: ubuntu-${{ matrix.ubuntu_version }} strategy: From 54bf2e787599fd21c6a9aed5104a617475e40b7b Mon Sep 17 00:00:00 2001 From: Simon Li Date: Tue, 11 Feb 2025 18:05:06 +0000 Subject: [PATCH 050/299] Test that set -e hasn't leaked into the main shell --- tests/venv/start/postBuild/README.rst | 2 ++ tests/venv/start/postBuild/verify | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/venv/start/postBuild/README.rst b/tests/venv/start/postBuild/README.rst index ecfd428eb..81b2e86cd 100644 --- a/tests/venv/start/postBuild/README.rst +++ b/tests/venv/start/postBuild/README.rst @@ -3,3 +3,5 @@ postBuild and start This test checks that we can use a postBuild and start script at the same time. + +It also checks that exit on error (set -e) has not leaked into the main shell. diff --git a/tests/venv/start/postBuild/verify b/tests/venv/start/postBuild/verify index 5fd16f8d0..a8dbc5e33 100755 --- a/tests/venv/start/postBuild/verify +++ b/tests/venv/start/postBuild/verify @@ -1,4 +1,9 @@ -#!/bin/bash +#!/bin/bash -il +# Run this as an interactive login shell so that the conda profile is sourced + +# Test that `set -e` isn't incorrectly set in a profile +false + set -euo pipefail grep 'Done!' $HOME/postbuild.txt # set value of TEST_START_VAR to empty string when it is not defined From 12fc6dd42b70dfc11bafdc1de3ad4e878c046125 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Tue, 11 Feb 2025 18:10:47 +0000 Subject: [PATCH 051/299] activate-conda.sh: undo `set -e` --- repo2docker/buildpacks/conda/activate-conda.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/activate-conda.sh b/repo2docker/buildpacks/conda/activate-conda.sh index 312646575..b5a54e306 100755 --- a/repo2docker/buildpacks/conda/activate-conda.sh +++ b/repo2docker/buildpacks/conda/activate-conda.sh @@ -1,5 +1,5 @@ # enable conda and activate the notebook environment -set -ex +set -e eval $(micromamba shell hook -s posix -r ${CONDA_DIR}) for name in conda mamba; do CONDA_PROFILE="${CONDA_DIR}/etc/profile.d/${name}.sh" @@ -21,3 +21,5 @@ if [[ "${KERNEL_PYTHON_PREFIX}" != "${NB_PYTHON_PREFIX}" ]]; then else mamba activate ${NB_PYTHON_PREFIX} fi + +set +e From 07ef92ecbdcf64234402c79961323a043078cc45 Mon Sep 17 00:00:00 2001 From: Yuvi Panda Date: Tue, 11 Feb 2025 12:17:14 -0800 Subject: [PATCH 052/299] Add extra_args test Co-authored-by: Min RK --- tests/unit/test_app.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 7828c3183..49903d376 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -78,6 +78,20 @@ def test_local_dir_image_name(repo_with_content): ) +def test_extra_buildx_build_args(repo_with_content): + upstream, sha1 = repo_with_content + argv = ['--DockerEngine.extra_buildx_build_args=--check', upstream] + app = make_r2d(argv) + with patch("repo2docker.docker.execute_cmd") as execute_cmd: + app.build() + + args, kwargs = execute_cmd.call_args + cmd = args[0] + assert cmd[:3] == ["docker", "buildx", "build"] + # make sure it's inserted before the end + assert "--check" in cmd[:-1] + + def test_run_kwargs(repo_with_content): upstream, sha1 = repo_with_content argv = [upstream] From bd615901cb0077275b09e9c6b0a3dc1f8d1d2add Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:17:24 +0000 Subject: [PATCH 053/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/unit/test_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 49903d376..0ee4d0b3e 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -80,11 +80,11 @@ def test_local_dir_image_name(repo_with_content): def test_extra_buildx_build_args(repo_with_content): upstream, sha1 = repo_with_content - argv = ['--DockerEngine.extra_buildx_build_args=--check', upstream] + argv = ["--DockerEngine.extra_buildx_build_args=--check", upstream] app = make_r2d(argv) with patch("repo2docker.docker.execute_cmd") as execute_cmd: app.build() - + args, kwargs = execute_cmd.call_args cmd = args[0] assert cmd[:3] == ["docker", "buildx", "build"] From 0186eef20dbc9737f381069251380211d7d50f32 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Wed, 12 Feb 2025 00:14:01 +0000 Subject: [PATCH 054/299] Add basic UI Playwright tests --- .github/workflows/test.yml | 10 +++++++ playwright-requirements.txt | 2 ++ tests/conftest.py | 30 ++++++++++++++++++-- tests/ui/README.md | 9 ++++++ tests/ui/browser/environment.yml | 2 ++ tests/ui/browser/external-verify | 7 +++++ tests/ui/browser/external-verify.py | 41 +++++++++++++++++++++++++++ tests/ui/browser/test-extra-args.yaml | 2 ++ tests/ui/browser/verify | 1 + 9 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 playwright-requirements.txt create mode 100644 tests/ui/README.md create mode 100644 tests/ui/browser/environment.yml create mode 100755 tests/ui/browser/external-verify create mode 100755 tests/ui/browser/external-verify.py create mode 100644 tests/ui/browser/test-extra-args.yaml create mode 100755 tests/ui/browser/verify diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 300458514..c8616b2a6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,6 +68,10 @@ jobs: - ubuntu_version: "20.04" python_version: "3.6" repo_type: venv + # Playwright test + - ubuntu_version: "24.04" + python_version: "3.13" + repo_type: ui steps: - uses: actions/checkout@v4 @@ -80,6 +84,12 @@ jobs: pip install -r dev-requirements.txt pip freeze + - name: Install UI test dependencies + if: matrix.repo_type == 'ui' + run: | + pip install -r playwright-requirements.txt + playwright install firefox + - name: Install repo2docker run: | python -m build --wheel . diff --git a/playwright-requirements.txt b/playwright-requirements.txt new file mode 100644 index 000000000..d01da0110 --- /dev/null +++ b/playwright-requirements.txt @@ -0,0 +1,2 @@ +-r dev-requirements.txt +pytest-playwright diff --git a/tests/conftest.py b/tests/conftest.py index bade0a1ad..5d3a74793 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -39,7 +39,7 @@ def pytest_collect_file(parent, file_path): return RemoteRepoList.from_parent(parent, path=file_path) -def make_test_func(args, skip_build=False, extra_run_kwargs=None): +def make_test_func(args, skip_build=False, extra_run_kwargs=None, external_script=None): """Generate a test function that runs repo2docker""" def test(): @@ -82,6 +82,10 @@ def build_noop(): success = True break assert success, f"Notebook never started in {container}" + + if external_script: + subprocess.check_call([external_script, f"http://localhost:{port}"]) + finally: # stop the container container.stop() @@ -202,12 +206,21 @@ class Repo2DockerTest(pytest.Function): """A pytest.Item for running repo2docker""" def __init__( - self, name, parent, args=None, skip_build=False, extra_run_kwargs=None + self, + name, + parent, + args=None, + skip_build=False, + extra_run_kwargs=None, + external_script=None, ): self.args = args self.save_cwd = os.getcwd() f = parent.obj = make_test_func( - args, skip_build=skip_build, extra_run_kwargs=extra_run_kwargs + args, + skip_build=skip_build, + extra_run_kwargs=extra_run_kwargs, + external_script=external_script, ) super().__init__(name, parent, callobj=f) @@ -246,6 +259,17 @@ def collect(self): args.append(str(self.path.parent)) yield Repo2DockerTest.from_parent(self, name="build", args=args) + # If external-verify exists it should be run on the host + external_verify_script = self.path.parent / "external-verify" + if external_verify_script.exists(): + yield Repo2DockerTest.from_parent( + self, + name=self.path.name, + args=args, + skip_build=True, + external_script=external_verify_script, + ) + yield Repo2DockerTest.from_parent( self, name=self.path.name, diff --git a/tests/ui/README.md b/tests/ui/README.md new file mode 100644 index 000000000..04adc855b --- /dev/null +++ b/tests/ui/README.md @@ -0,0 +1,9 @@ +# User interface tests + +This contains very basic [Playwright](https://playwright.dev/python/) tests to check the + +- JupyterLab +- RStudio +- RShiny + +interfaces can be accessed. diff --git a/tests/ui/browser/environment.yml b/tests/ui/browser/environment.yml new file mode 100644 index 000000000..9f6f2aaba --- /dev/null +++ b/tests/ui/browser/environment.yml @@ -0,0 +1,2 @@ +dependencies: + - r-base diff --git a/tests/ui/browser/external-verify b/tests/ui/browser/external-verify new file mode 100755 index 000000000..1e78c86f4 --- /dev/null +++ b/tests/ui/browser/external-verify @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# This script is run outside the container + +set -eux + +export TEST_REPO2DOCKER_URL="${1}/?token=token" +pytest --verbose --color=yes --browser=firefox tests/ui/browser/external-verify.py diff --git a/tests/ui/browser/external-verify.py b/tests/ui/browser/external-verify.py new file mode 100755 index 000000000..bbeec18bb --- /dev/null +++ b/tests/ui/browser/external-verify.py @@ -0,0 +1,41 @@ +import os +from subprocess import check_output +from urllib.parse import urlsplit + +import pytest +from playwright.sync_api import Page, expect + + +# To run this test manually: +# - Run: repo2docker tests/ui/browser/ +# - Run: TEST_REPO2DOCKER_URL= python -mpytest --browser=firefox tests/ui/browser/external-verify.py [--headed] +def test_user_interfaces(page: Page) -> None: + url = os.getenv("TEST_REPO2DOCKER_URL") + u = urlsplit(url) + + # Includes token + page.goto(url) + + # Initial page should be Jupyter Notebook + page.wait_for_url(f"{u.scheme}://{u.netloc}/tree") + + # Check JupyterLab + page.goto(f"{u.scheme}://{u.netloc}/lab") + expect(page.get_by_text("Python 3 (ipykernel)").nth(1)).to_be_visible() + + # Check JupyterLab RStudio launcher + with page.expect_popup() as page1_info: + page.get_by_text("RStudio [↗]").click() + page1 = page1_info.value + page1.wait_for_url(f"{u.scheme}://{u.netloc}/rstudio/") + # Top-left logo + expect(page1.locator("#rstudio_rstudio_logo")).to_be_visible() + # Initial RStudio console text + expect(page1.get_by_text("R version ")).to_be_visible() + + # Check JupyterLab RShiny launcher + with page.expect_popup() as page2_info: + page.get_by_text("Shiny [↗]").click() + page2 = page2_info.value + page2.wait_for_url(f"{u.scheme}://{u.netloc}/shiny/") + expect(page2.get_by_text("Index of /")).to_be_visible() diff --git a/tests/ui/browser/test-extra-args.yaml b/tests/ui/browser/test-extra-args.yaml new file mode 100644 index 000000000..574c469a7 --- /dev/null +++ b/tests/ui/browser/test-extra-args.yaml @@ -0,0 +1,2 @@ +- --env +- JUPYTER_TOKEN=token diff --git a/tests/ui/browser/verify b/tests/ui/browser/verify new file mode 100755 index 000000000..1a2485251 --- /dev/null +++ b/tests/ui/browser/verify @@ -0,0 +1 @@ +#!/bin/sh From 34399f8f87cf5af2d39ce7341e17ca7c31d714fa Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 11 Feb 2025 20:50:39 -0800 Subject: [PATCH 055/299] Throw error if using --build-memory-limit --- repo2docker/__main__.py | 13 ++++++------- repo2docker/app.py | 12 ++++++++++-- tests/unit/test_args.py | 7 ++----- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/repo2docker/__main__.py b/repo2docker/__main__.py index fb4e78460..00ad09913 100644 --- a/repo2docker/__main__.py +++ b/repo2docker/__main__.py @@ -140,7 +140,8 @@ def get_argparser(): argparser.add_argument( "--build-memory-limit", - help="Total Memory that can be used by the docker build process", + # Removed argument, but we still want to support printing an error message if this is passed + help=argparse.SUPPRESS ) argparser.add_argument( @@ -434,12 +435,10 @@ def make_r2d(argv=None): sys.exit(1) if args.build_memory_limit: - # if the string only contains numerals we assume it should be an int - # and specifies a size in bytes - if args.build_memory_limit.isnumeric(): - r2d.build_memory_limit = int(args.build_memory_limit) - else: - r2d.build_memory_limit = args.build_memory_limit + # We no longer support build_memory_limit, it must be set in the builder instance + print("--build-memory-limit is no longer supported", file=sys.stderr) + print("Use `docker buildx create` to create a custom builder with appropriate memory limits instead", file=sys.stderr) + sys.exit(-1) if args.environment and not r2d.run: print("To specify environment variables, you also need to run " "the container") diff --git a/repo2docker/app.py b/repo2docker/app.py index a2a9a92d6..56eddbbbe 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -165,13 +165,20 @@ def _default_log_level(self): build_memory_limit = ByteSpecification( 0, help=""" - Total memory that can be used by the docker image building process. + Unsupported. - Set to 0 for no limits. + When using docker, please use `docker buildx create` to create a new buildkit + builder with appropriate limits instead. """, config=True, ) + @observe("build_memory_limit") + def build_memory_limit_changed(self, change): + print("Setting build_memory_limit is not supported", file=sys.stderr) + print("Use `docker buildx create` to create a custom builder with appropriate memory limits instead", file=sys.stderr) + sys.exit(-1) + volumes = Dict( {}, help=""" @@ -856,6 +863,7 @@ def build(self): for l in picked_buildpack.build( docker_client, self.output_image_spec, + # This is deprecated, but passing it anyway to not break backwards compatibility self.build_memory_limit, build_args, self.cache_from, diff --git a/tests/unit/test_args.py b/tests/unit/test_args.py index d3e304f00..e3257f448 100644 --- a/tests/unit/test_args.py +++ b/tests/unit/test_args.py @@ -50,11 +50,8 @@ def test_mem_limit(): """ Test various ways of passing --build-memory-limit """ - r2d = make_r2d(["--build-memory-limit", "1024", "."]) - assert int(r2d.build_memory_limit) == 1024 - - r2d = make_r2d(["--build-memory-limit", "3K", "."]) - assert int(r2d.build_memory_limit) == 1024 * 3 + with pytest.raises(SystemExit): + r2d = make_r2d(["--build-memory-limit", "1024", "."]) def test_run_required(): From bd39320153c8a1eae6c13c17464dd12307be2ea5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 04:52:38 +0000 Subject: [PATCH 056/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/__main__.py | 7 +++++-- repo2docker/app.py | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/repo2docker/__main__.py b/repo2docker/__main__.py index 00ad09913..748e0d02b 100644 --- a/repo2docker/__main__.py +++ b/repo2docker/__main__.py @@ -141,7 +141,7 @@ def get_argparser(): argparser.add_argument( "--build-memory-limit", # Removed argument, but we still want to support printing an error message if this is passed - help=argparse.SUPPRESS + help=argparse.SUPPRESS, ) argparser.add_argument( @@ -437,7 +437,10 @@ def make_r2d(argv=None): if args.build_memory_limit: # We no longer support build_memory_limit, it must be set in the builder instance print("--build-memory-limit is no longer supported", file=sys.stderr) - print("Use `docker buildx create` to create a custom builder with appropriate memory limits instead", file=sys.stderr) + print( + "Use `docker buildx create` to create a custom builder with appropriate memory limits instead", + file=sys.stderr, + ) sys.exit(-1) if args.environment and not r2d.run: diff --git a/repo2docker/app.py b/repo2docker/app.py index 56eddbbbe..c7bb8039d 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -176,7 +176,10 @@ def _default_log_level(self): @observe("build_memory_limit") def build_memory_limit_changed(self, change): print("Setting build_memory_limit is not supported", file=sys.stderr) - print("Use `docker buildx create` to create a custom builder with appropriate memory limits instead", file=sys.stderr) + print( + "Use `docker buildx create` to create a custom builder with appropriate memory limits instead", + file=sys.stderr, + ) sys.exit(-1) volumes = Dict( From b243cb60792112c8fd009ee17e0417e8b5ef5643 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 11 Feb 2025 20:58:36 -0800 Subject: [PATCH 057/299] Add another unit test for sys.exit behavior --- tests/unit/test_args.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/test_args.py b/tests/unit/test_args.py index e3257f448..d416d2042 100644 --- a/tests/unit/test_args.py +++ b/tests/unit/test_args.py @@ -53,6 +53,8 @@ def test_mem_limit(): with pytest.raises(SystemExit): r2d = make_r2d(["--build-memory-limit", "1024", "."]) + with pytest.raises(SystemExit): + r2d = make_r2d(["--Repo2Docker.build_memory_limit", "1024", "."]) def test_run_required(): """ From 6484673698b30c250215919b4cb8a7c95d45cd61 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 04:59:12 +0000 Subject: [PATCH 058/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/unit/test_args.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/test_args.py b/tests/unit/test_args.py index d416d2042..a116a9884 100644 --- a/tests/unit/test_args.py +++ b/tests/unit/test_args.py @@ -56,6 +56,7 @@ def test_mem_limit(): with pytest.raises(SystemExit): r2d = make_r2d(["--Repo2Docker.build_memory_limit", "1024", "."]) + def test_run_required(): """ Test all the things that should fail if we pass in --no-run From 704b91c4f13dae8293baff7c6c24a791f9998c6c Mon Sep 17 00:00:00 2001 From: Simon Li Date: Wed, 12 Feb 2025 13:18:31 +0000 Subject: [PATCH 059/299] set `external-verify` name in test Co-authored-by: Min RK --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5d3a74793..f64c85f1c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -264,7 +264,7 @@ def collect(self): if external_verify_script.exists(): yield Repo2DockerTest.from_parent( self, - name=self.path.name, + name=external_verify_script.name, args=args, skip_build=True, external_script=external_verify_script, From a9a38de516ea9e613289418ff89dfb37ec4c8e01 Mon Sep 17 00:00:00 2001 From: Yuvi Panda Date: Wed, 12 Feb 2025 08:17:50 -0800 Subject: [PATCH 060/299] Clarify where memory limits are Co-authored-by: Simon Li --- repo2docker/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index c7bb8039d..0d8174525 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -177,7 +177,7 @@ def _default_log_level(self): def build_memory_limit_changed(self, change): print("Setting build_memory_limit is not supported", file=sys.stderr) print( - "Use `docker buildx create` to create a custom builder with appropriate memory limits instead", + "Check your build engine documentation to set memory limits. Use `docker buildx create` if using the default builder to create a custom builder with appropriate memory limits", file=sys.stderr, ) sys.exit(-1) From 72816ca708e5e6d44859d028f55d10da1222739a Mon Sep 17 00:00:00 2001 From: Simon Li Date: Wed, 12 Feb 2025 17:44:16 +0000 Subject: [PATCH 061/299] Bump GitHub actions runner to ubuntu-24.04 --- .github/workflows/docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8b9945be2..d1fa1c5aa 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -29,7 +29,7 @@ on: jobs: docker: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a02c2818..7dabbc8ca 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,7 @@ on: jobs: build-n-publish: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 @@ -62,7 +62,7 @@ jobs: password: ${{ secrets.PYPI_PASSWORD }} publish-docker: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 env: DEFAULT_REGISTRY: quay.io IMAGE_NAME: jupyterhub/repo2docker diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 63fb2c428..34a1585f0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,7 @@ jobs: strategy: fail-fast: false matrix: - ubuntu_version: ["22.04"] + ubuntu_version: ["24.04"] python_version: ["3.9"] repo_type: - base From c1ddf464d652568021ebb66a9b3b4469d8711a90 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Wed, 12 Feb 2025 17:52:28 +0000 Subject: [PATCH 062/299] BREAKING: Require Python 3.8 to run repo2docker --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 16 ++++++---------- .pre-commit-config.yaml | 10 +++++----- README.md | 2 +- setup.py | 2 +- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7dabbc8ca..3e0b4cead 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.13" - name: install build requirements run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 34a1585f0..32156ff70 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: fail-fast: false matrix: ubuntu_version: ["24.04"] - python_version: ["3.9"] + python_version: ["3.13"] repo_type: - base - conda @@ -64,17 +64,13 @@ jobs: - unit - venv - contentproviders + # Playwright test + - ui include: - # The actions/setup-python action with Python version 3.6 isn't - # possible to use with the ubuntu-22.04 runner, so we use ubuntu-20.04 - # for this test where Python 3.6 remain available. - - ubuntu_version: "20.04" - python_version: "3.6" + # The earliest actions/setup-python versions depend on the runner. + - ubuntu_version: "22.04" + python_version: "3.8" repo_type: venv - # Playwright test - - ubuntu_version: "24.04" - python_version: "3.13" - repo_type: ui steps: - uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ac5a2955..a5c2d516a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,10 +15,10 @@ repos: hooks: - id: pyupgrade args: - - --py36-plus + - --py38-plus # check-tmp is a Python based test script run in created environments - # that can be at least Python 3.5 even though we require Python 3.6 for - # repo2docker itself. + # that can be Python 3.5, older than the Python version required to run + # repo2docker. exclude: check-tmp # Autoformat: Python code @@ -27,12 +27,12 @@ repos: hooks: - id: black args: - - --target-version=py36 - - --target-version=py37 - --target-version=py38 - --target-version=py39 - --target-version=py310 - --target-version=py311 + - --target-version=py312 + - --target-version=py313 # Autoformat: Python code - repo: https://github.com/pycqa/isort diff --git a/README.md b/README.md index 01d60eebc..802c06d16 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ For more information, please visit 1. Docker to build & run the repositories. The [community edition](https://store.docker.com/search?type=edition&offering=community) is recommended. -2. Python 3.6+. +2. Python 3.8+. Supported on Linux and macOS. [See documentation note about Windows support.](http://repo2docker.readthedocs.io/en/latest/install.html#note-about-windows-support) diff --git a/setup.py b/setup.py index 58abff7c0..0639ec107 100644 --- a/setup.py +++ b/setup.py @@ -62,7 +62,7 @@ def get_identifier(json): "toml", "traitlets", ], - python_requires=">=3.6", + python_requires=">=3.8", author="Project Jupyter Contributors", author_email="jupyter@googlegroups.com", url="https://repo2docker.readthedocs.io/en/latest/", From ac485fa06c1dc153e2c59946b461dde107cc4f71 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:55:42 +0000 Subject: [PATCH 063/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/buildpacks/base.py | 38 +++++++++---------- repo2docker/buildpacks/conda/__init__.py | 18 ++++----- repo2docker/buildpacks/julia/julia_project.py | 10 ++--- repo2docker/buildpacks/nix/__init__.py | 12 +++--- repo2docker/buildpacks/pipfile/__init__.py | 6 +-- repo2docker/buildpacks/python/__init__.py | 6 +-- repo2docker/buildpacks/r.py | 20 +++++----- repo2docker/semver.py | 4 +- 8 files changed, 57 insertions(+), 57 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index d3e8ec408..f433029ea 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -236,7 +236,7 @@ def __init__(self, base_image): ) self.platform = "" - @lru_cache() + @lru_cache def get_packages(self): """ List of packages that are installed in this BuildPack. @@ -246,7 +246,7 @@ def get_packages(self): """ return set() - @lru_cache() + @lru_cache def get_base_packages(self): """ Base set of apt packages that are installed for all images. @@ -265,7 +265,7 @@ def get_base_packages(self): "gettext-base", } - @lru_cache() + @lru_cache def get_build_env(self): """ Ordered list of environment variables to be set for this image. @@ -281,7 +281,7 @@ def get_build_env(self): """ return [] - @lru_cache() + @lru_cache def get_env(self): """ Ordered list of environment variables to be set for this image. @@ -296,7 +296,7 @@ def get_env(self): """ return [] - @lru_cache() + @lru_cache def get_path(self): """ Ordered list of file system paths to look for executables in. @@ -306,14 +306,14 @@ def get_path(self): """ return [] - @lru_cache() + @lru_cache def get_labels(self): """ Docker labels to set on the built image. """ return self.labels - @lru_cache() + @lru_cache def get_build_script_files(self): """ Dict of files to be copied to the container image for use in building. @@ -338,7 +338,7 @@ def _check_stencila(self): f"Found a stencila manifest.xml at {root}. Stencila is no longer supported." ) - @lru_cache() + @lru_cache def get_build_scripts(self): """ Ordered list of shell script snippets to build the base image. @@ -360,7 +360,7 @@ def get_build_scripts(self): return [] - @lru_cache() + @lru_cache def get_preassemble_script_files(self): """ Dict of files to be copied to the container image for use in preassembly. @@ -374,7 +374,7 @@ def get_preassemble_script_files(self): """ return {} - @lru_cache() + @lru_cache def get_preassemble_scripts(self): """ Ordered list of shell snippets to build an image for this repository. @@ -391,7 +391,7 @@ def get_preassemble_scripts(self): """ return [] - @lru_cache() + @lru_cache def get_assemble_scripts(self): """ Ordered list of shell script snippets to build the repo into the image. @@ -418,7 +418,7 @@ def get_assemble_scripts(self): """ return [] - @lru_cache() + @lru_cache def get_post_build_scripts(self): """ An ordered list of executable scripts to execute after build. @@ -431,7 +431,7 @@ def get_post_build_scripts(self): """ return [] - @lru_cache() + @lru_cache def get_start_script(self): """ The path to a script to be executed at container start up. @@ -672,14 +672,14 @@ def _filter_tar(tarinfo): class BaseImage(BuildPack): - @lru_cache() + @lru_cache def get_build_env(self): """Return env directives required for build""" return [ ("APP_BASE", "/srv"), ] - @lru_cache() + @lru_cache def get_env(self): """Return env directives to be set after build""" return [] @@ -687,7 +687,7 @@ def get_env(self): def detect(self): return True - @lru_cache() + @lru_cache def get_preassemble_scripts(self): scripts = [] try: @@ -727,19 +727,19 @@ def get_preassemble_scripts(self): return scripts - @lru_cache() + @lru_cache def get_assemble_scripts(self): """Return directives to run after the entire repository has been added to the image""" return [] - @lru_cache() + @lru_cache def get_post_build_scripts(self): post_build = self.binder_path("postBuild") if os.path.exists(post_build): return [post_build] return [] - @lru_cache() + @lru_cache def get_start_script(self): start = self.binder_path("start") if os.path.exists(start): diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index 57f5d2abe..a04a305c3 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -46,7 +46,7 @@ def _conda_platform(self): return "linux-aarch64" raise ValueError(f"Unknown platform {self.platform}") - @lru_cache() + @lru_cache def get_build_env(self): """Return environment variables to be set. @@ -90,13 +90,13 @@ def get_build_env(self): env.append(("KERNEL_PYTHON_PREFIX", "${NB_PYTHON_PREFIX}")) return env - @lru_cache() + @lru_cache def get_env(self): """Make kernel env the default for `conda install`""" env = super().get_env() + [("CONDA_DEFAULT_ENV", "${KERNEL_PYTHON_PREFIX}")] return env - @lru_cache() + @lru_cache def get_path(self): """Return paths (including conda environment path) to be added to the PATH environment variable. @@ -111,7 +111,7 @@ def get_path(self): path.append("${NPM_DIR}/bin") return path - @lru_cache() + @lru_cache def get_build_scripts(self): """ Return series of build-steps common to all Python 3 repositories. @@ -149,7 +149,7 @@ def get_build_scripts(self): major_pythons = {"2": "2.7", "3": "3.10"} - @lru_cache() + @lru_cache def get_build_script_files(self): """ Dict of files to be copied to the container image for use in building. @@ -374,7 +374,7 @@ def separate_kernel_env(self): self.kernel_env_cutoff_version ) - @lru_cache() + @lru_cache def get_preassemble_script_files(self): """preassembly only requires environment.yml @@ -388,7 +388,7 @@ def get_preassemble_script_files(self): assemble_files[environment_yml] = environment_yml return assemble_files - @lru_cache() + @lru_cache def get_env_scripts(self): """Return series of build-steps specific to this source repository.""" scripts = [] @@ -455,14 +455,14 @@ def get_env_scripts(self): ] return scripts - @lru_cache() + @lru_cache def get_preassemble_scripts(self): scripts = super().get_preassemble_scripts() if self._should_preassemble_env: scripts.extend(self.get_env_scripts()) return scripts - @lru_cache() + @lru_cache def get_assemble_scripts(self): scripts = super().get_assemble_scripts() if not self._should_preassemble_env: diff --git a/repo2docker/buildpacks/julia/julia_project.py b/repo2docker/buildpacks/julia/julia_project.py index 9fc5b2cd5..84153f194 100644 --- a/repo2docker/buildpacks/julia/julia_project.py +++ b/repo2docker/buildpacks/julia/julia_project.py @@ -69,7 +69,7 @@ def julia_version(self): raise RuntimeError("Failed to find a matching Julia version: {compat}") return match - @lru_cache() + @lru_cache def get_build_env(self): """Get additional environment settings for Julia and Jupyter @@ -112,11 +112,11 @@ def project_dir(self): else: return "${REPO_DIR}" - @lru_cache() + @lru_cache def get_env(self): return super().get_env() + [("JULIA_PROJECT", self.project_dir)] - @lru_cache() + @lru_cache def get_path(self): """Adds path to Julia binaries to user's PATH. @@ -127,7 +127,7 @@ def get_path(self): """ return super().get_path() + ["${JULIA_PATH}/bin"] - @lru_cache() + @lru_cache def get_build_scripts(self): """ Return series of build-steps common to "ALL" Julia repositories @@ -156,7 +156,7 @@ def get_build_scripts(self): ), ] - @lru_cache() + @lru_cache def get_assemble_scripts(self): """ Return series of build-steps specific to "this" Julia repository diff --git a/repo2docker/buildpacks/nix/__init__.py b/repo2docker/buildpacks/nix/__init__.py index 7da3be603..06d2a7aa8 100644 --- a/repo2docker/buildpacks/nix/__init__.py +++ b/repo2docker/buildpacks/nix/__init__.py @@ -9,12 +9,12 @@ class NixBuildPack(BaseImage): """A nix Package Manager BuildPack""" - @lru_cache() + @lru_cache def get_path(self): """Return paths to be added to PATH environemnt variable""" return super().get_path() + ["/home/${NB_USER}/.nix-profile/bin"] - @lru_cache() + @lru_cache def get_env(self): """Ordered list of environment variables to be set for this image""" @@ -24,7 +24,7 @@ def get_env(self): ("GIT_SSL_CAINFO", "/etc/ssl/certs/ca-certificates.crt"), ] - @lru_cache() + @lru_cache def get_build_scripts(self): """ Return series of build-steps common to all nix repositories. @@ -60,7 +60,7 @@ def get_build_scripts(self): ), ] - @lru_cache() + @lru_cache def get_build_script_files(self): """Dict of files to be copied to the container image for use in building""" return { @@ -68,7 +68,7 @@ def get_build_script_files(self): "nix/nix-shell-wrapper": "/usr/local/bin/nix-shell-wrapper", } - @lru_cache() + @lru_cache def get_assemble_scripts(self): """Return series of build-steps specific to this source repository.""" return super().get_assemble_scripts() + [ @@ -82,7 +82,7 @@ def get_assemble_scripts(self): ) ] - @lru_cache() + @lru_cache def get_start_script(self): """The path to a script to be executed as ENTRYPOINT""" # the shell wrapper script duplicates the behaviour of other buildpacks diff --git a/repo2docker/buildpacks/pipfile/__init__.py b/repo2docker/buildpacks/pipfile/__init__.py index cb6d1ef2b..2e24d6142 100644 --- a/repo2docker/buildpacks/pipfile/__init__.py +++ b/repo2docker/buildpacks/pipfile/__init__.py @@ -80,7 +80,7 @@ def python_version(self): ) return self._python_version - @lru_cache() + @lru_cache def get_preassemble_script_files(self): """Return files needed for preassembly""" files = super().get_preassemble_script_files() @@ -90,7 +90,7 @@ def get_preassemble_script_files(self): files[path] = path return files - @lru_cache() + @lru_cache def get_preassemble_scripts(self): """scripts to run prior to staging the repo contents""" scripts = super().get_preassemble_scripts() @@ -108,7 +108,7 @@ def get_preassemble_scripts(self): ) return scripts - @lru_cache() + @lru_cache def get_assemble_scripts(self): """Return series of build-steps specific to this repository.""" # If we have either Pipfile.lock, Pipfile, or runtime.txt declare the diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 36740795a..1530e347d 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -98,7 +98,7 @@ def _should_preassemble_pip(self): # allow assembly from subset return True - @lru_cache() + @lru_cache def get_preassemble_script_files(self): assemble_files = super().get_preassemble_script_files() for name in ("requirements.txt", "requirements3.txt"): @@ -107,7 +107,7 @@ def get_preassemble_script_files(self): assemble_files[requirements_txt] = requirements_txt return assemble_files - @lru_cache() + @lru_cache def get_preassemble_scripts(self): """Return scripts to run before adding the full repository""" scripts = super().get_preassemble_scripts() @@ -115,7 +115,7 @@ def get_preassemble_scripts(self): scripts.extend(self._get_pip_scripts()) return scripts - @lru_cache() + @lru_cache def get_assemble_scripts(self): """Return series of build steps that require the full repository""" # If we have a runtime.txt & that's set to python-2.7, diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index ddc18ed37..fe0db1836 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -146,7 +146,7 @@ def detect(self): self._runtime = f"r-{str(self._checkpoint_date)}" return True - @lru_cache() + @lru_cache def get_env(self): """ Set custom env vars needed for RStudio to load @@ -161,7 +161,7 @@ def get_env(self): ("LD_LIBRARY_PATH", "${R_HOME}/lib:${LD_LIBRARY_PATH}"), ] - @lru_cache() + @lru_cache def get_path(self): """ Return paths to be added to the PATH environment variable. @@ -171,7 +171,7 @@ def get_path(self): """ return super().get_path() + ["/usr/lib/rstudio-server/bin/"] - @lru_cache() + @lru_cache def get_build_env(self): """ Return environment variables to be set. @@ -185,7 +185,7 @@ def get_build_env(self): ("R_LIBS_USER", "${APP_BASE}/rlibs") ] - @lru_cache() + @lru_cache def get_packages(self): """ Return list of packages to be installed. @@ -204,7 +204,7 @@ def get_packages(self): return super().get_packages().union(packages) - @lru_cache() + @lru_cache def get_rspm_snapshot_url(self, snapshot_date, max_days_prior=7): for i in range(max_days_prior): snapshots = requests.post( @@ -232,7 +232,7 @@ def get_rspm_snapshot_url(self, snapshot_date, max_days_prior=7): ) ) - @lru_cache() + @lru_cache def get_devtools_snapshot_url(self): """ Return url of snapshot to use for getting devtools install @@ -249,7 +249,7 @@ def get_devtools_snapshot_url(self): # appropriate binary packages without having to hard code version names here. return "https://packagemanager.posit.co/all/__linux__/${VERSION_CODENAME}/2022-06-03+Y3JhbiwyOjQ1MjYyMTU7RkM5ODcwN0M" - @lru_cache() + @lru_cache def get_build_scripts(self): """ Return series of build-steps common to all R repositories @@ -361,7 +361,7 @@ def get_build_scripts(self): return super().get_build_scripts() + scripts - @lru_cache() + @lru_cache def get_preassemble_script_files(self): files = super().get_preassemble_script_files() installR_path = self.binder_path("install.R") @@ -370,7 +370,7 @@ def get_preassemble_script_files(self): return files - @lru_cache() + @lru_cache def get_preassemble_scripts(self): """Install contents of install.R @@ -396,7 +396,7 @@ def get_preassemble_scripts(self): return super().get_preassemble_scripts() + scripts - @lru_cache() + @lru_cache def get_assemble_scripts(self): """Install the dependencies of or the repository itself""" assemble_scripts = super().get_assemble_scripts() diff --git a/repo2docker/semver.py b/repo2docker/semver.py index 661829ecc..24dd07319 100644 --- a/repo2docker/semver.py +++ b/repo2docker/semver.py @@ -30,7 +30,7 @@ def str_to_version(vstr): return tuple([int(n) for n in vstr.split(".")]) -@lru_cache() +@lru_cache def parse_version(vstr): """Convert a simple 'x[.y[.z]]' version string to a comparable VersionInfo @@ -62,7 +62,7 @@ def patch(v): return v[2] if len(v) >= 3 else 0 -@lru_cache() +@lru_cache def create_semver_matcher(constraint_str): """Create a matcher that can be used to match version tuples From 709eb8e527c377aee071766d433bd6691235e403 Mon Sep 17 00:00:00 2001 From: Yuvi Panda Date: Wed, 12 Feb 2025 21:23:41 -0800 Subject: [PATCH 064/299] Update error message Co-authored-by: Simon Li --- repo2docker/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/__main__.py b/repo2docker/__main__.py index 748e0d02b..62d67f026 100644 --- a/repo2docker/__main__.py +++ b/repo2docker/__main__.py @@ -438,7 +438,7 @@ def make_r2d(argv=None): # We no longer support build_memory_limit, it must be set in the builder instance print("--build-memory-limit is no longer supported", file=sys.stderr) print( - "Use `docker buildx create` to create a custom builder with appropriate memory limits instead", + "Check your build engine documentation to set memory limits. Use `docker buildx create` if using the default builder to create a custom builder with appropriate memory limits", file=sys.stderr, ) sys.exit(-1) From 89e78b7cafc480c3b72e13a9ed5505190b35cbb3 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Thu, 13 Feb 2025 09:27:45 +0000 Subject: [PATCH 065/299] Require Python 3.9 to run repo2docker --- .github/workflows/test.yml | 2 +- .pre-commit-config.yaml | 1 - README.md | 2 +- setup.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 32156ff70..de4fd3b91 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -69,7 +69,7 @@ jobs: include: # The earliest actions/setup-python versions depend on the runner. - ubuntu_version: "22.04" - python_version: "3.8" + python_version: "3.9" repo_type: venv steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a5c2d516a..426fff94a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,7 +27,6 @@ repos: hooks: - id: black args: - - --target-version=py38 - --target-version=py39 - --target-version=py310 - --target-version=py311 diff --git a/README.md b/README.md index 802c06d16..89d09b3c6 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ For more information, please visit 1. Docker to build & run the repositories. The [community edition](https://store.docker.com/search?type=edition&offering=community) is recommended. -2. Python 3.8+. +2. Python 3.9+. Supported on Linux and macOS. [See documentation note about Windows support.](http://repo2docker.readthedocs.io/en/latest/install.html#note-about-windows-support) diff --git a/setup.py b/setup.py index 0639ec107..c8fcbbd73 100644 --- a/setup.py +++ b/setup.py @@ -62,7 +62,7 @@ def get_identifier(json): "toml", "traitlets", ], - python_requires=">=3.8", + python_requires=">=3.9", author="Project Jupyter Contributors", author_email="jupyter@googlegroups.com", url="https://repo2docker.readthedocs.io/en/latest/", From 7793358699af1e6d5b1c01c6b70eb6acc87102d1 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Thu, 13 Feb 2025 09:34:00 +0000 Subject: [PATCH 066/299] Bump alpine docker to 3.21 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 74fbad894..bb92d164d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # syntax = docker/dockerfile:1.3 -ARG ALPINE_VERSION=3.19 +ARG ALPINE_VERSION=3.21 FROM alpine:${ALPINE_VERSION} RUN apk add --no-cache git python3 python3-dev py3-pip py3-setuptools build-base From b6fa2d447eab2d988904bb668d9d7876e4e2e8b9 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 13 Feb 2025 16:01:32 -0800 Subject: [PATCH 067/299] Simulate json output from docker buildx build We still use the docker python api to push images, and to run. So we need to set string_output to false, and simulate the json output on buildx. Alternatively we could completely get rid of the python API, but that's a much bigger lift (especially around registry credentials) that I don't want us to do right now. Without this, push progress is reported as raw bytes in the binderhub UI --- repo2docker/docker.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 7fcbc31e2..b92f807de 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -58,7 +58,7 @@ class DockerEngine(ContainerEngine): https://docker-py.readthedocs.io/en/4.2.0/api.html#module-docker.api.build """ - string_output = True + string_output = False extra_init_args = Dict( {}, @@ -141,12 +141,18 @@ def build( args += [d] - yield from execute_cmd(args, True) + for line in execute_cmd(args, True): + # Simulate structured JSON output from buildx build, since we + # do get structured json output from pushing and running + yield {"stream": line} else: # Assume 'path' is passed in args += [path] - yield from execute_cmd(args, True) + for line in execute_cmd(args, True): + # Simulate structured JSON output from buildx build, since we + # do get structured json output from pushing and running + yield {"stream": line} def images(self): images = self._apiclient.images() From 8d916f46c4f7744ace666738043db5aaf6d6fb22 Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 30 Jan 2025 09:37:23 +0100 Subject: [PATCH 068/299] add triplets for r versions 4.3, 4.4 otherwise r-4.3 won't work --- repo2docker/buildpacks/r.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index fe0db1836..63ce965a3 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -69,6 +69,8 @@ def r_version(self): """ # Available versions at https://cran.r-project.org/src/base/ version_map = { + "4.4": "4.4.1", + "4.3": "4.3.3", "4.2": "4.2.1", "4.1": "4.1.3", "4.0": "4.0.5", From d13330a288c279dccc03b4c7750483e58a740893 Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 30 Jan 2025 09:41:30 +0100 Subject: [PATCH 069/299] resolve unrecognized x.y r versions to x.y.0 R.deb download step requires a full x.y.z version, it will 404 on `r-4.4` --- repo2docker/buildpacks/r.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 63ce965a3..022554821 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -99,6 +99,9 @@ def r_version(self): # available. Users can however explicitly specify the full version to get something specific if r_version in version_map: r_version = version_map[r_version] + elif len(r_version.split(".")) == 1: + # must have x.y.z version, add .0 for unrecognized (future) R versions + r_version += ".0" # translate to the full version string self._r_version = r_version From 11b8fc1ab83c3c7a0ad265365b212adfa0a98b4c Mon Sep 17 00:00:00 2001 From: Yuvi Panda Date: Tue, 18 Feb 2025 14:03:14 -0800 Subject: [PATCH 070/299] Fix typo Co-authored-by: Simon Li --- repo2docker/buildpacks/r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 022554821..93148a940 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -99,7 +99,7 @@ def r_version(self): # available. Users can however explicitly specify the full version to get something specific if r_version in version_map: r_version = version_map[r_version] - elif len(r_version.split(".")) == 1: + elif len(r_version.split(".")) == 2: # must have x.y.z version, add .0 for unrecognized (future) R versions r_version += ".0" From 5a3144f960e895d11fcf4228e59eee46f18ff1e4 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 18 Feb 2025 14:23:24 -0800 Subject: [PATCH 071/299] Update r version we test --- tests/r/r4.0-rspm/runtime.txt | 1 - tests/r/{r4.0-rspm => r4.4-rspm}/install.R | 0 tests/r/r4.4-rspm/runtime.txt | 1 + tests/r/{r4.0-rspm => r4.4-rspm}/verify | 0 4 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 tests/r/r4.0-rspm/runtime.txt rename tests/r/{r4.0-rspm => r4.4-rspm}/install.R (100%) create mode 100644 tests/r/r4.4-rspm/runtime.txt rename tests/r/{r4.0-rspm => r4.4-rspm}/verify (100%) diff --git a/tests/r/r4.0-rspm/runtime.txt b/tests/r/r4.0-rspm/runtime.txt deleted file mode 100644 index e9f265b55..000000000 --- a/tests/r/r4.0-rspm/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -r-4.0-2022-01-01 diff --git a/tests/r/r4.0-rspm/install.R b/tests/r/r4.4-rspm/install.R similarity index 100% rename from tests/r/r4.0-rspm/install.R rename to tests/r/r4.4-rspm/install.R diff --git a/tests/r/r4.4-rspm/runtime.txt b/tests/r/r4.4-rspm/runtime.txt new file mode 100644 index 000000000..1375871dd --- /dev/null +++ b/tests/r/r4.4-rspm/runtime.txt @@ -0,0 +1 @@ +r-4.4-2025-01-01 diff --git a/tests/r/r4.0-rspm/verify b/tests/r/r4.4-rspm/verify similarity index 100% rename from tests/r/r4.0-rspm/verify rename to tests/r/r4.4-rspm/verify From a6e9ddffc256a9300bedd780a6cbfb34315540fd Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 19 Feb 2025 08:49:55 +0100 Subject: [PATCH 072/299] update expected version in verify --- tests/r/r4.4-rspm/verify | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/r/r4.4-rspm/verify b/tests/r/r4.4-rspm/verify index 835f141c0..0e02bdd40 100755 --- a/tests/r/r4.4-rspm/verify +++ b/tests/r/r4.4-rspm/verify @@ -3,7 +3,7 @@ library('digest') # Fail if version is not 4.0 print(version) -if (!(version$major == "4" && as.double(version$minor) >= 0 && as.double(version$minor) < 1)) { +if (!(version$major == "4" && as.double(version$minor) >= 4 && as.double(version$minor) < 5)) { quit("yes", 1) } From a9e5a19aee43737cda60e63d33fb84556a80fc34 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 18 Feb 2025 13:42:01 -0800 Subject: [PATCH 073/299] Add a test for runtime.txt with full R version specified Catching possible errors as reported in https://discourse.jupyter.org/t/error-in-mybinder-org-there-is-no-package-called-irkernel/32478/13. The other tests only specify x.y, not x.y.z --- tests/r/r4.3.2-rspm/install.R | 1 + tests/r/r4.3.2-rspm/runtime.txt | 1 + tests/r/r4.3.2-rspm/verify | 13 +++++++++++++ 3 files changed, 15 insertions(+) create mode 100644 tests/r/r4.3.2-rspm/install.R create mode 100644 tests/r/r4.3.2-rspm/runtime.txt create mode 100755 tests/r/r4.3.2-rspm/verify diff --git a/tests/r/r4.3.2-rspm/install.R b/tests/r/r4.3.2-rspm/install.R new file mode 100644 index 000000000..f609959ef --- /dev/null +++ b/tests/r/r4.3.2-rspm/install.R @@ -0,0 +1 @@ +install.packages("digest") diff --git a/tests/r/r4.3.2-rspm/runtime.txt b/tests/r/r4.3.2-rspm/runtime.txt new file mode 100644 index 000000000..cdd616ea8 --- /dev/null +++ b/tests/r/r4.3.2-rspm/runtime.txt @@ -0,0 +1 @@ +r-4.3.2-2024-01-10 diff --git a/tests/r/r4.3.2-rspm/verify b/tests/r/r4.3.2-rspm/verify new file mode 100755 index 000000000..c5cb0ee87 --- /dev/null +++ b/tests/r/r4.3.2-rspm/verify @@ -0,0 +1,13 @@ +#!/usr/bin/env Rscript +library('digest') + +# Fail if version is not 4.3 +print(version) +if (!(version$major == "4" && version$minor == "3")) { + quit("yes", 1) +} + +# The date we have chosen should give us an rspm mirror +if (!(startsWith(options()$repos["CRAN"], "https://packagemanager.posit.co"))) { + quit("yes", 1) +} From 3304921cdd7dc43bb2a9a02932235bd043d48d80 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 20 Feb 2025 14:55:08 -0800 Subject: [PATCH 074/299] Ask for very specific version --- tests/r/r4.3.2-rspm/verify | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/r/r4.3.2-rspm/verify b/tests/r/r4.3.2-rspm/verify index c5cb0ee87..c46a402ac 100755 --- a/tests/r/r4.3.2-rspm/verify +++ b/tests/r/r4.3.2-rspm/verify @@ -1,9 +1,9 @@ #!/usr/bin/env Rscript library('digest') -# Fail if version is not 4.3 +# Fail if version is not 4.3.2 print(version) -if (!(version$major == "4" && version$minor == "3")) { +if (!(version$major == "4" && version$minor == "3.2")) { quit("yes", 1) } From f968689aad1385de2e0d95f1ee1a1b94db093129 Mon Sep 17 00:00:00 2001 From: Julien Jerphanion Date: Tue, 25 Feb 2025 11:13:40 +0100 Subject: [PATCH 075/299] maint: Adapt mamba activation Signed-off-by: Julien Jerphanion --- .../buildpacks/conda/activate-conda.sh | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/repo2docker/buildpacks/conda/activate-conda.sh b/repo2docker/buildpacks/conda/activate-conda.sh index b5a54e306..d3732c8fe 100755 --- a/repo2docker/buildpacks/conda/activate-conda.sh +++ b/repo2docker/buildpacks/conda/activate-conda.sh @@ -1,11 +1,24 @@ -# enable conda and activate the notebook environment -set -e +set -ex + +# Setup conda +CONDA_PROFILE="${CONDA_DIR}/etc/profile.d/conda.sh" +echo "Activating profile: ${CONDA_PROFILE}" +test -f $CONDA_PROFILE && . $CONDA_PROFILE + +# Setup micromamba eval $(micromamba shell hook -s posix -r ${CONDA_DIR}) -for name in conda mamba; do - CONDA_PROFILE="${CONDA_DIR}/etc/profile.d/${name}.sh" - echo "Activating profile: ${CONDA_PROFILE}" - test -f $CONDA_PROFILE && . $CONDA_PROFILE -done + +# Setup mamba +export MAMBA_ROOT_PREFIX="${CONDA_DIR}" +__mamba_setup="$("${CONDA_DIR}/bin/mamba" shell hook --shell posix 2> /dev/null)" +if [ $? -eq 0 ]; then + eval "$__mamba_setup" +else + alias mamba="${CONDA_DIR}/bin/mamba" # Fallback on help from mamba activate +fi +unset __mamba_setup + +# Activate the environment if [[ "${KERNEL_PYTHON_PREFIX}" != "${NB_PYTHON_PREFIX}" ]]; then # if the kernel is a separate env, stack them # so both are on PATH, notebook first @@ -22,4 +35,4 @@ else mamba activate ${NB_PYTHON_PREFIX} fi -set +e +set +ex From ac0def4028ac9264f42e9c0eef571e8ec9711153 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 26 Feb 2025 11:04:19 -0800 Subject: [PATCH 076/299] Use CLI to push docker image Preserves existing authentication information handling behavior: 1. If registry_credentials are present, they are used but not leaked on to existing ~/.docker/config 2. If registry_credentials are not present, they are not used 3. Regardless of registry_credentials being present, we still will use existing authentication info in DOCKER_CONFIG --- repo2docker/docker.py | 52 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index b92f807de..aaec2774e 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,9 +2,13 @@ Docker container engine for repo2docker """ +import os import shutil +import subprocess import tarfile import tempfile +from contextlib import contextmanager +from pathlib import Path from iso8601 import parse_date from traitlets import Dict, List, Unicode @@ -58,7 +62,7 @@ class DockerEngine(ContainerEngine): https://docker-py.readthedocs.io/en/4.2.0/api.html#module-docker.api.build """ - string_output = False + string_output = True extra_init_args = Dict( {}, @@ -141,18 +145,12 @@ def build( args += [d] - for line in execute_cmd(args, True): - # Simulate structured JSON output from buildx build, since we - # do get structured json output from pushing and running - yield {"stream": line} + yield from execute_cmd(args, True) else: # Assume 'path' is passed in args += [path] - for line in execute_cmd(args, True): - # Simulate structured JSON output from buildx build, since we - # do get structured json output from pushing and running - yield {"stream": line} + yield from execute_cmd(args, True) def images(self): images = self._apiclient.images() @@ -162,10 +160,42 @@ def inspect_image(self, image): image = self._apiclient.inspect_image(image) return Image(tags=image["RepoTags"], config=image["Config"]) + @contextmanager + def docker_login(self, username, password, registry): + # Determine existing DOCKER_CONFIG + dc_path = Path( + os.environ.get("DOCKER_CONFIG", os.path.expanduser("~/.docker/config.json")) + ) + + with tempfile.TemporaryDirectory() as d: + new_dc_path = Path(d) / "config.json" + if dc_path.exists(): + # If there is an existing DOCKER_CONFIG, copy it to new location so we inherit + # whatever configuration the user has already set + shutil.copy2(dc_path, new_dc_path) + + env = os.environ.copy() + subprocess.check_call( + # FIXME: This should be using --password-stdin instead + [ + "docker", + "login", + "--username", + username, + "--password", + password, + registry, + ], + env=env, + ) + yield + def push(self, image_spec): if self.registry_credentials: - self._apiclient.login(**self.registry_credentials) - return self._apiclient.push(image_spec, stream=True) + with self.docker_login(**self.registry_credentials): + yield from execute_cmd(["docker", "push", image_spec], capture=True) + else: + yield from execute_cmd(["docker", "push", image_spec], capture=True) def run( self, From 268e18765b6e3760390690a8fbaf09f7ac7cc322 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 26 Feb 2025 12:58:29 -0800 Subject: [PATCH 077/299] Properly set DOCKER_CONFIG to be a dir, not a file --- repo2docker/docker.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index aaec2774e..b4361a695 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -163,9 +163,11 @@ def inspect_image(self, image): @contextmanager def docker_login(self, username, password, registry): # Determine existing DOCKER_CONFIG - dc_path = Path( - os.environ.get("DOCKER_CONFIG", os.path.expanduser("~/.docker/config.json")) - ) + old_dc_path = os.environ.get("DOCKER_CONFIG") + if old_dc_path is None: + dc_path = Path("~/.docker/config.json").expanduser() + else: + dc_path = Path(old_dc_path) with tempfile.TemporaryDirectory() as d: new_dc_path = Path(d) / "config.json" @@ -174,21 +176,25 @@ def docker_login(self, username, password, registry): # whatever configuration the user has already set shutil.copy2(dc_path, new_dc_path) - env = os.environ.copy() - subprocess.check_call( - # FIXME: This should be using --password-stdin instead - [ + os.environ['DOCKER_CONFIG'] = d + proc = subprocess.run([ "docker", "login", "--username", username, - "--password", - password, + "--password-stdin", registry, ], - env=env, + input=password.encode(), + check=True ) - yield + try: + yield + finally: + if old_dc_path: + os.environ['DOCKER_CONFIG'] = old_dc_path + else: + del os.environ['DOCKER_CONFIG'] def push(self, image_spec): if self.registry_credentials: From 3bdc004e461bbb204b1edef448d6fa24f3882158 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 21:00:17 +0000 Subject: [PATCH 078/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/docker.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index b4361a695..4222fadd3 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -176,8 +176,9 @@ def docker_login(self, username, password, registry): # whatever configuration the user has already set shutil.copy2(dc_path, new_dc_path) - os.environ['DOCKER_CONFIG'] = d - proc = subprocess.run([ + os.environ["DOCKER_CONFIG"] = d + proc = subprocess.run( + [ "docker", "login", "--username", @@ -186,15 +187,15 @@ def docker_login(self, username, password, registry): registry, ], input=password.encode(), - check=True + check=True, ) try: yield finally: if old_dc_path: - os.environ['DOCKER_CONFIG'] = old_dc_path + os.environ["DOCKER_CONFIG"] = old_dc_path else: - del os.environ['DOCKER_CONFIG'] + del os.environ["DOCKER_CONFIG"] def push(self, image_spec): if self.registry_credentials: From 364a18932c0f41aa441e14a593eeffcaf08a8c48 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 27 Feb 2025 20:21:22 -0800 Subject: [PATCH 079/299] Add a local registry in github actions for us to test with --- .github/workflows/test.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index de4fd3b91..924b23164 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,6 +40,7 @@ env: GIT_AUTHOR_EMAIL: ci-user@github.local GIT_AUTHOR_NAME: CI User + jobs: test: # Don't run scheduled tests on forks @@ -72,8 +73,22 @@ jobs: python_version: "3.9" repo_type: venv + services: + # So that we can test this in PRs/branches + local-registry: + image: registry:2 + ports: + - 5000:5000 + steps: - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + # Allows pushing to registry on localhost:5000 + driver-opts: network=host + - uses: actions/setup-python@v5 with: python-version: "${{ matrix.python_version }}" From 82e049fcec44db30d3f7c90f05392e62454158b6 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 27 Feb 2025 20:49:09 -0800 Subject: [PATCH 080/299] Add a docker registry integration test with real registry --- .github/workflows/test.yml | 14 +-------- repo2docker/app.py | 15 ++-------- repo2docker/utils.py | 12 ++++++++ tests/registry/Dockerfile | 2 ++ tests/registry/test_registry.py | 50 +++++++++++++++++++++++++++++++++ tests/unit/test_docker.py | 40 -------------------------- 6 files changed, 67 insertions(+), 66 deletions(-) create mode 100644 tests/registry/Dockerfile create mode 100644 tests/registry/test_registry.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 924b23164..07bfc368f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,6 +65,7 @@ jobs: - unit - venv - contentproviders + - registry # Playwright test - ui include: @@ -73,22 +74,9 @@ jobs: python_version: "3.9" repo_type: venv - services: - # So that we can test this in PRs/branches - local-registry: - image: registry:2 - ports: - - 5000:5000 - steps: - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - # Allows pushing to registry on localhost:5000 - driver-opts: network=host - - uses: actions/setup-python@v5 with: python-version: "${{ matrix.python_version }}" diff --git a/repo2docker/app.py b/repo2docker/app.py index 0d8174525..418ef12d7 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -37,7 +37,7 @@ RBuildPack, ) from .engine import BuildError, ContainerEngineException, ImageLoadError -from .utils import ByteSpecification, R2dState, chdir, get_platform +from .utils import ByteSpecification, R2dState, chdir, get_platform, get_free_port class Repo2Docker(Application): @@ -660,7 +660,7 @@ def start_container(self): container_port = int(container_port_proto.split("/", 1)[0]) else: # no port specified, pick a random one - container_port = host_port = str(self._get_free_port()) + container_port = host_port = str(get_free_port()) self.ports = {f"{container_port}/tcp": host_port} self.port = host_port # To use the option --NotebookApp.custom_display_url @@ -744,17 +744,6 @@ def wait_for_container(self, container): if exit_code: sys.exit(exit_code) - def _get_free_port(self): - """ - Hacky method to get a free random port on local host - """ - import socket - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(("", 0)) - port = s.getsockname()[1] - s.close() - return port def find_image(self): # if this is a dry run it is Ok for dockerd to be unreachable so we diff --git a/repo2docker/utils.py b/repo2docker/utils.py index 9c2769e1d..ebae3da96 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -1,4 +1,5 @@ import os +import socket import platform import re import subprocess @@ -545,3 +546,14 @@ def get_platform(): else: warnings.warn(f"Unexpected platform '{m}', defaulting to linux/amd64") return "linux/amd64" + + +def get_free_port(): + """ + Hacky method to get a free random port on local host + """ + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(("", 0)) + port = s.getsockname()[1] + s.close() + return port \ No newline at end of file diff --git a/tests/registry/Dockerfile b/tests/registry/Dockerfile new file mode 100644 index 000000000..bd083ea7f --- /dev/null +++ b/tests/registry/Dockerfile @@ -0,0 +1,2 @@ +# Smallest possible dockerfile, used only for building images to be tested +FROM scratch \ No newline at end of file diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py new file mode 100644 index 000000000..03b005662 --- /dev/null +++ b/tests/registry/test_registry.py @@ -0,0 +1,50 @@ +from pathlib import Path +import subprocess +import pytest +from repo2docker.__main__ import make_r2d +from repo2docker.utils import get_free_port +import time +import requests +import secrets + +HERE = Path(__file__).parent + +@pytest.fixture +def registry(): + port = get_free_port() + cmd = [ + "docker", "run", "-it", "-p", f"{port}:5000", "registry:3.0.0-rc.3" + ] + proc = subprocess.Popen(cmd) + health_url = f'http://localhost:{port}/v2' + # Wait for the registry to actually come up + for i in range(10): + try: + resp = requests.get(health_url) + if resp.status_code in (401, 200): + break + except requests.ConnectionError: + # The service is not up yet + pass + time.sleep(i) + else: + raise TimeoutError("Test registry did not come up in time") + + try: + yield f"localhost:{port}" + finally: + proc.terminate() + proc.wait() + + +def test_registry(registry): + image_name = f"{registry}/{secrets.token_hex(8)}:latest" + r2d = make_r2d([ + "--image", image_name, + "--push", "--no-run", str(HERE) + ]) + + r2d.start() + + proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) + assert proc.returncode == 0 diff --git a/tests/unit/test_docker.py b/tests/unit/test_docker.py index c47aa4fa0..a41bafa3a 100644 --- a/tests/unit/test_docker.py +++ b/tests/unit/test_docker.py @@ -22,43 +22,3 @@ def test_git_credential_env(): .strip() ) assert out == credential_env - - -class MockDockerEngine(DockerEngine): - def __init__(self, *args, **kwargs): - self._apiclient = Mock() - - -def test_docker_push_no_credentials(): - engine = MockDockerEngine() - - engine.push("image") - - assert len(engine._apiclient.method_calls) == 1 - engine._apiclient.push.assert_called_once_with("image", stream=True) - - -def test_docker_push_dict_credentials(): - engine = MockDockerEngine() - engine.registry_credentials = {"username": "abc", "password": "def"} - - engine.push("image") - - assert len(engine._apiclient.method_calls) == 2 - engine._apiclient.login.assert_called_once_with(username="abc", password="def") - engine._apiclient.push.assert_called_once_with("image", stream=True) - - -def test_docker_push_env_credentials(): - engine = MockDockerEngine() - with patch.dict( - "os.environ", - { - "CONTAINER_ENGINE_REGISTRY_CREDENTIALS": '{"username": "abc", "password": "def"}' - }, - ): - engine.push("image") - - assert len(engine._apiclient.method_calls) == 2 - engine._apiclient.login.assert_called_once_with(username="abc", password="def") - engine._apiclient.push.assert_called_once_with("image", stream=True) From 8444a28d866189117b28b3ba4d5ed134b566c056 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 27 Feb 2025 21:26:42 -0800 Subject: [PATCH 081/299] Explicitly pull registry image before trying to run --- tests/registry/test_registry.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index 03b005662..7d9795c02 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -12,8 +12,11 @@ @pytest.fixture def registry(): port = get_free_port() + # Explicitly pull the image first so it runs on time + registry_image = "registry:3.0.0-rc.3" + subprocess.check_call(["docker", "pull", registry_image]) cmd = [ - "docker", "run", "-it", "-p", f"{port}:5000", "registry:3.0.0-rc.3" + "docker", "run", "-it", "-p", f"{port}:5000", registry_image ] proc = subprocess.Popen(cmd) health_url = f'http://localhost:{port}/v2' From 69e67a23bf22609f0f27a64800d4c720c28c4b52 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 27 Feb 2025 21:28:50 -0800 Subject: [PATCH 082/299] Don't need -it for docker run here --- tests/registry/test_registry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index 7d9795c02..eed3f0f7a 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -16,7 +16,7 @@ def registry(): registry_image = "registry:3.0.0-rc.3" subprocess.check_call(["docker", "pull", registry_image]) cmd = [ - "docker", "run", "-it", "-p", f"{port}:5000", registry_image + "docker", "run", "-p", f"{port}:5000", registry_image ] proc = subprocess.Popen(cmd) health_url = f'http://localhost:{port}/v2' From a8369beed4d4cec8bd842a3e676990057c82f437 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 09:44:35 -0800 Subject: [PATCH 083/299] Use custom dind for talking to insecure registry --- tests/registry/test_registry.py | 60 +++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index eed3f0f7a..8c4ef441e 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -1,3 +1,5 @@ +import os +import socket from pathlib import Path import subprocess import pytest @@ -9,17 +11,62 @@ HERE = Path(__file__).parent -@pytest.fixture -def registry(): +@pytest.fixture(scope="session") +def dind(registry, host_ip): + port = get_free_port() + dind_image = "docker:dind" + subprocess.check_call(["docker", "pull", dind_image]) + # This is insecure, because I'm disabling all kinds of authentication on the docker daemon. + # FIXME: Use TLS verification. + # but also docker this is your own fucking fault for making technical choices that force dockerhub + # to be the primary registry, so your registry handling sucks and forces these kinds of difficulties. + cmd = [ + "docker", "run", "-e", 'DOCKER_TLS_CERTDIR=', + "--privileged", "-p", f"{port}:2376", dind_image, + "--host", "0.0.0.0:2376", + "--insecure-registry", registry, + "--tls=false" + ] + proc = subprocess.Popen(cmd) + time.sleep(5) + + try: + yield f"tcp://{host_ip}:{port}" + finally: + proc.terminate() + proc.wait() + +@pytest.fixture(scope="session") +def host_ip(): + # Get the IP of the current machine, as we need to use the same IP + # for all our docker commands, *and* the dind we run needs to reach it + # in the same way. + # Thanks to https://stackoverflow.com/a/28950776 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.settimeout(0) + try: + # doesn't even have to be reachable + s.connect(('10.254.254.254', 1)) + host_ip = s.getsockname()[0] + finally: + s.close() + + return host_ip + +@pytest.fixture(scope="session") +def registry(host_ip): port = get_free_port() # Explicitly pull the image first so it runs on time registry_image = "registry:3.0.0-rc.3" subprocess.check_call(["docker", "pull", registry_image]) + + cmd = [ - "docker", "run", "-p", f"{port}:5000", registry_image + "docker", "run", "--rm", + "-p", f"{port}:5000", registry_image ] proc = subprocess.Popen(cmd) - health_url = f'http://localhost:{port}/v2' + health_url = f'http://{host_ip}:{port}/v2' # Wait for the registry to actually come up for i in range(10): try: @@ -34,19 +81,20 @@ def registry(): raise TimeoutError("Test registry did not come up in time") try: - yield f"localhost:{port}" + yield f"{host_ip}:{port}" finally: proc.terminate() proc.wait() -def test_registry(registry): +def test_registry(registry, dind): image_name = f"{registry}/{secrets.token_hex(8)}:latest" r2d = make_r2d([ "--image", image_name, "--push", "--no-run", str(HERE) ]) + os.environ["DOCKER_HOST"] = dind r2d.start() proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) From 9f6fbf76784202873f8a29598d698e7770eb7eec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:44:57 +0000 Subject: [PATCH 084/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/app.py | 3 +-- repo2docker/utils.py | 4 +-- tests/registry/test_registry.py | 48 ++++++++++++++++++--------------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 418ef12d7..d70ec761d 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -37,7 +37,7 @@ RBuildPack, ) from .engine import BuildError, ContainerEngineException, ImageLoadError -from .utils import ByteSpecification, R2dState, chdir, get_platform, get_free_port +from .utils import ByteSpecification, R2dState, chdir, get_free_port, get_platform class Repo2Docker(Application): @@ -744,7 +744,6 @@ def wait_for_container(self, container): if exit_code: sys.exit(exit_code) - def find_image(self): # if this is a dry run it is Ok for dockerd to be unreachable so we # always return False for dry runs. diff --git a/repo2docker/utils.py b/repo2docker/utils.py index ebae3da96..e71dcf94d 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -1,7 +1,7 @@ import os -import socket import platform import re +import socket import subprocess import warnings from contextlib import contextmanager @@ -556,4 +556,4 @@ def get_free_port(): s.bind(("", 0)) port = s.getsockname()[1] s.close() - return port \ No newline at end of file + return port diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index 8c4ef441e..c641b43fb 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -1,16 +1,19 @@ import os +import secrets import socket -from pathlib import Path import subprocess +import time +from pathlib import Path + import pytest +import requests + from repo2docker.__main__ import make_r2d from repo2docker.utils import get_free_port -import time -import requests -import secrets HERE = Path(__file__).parent + @pytest.fixture(scope="session") def dind(registry, host_ip): port = get_free_port() @@ -21,11 +24,19 @@ def dind(registry, host_ip): # but also docker this is your own fucking fault for making technical choices that force dockerhub # to be the primary registry, so your registry handling sucks and forces these kinds of difficulties. cmd = [ - "docker", "run", "-e", 'DOCKER_TLS_CERTDIR=', - "--privileged", "-p", f"{port}:2376", dind_image, - "--host", "0.0.0.0:2376", - "--insecure-registry", registry, - "--tls=false" + "docker", + "run", + "-e", + "DOCKER_TLS_CERTDIR=", + "--privileged", + "-p", + f"{port}:2376", + dind_image, + "--host", + "0.0.0.0:2376", + "--insecure-registry", + registry, + "--tls=false", ] proc = subprocess.Popen(cmd) time.sleep(5) @@ -36,6 +47,7 @@ def dind(registry, host_ip): proc.terminate() proc.wait() + @pytest.fixture(scope="session") def host_ip(): # Get the IP of the current machine, as we need to use the same IP @@ -46,27 +58,24 @@ def host_ip(): s.settimeout(0) try: # doesn't even have to be reachable - s.connect(('10.254.254.254', 1)) + s.connect(("10.254.254.254", 1)) host_ip = s.getsockname()[0] finally: s.close() return host_ip + @pytest.fixture(scope="session") def registry(host_ip): port = get_free_port() # Explicitly pull the image first so it runs on time - registry_image = "registry:3.0.0-rc.3" + registry_image = "registry:3.0.0-rc.3" subprocess.check_call(["docker", "pull", registry_image]) - - cmd = [ - "docker", "run", "--rm", - "-p", f"{port}:5000", registry_image - ] + cmd = ["docker", "run", "--rm", "-p", f"{port}:5000", registry_image] proc = subprocess.Popen(cmd) - health_url = f'http://{host_ip}:{port}/v2' + health_url = f"http://{host_ip}:{port}/v2" # Wait for the registry to actually come up for i in range(10): try: @@ -89,10 +98,7 @@ def registry(host_ip): def test_registry(registry, dind): image_name = f"{registry}/{secrets.token_hex(8)}:latest" - r2d = make_r2d([ - "--image", image_name, - "--push", "--no-run", str(HERE) - ]) + r2d = make_r2d(["--image", image_name, "--push", "--no-run", str(HERE)]) os.environ["DOCKER_HOST"] = dind r2d.start() From 576b8967bc1131793f9a7502b5c978aec065d6ff Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 11:17:10 -0800 Subject: [PATCH 085/299] Stop using docker-py for anything Also properly setup TLS for docker daemon to close security hole --- repo2docker/app.py | 8 ++------ repo2docker/buildpacks/docker.py | 2 -- repo2docker/docker.py | 32 ++++++++++++++------------------ repo2docker/engine.py | 12 +----------- setup.py | 1 - tests/registry/test_registry.py | 23 +++++++++++++++-------- tests/unit/test_docker.py | 3 --- tests/unit/test_ports.py | 4 ---- 8 files changed, 32 insertions(+), 53 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index d70ec761d..54482b7ad 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -750,12 +750,8 @@ def find_image(self): if self.dry_run: return False # check if we already have an image for this content - client = self.get_engine() - for image in client.images(): - for tag in image.tags: - if tag == self.output_image_spec + ":latest": - return True - return False + engine = self.get_engine() + return engine.inspect_image(self.output_image_spec) is not None def build(self): """ diff --git a/repo2docker/buildpacks/docker.py b/repo2docker/buildpacks/docker.py index 9185307ad..b0e58778c 100644 --- a/repo2docker/buildpacks/docker.py +++ b/repo2docker/buildpacks/docker.py @@ -3,8 +3,6 @@ import os -import docker - from .base import BuildPack diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 4222fadd3..310a90823 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,6 +2,7 @@ Docker container engine for repo2docker """ +import json import os import shutil import subprocess @@ -13,9 +14,7 @@ from iso8601 import parse_date from traitlets import Dict, List, Unicode -import docker - -from .engine import Container, ContainerEngine, ContainerEngineException, Image +from .engine import Container, ContainerEngine, Image from .utils import execute_cmd @@ -86,16 +85,6 @@ class DockerEngine(ContainerEngine): config=True, ) - def __init__(self, *, parent): - super().__init__(parent=parent) - try: - kwargs = docker.utils.kwargs_from_env() - kwargs.update(self.extra_init_args) - kwargs.setdefault("version", "auto") - self._apiclient = docker.APIClient(**kwargs) - except docker.errors.DockerException as e: - raise ContainerEngineException("Check if docker is running on the host.", e) - def build( self, *, @@ -152,13 +141,20 @@ def build( yield from execute_cmd(args, True) - def images(self): - images = self._apiclient.images() - return [Image(tags=image["RepoTags"]) for image in images] def inspect_image(self, image): - image = self._apiclient.inspect_image(image) - return Image(tags=image["RepoTags"], config=image["Config"]) + """ + Return image configuration if it exists, otherwise None + """ + proc = subprocess.run([ + "docker", "image", "inspect", image + ], capture_output=True) + + if proc.returncode != 0: + return None + + config = json.loads(proc.stdout.decode()) + return Image(tags=config["RepoTags"], config=config["Config"]) @contextmanager def docker_login(self, username, password, registry): diff --git a/repo2docker/engine.py b/repo2docker/engine.py index a8897a64e..a6932bd8e 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -254,19 +254,9 @@ def build( """ raise NotImplementedError("build not implemented") - def images(self): - """ - List images - - Returns - ------- - list[Image] : List of Image objects. - """ - raise NotImplementedError("images not implemented") - def inspect_image(self, image): """ - Get information about an image + Get information about an image, or None if the image does not exist TODO: This is specific to the engine, can we convert it to a standard format? diff --git a/setup.py b/setup.py index c8fcbbd73..8c6fcedd9 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,6 @@ def get_identifier(json): version=versioneer.get_version(), install_requires=[ "chardet", - "docker!=5.0.0", "entrypoints", "escapism", "iso8601", diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index c641b43fb..46ea5e2a5 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -1,4 +1,5 @@ import os +import shutil import secrets import socket import subprocess @@ -17,18 +18,21 @@ @pytest.fixture(scope="session") def dind(registry, host_ip): port = get_free_port() + + # Generate CA certs here so we can securely connect to the docker daemon + cert_dir = HERE / f"tmp-certs-{secrets.token_hex(8)}" + cert_dir.mkdir() + dind_image = "docker:dind" subprocess.check_call(["docker", "pull", dind_image]) - # This is insecure, because I'm disabling all kinds of authentication on the docker daemon. - # FIXME: Use TLS verification. - # but also docker this is your own fucking fault for making technical choices that force dockerhub - # to be the primary registry, so your registry handling sucks and forces these kinds of difficulties. + cmd = [ "docker", "run", "-e", - "DOCKER_TLS_CERTDIR=", + "DOCKER_TLS_CERTDIR=/opt/certs", "--privileged", + "--mount", f"type=bind,src={cert_dir},dst=/opt/certs", "-p", f"{port}:2376", dind_image, @@ -36,14 +40,14 @@ def dind(registry, host_ip): "0.0.0.0:2376", "--insecure-registry", registry, - "--tls=false", ] proc = subprocess.Popen(cmd) time.sleep(5) try: - yield f"tcp://{host_ip}:{port}" + yield f"tcp://127.0.0.1:{port}", cert_dir finally: + shutil.rmtree(cert_dir) proc.terminate() proc.wait() @@ -100,7 +104,10 @@ def test_registry(registry, dind): image_name = f"{registry}/{secrets.token_hex(8)}:latest" r2d = make_r2d(["--image", image_name, "--push", "--no-run", str(HERE)]) - os.environ["DOCKER_HOST"] = dind + docker_host, cert_dir = dind + os.environ["DOCKER_HOST"] = docker_host + os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") + os.environ["DOCKER_TLS_VERIFY"] = "1" r2d.start() proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) diff --git a/tests/unit/test_docker.py b/tests/unit/test_docker.py index a41bafa3a..2fe0b6f5e 100644 --- a/tests/unit/test_docker.py +++ b/tests/unit/test_docker.py @@ -2,9 +2,6 @@ import os from subprocess import check_output -from unittest.mock import Mock, patch - -from repo2docker.docker import DockerEngine repo_root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) diff --git a/tests/unit/test_ports.py b/tests/unit/test_ports.py index aaebcdab1..43fd990b5 100644 --- a/tests/unit/test_ports.py +++ b/tests/unit/test_ports.py @@ -11,7 +11,6 @@ import pytest import requests -import docker from repo2docker.__main__ import make_r2d from repo2docker.app import Repo2Docker @@ -69,10 +68,7 @@ def _cleanup(): container.reload() if container.status == "running": container.kill() - try: container.remove() - except docker.errors.NotFound: - pass request.addfinalizer(_cleanup) From 48da2c1bf4dadcea5e9f0b697501c2e742128c07 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 11:29:14 -0800 Subject: [PATCH 086/299] Re-add dockerpy for using exclude patterns --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 8c6fcedd9..c8fcbbd73 100644 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ def get_identifier(json): version=versioneer.get_version(), install_requires=[ "chardet", + "docker!=5.0.0", "entrypoints", "escapism", "iso8601", From a0f02ce2c6a16d3b44db0f6ef83a1c1c0e532a10 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:31:50 +0000 Subject: [PATCH 087/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/docker.py | 7 +++---- tests/registry/test_registry.py | 5 +++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 310a90823..39670e3b0 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -141,14 +141,13 @@ def build( yield from execute_cmd(args, True) - def inspect_image(self, image): """ Return image configuration if it exists, otherwise None """ - proc = subprocess.run([ - "docker", "image", "inspect", image - ], capture_output=True) + proc = subprocess.run( + ["docker", "image", "inspect", image], capture_output=True + ) if proc.returncode != 0: return None diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index 46ea5e2a5..4960ad214 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -1,6 +1,6 @@ import os -import shutil import secrets +import shutil import socket import subprocess import time @@ -32,7 +32,8 @@ def dind(registry, host_ip): "-e", "DOCKER_TLS_CERTDIR=/opt/certs", "--privileged", - "--mount", f"type=bind,src={cert_dir},dst=/opt/certs", + "--mount", + f"type=bind,src={cert_dir},dst=/opt/certs", "-p", f"{port}:2376", dind_image, From 2d9a3507002abd4adabcfc41448fd6a7a860d2f0 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 11:34:35 -0800 Subject: [PATCH 088/299] Inspect returns a list of dicts --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 39670e3b0..858f793fa 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -152,7 +152,7 @@ def inspect_image(self, image): if proc.returncode != 0: return None - config = json.loads(proc.stdout.decode()) + config = json.loads(proc.stdout.decode())[0] return Image(tags=config["RepoTags"], config=config["Config"]) @contextmanager From af1050f72bcab5c211ecdbb1491298df42425667 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 11:45:26 -0800 Subject: [PATCH 089/299] Re-add docker import for container running --- repo2docker/docker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 858f793fa..d3dde5763 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -10,6 +10,7 @@ import tempfile from contextlib import contextmanager from pathlib import Path +import docker from iso8601 import parse_date from traitlets import Dict, List, Unicode From 5aaf26aa9d73caff9636dde557a6829b94390f37 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:45:45 +0000 Subject: [PATCH 090/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/docker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index d3dde5763..1cb55fd0f 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -10,11 +10,12 @@ import tempfile from contextlib import contextmanager from pathlib import Path -import docker from iso8601 import parse_date from traitlets import Dict, List, Unicode +import docker + from .engine import Container, ContainerEngine, Image from .utils import execute_cmd From 9753570370edd79c3f27fa0bf881e04d5c887bf4 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:06:17 -0800 Subject: [PATCH 091/299] Pass cert_dir removal some of the time --- tests/registry/test_registry.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/registry/test_registry.py b/tests/registry/test_registry.py index 4960ad214..72526af37 100644 --- a/tests/registry/test_registry.py +++ b/tests/registry/test_registry.py @@ -48,7 +48,11 @@ def dind(registry, host_ip): try: yield f"tcp://127.0.0.1:{port}", cert_dir finally: - shutil.rmtree(cert_dir) + try: + shutil.rmtree(cert_dir) + except PermissionError: + # Sometimes this is owned by root in CI. is ok, let's let it go + pass proc.terminate() proc.wait() From c04652e706a6dfa96cf5308860c5dc99f91aa094 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:11:34 -0800 Subject: [PATCH 092/299] Replace mocked find_image tests with real ones --- .github/workflows/test.yml | 2 +- tests/{registry => norun}/Dockerfile | 0 tests/norun/test_find.py | 23 +++++++++++++++++ tests/{registry => norun}/test_registry.py | 2 +- tests/unit/test_app.py | 29 ---------------------- 5 files changed, 25 insertions(+), 31 deletions(-) rename tests/{registry => norun}/Dockerfile (100%) create mode 100644 tests/norun/test_find.py rename tests/{registry => norun}/test_registry.py (99%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 07bfc368f..7e89cab59 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,7 +65,7 @@ jobs: - unit - venv - contentproviders - - registry + - norun # Playwright test - ui include: diff --git a/tests/registry/Dockerfile b/tests/norun/Dockerfile similarity index 100% rename from tests/registry/Dockerfile rename to tests/norun/Dockerfile diff --git a/tests/norun/test_find.py b/tests/norun/test_find.py new file mode 100644 index 000000000..24025b0f0 --- /dev/null +++ b/tests/norun/test_find.py @@ -0,0 +1,23 @@ +import secrets +from pathlib import Path + +from repo2docker.__main__ import make_r2d + +HERE = Path(__file__).parent + + +def test_find_image(): + image_name = f"{secrets.token_hex(8)}:latest" + r2d = make_r2d(["--image", image_name, "--no-run", str(HERE)]) + + r2d.start() + + assert r2d.find_image() + + +def test_dont_find_image(): + image_name = f"{secrets.token_hex(8)}:latest" + r2d = make_r2d(["--image", image_name, "--no-run", str(HERE)]) + + # Just don't actually start the build, so image won't be found + assert not r2d.find_image() \ No newline at end of file diff --git a/tests/registry/test_registry.py b/tests/norun/test_registry.py similarity index 99% rename from tests/registry/test_registry.py rename to tests/norun/test_registry.py index 72526af37..e65b2532d 100644 --- a/tests/registry/test_registry.py +++ b/tests/norun/test_registry.py @@ -116,4 +116,4 @@ def test_registry(registry, dind): r2d.start() proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) - assert proc.returncode == 0 + assert proc.returncode == 0 \ No newline at end of file diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 0ee4d0b3e..02841ba42 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -10,35 +10,6 @@ from repo2docker.app import Repo2Docker from repo2docker.utils import chdir - -def test_find_image(): - images = [{"RepoTags": ["some-org/some-repo:latest"]}] - - with patch("repo2docker.docker.docker.APIClient") as FakeDockerClient: - instance = FakeDockerClient.return_value - instance.images.return_value = images - - r2d = Repo2Docker() - r2d.output_image_spec = "some-org/some-repo" - assert r2d.find_image() - - instance.images.assert_called_with() - - -def test_dont_find_image(): - images = [{"RepoTags": ["some-org/some-image-name:latest"]}] - - with patch("repo2docker.docker.docker.APIClient") as FakeDockerClient: - instance = FakeDockerClient.return_value - instance.images.return_value = images - - r2d = Repo2Docker() - r2d.output_image_spec = "some-org/some-other-image-name" - assert not r2d.find_image() - - instance.images.assert_called_with() - - def test_image_name_remains_unchanged(): # if we specify an image name, it should remain unmodified with TemporaryDirectory() as src: From c9b78be470a65c79d5526c23cafb5d650b705fad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:12:02 +0000 Subject: [PATCH 093/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/norun/test_find.py | 2 +- tests/norun/test_registry.py | 2 +- tests/unit/test_app.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/norun/test_find.py b/tests/norun/test_find.py index 24025b0f0..6d02631db 100644 --- a/tests/norun/test_find.py +++ b/tests/norun/test_find.py @@ -20,4 +20,4 @@ def test_dont_find_image(): r2d = make_r2d(["--image", image_name, "--no-run", str(HERE)]) # Just don't actually start the build, so image won't be found - assert not r2d.find_image() \ No newline at end of file + assert not r2d.find_image() diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index e65b2532d..72526af37 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -116,4 +116,4 @@ def test_registry(registry, dind): r2d.start() proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) - assert proc.returncode == 0 \ No newline at end of file + assert proc.returncode == 0 diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 02841ba42..0b5737166 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -10,6 +10,7 @@ from repo2docker.app import Repo2Docker from repo2docker.utils import chdir + def test_image_name_remains_unchanged(): # if we specify an image name, it should remain unmodified with TemporaryDirectory() as src: From 0bc550a49419a7679be0beae0d343a07d8a067cb Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:15:07 -0800 Subject: [PATCH 094/299] Add a .gitignore for any generated tmp certs --- tests/norun/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/norun/.gitignore diff --git a/tests/norun/.gitignore b/tests/norun/.gitignore new file mode 100644 index 000000000..6cbb595e8 --- /dev/null +++ b/tests/norun/.gitignore @@ -0,0 +1 @@ +tmp-certs-* From b854c6c30d32c238ce55f660fa4801c3825d6dbc Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:15:57 -0800 Subject: [PATCH 095/299] Document why we put certs in current dir --- tests/norun/test_registry.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 72526af37..45bd7b9e5 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -19,7 +19,9 @@ def dind(registry, host_ip): port = get_free_port() - # Generate CA certs here so we can securely connect to the docker daemon + # docker daemon will generate certs here, that we can then use to connect to it. + # put it in current dir than in /tmp because on macos, current dir is likely to + # shared with docker VM so it can be mounted, unlike /tmp cert_dir = HERE / f"tmp-certs-{secrets.token_hex(8)}" cert_dir.mkdir() From 3e458e3299cfc6cfe24d696f0368802e51768a5e Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:23:01 -0800 Subject: [PATCH 096/299] Remove a couple more tests --- tests/unit/test_app.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 0b5737166..04ec9086d 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -1,9 +1,7 @@ -import errno from tempfile import TemporaryDirectory from unittest.mock import patch import escapism -import pytest import docker from repo2docker.__main__ import make_r2d @@ -76,25 +74,3 @@ def test_run_kwargs(repo_with_content): args, kwargs = containers.run.call_args assert "somekey" in kwargs assert kwargs["somekey"] == "somevalue" - - -def test_dryrun_works_without_docker(tmpdir, capsys): - with chdir(tmpdir): - with patch.object(docker, "APIClient") as client: - client.side_effect = docker.errors.DockerException("Error: no Docker") - app = Repo2Docker(dry_run=True) - app.build() - captured = capsys.readouterr() - assert "Error: no Docker" not in captured.err - - -def test_error_log_without_docker(tmpdir, capsys): - with chdir(tmpdir): - with patch.object(docker, "APIClient") as client: - client.side_effect = docker.errors.DockerException("Error: no Docker") - app = Repo2Docker() - - with pytest.raises(SystemExit): - app.build() - captured = capsys.readouterr() - assert "Error: no Docker" in captured.err From 1bd3d276f37de3e5a750ac1938cdbe32f6c9a44c Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:29:09 -0800 Subject: [PATCH 097/299] Restore env vars after test --- tests/norun/test_registry.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 45bd7b9e5..7dcd43e35 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -112,10 +112,17 @@ def test_registry(registry, dind): r2d = make_r2d(["--image", image_name, "--push", "--no-run", str(HERE)]) docker_host, cert_dir = dind - os.environ["DOCKER_HOST"] = docker_host - os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") - os.environ["DOCKER_TLS_VERIFY"] = "1" - r2d.start() - proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) - assert proc.returncode == 0 + old_environ = os.environ.copy() + + try: + os.environ["DOCKER_HOST"] = docker_host + os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") + os.environ["DOCKER_TLS_VERIFY"] = "1" + r2d.start() + + proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) + assert proc.returncode == 0 + finally: + os.environ.clear() + os.environ.update(old_environ) \ No newline at end of file From c29423606336c6c7b4f94379c02fdbf07ef081d2 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:29:15 -0800 Subject: [PATCH 098/299] Remove some more tests --- tests/unit/test_argumentvalidation.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/tests/unit/test_argumentvalidation.py b/tests/unit/test_argumentvalidation.py index 78b964649..466a7d7d3 100644 --- a/tests/unit/test_argumentvalidation.py +++ b/tests/unit/test_argumentvalidation.py @@ -212,33 +212,6 @@ def test_invalid_container_port_protocol_mapping_fail(temp_cwd): assert not validate_arguments(builddir, args_list, "Port specification") -def test_docker_handle_fail(temp_cwd): - """ - Test to check if r2d fails with minimal error message on not being able to connect to docker daemon - """ - args_list = [] - - assert not validate_arguments( - builddir, - args_list, - "Check if docker is running on the host.", - disable_dockerd=True, - ) - - -def test_docker_handle_debug_fail(temp_cwd): - """ - Test to check if r2d fails with helpful error message on not being able to connect to docker daemon and debug enabled - """ - args_list = ["--debug"] - - assert not validate_arguments( - builddir, - args_list, - "Check if docker is running on the host.", - disable_dockerd=True, - ) - def test_docker_no_build_success(temp_cwd): """ From aa948e08aff3c2515f6381e035a92f4ed17b7055 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:44:18 -0800 Subject: [PATCH 099/299] Test login to registry as well --- dev-requirements.txt | 1 + tests/norun/test_registry.py | 82 +++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 22ba622e3..1157007eb 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -5,3 +5,4 @@ pytest-cov pytest>=7 pyyaml requests_mock +bcrypt \ No newline at end of file diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 7dcd43e35..92aa1f6e6 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -1,9 +1,13 @@ +import json import os import secrets import shutil import socket import subprocess +from tempfile import TemporaryDirectory +from base64 import b64encode import time +import bcrypt from pathlib import Path import pytest @@ -16,8 +20,9 @@ @pytest.fixture(scope="session") -def dind(registry, host_ip): +def dind(registry): port = get_free_port() + registry_host, _, _ = registry # docker daemon will generate certs here, that we can then use to connect to it. # put it in current dir than in /tmp because on macos, current dir is likely to @@ -42,7 +47,7 @@ def dind(registry, host_ip): "--host", "0.0.0.0:2376", "--insecure-registry", - registry, + registry_host, ] proc = subprocess.Popen(cmd) time.sleep(5) @@ -80,11 +85,27 @@ def host_ip(): @pytest.fixture(scope="session") def registry(host_ip): port = get_free_port() + username = "user" + password = secrets.token_hex(16) + bcrypted_pw = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt(rounds=12)).decode("utf-8") + + # We put our password here, and mount it into the container. + # put it in current dir than in /tmp because on macos, current dir is likely to + # shared with docker VM so it can be mounted, unlike /tmp + htpasswd_dir = HERE / f"tmp-certs-{secrets.token_hex(8)}" + htpasswd_dir.mkdir() + (htpasswd_dir / "htpasswd.conf").write_text(f"{username}:{bcrypted_pw}") + # Explicitly pull the image first so it runs on time registry_image = "registry:3.0.0-rc.3" subprocess.check_call(["docker", "pull", registry_image]) - cmd = ["docker", "run", "--rm", "-p", f"{port}:5000", registry_image] + cmd = ["docker", "run", "--rm", + "-e", "REGISTRY_AUTH=htpasswd", + "-e", "REGISTRY_AUTH_HTPASSWD_REALM=basic", + "-e", "REGISTRY_AUTH_HTPASSWD_PATH=/opt/htpasswd/htpasswd.conf", + "--mount", f"type=bind,src={htpasswd_dir},dst=/opt/htpasswd", + "-p", f"{port}:5000", registry_image] proc = subprocess.Popen(cmd) health_url = f"http://{host_ip}:{port}/v2" # Wait for the registry to actually come up @@ -101,14 +122,18 @@ def registry(host_ip): raise TimeoutError("Test registry did not come up in time") try: - yield f"{host_ip}:{port}" + yield f"{host_ip}:{port}", username, password finally: proc.terminate() proc.wait() -def test_registry(registry, dind): - image_name = f"{registry}/{secrets.token_hex(8)}:latest" +def test_registry_explicit_creds(registry, dind): + """ + Test that we can push to registry when given explicit credentials + """ + registry_host, username, password = registry + image_name = f"{registry_host}/{secrets.token_hex(8)}:latest" r2d = make_r2d(["--image", image_name, "--push", "--no-run", str(HERE)]) docker_host, cert_dir = dind @@ -119,10 +144,55 @@ def test_registry(registry, dind): os.environ["DOCKER_HOST"] = docker_host os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") os.environ["DOCKER_TLS_VERIFY"] = "1" + os.environ["CONTAINER_ENGINE_REGISTRY_CREDENTIALS"] = json.dumps({ + "registry": f"http://{registry_host}", + "username": username, + "password": password + }) r2d.start() + proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) assert proc.returncode == 0 + + # Validate that we didn't leak our registry creds into existing docker config + docker_config_path = Path(os.environ.get("DOCKER_CONFIG", "~/.docker/config.json")).expanduser() + if docker_config_path.exists(): + # Just check that our randomly generated password is not in this file + # Can this cause a conflict? Sure, if there's a different randomly generated password in here + # that matches our own randomly generated password. But if you're that unlucky, take cover from the asteroid. + assert password not in docker_config_path.read_text() + finally: + os.environ.clear() + os.environ.update(old_environ) + + +def test_registry_no_explicit_creds(registry, dind): + """ + Test that we can push to registry *without* explicit credentials but reading from a DOCKER_CONFIG + """ + registry_host, username, password = registry + image_name = f"{registry_host}/{secrets.token_hex(8)}:latest" + r2d = make_r2d(["--image", image_name, "--push", "--no-run", str(HERE)]) + + docker_host, cert_dir = dind + + old_environ = os.environ.copy() + + try: + os.environ["DOCKER_HOST"] = docker_host + os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") + os.environ["DOCKER_TLS_VERIFY"] = "1" + with TemporaryDirectory() as d: + (Path(d) / "config.json").write_text(json.dumps( + ({"auths":{f"http://{registry_host}":{"auth":b64encode(f"{username}:{password}".encode()).decode()}}}) + )) + os.environ["DOCKER_CONFIG"] = d + r2d.start() + + + proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) + assert proc.returncode == 0 finally: os.environ.clear() os.environ.update(old_environ) \ No newline at end of file From ad29ffd8e665eaae23eeffca8e329769594b72a2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:44:59 +0000 Subject: [PATCH 100/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/norun/test_registry.py | 76 ++++++++++++++++++--------- tests/unit/test_argumentvalidation.py | 1 - 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 92aa1f6e6..98a1d36c2 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -4,12 +4,12 @@ import shutil import socket import subprocess -from tempfile import TemporaryDirectory -from base64 import b64encode import time -import bcrypt +from base64 import b64encode from pathlib import Path +from tempfile import TemporaryDirectory +import bcrypt import pytest import requests @@ -87,7 +87,9 @@ def registry(host_ip): port = get_free_port() username = "user" password = secrets.token_hex(16) - bcrypted_pw = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt(rounds=12)).decode("utf-8") + bcrypted_pw = bcrypt.hashpw( + password.encode("utf-8"), bcrypt.gensalt(rounds=12) + ).decode("utf-8") # We put our password here, and mount it into the container. # put it in current dir than in /tmp because on macos, current dir is likely to @@ -100,12 +102,22 @@ def registry(host_ip): registry_image = "registry:3.0.0-rc.3" subprocess.check_call(["docker", "pull", registry_image]) - cmd = ["docker", "run", "--rm", - "-e", "REGISTRY_AUTH=htpasswd", - "-e", "REGISTRY_AUTH_HTPASSWD_REALM=basic", - "-e", "REGISTRY_AUTH_HTPASSWD_PATH=/opt/htpasswd/htpasswd.conf", - "--mount", f"type=bind,src={htpasswd_dir},dst=/opt/htpasswd", - "-p", f"{port}:5000", registry_image] + cmd = [ + "docker", + "run", + "--rm", + "-e", + "REGISTRY_AUTH=htpasswd", + "-e", + "REGISTRY_AUTH_HTPASSWD_REALM=basic", + "-e", + "REGISTRY_AUTH_HTPASSWD_PATH=/opt/htpasswd/htpasswd.conf", + "--mount", + f"type=bind,src={htpasswd_dir},dst=/opt/htpasswd", + "-p", + f"{port}:5000", + registry_image, + ] proc = subprocess.Popen(cmd) health_url = f"http://{host_ip}:{port}/v2" # Wait for the registry to actually come up @@ -144,19 +156,24 @@ def test_registry_explicit_creds(registry, dind): os.environ["DOCKER_HOST"] = docker_host os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") os.environ["DOCKER_TLS_VERIFY"] = "1" - os.environ["CONTAINER_ENGINE_REGISTRY_CREDENTIALS"] = json.dumps({ - "registry": f"http://{registry_host}", - "username": username, - "password": password - }) + os.environ["CONTAINER_ENGINE_REGISTRY_CREDENTIALS"] = json.dumps( + { + "registry": f"http://{registry_host}", + "username": username, + "password": password, + } + ) r2d.start() - - proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) + proc = subprocess.run( + ["docker", "manifest", "inspect", "--insecure", image_name] + ) assert proc.returncode == 0 # Validate that we didn't leak our registry creds into existing docker config - docker_config_path = Path(os.environ.get("DOCKER_CONFIG", "~/.docker/config.json")).expanduser() + docker_config_path = Path( + os.environ.get("DOCKER_CONFIG", "~/.docker/config.json") + ).expanduser() if docker_config_path.exists(): # Just check that our randomly generated password is not in this file # Can this cause a conflict? Sure, if there's a different randomly generated password in here @@ -184,15 +201,26 @@ def test_registry_no_explicit_creds(registry, dind): os.environ["DOCKER_CERT_PATH"] = str(cert_dir / "client") os.environ["DOCKER_TLS_VERIFY"] = "1" with TemporaryDirectory() as d: - (Path(d) / "config.json").write_text(json.dumps( - ({"auths":{f"http://{registry_host}":{"auth":b64encode(f"{username}:{password}".encode()).decode()}}}) - )) + (Path(d) / "config.json").write_text( + json.dumps( + { + "auths": { + f"http://{registry_host}": { + "auth": b64encode( + f"{username}:{password}".encode() + ).decode() + } + } + } + ) + ) os.environ["DOCKER_CONFIG"] = d r2d.start() - - proc = subprocess.run(["docker", "manifest", "inspect", "--insecure", image_name]) + proc = subprocess.run( + ["docker", "manifest", "inspect", "--insecure", image_name] + ) assert proc.returncode == 0 finally: os.environ.clear() - os.environ.update(old_environ) \ No newline at end of file + os.environ.update(old_environ) diff --git a/tests/unit/test_argumentvalidation.py b/tests/unit/test_argumentvalidation.py index 466a7d7d3..1439a6533 100644 --- a/tests/unit/test_argumentvalidation.py +++ b/tests/unit/test_argumentvalidation.py @@ -212,7 +212,6 @@ def test_invalid_container_port_protocol_mapping_fail(temp_cwd): assert not validate_arguments(builddir, args_list, "Port specification") - def test_docker_no_build_success(temp_cwd): """ Test to check if r2d succeeds with --no-build argument with not being able to connect to docker daemon From 2fece29210207b5fda055b5e3d8f91efb9c4c947 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 13:53:51 -0800 Subject: [PATCH 101/299] Add validation for registry_credentials --- repo2docker/engine.py | 11 ++++++++++- tests/unit/test_engine.py | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_engine.py diff --git a/repo2docker/engine.py b/repo2docker/engine.py index a6932bd8e..1117ed9da 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -6,7 +6,7 @@ import os from abc import ABC, abstractmethod -from traitlets import Dict, default +from traitlets import Dict, TraitError, default, validate from traitlets.config import LoggingConfigurable # Based on https://docker-py.readthedocs.io/en/4.2.0/containers.html @@ -176,6 +176,15 @@ def _registry_credentials_default(self): raise return {} + @validate("registry_credentials") + def _registry_credentials_validate(self, proposal): + """ + Validate form of registry credentials + """ + new = proposal["value"] + if len({"registry", "username", "password"} & new.keys()) != 3: + raise TraitError("registry_credentials must have keys 'registry', 'username' and 'password'") + string_output = True """ Whether progress events should be strings or an object. diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py new file mode 100644 index 000000000..74e9a7477 --- /dev/null +++ b/tests/unit/test_engine.py @@ -0,0 +1,13 @@ +import pytest +from traitlets import TraitError +from repo2docker.engine import ContainerEngine + + +def test_registry_credentials(): + e = ContainerEngine(parent=None) + + # This should be fine + e.registry_credentials = {"registry": "something", "username": "something", "password": "something"} + + with pytest.raises(TraitError): + e.registry_credentials = {"hi": "bye"} From 0f680569566cfd1153c67232e06ec5797ed15919 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:01:30 -0800 Subject: [PATCH 102/299] Intentionally set auth when checking if image exists in registry --- tests/norun/test_registry.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 98a1d36c2..2c6ef3445 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -165,10 +165,29 @@ def test_registry_explicit_creds(registry, dind): ) r2d.start() - proc = subprocess.run( - ["docker", "manifest", "inspect", "--insecure", image_name] - ) - assert proc.returncode == 0 + # CONTAINER_ENGINE_REGISTRY_CREDENTIALS unfortunately doesn't propagate to docker manifest, so + # let's explicitly set up a docker_config here so we can check if the image exists + with TemporaryDirectory() as d: + (Path(d) / "config.json").write_text( + json.dumps( + { + "auths": { + f"http://{registry_host}": { + "auth": b64encode( + f"{username}:{password}".encode() + ).decode() + } + } + } + ) + ) + env = os.environ.copy() + env["DOCKER_CONFIG"] = d + proc = subprocess.run( + ["docker", "manifest", "inspect", "--insecure", image_name], + env=env + ) + assert proc.returncode == 0 # Validate that we didn't leak our registry creds into existing docker config docker_config_path = Path( From e066ca04a151a2a4322ac4fc260ca34d8d47d864 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:02:01 +0000 Subject: [PATCH 103/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/engine.py | 4 +++- tests/norun/test_registry.py | 3 +-- tests/unit/test_engine.py | 7 ++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/repo2docker/engine.py b/repo2docker/engine.py index 1117ed9da..d081a33c7 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -183,7 +183,9 @@ def _registry_credentials_validate(self, proposal): """ new = proposal["value"] if len({"registry", "username", "password"} & new.keys()) != 3: - raise TraitError("registry_credentials must have keys 'registry', 'username' and 'password'") + raise TraitError( + "registry_credentials must have keys 'registry', 'username' and 'password'" + ) string_output = True """ diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 2c6ef3445..2b332a8e0 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -184,8 +184,7 @@ def test_registry_explicit_creds(registry, dind): env = os.environ.copy() env["DOCKER_CONFIG"] = d proc = subprocess.run( - ["docker", "manifest", "inspect", "--insecure", image_name], - env=env + ["docker", "manifest", "inspect", "--insecure", image_name], env=env ) assert proc.returncode == 0 diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 74e9a7477..1ccf1dc28 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -1,5 +1,6 @@ import pytest from traitlets import TraitError + from repo2docker.engine import ContainerEngine @@ -7,7 +8,11 @@ def test_registry_credentials(): e = ContainerEngine(parent=None) # This should be fine - e.registry_credentials = {"registry": "something", "username": "something", "password": "something"} + e.registry_credentials = { + "registry": "something", + "username": "something", + "password": "something", + } with pytest.raises(TraitError): e.registry_credentials = {"hi": "bye"} From 07e97ee5ceff625236f8ad5e0b4b2ca3e89be9cc Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:16:28 -0800 Subject: [PATCH 104/299] Turn push and load into params for the build arg --- repo2docker/app.py | 60 +++++-------------------------------------- repo2docker/docker.py | 45 ++++++++++++++++++-------------- repo2docker/engine.py | 6 +++++ 3 files changed, 39 insertions(+), 72 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 54482b7ad..816fc0bf1 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -572,55 +572,6 @@ def initialize(self, *args, **kwargs): if self.volumes and not self.run: raise ValueError("Cannot mount volumes if container is not run") - def push_image(self): - """Push docker image to registry""" - client = self.get_engine() - # Build a progress setup for each layer, and only emit per-layer - # info every 1.5s - progress_layers = {} - layers = {} - last_emit_time = time.time() - for chunk in client.push(self.output_image_spec): - if client.string_output: - self.log.info(chunk, extra=dict(phase=R2dState.PUSHING)) - continue - # else this is Docker output - - # each chunk can be one or more lines of json events - # split lines here in case multiple are delivered at once - for line in chunk.splitlines(): - line = line.decode("utf-8", errors="replace") - try: - progress = json.loads(line) - except Exception as e: - self.log.warning("Not a JSON progress line: %r", line) - continue - if "error" in progress: - self.log.error(progress["error"], extra=dict(phase=R2dState.FAILED)) - raise ImageLoadError(progress["error"]) - if "id" not in progress: - continue - # deprecated truncated-progress data - if "progressDetail" in progress and progress["progressDetail"]: - progress_layers[progress["id"]] = progress["progressDetail"] - else: - progress_layers[progress["id"]] = progress["status"] - # include full progress data for each layer in 'layers' data - layers[progress["id"]] = progress - if time.time() - last_emit_time > 1.5: - self.log.info( - "Pushing image\n", - extra=dict( - progress=progress_layers, - layers=layers, - phase=R2dState.PUSHING, - ), - ) - last_emit_time = time.time() - self.log.info( - f"Successfully pushed {self.output_image_spec}", - extra=dict(phase=R2dState.PUSHING), - ) def run_image(self): """Run docker container from built image @@ -847,6 +798,12 @@ def build(self): extra=dict(phase=R2dState.BUILDING), ) + extra_build_kwargs = self.extra_build_kwargs.copy() + # Set "push" and "load" parameters in a backwards compat way, without + # having to change the signature of every buildpack + extra_build_kwargs["push"] = self.push + extra_build_kwargs["load"] = self.run + for l in picked_buildpack.build( docker_client, self.output_image_spec, @@ -854,7 +811,7 @@ def build(self): self.build_memory_limit, build_args, self.cache_from, - self.extra_build_kwargs, + extra_build_kwargs, platform=self.platform, ): if docker_client.string_output: @@ -886,8 +843,5 @@ def build(self): def start(self): self.build() - if self.push: - self.push_image() - if self.run: self.run_image() diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 1cb55fd0f..420014487 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,13 +2,14 @@ Docker container engine for repo2docker """ +from argparse import ArgumentError import json import os import shutil import subprocess import tarfile import tempfile -from contextlib import contextmanager +from contextlib import ExitStack, contextmanager from pathlib import Path from iso8601 import parse_date @@ -89,6 +90,8 @@ class DockerEngine(ContainerEngine): def build( self, + push=False, + load=False, *, buildargs=None, cache_from=None, @@ -104,7 +107,15 @@ def build( ): if not shutil.which("docker"): raise RuntimeError("The docker commandline client must be installed") - args = ["docker", "buildx", "build", "--progress", "plain", "--load"] + args = ["docker", "buildx", "build", "--progress", "plain"] + if load: + if push: + raise ValueError("Setting push=True and load=True is currently not supported") + args.append("--load") + + if push: + args.append("--push") + if buildargs: for k, v in buildargs.items(): args += ["--build-arg", f"{k}={v}"] @@ -129,19 +140,22 @@ def build( # place extra args right *before* the path args += self.extra_buildx_build_args - if fileobj: - with tempfile.TemporaryDirectory() as d: - tarf = tarfile.open(fileobj=fileobj) - tarf.extractall(d) + with ExitStack() as stack: + if self.registry_credentials: + stack.enter_context(self.docker_login(**self.registry_credentials)) + if fileobj: + with tempfile.TemporaryDirectory() as d: + tarf = tarfile.open(fileobj=fileobj) + tarf.extractall(d) - args += [d] + args += [d] - yield from execute_cmd(args, True) - else: - # Assume 'path' is passed in - args += [path] + yield from execute_cmd(args, True) + else: + # Assume 'path' is passed in + args += [path] - yield from execute_cmd(args, True) + yield from execute_cmd(args, True) def inspect_image(self, image): """ @@ -194,13 +208,6 @@ def docker_login(self, username, password, registry): else: del os.environ["DOCKER_CONFIG"] - def push(self, image_spec): - if self.registry_credentials: - with self.docker_login(**self.registry_credentials): - yield from execute_cmd(["docker", "push", image_spec], capture=True) - else: - yield from execute_cmd(["docker", "push", image_spec], capture=True) - def run( self, image_spec, diff --git a/repo2docker/engine.py b/repo2docker/engine.py index d081a33c7..28580ebd8 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -212,6 +212,8 @@ def __init__(self, *, parent): def build( self, + push=False, + load=False, *, buildargs={}, cache_from=[], @@ -230,6 +232,10 @@ def build( Parameters ---------- + push: bool + Push the resulting image to a registry + load: bool + Load the resulting image into the container store ready to be run buildargs : dict Dictionary of build arguments cache_from : list[str] From 2bd84781595da2edcf0c10861851b7f60ee8c578 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:17:09 +0000 Subject: [PATCH 105/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/app.py | 1 - repo2docker/docker.py | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 816fc0bf1..b9684c118 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -572,7 +572,6 @@ def initialize(self, *args, **kwargs): if self.volumes and not self.run: raise ValueError("Cannot mount volumes if container is not run") - def run_image(self): """Run docker container from built image diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 420014487..76af6d040 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,13 +2,13 @@ Docker container engine for repo2docker """ -from argparse import ArgumentError import json import os import shutil import subprocess import tarfile import tempfile +from argparse import ArgumentError from contextlib import ExitStack, contextmanager from pathlib import Path @@ -110,7 +110,9 @@ def build( args = ["docker", "buildx", "build", "--progress", "plain"] if load: if push: - raise ValueError("Setting push=True and load=True is currently not supported") + raise ValueError( + "Setting push=True and load=True is currently not supported" + ) args.append("--load") if push: From 081c3c48cfc5c457527fc440fc80bd969e568e66 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:19:06 -0800 Subject: [PATCH 106/299] Make build and push into explicit only args --- repo2docker/docker.py | 2 +- repo2docker/engine.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 76af6d040..483e77701 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -90,9 +90,9 @@ class DockerEngine(ContainerEngine): def build( self, + *, push=False, load=False, - *, buildargs=None, cache_from=None, container_limits=None, diff --git a/repo2docker/engine.py b/repo2docker/engine.py index 28580ebd8..303b38e20 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -212,9 +212,9 @@ def __init__(self, *, parent): def build( self, + *, push=False, load=False, - *, buildargs={}, cache_from=[], container_limits={}, From 56cf063636c589475f3f19e39df5a6b9619f3c0f Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:28:21 -0800 Subject: [PATCH 107/299] Don't pass --no-run to find tests --- tests/norun/test_find.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/norun/test_find.py b/tests/norun/test_find.py index 6d02631db..4b8d2bd18 100644 --- a/tests/norun/test_find.py +++ b/tests/norun/test_find.py @@ -8,16 +8,16 @@ def test_find_image(): image_name = f"{secrets.token_hex(8)}:latest" - r2d = make_r2d(["--image", image_name, "--no-run", str(HERE)]) + r2d = make_r2d(["--image", image_name, str(HERE)]) - r2d.start() + r2d.build() assert r2d.find_image() def test_dont_find_image(): image_name = f"{secrets.token_hex(8)}:latest" - r2d = make_r2d(["--image", image_name, "--no-run", str(HERE)]) + r2d = make_r2d(["--image", image_name, str(HERE)]) # Just don't actually start the build, so image won't be found assert not r2d.find_image() From ce35f47f1e74467c1c47083be1f4feaf7676a77d Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:31:20 -0800 Subject: [PATCH 108/299] Actually remove push method --- repo2docker/engine.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/repo2docker/engine.py b/repo2docker/engine.py index 303b38e20..310bddbbf 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -288,27 +288,6 @@ def inspect_image(self, image): """ raise NotImplementedError("inspect_image not implemented") - def push(self, image_spec): - """ - Push image to a registry - - If the registry_credentials traitlets is set it should be used to - authenticate with the registry before pushing. - - Parameters - ---------- - image_spec : str - The repository spec to push to - - Returns - ------- - A generator of strings. If an error occurs an exception must be thrown. - - If `string_output=True` this should instead be whatever Docker returns: - https://github.com/jupyter/repo2docker/blob/0.11.0/repo2docker/app.py#L469-L495 - """ - raise NotImplementedError("push not implemented") - # Note this is different from the Docker client which has Client.containers.run def run( self, From d3facba5fbfa7392660edd5fc3e339113ac72e7f Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 14:32:05 -0800 Subject: [PATCH 109/299] Fix documentation for `--push` --- docs/source/architecture.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/source/architecture.md b/docs/source/architecture.md index c145010ca..2d14daf36 100644 --- a/docs/source/architecture.md +++ b/docs/source/architecture.md @@ -98,10 +98,8 @@ At the end of the assemble step, the docker image is ready to be used in various ### Push -Optionally, repo2docker can **push** a built image to a [docker registry](https://docs.docker.com/registry/). -This is done as a convenience only (since you can do the same with a `docker push` after using repo2docker -only to build), and implemented in `Repo2Docker.push` method. It is only activated if using the -`--push` commandline flag. +Optionally, repo2docker can **push** a built image to a [docker registry](https://docs.docker.com/registry/), +if you specify the `--push` flag. ### Run From 342eea96a8ed5f7778d34a07ce0a3896aa87cfd6 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Fri, 28 Feb 2025 15:07:43 -0800 Subject: [PATCH 110/299] Move login command inside try so we clear env correctly --- repo2docker/docker.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 483e77701..e6d3958c6 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -190,19 +190,19 @@ def docker_login(self, username, password, registry): shutil.copy2(dc_path, new_dc_path) os.environ["DOCKER_CONFIG"] = d - proc = subprocess.run( - [ - "docker", - "login", - "--username", - username, - "--password-stdin", - registry, - ], - input=password.encode(), - check=True, - ) try: + subprocess.run( + [ + "docker", + "login", + "--username", + username, + "--password-stdin", + registry, + ], + input=password.encode(), + check=True, + ) yield finally: if old_dc_path: From 30b2a71c276cf0d43d68c002acff8450a8d6f5a1 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:52:55 +1300 Subject: [PATCH 111/299] Bump mamba from 2.0.5 to 2.0.8 Bumps [mamba](https://github.com/mamba-org/mamba) from 2.0.5 to 2.0.8. - [Release notes](https://github.com/mamba-org/mamba/releases) - [Commits](https://github.com/mamba-org/mamba/compare/micromamba-2.0.5...2.0.8) --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- tests/conda/py35-binder-dir/verify | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index a26eff596..fb2c4c164 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,7 +5,7 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION="2.0.5" +export MAMBA_VERSION="2.0.8" export CONDA_VERSION=24.11.0 URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index 5b01d9a92..4689057f2 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -16,10 +16,10 @@ v = out.split()[1] assert v[:3] == "3.5", out out = sh(["micromamba", "--version"]) -assert out == "2.0.5", out +assert out == "2.0.8", out out = sh(["mamba", "--version"]) -assert out == "2.0.5", out +assert out == "2.0.8", out sh([kernel_python, "-c", "import numpy"]) From d4592c2427a93e3556bbd3b70fd858bc36694551 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:07:49 +1200 Subject: [PATCH 112/299] Bump mamba from 2.0.8 to 2.1.0 Bumps [mamba](https://github.com/mamba-org/mamba) from 2.0.8 to 2.1.0. - [Release notes](https://github.com/mamba-org/mamba/releases) - [Commits](https://github.com/mamba-org/mamba/compare/2.0.8...2.1.0) --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- tests/conda/py35-binder-dir/verify | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index fb2c4c164..65d07a627 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,7 +5,7 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION="2.0.8" +export MAMBA_VERSION="2.1.0" export CONDA_VERSION=24.11.0 URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index 4689057f2..11a1b3d7f 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -16,10 +16,10 @@ v = out.split()[1] assert v[:3] == "3.5", out out = sh(["micromamba", "--version"]) -assert out == "2.0.8", out +assert out == "2.1.0", out out = sh(["mamba", "--version"]) -assert out == "2.0.8", out +assert out == "2.1.0", out sh([kernel_python, "-c", "import numpy"]) From dae67cc73dced35fc9dd15f062b03e0d043d963c Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Sun, 11 May 2025 09:45:23 -0600 Subject: [PATCH 113/299] Disable bash trace output in conda activation script Remove `-x` to be less spammy. Retain `-e` to exit on errors. --- repo2docker/buildpacks/conda/activate-conda.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/conda/activate-conda.sh b/repo2docker/buildpacks/conda/activate-conda.sh index d3732c8fe..9676234e1 100755 --- a/repo2docker/buildpacks/conda/activate-conda.sh +++ b/repo2docker/buildpacks/conda/activate-conda.sh @@ -1,4 +1,4 @@ -set -ex +set -e # Setup conda CONDA_PROFILE="${CONDA_DIR}/etc/profile.d/conda.sh" @@ -35,4 +35,4 @@ else mamba activate ${NB_PYTHON_PREFIX} fi -set +ex +set +e From 8a67dab2552e213e8888dd5ee84f15ed1e60c154 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:17:40 +0000 Subject: [PATCH 114/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.19.0 → v3.20.0](https://github.com/asottile/pyupgrade/compare/v3.19.0...v3.20.0) - [github.com/psf/black: 24.10.0 → 25.1.0](https://github.com/psf/black/compare/24.10.0...25.1.0) - [github.com/pycqa/isort: 5.13.2 → 6.0.1](https://github.com/pycqa/isort/compare/5.13.2...6.0.1) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 426fff94a..b87234df3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: # Autoformat: Python code, syntax patterns are modernized - repo: https://github.com/asottile/pyupgrade - rev: v3.19.0 + rev: v3.20.0 hooks: - id: pyupgrade args: @@ -23,7 +23,7 @@ repos: # Autoformat: Python code - repo: https://github.com/psf/black - rev: 24.10.0 + rev: 25.1.0 hooks: - id: black args: @@ -35,7 +35,7 @@ repos: # Autoformat: Python code - repo: https://github.com/pycqa/isort - rev: 5.13.2 + rev: 6.0.1 hooks: - id: isort args: From 0ece76455493e66471872f80d6b1e343e042594e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:19:56 +0000 Subject: [PATCH 115/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/buildpacks/docker.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/docker.py b/repo2docker/buildpacks/docker.py index b0e58778c..b162cb1f1 100644 --- a/repo2docker/buildpacks/docker.py +++ b/repo2docker/buildpacks/docker.py @@ -1,5 +1,4 @@ -"""Generates a variety of Dockerfiles based on an input matrix -""" +"""Generates a variety of Dockerfiles based on an input matrix""" import os From cab6fce923f1c530291aa52320ac73e1bfab1fb6 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Sun, 22 Jun 2025 14:22:51 +0100 Subject: [PATCH 116/299] Move runtime.txt handling into base class This will allow it to be used for Python (and other languages) in future --- repo2docker/buildpacks/base.py | 39 ++++++++++++++++++++++ repo2docker/buildpacks/pipfile/__init__.py | 9 ++--- repo2docker/buildpacks/python/__init__.py | 24 ++++--------- repo2docker/buildpacks/r.py | 37 ++++++++++---------- tests/unit/test_buildpack.py | 29 +++++++++++++++- 5 files changed, 95 insertions(+), 43 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index f433029ea..4a6a94170 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -1,3 +1,4 @@ +import datetime import hashlib import io import logging @@ -750,3 +751,41 @@ def get_start_script(self): # the only path evaluated at container start time rather than build time return os.path.join("${REPO_DIR}", start) return None + + @property + def runtime_info(self): + """ + Return parsed contents of runtime.txt + + Returns (runtime, version, date), tuple components may be None. + Returns (None, None, None) if runtime.txt not found. + """ + if hasattr(self, "_runtime"): + return self._runtime + + self._runtime = (None, None, None) + + runtime_path = self.binder_path("runtime.txt") + try: + with open(runtime_path) as f: + runtime_txt = f.read().strip() + except FileNotFoundError: + return self._runtime + + runtime = None + version = None + date = None + + parts = runtime_txt.split("-", 2) + if len(parts) > 0 and parts[0]: + runtime = parts[0] + if len(parts) > 1 and parts[1]: + version = parts[1] + if len(parts) > 2 and parts[2]: + date = parts[2] + if not re.match(r"\d\d\d\d-\d\d-\d\d", date): + raise ValueError(f"Invalid date, expected YYYY-MM-DD: {date}") + date = datetime.datetime.fromisoformat(date).date() + + self._runtime = (runtime, version, date) + return self._runtime diff --git a/repo2docker/buildpacks/pipfile/__init__.py b/repo2docker/buildpacks/pipfile/__init__.py index 2e24d6142..c816e88e2 100644 --- a/repo2docker/buildpacks/pipfile/__init__.py +++ b/repo2docker/buildpacks/pipfile/__init__.py @@ -187,12 +187,9 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Pipfile buildpack.""" # first make sure python is not explicitly unwanted - runtime_txt = self.binder_path("runtime.txt") - if os.path.exists(runtime_txt): - with open(runtime_txt) as f: - runtime = f.read().strip() - if not runtime.startswith("python-"): - return False + runtime = self.runtime_info[0] + if runtime and runtime != "python": + return False pipfile = self.binder_path("Pipfile") pipfile_lock = self.binder_path("Pipfile.lock") diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 1530e347d..3b33fe31d 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -15,14 +15,10 @@ def python_version(self): if hasattr(self, "_python_version"): return self._python_version - try: - with open(self.binder_path("runtime.txt")) as f: - runtime = f.read().strip() - except FileNotFoundError: - runtime = "" - - if not runtime.startswith("python-"): - # not a Python runtime (e.g. R, which subclasses this) + runtime, version, _ = self.runtime_info + + if runtime != "python" or not version: + # Either not specified, or not a Python runtime (e.g. R, which subclasses this) # use the default Python self._python_version = self.major_pythons["3"] self.log.warning( @@ -30,7 +26,7 @@ def python_version(self): ) return self._python_version - py_version_info = runtime.split("-", 1)[1].split(".") + py_version_info = version.split(".") py_version = "" if len(py_version_info) == 1: py_version = self.major_pythons[py_version_info[0]] @@ -138,16 +134,10 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Python buildpack.""" requirements_txt = self.binder_path("requirements.txt") - runtime_txt = self.binder_path("runtime.txt") setup_py = "setup.py" - if os.path.exists(runtime_txt): - with open(runtime_txt) as f: - runtime = f.read().strip() - if runtime.startswith("python-"): - return True - else: - return False + if self.runtime_info[0]: + return self.runtime_info[0] == "python" if not self.binder_dir and os.path.exists(setup_py): return True return os.path.exists(requirements_txt) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 93148a940..447ce84cf 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -1,6 +1,6 @@ import datetime import os -import re +import warnings from functools import lru_cache import requests @@ -49,7 +49,14 @@ class RBuildPack(PythonBuildPack): def runtime(self): """ Return contents of runtime.txt if it exists, '' otherwise + + Deprecated, use `runtime_info` instead. """ + warnings.warn( + "`{self.__class__.__name__}.runtime` is deprecated. Use `runtime_info` instead", + DeprecationWarning, + ) + if not hasattr(self, "_runtime"): runtime_path = self.binder_path("runtime.txt") try: @@ -90,11 +97,11 @@ def r_version(self): r_version = version_map["4.2"] if not hasattr(self, "_r_version"): - parts = self.runtime.split("-") + runtime, version, date = self.runtime_info # If runtime.txt is not set, or if it isn't of the form r----
, # we don't use any of it in determining r version and just use the default - if len(parts) == 5: - r_version = parts[1] + if version and date: + r_version = version # For versions of form x.y, we want to explicitly provide x.y.z - latest patchlevel # available. Users can however explicitly specify the full version to get something specific if r_version in version_map: @@ -116,15 +123,11 @@ def checkpoint_date(self): Returns '' if no date is specified """ if not hasattr(self, "_checkpoint_date"): - match = re.match(r"r-(\d.\d(.\d)?-)?(\d\d\d\d)-(\d\d)-(\d\d)", self.runtime) - if not match: - self._checkpoint_date = False + runtime, version, date = self.runtime_info + if runtime == "r" and date: + self._checkpoint_date = date else: - # turn the last three groups of the match into a date - self._checkpoint_date = datetime.date( - *[int(s) for s in match.groups()[-3:]] - ) - + self._checkpoint_date = False return self._checkpoint_date def detect(self): @@ -142,13 +145,9 @@ def detect(self): description_R = "DESCRIPTION" if not self.binder_dir and os.path.exists(description_R): - if not self.checkpoint_date: - # no R snapshot date set through runtime.txt - # Set it to two days ago from today - self._checkpoint_date = datetime.date.today() - datetime.timedelta( - days=2 - ) - self._runtime = f"r-{str(self._checkpoint_date)}" + # no R snapshot date set through runtime.txt + # Set it to two days ago from today + self._checkpoint_date = datetime.date.today() - datetime.timedelta(days=2) return True @lru_cache diff --git a/tests/unit/test_buildpack.py b/tests/unit/test_buildpack.py index 38fc5c237..224a834b5 100644 --- a/tests/unit/test_buildpack.py +++ b/tests/unit/test_buildpack.py @@ -1,9 +1,14 @@ +from datetime import date from os.path import join as pjoin from tempfile import TemporaryDirectory import pytest -from repo2docker.buildpacks import LegacyBinderDockerBuildPack, PythonBuildPack +from repo2docker.buildpacks import ( + BaseImage, + LegacyBinderDockerBuildPack, + PythonBuildPack, +) from repo2docker.utils import chdir @@ -46,3 +51,25 @@ def test_unsupported_python(tmpdir, python_version, base_image): assert bp.python_version == python_version with pytest.raises(ValueError): bp.render() + + +@pytest.mark.parametrize( + "runtime_txt, expected", + [ + (None, (None, None, None)), + ("", (None, None, None)), + ("abc", ("abc", None, None)), + ("abc-001", ("abc", "001", None)), + ("abc-001-2025-06-22", ("abc", "001", date(2025, 6, 22))), + ("a_b/c-0.0.1-2025-06-22", ("a_b/c", "0.0.1", date(2025, 6, 22))), + ], +) +def test_runtime_txt(tmpdir, runtime_txt, expected, base_image): + tmpdir.chdir() + + if runtime_txt is not None: + with open("runtime.txt", "w") as f: + f.write(runtime_txt) + + base = BaseImage(base_image) + assert base.runtime_info == expected From 7ec064c128d276a8e58f4c3665051645c582dc1f Mon Sep 17 00:00:00 2001 From: Simon Li Date: Sun, 22 Jun 2025 15:42:48 +0100 Subject: [PATCH 117/299] BREAKING: replace `RBuildPack.runtime` with `BuildPack.runtime` --- docs/source/changelog.md | 5 ++++ repo2docker/buildpacks/base.py | 8 +++---- repo2docker/buildpacks/pipfile/__init__.py | 4 ++-- repo2docker/buildpacks/python/__init__.py | 9 +++---- repo2docker/buildpacks/r.py | 28 +++------------------- tests/unit/test_buildpack.py | 4 ++-- 6 files changed, 21 insertions(+), 37 deletions(-) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index 58cef1cff..29fa7c93e 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased breaking changes + +`RBuildPack.runtime` previously returned the contents of `runtime.txt` as a string. +It has been replaced by `BuildPack.runtime` which returns a tuple `(name, version, date)`. + ## 2024.07.0 ([full changelog](https://github.com/jupyterhub/repo2docker/compare/2024.03.0...2024.07.0)) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index 4a6a94170..f3e1f4cd4 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -753,7 +753,7 @@ def get_start_script(self): return None @property - def runtime_info(self): + def runtime(self): """ Return parsed contents of runtime.txt @@ -772,13 +772,13 @@ def runtime_info(self): except FileNotFoundError: return self._runtime - runtime = None + name = None version = None date = None parts = runtime_txt.split("-", 2) if len(parts) > 0 and parts[0]: - runtime = parts[0] + name = parts[0] if len(parts) > 1 and parts[1]: version = parts[1] if len(parts) > 2 and parts[2]: @@ -787,5 +787,5 @@ def runtime_info(self): raise ValueError(f"Invalid date, expected YYYY-MM-DD: {date}") date = datetime.datetime.fromisoformat(date).date() - self._runtime = (runtime, version, date) + self._runtime = (name, version, date) return self._runtime diff --git a/repo2docker/buildpacks/pipfile/__init__.py b/repo2docker/buildpacks/pipfile/__init__.py index c816e88e2..da3f1fd3b 100644 --- a/repo2docker/buildpacks/pipfile/__init__.py +++ b/repo2docker/buildpacks/pipfile/__init__.py @@ -187,8 +187,8 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Pipfile buildpack.""" # first make sure python is not explicitly unwanted - runtime = self.runtime_info[0] - if runtime and runtime != "python": + name = self.runtime[0] + if name and name != "python": return False pipfile = self.binder_path("Pipfile") diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 3b33fe31d..6c9a6d6e0 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -15,9 +15,9 @@ def python_version(self): if hasattr(self, "_python_version"): return self._python_version - runtime, version, _ = self.runtime_info + name, version, _ = self.runtime - if runtime != "python" or not version: + if name != "python" or not version: # Either not specified, or not a Python runtime (e.g. R, which subclasses this) # use the default Python self._python_version = self.major_pythons["3"] @@ -136,8 +136,9 @@ def detect(self): requirements_txt = self.binder_path("requirements.txt") setup_py = "setup.py" - if self.runtime_info[0]: - return self.runtime_info[0] == "python" + name = self.runtime[0] + if name: + return name == "python" if not self.binder_dir and os.path.exists(setup_py): return True return os.path.exists(requirements_txt) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 447ce84cf..91c5183be 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -45,28 +45,6 @@ class RBuildPack(PythonBuildPack): R is installed from https://docs.rstudio.com/resources/install-r/ """ - @property - def runtime(self): - """ - Return contents of runtime.txt if it exists, '' otherwise - - Deprecated, use `runtime_info` instead. - """ - warnings.warn( - "`{self.__class__.__name__}.runtime` is deprecated. Use `runtime_info` instead", - DeprecationWarning, - ) - - if not hasattr(self, "_runtime"): - runtime_path = self.binder_path("runtime.txt") - try: - with open(runtime_path) as f: - self._runtime = f.read().strip() - except FileNotFoundError: - self._runtime = "" - - return self._runtime - @property def r_version(self): """Detect the R version for a given `runtime.txt` @@ -97,7 +75,7 @@ def r_version(self): r_version = version_map["4.2"] if not hasattr(self, "_r_version"): - runtime, version, date = self.runtime_info + _, version, date = self.runtime # If runtime.txt is not set, or if it isn't of the form r----
, # we don't use any of it in determining r version and just use the default if version and date: @@ -123,8 +101,8 @@ def checkpoint_date(self): Returns '' if no date is specified """ if not hasattr(self, "_checkpoint_date"): - runtime, version, date = self.runtime_info - if runtime == "r" and date: + name, version, date = self.runtime + if name == "r" and date: self._checkpoint_date = date else: self._checkpoint_date = False diff --git a/tests/unit/test_buildpack.py b/tests/unit/test_buildpack.py index 224a834b5..23bbc0c6e 100644 --- a/tests/unit/test_buildpack.py +++ b/tests/unit/test_buildpack.py @@ -64,7 +64,7 @@ def test_unsupported_python(tmpdir, python_version, base_image): ("a_b/c-0.0.1-2025-06-22", ("a_b/c", "0.0.1", date(2025, 6, 22))), ], ) -def test_runtime_txt(tmpdir, runtime_txt, expected, base_image): +def test_runtime(tmpdir, runtime_txt, expected, base_image): tmpdir.chdir() if runtime_txt is not None: @@ -72,4 +72,4 @@ def test_runtime_txt(tmpdir, runtime_txt, expected, base_image): f.write(runtime_txt) base = BaseImage(base_image) - assert base.runtime_info == expected + assert base.runtime == expected From 53cc506e8e807b7e55dc4c53454e56e0fdb10d2a Mon Sep 17 00:00:00 2001 From: Simon Li Date: Sun, 22 Jun 2025 18:38:18 +0100 Subject: [PATCH 118/299] runtime.txt: allow name-yyyy-mm-dd (no version) --- repo2docker/buildpacks/base.py | 23 ++++++++++++++++------- tests/unit/test_buildpack.py | 24 ++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index f3e1f4cd4..74bfa3311 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -759,6 +759,11 @@ def runtime(self): Returns (runtime, version, date), tuple components may be None. Returns (None, None, None) if runtime.txt not found. + + Supported formats: + name-version + name-version-yyyy-mm-dd + name-yyyy-mm-dd """ if hasattr(self, "_runtime"): return self._runtime @@ -776,15 +781,19 @@ def runtime(self): version = None date = None - parts = runtime_txt.split("-", 2) - if len(parts) > 0 and parts[0]: - name = parts[0] - if len(parts) > 1 and parts[1]: + parts = runtime_txt.split("-") + if len(parts) not in (2, 4, 5) or any(not (p) for p in parts): + raise ValueError(f"Invalid runtime.txt: {runtime_txt}") + + name = parts[0] + + if len(parts) in (2, 5): version = parts[1] - if len(parts) > 2 and parts[2]: - date = parts[2] + + if len(parts) in (4, 5): + date = "-".join(parts[-3:]) if not re.match(r"\d\d\d\d-\d\d-\d\d", date): - raise ValueError(f"Invalid date, expected YYYY-MM-DD: {date}") + raise ValueError(f"Invalid runtime.txt date: {date}") date = datetime.datetime.fromisoformat(date).date() self._runtime = (name, version, date) diff --git a/tests/unit/test_buildpack.py b/tests/unit/test_buildpack.py index 23bbc0c6e..ce84df2fc 100644 --- a/tests/unit/test_buildpack.py +++ b/tests/unit/test_buildpack.py @@ -57,10 +57,9 @@ def test_unsupported_python(tmpdir, python_version, base_image): "runtime_txt, expected", [ (None, (None, None, None)), - ("", (None, None, None)), - ("abc", ("abc", None, None)), ("abc-001", ("abc", "001", None)), ("abc-001-2025-06-22", ("abc", "001", date(2025, 6, 22))), + ("abc-2025-06-22", ("abc", None, date(2025, 6, 22))), ("a_b/c-0.0.1-2025-06-22", ("a_b/c", "0.0.1", date(2025, 6, 22))), ], ) @@ -73,3 +72,24 @@ def test_runtime(tmpdir, runtime_txt, expected, base_image): base = BaseImage(base_image) assert base.runtime == expected + + +@pytest.mark.parametrize( + "runtime_txt", + [ + "", + "abc", + "abc-001-25-06-22", + ], +) +def test_invalid_runtime(tmpdir, runtime_txt, base_image): + tmpdir.chdir() + + if runtime_txt is not None: + with open("runtime.txt", "w") as f: + f.write(runtime_txt) + + base = BaseImage(base_image) + + with pytest.raises(ValueError, match=r"^Invalid runtime.txt.*"): + base.runtime From 63239b0e02a5513012250e71447127e900fd081f Mon Sep 17 00:00:00 2001 From: nadiaguiffant <113976986+nadiaguiffant@users.noreply.github.com> Date: Thu, 26 Jun 2025 17:16:01 +0200 Subject: [PATCH 119/299] Update specification.rst correction "pacakges" to "packages" --- docs/source/specification.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/specification.rst b/docs/source/specification.rst index 28226845e..bd635b231 100644 --- a/docs/source/specification.rst +++ b/docs/source/specification.rst @@ -10,7 +10,7 @@ and the resulting actions that repo2docker takes is known as the **Reproducible Execution Environment Specification** (or REES). The goal of the REES is to automate and encourage existing community best practices -for reproducible computational environments. This includes installing pacakges using +for reproducible computational environments. This includes installing packages using community-standard specification files and their corresponding tools, such as ``requirements.txt`` (with ``pip``), ``Project.toml`` (with Julia), or ``apt.txt`` (with ``apt``). While repo2docker automates the From bcb46e140e3f122883c2306b8f2b1d7aa11c816b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 9 Jul 2025 17:12:54 +0200 Subject: [PATCH 120/299] Add --vanilla to R call Closes https://github.com/jupyterhub/repo2docker/issues/1431 --- repo2docker/buildpacks/r.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 93148a940..1611460eb 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -358,8 +358,8 @@ def get_build_scripts(self): # Install a pinned version of devtools, IRKernel and shiny rf""" export EXPANDED_CRAN_MIRROR_URL="$(. /etc/os-release && echo {cran_mirror_url} | envsubst)" && \ - R --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ - R --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" + R --vanilla --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ + R --vanilla --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" """, ), ] @@ -395,7 +395,7 @@ def get_preassemble_scripts(self): "${NB_USER}", # Delete /tmp/downloaded_packages only if install.R fails, as the second # invocation of install.R might be able to reuse them - f"Rscript {installR_path} && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages", + f"Rscript --vanilla {installR_path} && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages", ) ] @@ -413,14 +413,14 @@ def get_assemble_scripts(self): "${NB_USER}", # only run install.R if the pre-assembly failed # Delete any downloaded packages in /tmp, as they aren't reused by R - f"""if [ ! -f /tmp/.preassembled ]; then Rscript {installR_path}; rm -rf /tmp/downloaded_packages; fi""", + f"""if [ ! -f /tmp/.preassembled ]; then Rscript --vanilla {installR_path}; rm -rf /tmp/downloaded_packages; fi""", ) ] description_R = "DESCRIPTION" if not self.binder_dir and os.path.exists(description_R): assemble_scripts += [ - ("${NB_USER}", 'R --quiet -e "devtools::install_local(getwd())"') + ("${NB_USER}", 'R --vanilla --quiet -e "devtools::install_local(getwd())"') ] return assemble_scripts From 356371d7e5207b759d2834a2b31546ab72c5772a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:14:10 +0000 Subject: [PATCH 121/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/buildpacks/r.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 1611460eb..0c5c6c439 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -420,7 +420,10 @@ def get_assemble_scripts(self): description_R = "DESCRIPTION" if not self.binder_dir and os.path.exists(description_R): assemble_scripts += [ - ("${NB_USER}", 'R --vanilla --quiet -e "devtools::install_local(getwd())"') + ( + "${NB_USER}", + 'R --vanilla --quiet -e "devtools::install_local(getwd())"', + ) ] return assemble_scripts From 6cf91e45d5b03f79e365cd82eda09d1178d03327 Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Fri, 1 Aug 2025 10:13:00 -0700 Subject: [PATCH 122/299] Revamp our documentation and refactor a bit (#1433) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .readthedocs.yaml | 1 + docs/requirements.txt | 5 +- docs/source/_static/images/logo-dark.png | Bin 0 -> 9766 bytes docs/source/_static/images/logo.png | Bin 13493 -> 10111 bytes docs/source/_static/images/whentouse.svg | 4 + docs/source/architecture.md | 28 +- docs/source/changelog.md | 14 +- docs/source/cli.md | 87 +++++++ docs/source/conf.py | 17 +- docs/source/config_files.rst | 245 ------------------ docs/source/configuration/actions.md | 39 +++ docs/source/configuration/development.md | 33 +++ docs/source/configuration/index.md | 26 ++ docs/source/configuration/index.rst | 15 -- docs/source/configuration/research.md | 66 +++++ docs/source/configuration/system.md | 72 +++++ .../{contributing => contribute}/buildpack.md | 0 .../contentprovider.rst | 0 .../contributing.md | 2 +- .../{contributing => contribute}/index.rst | 13 +- .../{contributing => contribute}/roadmap.md | 0 .../{contributing => contribute}/tasks.md | 4 +- docs/source/design.md | 4 +- docs/source/faq.md | 106 ++++++++ docs/source/faq.rst | 192 -------------- docs/source/getting-started/index.rst | 13 - docs/source/howto/breaking_changes.md | 6 +- docs/source/howto/export_environment.rst | 13 +- docs/source/howto/index.rst | 19 -- docs/source/howto/languages.md | 135 ++++++++++ docs/source/howto/languages.rst | 102 -------- docs/source/index.md | 91 +++++++ docs/source/index.rst | 42 --- docs/source/install.rst | 79 ------ docs/source/specification.md | 30 +++ docs/source/specification.rst | 32 --- docs/source/start.md | 62 +++++ docs/source/usage.rst | 140 ---------- docs/source/use/action.md | 7 + docs/source/use/community-image.md | 54 ++++ docs/source/use/extend-community-image.md | 91 +++++++ docs/source/use/index.md | 47 ++++ docs/source/use/pathways.md | 102 ++++++++ docs/source/use/repository.md | 63 +++++ 44 files changed, 1175 insertions(+), 926 deletions(-) create mode 100644 docs/source/_static/images/logo-dark.png create mode 100644 docs/source/_static/images/whentouse.svg create mode 100644 docs/source/cli.md delete mode 100644 docs/source/config_files.rst create mode 100644 docs/source/configuration/actions.md create mode 100644 docs/source/configuration/development.md create mode 100644 docs/source/configuration/index.md delete mode 100644 docs/source/configuration/index.rst create mode 100644 docs/source/configuration/research.md create mode 100644 docs/source/configuration/system.md rename docs/source/{contributing => contribute}/buildpack.md (100%) rename docs/source/{contributing => contribute}/contentprovider.rst (100%) rename docs/source/{contributing => contribute}/contributing.md (99%) rename docs/source/{contributing => contribute}/index.rst (71%) rename docs/source/{contributing => contribute}/roadmap.md (100%) rename docs/source/{contributing => contribute}/tasks.md (95%) create mode 100644 docs/source/faq.md delete mode 100644 docs/source/faq.rst delete mode 100644 docs/source/getting-started/index.rst delete mode 100644 docs/source/howto/index.rst create mode 100644 docs/source/howto/languages.md delete mode 100644 docs/source/howto/languages.rst create mode 100644 docs/source/index.md delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/install.rst create mode 100644 docs/source/specification.md delete mode 100644 docs/source/specification.rst create mode 100644 docs/source/start.md delete mode 100644 docs/source/usage.rst create mode 100644 docs/source/use/action.md create mode 100644 docs/source/use/community-image.md create mode 100644 docs/source/use/extend-community-image.md create mode 100644 docs/source/use/index.md create mode 100644 docs/source/use/pathways.md create mode 100644 docs/source/use/repository.md diff --git a/.readthedocs.yaml b/.readthedocs.yaml index dde32e62f..7bb04d170 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -6,6 +6,7 @@ version: 2 sphinx: configuration: docs/source/conf.py + builder: dirhtml build: os: ubuntu-22.04 diff --git a/docs/requirements.txt b/docs/requirements.txt index 5c38c561a..2e0c7627c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,8 @@ -myst-parser>=0.18 -pydata-sphinx-theme>=0.11 +myst-parser<4 +pydata-sphinx-theme sphinx-autobuild sphinx-copybutton +sphinx-design sphinxcontrib-autoprogram>=0.1.7 sphinxext-opengraph sphinxext-rediraffe diff --git a/docs/source/_static/images/logo-dark.png b/docs/source/_static/images/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..36c9868044fdb182da3621e91f99a196a7afc2e6 GIT binary patch literal 9766 zcmb_?1y`HT6K*O%vEo6Bmg2$P-K{tjcMI+XQbCH-qQ$kiYw#8bQmkl#yA=%-AjyR_UG!v=eXR(aPvJ@BXV(OqWM=PZ0U-&yAWqQX=*45lc~3{c$-`s7 zv8zSL>V#*YVZr@~axvf003gGv)VaqFYuWb}6FqpZ4qmRi zPFO`YF?9=JtNCvIJuvE8y7{h(9{yt_5l1_F{ZZE;j`jR_sSn+?)#N{hZuFned>aa= zii^UuNH7FHg49$P)VGPxJ9a%hQ(M9)*cO@Gw!;RTJ7xljk6_Ko4g2mN|KpOxS{ zr{3|>|B-0I3!da`MznwWkLy3YU`04*3tsF|v}kLZ0(g0bPTVH?1R)%7#r+?wpF<9a z=o(!xca9F>V)>Z9JN_J2RT%mzXZ~ME zKTnJPDg+eAR=)zS>YP02Lvw{?L!JQg2g<1?BM`tZn_ccm8UuK%(DeMgCK^jcE@lPs z`$l~2r0kn7UmmC*w|41UxUQk6m0qYsrw!c1SA}6y%n7DyRhi2FYc5tnMU4440_5t@ zdu6$(X2s*zB`IJ%$UL&Jy{S)cO^BYp%zPJ+c@}CqU}T*?t4g6T*~k3{t@U!e?*KOZ zEYM5CIB@=GC3s#Vv-9{BTBY;-%fu$_!NL_ZebhbY`$QbwMG>>o`|~e35`xvDj)vP> z-?;}Ie+TgBB6>bNG9KHvnH`t!?CfYgeRp-Vm|j&`X}W2_m9Wh2b*S;wzLZ@NuEf+m z=x!$0m445KA7Bg~#5LmUSeUpU*AP2v>#2%9O9P~Q4uM$B@nGG-a0?GKb$t%!qSICL z5A~b(7V1uO$>c_kcW`MtR^P9N+8)%AGL$0DP9(esjjDP8{h#VWbbHU*3_At;`=Aka z%id2Me+IA+M{`+YbTOxM(wM>t|cNImpah%cmIU`$}j^ z$T9_k>PLaCMJ%Lhmkq1bvDcedvP$OJ9(t%ZaAiVf;?P`N`{R=HPb7;|_otH-AsV)= zWzZdkUjy5XUpRIIGO>v`GyHT$QXcVPMj_V#3dK7L@By~&^^oxm(WCZ$I#D6r#4(7+Ty&iCVr!T$hByBnWzOWdvLdecg;hR<&1cVKT`R z{>EObdPa~Kt$CyhLPtfMnaS2lG0V})=J0qEv#PHYM<&AacX3UB~I3*gHnJoRynwO%T8dV1$vnW4$&Q$Ha zBw8fn0M#Fn9B6Gtl~^V>ScvB?%8A1cJTV5Y#lAdxTF0X7tz&IGnSC}Bw8Z8E65b~k zy}&#rFm2QKBq5M{*V@ggU+$i zFS$#F&x?w@5pbIubef1=bULs_r87;>n^m7?+8D`rT!gaDMbZ>Po)LHo==+a^Ooc!SrtW2m3#c_19eYQ<7Cuf+<9$z9qDKSHx2W!jOb~F4ajMjcnQ5h<#JN_J#>ISKA|h6qkI6bD)HJJ(9xb?dv^`npzHy42mI5_+D?O@g)(iOr-$8+ zYf7Dk619xr4D6||eR$h+N0BjIQ&L~rz8_LS5%P=EpNsJEgzy93xHV%;(kIRhhyB-d z&=CR`p~mOQ9CXMJS0}5hL^hZyP2$sr?fQ#bj$EnoPQFZp_>g&^`H&Fnx-DD6FSU-n zPB?0WIBq0d9i9@cO+!kPyumW_Y1iyo(3`V)t^n^Y!zlnCO zzTDN$CEhyNpCZsM4PK-xT$UdHgDZVX>##-Z`l`4N)<5>Bbpmk$URsExvS$5o=|8~4 zy%wE|plQ0Nk4>(EG)ZhUxv2s}x%LPJF!!DMI#~&X?+U02pBFLV=mvgn`ZOZx|F)AN z#=cw3T!>*JEEEsexGl@eFrg}rF*u*gq*H?%lqku@lKmola{;9KrC*cim-()+?1ZDT zazt~UhzC4oeBdk!=)_mU?xs^#_Mh=!=TT$LWPgVs){QxuT>6OM1I3wkw`xTlId3!^ z!b5JA)|oA4@&xRCE>2~s#9JnBHF`#G6@I@j?}v}8NS*xYD8Mznn4O)Tzr|FGqtU+6 zV<}r8BroFrwT+`>abOFrtNxNiy23-Cl0=qfQF@w#<=%Hth|k|AVHNaXG?wBbyI7~$ z^l8~#F+xk~tIbh?I{biMWL#Y;x_~4-=}wus#3w0f_l^FSIC+LMRJi}-^hZKLY&oXk z8(IIf&gZSOySoaM6R#Q#oC6>>7#+>98wsjkU8!8mP4>9no-r+AENsgP<2R zYyU;v<-^nnH#yfdnvNr!o`Z#@myWj@%0S+Zx zH8|vv_a?Vzkv{aPuCA1oBWBwqjMsP*>A5>Gtg_ChI&f+S9)1h<5LvL&r9?(;-dxG3 z91NTy`q75y5>$2GL~U~IfT2!tuOw=10glo7D`j>0wK#R8O)z8J=>m{z9|Im_jzE2J zscOPlb=(NZkPC$Cj0R$Jkx9^W_m6y8TjI+HxkKYc z1zFhL#b?Ef{Tq2$T5^#PWY;qMAb?8K&7~po>HKGomb#Um)>Y~^?T!kdfb(0wCYv$& zwCxd_e?Q@d&w=Kzg1=AxwGWtH=MKpk4_za+ysI~mxMksWG&WcQo(J1uc7W(J^d8=N<+0fB00`vpp#0&J4 zQT%gtg&*HlZ6{Z3Q{RjCTAd0Sw6S>Qi$Cw0+I)EI?iOLUr5oK`cBZBRZaL(A9^-+~ z{btnDJms6(=PIH2J`3?-DAZReEQ>j!N6?It~CE~$&ba&F~ zbc`>oLkiZJKtktVX9t{`yM&Y{Cun4AL~owx;ZJjVM9Gl1um{OP<|MdLWu3@tr31qh zT7j}ZmF`7^LvdU776jPyEe_`U@<5$>cQ@Y3NVWU~ z)v3Q0xhT;cqvP6xkScZ{Zpz?mMsfK9PV@N$Ay`Er{70fc#n$;kO0Ner{jO6=6Zr); zpl_C^8squFY2h}Cc?FC)e0X_1COiH}IO#w@fpOZxTKC-2w@Cx;o%~xyakM5~*kg3- zfXX4J_22>Z^U2@9(>&*Y($y_hrmuigD2Ve^(ds+RS3Tw`-t7mK9Q)@Z$3Mtc-@kov zX2(&|arc96df>yI(ZYS#WiJ)P6q-|tEh}Yb@{2Cl&%lX8m^GeTQnAhGG5N||C^kC-g9BMSGbCU|%x=?`vl=^W|k-%e>uE9ZP-WBCi>RnNEj@67H|R21jD5QnSutB z#jv~rtM3enK~?$^KZiCc`evRPG0=1qaKxV)(pu8TyjZ;@sHe{3b4)Y8zw$n~oA#{_ zR$+p^yEV1V*sb1mh2;6*;w9YvvG$zaWFqd?OTuy%y65{-e8ZP(Yf}*wN84e3DtE7? zjF0?J!_XiHAfUsiz~aP_tSypRgavy)T$7!IZximxy*u@p6kmLLHdM>k{SlZrfvsLD z!s7k}n~61{!dU(^*{Ou#hw&WEob9i<^1qPc-uifNY7RLQ#sBBRh}QyZx0meLw(@#3 zp5Ki1{_QH2Ucp6H)7p9HZ6A-m4b*_~Rrcz)Ey*uA6K+^T)Aniee+1So*bUjwyC`rH z^PQW`dKr^#SUa;yv8b_t@R&qdbOG1=x-|xvHy+9XD!h%0R=Rk49A{lwaK}Y%>_w&c zS(-}=9#vj&tjpJi7WJqs+1{}1!sjM;>oX*j7B@R)>i~cM>HxVB3%NhlM^j$7v6GijymB)v$LrO=4O^* zvNZ;adc=H)BRQcf2s^pYUh!}#={No`tbH{qV}#?H&cd>$x{te&RjB*3Fa0_ga;cvD zktNb0NUWB7gLb<^gPownCZmSm>Uv2Uj~R{MN@64E@TG+kQs+1@^DjjPDZ#Q-k9KS4 zM!n+L_xHgxyG~6yfq1hGAs58ieV-ecb&nRByex8w)o;B;&!bNy)liR@Mo(GP=95W6 zrZPza!cxJ_sAeNJu0TGF@ob0K%!r4H2Y10IZ{7O8{W1gDrpnRVme0zt!N&DLvDJ+F z7)_pRdN>oFV!(R6tHbSdVYj^@`0NCU(jRuN>7fX2W0A0SFVXHhM^xx^gD;)=xu&ay znWI-c&tafDZm7?VWRrGNMCrZh>5qcuoF`?(uO$(POG~>b6<9UzTTwfPG=Wcua+RwF zP~4=@U7Di9=d;ARYY56?5zVt#xpIe81I-D3GT7j|Hi`ksWvyArb5vwR6r~Zlfh9*D zO`LV1l8-IO?DL#&3Dl;gizlD#H?jF!Oqgxw&(~~`A3J4HduR7;e)EUFCCEbVC8Po# zdKE7gt~6NJn>M>ZKUZBJOAO4yNNRUh_RIq^U{@IHYCBL)xKl32Rk_orc~wIH-eKHT*`a<_$ujdg{}h=eh#)n7wQ`mK&`JcG)<{pGKM zRvS+oZ?y@JmWrp>enbr5NiVrB+3=zDZLCFYGTu2VS@vOZJ$g{UwIGH*kY}qveVcAY zry=1hv)=p+xaOVvTe3A$Iju~R946YBo$=e2jSfvsP1)bV730zyokYG^bzphZD6P~khB^!{qQ5BI zYE6zr@wxEa`5WBWCTN=1Xk9jJ$1mrFyRvwMf`el#tDzqzSb6KEiGtV?E_Je)#J^w?an;@{KM0t6}|8tk}t&oPW9hBpV<8u!_5w||BCN>q}Yv4FD8p7ODQ ztbpVBCcphVQ7czp_IJchtJjq*K96{col(l(uO6;ad^~y9Uz?!eS&u!TwPm5T7;O98GZ>7u)j?3Dr=oIbEbb6nmB}Rgb%5X~d_^tg5+s z+iYezW_u)N*~t4=c9z#UdWvXwa{~CUn^?=ujA+T z%ay(bWLdl_w9iuMspJHn8lb*yIxUh`YMfEBz{hAw3Ua;aeRIO{;bHeQ1++7?@E?}3 z)pWH!x}%CGyaXO=TIGl@i*C=|spZBYqAMdX z5bgcnu5R-=u)WWAd22w=6kV(0cKOh$rUQFg>+?2MC^;uT>mBFo?)m<+mpBQ63Ih`X z!FZ+CA(AuwLLqpO(CuqkhAMwc8^#aPt&HW@*#;0|9g&?kbG^~#??#Yd_3S_(pl?`5D~Zyzi5<7TND5}rr5Mmu+V z_2T$F*|J5(1enb^A>ur{4y$0~SVM(($JQ_FcRUqo?LpE+8(~8e=@;4E{%+=*?7an| zH$?H`3>*A#_KnQ6j|xyJekQfZ##4%(k(JM>=zX_R;>wNu&ih_;+hPz{Yuu_&d#4rP zICaxu(3miMSKx%zM8%e|=gknOAk;C&)^bh`Nh{H6iyGIJ1^Xl%+5@#wgmgfdsPNL3 zX^3AVp{OI?#&11Xj5V~icIyJ-7rI+!xP}!;?VTUI*XUYi@UoV7+orn!ug#*_G=Mra z$!vA`==#`h#a8Iejg{aqi$xz-+3CmTg!l>?TDpVa0lIyN#`~&Rl4OacYi8pFx&j}XI(wzT%N4c)neQ+GS_nHAJA%rSc_skLDPemO=W-Bzv z-mFw+MwIa=1!N1_65`ftdFFUo>|UkjKO9oFUpv<7F5A-;y!#xy%!l1~ff#Lgy)|-* z7zZwK;Utv%>`%%Jl$HjwgL}XEj(F`$OxyBX9<5<%NNvSQ&wlKrecdJ<^k~EDmv{7* z8B5eNm!$Tp%8xwlG}fA;^-iUeuk89VV>rEBt0nG)okN#wB; z_sawYiJ{GJ`6jo)_DSUMbGe~zWa@Uxd>T?vDBT+A7wd?y<4Blq@H-%D^&98u_gb-8 zOpj@A?DCy_wYYC{?k0vR7vJB?Hl1C(yn5UGTG7#>AB#y^-yxFJtb@kw%$f*+54%&` z*YxRNqz!YQkDPnwS2RC#{adq>RR}4_qP5x+tCLTb$RqD2mMW``#YwKjFP046w8=shcy7gXJ*K|lpEiXX z)tBCUu-lNjN@bR{x49a_)r%IJWc*ETHf~+Aw#f!S?`S}e@Bea635y)(05NPg83$N-+snyVM$a(W)G5?2Cqp+3?=uL+m@oi|T!rWA7uD{PD;lwuGd#VPOHL?wL;EbhN9W}SE z5<|AR#nh+Yd%AJWVIuzxI$15$Ym`^3jiCa>yH|^eK5mM5_Kv>U_4`Aef31vnf+ zB|Mp=wuXe)wg>7+!4BNqrWyrZc*VN^d&rxbvBV)i8}umk(c@y^R_eLa%e(+%&C-dR z8PoR*a3%1u{U56Ps=}VK z(T*(3I?A?_I$+0*{Bd7$=4`TZPy6K5Lp4~3~5W!CJ&;R{W~jX->; zPpOYrq`K4bLMMYfI!No1loWM5+X`B8h~>mx(u@U8;wA3iBgVwhajDzEUCem+!m#e~ zzeHN88B4sd%@&Kk57`m?*}N;c)UW}xJ8{c--aAQu)78}6YcV`yVmrOFGsrd)O?XD2 zKK3{p9exjKdHZYoZxDQvy!(PBh3TZthcYkAIKndYSx> zEi%Y=K<%2+PWyjimdJOr51s#Rl1rTi7usz*ExSDg&6n)nnq61F`JtIqapF255&wn_ z0HDxH>F*ld^g)LboV4xk7SOBtrwwi1h$72pXx#krD7U!9$lSqGh7!o&pZ9J?DnDDa^CJ~Ox2e8w@`RKe%g$2avQp|BrUYdp zF69x1mdTHMPXR6w4bfbE=YMneU5y>0xkVj-XOy+g*2wK>!l<*{yN=D4!(1*y?Tl*c z8vW+SQyno@vwr3HeSyupRd)7vi#QU)qkgwU0<|QyEs~J{?@$*)$|x>Cz9DPn-U4aK zzXMki5AyTJQX$Gu1G@_d7_a_@t7!$OC65&7R}ZZ=2cGRpKVr~4{6WXh3pm(DOcDFAQ9(Y_|P zY^245v}rYUBPTGx&t@<<=%t0Umucxi#%2pv=~#(gCe;u`F@3WIJTG+o@Xg1oq*ki_ zes&zcptS560Kg+rhBMim5qjR+qF`=Qp93aiUOB+(m|?^fG;PJIxsBVsf+-l8sNzr# zqxIWNKXs4qIFLKm<14bw0wEuHU7PF^Pr|v5Z@cfEG;^JkMGfO5c94tWOe#h8$O1;^Ly|l(68q?@Lv9Wqo`+DQWP~pR`LFLrDjA;{x?? z^*elqq;z=Rk!G&P@eduz!F`Rh*S`~}_?;fvJdO(W8f!}Lzds2OWKm_xJE}7q2JgR9 z)eX8GLccgv#`LBH=RN}PceMIf__q+gXqqFJp zWxku+NG9$88+TK5UsyTiq`fgkd2Q`%C3N5`)J=wCMlvoMhU(NCcidqUaa#o-J4}jDj A82|tP literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/logo.png b/docs/source/_static/images/logo.png index 9e03007d007cb9af935f0a5042cc448826843d44..c3a4979840ecdf74e0f56fd58f78a322b403286c 100644 GIT binary patch literal 10111 zcmb_?1y@_o*EKCIP$=&19-vrpcc(Z64OZMez^_nTi#vs)#R`-F!HPQ+w?J@*;4Uxy zujeDYv#zgu_c^og%&aqWc9f>N0wy{cIua5Rrjnwp7825{<(F$P8p_KNfNuZo<@C-~ z(a-}42?PJ%{t788hvenqD-SINX{72gioKVcH?~r0QbaX}&hPjS`ghYdeV?yp-s}@ngB4&XX#+g(4_s`pN z2OP7PZ`!}?vU!3;TrV3uy;qi}B`iPAJe(uSt}e|cnu3L1pT01O6Uog5HLA@GLe9+% zXrYC8%YvDY0#|U%l5xU>wRLr!YP`gfX%1_=TQb65c|Q8Vfmw9Mx(iZK%>ye#QJE z>GdfppCA1Ee-QDp{u3O(=NG@+yhcKD1x-g+n>fD3UE)1Qut&}>mfu|z(YE8StO)#m z|F6oH*`JtSd~WmhmUk>2{SHF@R}pg_ds%_SznVU@x@~N^B}7jyxd8U!|AQ>^otTL_ zx?MOobVL+yT5FfV{(G_XXTBID*ErcTi`7Gngw#hx$P9fUa!$3V-oxd`N^_&O{e$dJ zKALtUqz~R@BomZQAP3Zc_J8Ep5id`0{*SBH`gErDw)|)DP8I1WO_t?MbbXh9*pk-T zkV28!|HGE2wq}M}nm8Us-k6@PAr>xMDgOZxsxL%x_IwnNGOl#;uPUP3+-YoWe){g6QjKXtq`y8@Ns_KWp{ z0=zo|!baF+{?39-Gs z{XPmRYWCr<-vUaI3J!~~H3yW5u9eu}bMG>^mp6el_!>6D$0j$x264|})(4OKqS8Q+GwT{*#I6Xw0*;~WuHJkH0!djpMR3bRa%La*`I}HF5_k|)S@>=s* z4N#ZdP~FeM$+{TV*}Ls{!sv&nJ#G>XeMSQ!VlBU{hJd?3&EanwlV77%#}PqNd}4Z4 zk^ajm6I7Xd=~~Q~*yP-Qp~NC_O^D{~cIBORSMpSPItUL+^VOw3Vj1%ZpoDi5|M}MhAEqfh`tzT(?YoTBFemu%vJiacY z(Q&2KkMb4L>rbbJ4h`PZqH@V>xm)hfz})*#Z+$JR}?Jq=U(3L1{lV@-G-6 zXDv}+$I>)WS)?2DxbCxA$B^=*5~A9sK8o4;@a2)*NW^QL*l5CKTu_UD11%)UbK(=J*YB(5iZQNzN7(wd|QM+8hbN!Y)vFTQ-^y zHUy8WJ>e|+MpQ!p{JeUt{u=3~WL_iLyKj5?P{yAVY9*FpiB?d3S=oVYSy~ zdyAbLeB#MH3gd_mJa7?p(MYPeQ_ufSKL?W>bmf0M1-iZd!wzVwI2>jO8b016xh;*m zaJIqS_#Ze(c8(L`Bi02HaUf#cE1YkCJ{Gy?Y>C)AW7Q{>25M*5vT=3nvq6u{xJt9z ze@A*ho(TyXe7BIlC2L$PSvtt9Kj09 zKccS+9SD~s?nZQs3VZb4FPai91z9f~FV;of`3Knbjf_w9E5!dT$rqD@e|}u~`f{HM?!4nvn1A@7Pc_N9Suk-N zYQI@TFagFvYP6q;Q`FW6?d#(sp%YR_+9@I#q3;{762Fl-bxVpR&f=6wcWB zkE1XZ-6blZmu3%|qLf}pySCTlix`KD0Ew`dxv{7!iY`L>BkRVSYLbA+liE!b@E z^o{ofP#9_I_7*LLVdw20z#13Egk3SHqF`E04oAIg)rfJ&F?C~X)Qn<{+Krw!Rn)E7 z*RX-bJA>G(;oAKP5Uc51OC6KcQ0oWhT%?M25+SJgR9y@r9$ex*6zQu!{td8sg zcF7IdpkBvl>?!7TzCe#2y6&4QI>L1Wr(I=8*8-twe4&cJ&l#El4yDT-AY`e#<49{z zNKDz-MW@ZognoML-~bD6?h~i&(N*yj&6567e4@vm%#VpR)WG2~8WT0hxlH+oL9ZyCisaR~#>np-SC_#T2zoNyNh z>6*3!{d!uNQr`UlctV+^zUoIMq)d9^!3yrXz~U@Zdr`t*2?+T1tjA+qtntfP?3udY zyXqb>v8eP2^>nupHlIJ2hUWVVaFGuhl(Bo|2Jq?c!~6|>RO&t>tPOfVtq6>%juIOA z>@+Onxt=Xi^kv+5W6uXfnDD$@;pu-GOac+@NvlS4ev7*^_fd)En=hJ#=$Ym~cgEj9 zLq>%jKI$m*D&odG_14W!tGQ1Y0(?;J63QSsje0CQ#q8W3AS1}h%ijFfcgxg?5xYz< z_iAl>>)@86k0QRfmvMzq@xddkW={E@hksi@ol0|uZvVtBXKrTSsxu(+(NA7DgfnDm z+tUns6v5gWR2>y_Ga&TY3o46*m zJ8e-i8cXi)#8~}xcHFQ#phB@z-Tj2$uo_T=LXMf=xb!l z2Y-B4>4pv53!1VU4(N4?f>+fb=B4BaIw<+vGv#R8Y6}eg#5OEx@%WG4%woNy; zsdTYTF$Ch>>#8Fif|Py0Qk&cVWWs9QEStDH@Jl#p4+l#!7p3 zn_eAF^7{t$O6aGAO%^rh<-s!duhrA!fDnW4IT)r2#-RL^&|(K%fQTVt*ztaCXGN!r zdIJ1gs#3o3UVGU`trg3!5uWcQBu-7QY5E0s$5_}HpssSW=!eIcZg~ZM^eP-p`(@D5 z99f;b%3Ow)(sStV)W7X3Y%CV>3_A%NM~hloEk=0Q<+BGTeQt>lG_p7 zni{XWa*D2bsy)Ec4X-S9A*|S29#2lmfz6fUh)32Pt^sl1-a*WoH*@tOCc+|E{jjZ_ zyJ4?7uJn7hU61dOj74i9W+qdNX4EOQ z&Z53D`v$mk86n17r@Ot~yYC5&rNWr#uC`jK%<{<6e}10Kj84Yh6l^-D;G@bBP^K~` zIIa4*9wC%62qlQQ+6kuQWmA2}^U$xPSd&M^JtP*b2^Ok?QG4OdgEUJZ&~D zU2ra)3y>L0P6l!h@V_&n=^Pvyz2+|fa7gRbIaCc3CplUY5$^^#&akwCYz%%F!dtwn5iF`QpPAWfY@wSoy@ z5bph6hQBrFt8ze|JF5a|Vp*Wn-*9-yRhFRFfDS6_&xHhIp7<921B?f7Q>-A)7o+uS zu#gwj*YLY#nzB|_uNT{^NnYn4oY6{3uwgm~;J3pKVd}GrTXahrKbD#~jc#eRSt2P{ z%Rzc}Y=H>&6HTA9b+8%7R%LB@hd3%nHs^hSCCx zp#~<*-Vehc^(*8fC_1{a?e(_`>xh7Q~;LD*9R)JdC>MRC4+DWP>2lRWRo--=ch2 zIjA|p_kPkYaz4$D{I4`$C6m3XOQ_R=^boJ3n2#WZSvI_HvU6y#7=N3*bdXwy_0OL& z-xdlTmxOJ^w`^?=vWnP2u>J+GS4<7CN# z%Jj89{5}A9s_Brw8?B2xj+tDwCnFsyw&4F%eTBkxk4um$IrV+v>h5J#qGv#2ag9kw z7M=SxRLO|I+vwsTtEz1&$g#KUf8E)j%trKP96NO~)?u z#=!1L@ompkfjogIVNAX%K|Ho7(5Nbt%p6Ik;_*nA6!b6e&61A57ZGn>+2*|IcUey+ zPHFidB_~NZ{fleX8-;=_^9`Y&M93=M_<>EQQ-SEGL*Fb<6bwdhsHNK;ct0&&6p}Hk zie@h5&IcmMiL?o*tBjI#!!N&bfw!`#6>N9vu+?r6YfM=NUy8w_w6-_jm~n6SEL$-E zDTB^2hlqJHL#)(eGky)R4G zDj~?3@Z>yGpQukaTWT-orK~pU$-Vx_I>i#kB`f#{bz^M5Cr)^p|K*wQ{9Mb;Ro&1e zk8|~8&-~bQX>s@8wOq*q@b2haL+&dU)RYRb55wtP#B;$T?Jx>DEi4&!NhP~)nO$g` zxk*-B6el(D)Y{+Z>pB2iMZ_c>Vf+)_7@8xH3Zt<`zwJ_1hrYe{@(jX1N>>Q=u!dt?K&fjD~ z#c1WEcAEn;*)^-y6P2NbU_jLszecNc3QJ>U4!w)0Vdm>d(DeJj@RiL@J>3Z*(tf}^ z;Rw(om`J_#aA|fiY)PKaQ^L(vx9Qt83Y$_*Ib&}Jv8vR~sP*MEWxsbz^{vTdU~~g! z;;gkKR2TQcKf4nEwR66(FIsT(s3)90LAK>)w?nCh2 zBmPoqn1~C9Vo^rYLlOJJif8xIX=fJ$kxIL|RqiIJlL%RIzp4!WMV9E@m&jiwvp-EK z-E^M?;+^w#3LDg>%vd2z!#KlT5OMGEE#>YA2>1tu*9KHSi>HR*o=!%w*mE?U*?o`6nnq9 zT(f2rYG)iG7*mz^glR6V|4y)AMAJd{JWHg61Mc{G8(n@#P>5{5_;T2_C!n$rdmX)W zmxr45o;KY=L0vKD`jlFfM>R)E&r@vadlMm-ci_riLoMqeFAKTKV+(J)JQG06Pczy`snUrXqKX2yx#JO>(pe+`fslnGWGfA!p~7U zv!~5x!I>kH0DXyd)~;L01ABU`fDan=I8i6V1{MKYgeO=MR=Gup(VBOQ=F#lY)F(1L zPBd?6%2vxswX*oAo5x6ch%|Hfb|k}1-ndniOJCrQD&*PTyOn>O(Hl_JVrJJKtAJ-( zylL-v%|GjW&G=T*%lsu;0mseR-rAMg7=BkT_s=WLN;orG5>CIVhCV?(wDMIHjK?|* zE>e$6IPI_8F)uH_cFQ+gZ-8c}XHoDpcvl?MAa?_{hcmHD;!mM7(;g2^7IH0&y02`F zsdy|0zQ7}7+qt+EpS02Id{|CT;>c`CPVWM5s~`F-OsaWN$~`_v;}n0h!C270DrJ+U zo;sB28jPNRWtjcq+55pNfe_X8DBIO@VD57TIs{lrJ!%S6RG1?Fd;wm{$LI!9}^k9M#uzPC>SH|Hd8X_g=}trhII zjB)>6(WVvRZsNKPD}_pC-Rc=S?)ynBGVJvo|J36Y*&9_*3Z?)Rcxw@*q{7yI#fwQT zUkY1c={JtpiW84w?SOW(6er$9y~@gc=Ord4TD>FChI&y7%e^1!6F zowm5l!=EU^@5(K>yn0RWGuek_>5=t*pD)aYHfc?@D7o)?Tbe90l6fVBA8Z^S!j-G} z6hGzVsBaqk@pNTgBzbm&>CvOPT}vgENY%3#M?NyZO|RCZ)lo<-+n>sn6;acig4HfX1oRadG*rSU$9$3ijv;#A~~s zFxLyg{A_soN#S}|o!!VTj`My#ivxG|2tLzoQ>m^JrZx@xyql9U)R3jhWVtCCByfO+e4bHEza<0SNZIi) zvzOLk*j}y&kfBEiD>gfasCF`IBPqA)16F7{8tG(WP3PzL?7|BW&n@!8S5+MaFUebq zIsM0jIM2hrus--+Uh;*4%ahpUfy>#`eTaHVR6Z60cEir`0Z=B4;GH&O8Ht*r^p}@Xk`BznBWHx#g@Zg29l@Az08vrGW8YcJo7BeOiNbl>DOD%_pp9&)-jka z_iGnM<6+DBg7kLq}L5&UiAIx4D=ARpY9C;CL>)(%n*+JGj}c=fhCOKxywD+gYS zmU+=;N6xE*4zBQm1m1lr<0Y)N4>-E5wZMIa^yhP-dEo&Qgoj14F2i=2jNi26&tMA! zx1SejOpKu^UAuFK#KSguxHTY&G2b@kR2gR2-f}ihU2?|-Qw?tKYGFK*&v+|vcBkTb z2MLyGAE_tia}|n zy?L0Zam&||?IphyKS4b83hBRE`4u^zpce&$aAy1vyb%D6Yrj20XeM2N9C|781G2eg zcR|*yHK#_)h_|)})}7PR zNoxoXyjWw(=eU16!-pBn#S~0ItwGJ3j@W7kD{AG2=f)j7DGXjpzTXK!|KtnFA&gpW zv({E~A4gkk4NGIktqWo(&_1-!#?GN+zVD2Ozr$8_n8(mkvfoFT7Gy;w@4+77Zk~)P zu&c@Re7Ph7B&1j=ba5+1Mx@cig>Y$FBl>mr^&MNVQ*|<};@gT`4WGJQsw=*=FXlEn z`IT)U_N*fKFX@WyZIRtd8NE7ArRZ@5A2zuv#iZ9Stp9P0_da?PO*2a(k{j82zM! zm|4UK17WiOjN6rfXI19vd>Q7Nj;N%KKJxsxFUe;&piUCoi@pX)viN0+ma>k&V*0|*?_5>{yGG-FiUk4=j8_e#WsB>uYbb2|03>)#Tt_KRQorM z5}`-vMc<&rUHf+eE?J~GW{)Pa5w4FxA17w?lC($%|51))uBBJVKEKgM*B;cj1GT^+ zP4Zz!Zb&EVBJY_@Whhs=hXA92U-4*(fDB46`ki0ea@Ktl!QhsiT?xwLyN%3zIF52D zC*t6!D*e_YK%GJWubOGvpY#teg~!0(vAA4$F`FTSg3-gtpcuKc@ShluUg^wOQ;cn; zG|i z>ZopfhfZu=1bwmsvx10H61sDzKq|c2;(Ers7C#8#6WYJkrpbk0o$T9Wb`p8$E)Kb`ev8eeQ6>Awg%-r~xW zQ8>D@S98-jA55V)U|ZsyQu-YKUNe&a*W~{*E@PSCuLTzKaCbel97C9uwyeSymlsj~ zXF3s?kQK_*2Ww+pv?uHX&+!tSVn$3>_~tHYD!mK}lAJofce6s{ zIRgyLv-#ck^EvO%KXA^AVY6q}TKnp?uIu{lI32BLq{NSiK_C$6i|49(AP{~C@c$^$ z9pJCt?G7*Ca@XUzsW%8j!*TP$d!hFj1p={vUZ^S=1bo?BB=Ipk%@IT`_eVrVKEuby zKO#olQcHbZMp#zjk-earjb5R7JiQpU#Jn53{w#bw?%zn0i&8m3V< z{Tn&qIGOHaFy>rbAYv1#m+BvI8~-t<|CQgh%VOPw zN8&J7`Y;%b0H6?bXdJ#Q1Y8w`Sul9O^)W#>^UbaD|Hp4XtJ3sG=!G@el1} z;v9oryw|dOg1~@yCh~ifrm= zPZB-47-1v zzCmS-Ml#d)8g@d1TZm*;knC!2^Nlf3gy-Sj3FgIs0zM@uCMb^(g#lk8Ol>0aJ{q>j zbwATZLmt$1W|TeBDs~vk7tt3euxR#0495INSyXxxBEzk3i6{J%8DcH1#a^YZ)BoRx zefy(Z>1AREJTe(C#RXJJei{bw%yJYjkLlq@ZLEPz zn%7>H&YY4JYUOy`2l>Z=nxrOf0p1b3{z11NnbyG*A=Au%e`TdBf`W5M-f||A{F= zRRH)B;&3l)yrjWiyj13k1>f$v)yW%HCtj-Qzxg$>Gh84x| z$VXUJ!R2gK(Xq34L_zsa?{pqTKx4h+cm!J+NPrbU@%l4e2llf`^o!qyr~PInAx@u% zwKAhSY4ORz4Bc_LJbrCz_Rq*l2s)i^JZ{ZnAB4zz`NS3-JvKHmQAd;^VRZw<+1tQ$qo`+CwH`#IX(b*drs z79cB3ygF)pBaq8?^V1o#3T{Co?cgd^dWTjI*%n0Ay~fphy7@%kYF!vjUA zv0;3JF5F772v`2yhlN^s1=bbXy1wQljCspnqZCm|x0d_TaVmwqWTx`8=%)0&OJ*2uNz^?jir){p(=uFlRa$s>m%XqcfKDjEDJWol6IXOf zr)-6wKU}pHJ;@1WAJ}+V^&B2Mx+Qj7hb3@*D$=9ED2{bKEfYrwQi}6IjUTp&T=%Xd z(*~lxD6o@-*-9))ybdwbJ1j^nZ3I`724!;IWy$Eb3#k4>5`7M_?u(x`iMOHz5#)1) z=V_VG%DCq@^mX%ryx=Ujo$`)2ts(d426yQyXqFE?b4>>SIk|*Ut88y2HnOAeO3Hlc zE>5Uh_oAyN<3hEfW9uQIuU@@!Ic&uTbx<3kY#BCBKz+x!BhAjA{~Bn2Xpn>*R^geP z@9!8KV+HvW1icX|{Hh=%;2m=!Swrg8fzt!()xwRsXZTq!pYY~tau8JZ+X-XaTrrb) zVR`Wam~F}5TO6;W8^t**?|d~%IEZ@oJGUi*6@`cS#fLd$W<>vS^%17kj_d}O2}sz| zt?ND}rd^pP0)@o?0mGP3K|ok1JhJ87f^pD%N?Ma~5f}LtK^gUWEMzD~2*@Xm4IZ&sd8ZCAg ze>w8FcXXov&fZW!9Tg9`?U_+opqW{Cxq^o0TUp^C%PloPvs1iy&i%fOrc|Vo(3ZOs=93Z!v$o* z68wU3QT0zqO}2dNr_JTI$Od`zdneF@3+QOXA>Zhi7h;Wd#sF?Qe$dL@J|q`Yk2@%y z^WE9rFY31C9KRl{Dy%hRr@(>=^40ERL7<=q=LqCu)W!hsHY`WRsrRhW>9S#ZJHo#~ z|1ZS0 zgh9E-4g2O?NtRZ#IUT>u6_S(MykB7bLOmVf5kc^Tx2QG4@;9gFbcF2>$BW2_f^uN0 zugF~srjU7zs2O%b@{xoN=kEjmoIiI2#GQ$eg*67R44M(Gvm&q{$8tQnbvIfw1aw=7 zXIu8oMX-X)VGf?jUYyE-%1Lto?W9xXl{8*^JW-IQc z{dk}NM^=l!ulV&ldx0k}T5_l7!1|R*uT}Z)s~QcgH!p8P+VRHUxr(L*l>&aV4G(h# znZU0r-VY7?P(ZLXm_vzIp>-MNj=wG+zh`@ZwR`7&^gB*;XQ0^!a$&~9EMKF5s!qB^ zxYffse3djXFt~kIwV*QJ2pe6__TNQW4^CIMuIrUvPTiWg9-c44(*fd*Tv)Fg_RG%w zrwkb9ysN0Hdd!9KcD(g!%{RhV%o#k)1ySub6ziK9dD!8`+8tXG_k+oa2`aN~Qlawt zo?h+f`qjVT^rMAJFl&^2-G{Vtx9#2zWd?-?84-$(X;S$mK~r73IkcXHuxC?@s(Ia$ z&hwnxjAzu-I(}|J!L-eC!%cNarFLXioGOa`Y|h)jx@Lq$0cDs(_kz<~l~Wb5BR%_r ze+rRr!49s!*wPMBU37q-gr*@c`nT{<Oufur^^`m__>ip(td76LZ+Vr*}?9S`y_flpnc4a?{%o5-)4(<0JRzUV?gIQ}D zGm_qCYd{5IpQBHFXjM=yja#lymr&r=omX)Rm1suMy7R<0*WdklWeFNsW3}TKx;Zx^ zZl6AJGZ6f>?4uA!`upcX`cry|QEz?PH-hDw@4z2Z_G#OVH*cTg174(j5uB1KK`SkE zpHh8`H~OsY^#Q~WpFCtcdRLgu?3Jp%T{5FokmRde$#2-cP=xKAoCAL>4E#0~LouWudBO~-uUikI3m3MH6huA+-S3ZCgk#c51E-y&gn z2^F}>*8$I;0xPu7)i-A@TOt#p8ZPIYJ3BG#a9hOrcO_xK+ zB5%{>(8D=}tE1}?TK1Yd)uZdAFADE<-|5eG$ zG{nsq&J*&Sr3YH9CW{PSZ5PV6qJ3VaX0gxO?egO%DL)OoD)gthVXXDiQ{_CJmwU}G zbq*j6_;+uV|Awta^Gwnfv9>q)$Kq+0v>M{laazl@TFuy@_^jg=jYVvy!|tnW!%%Ae zX4__(v*!doiMYWTk(n6e#o|>3;RSQC26>owRclur!M(UgVMYs7Rt;l=N)m?3KT56J zK12m3Q-{tzIqdJ{Lpdfk&vTrulFzxNeJZ=#hTTqHCVC9x#>$OzTnd=-ANtp|=!t@P zAxAaJ>>8^N+`kQiYBW~P%@_EdtVmc_*BIDyFi0%$QW(kc}D#%(C~Woy@|h7W6GF(iK;kVB})d9J$Q zG?^YSUQ&Ply=ep)Z1ne$_w+}2Pf(Xy{DXw%(d_;8b5eVr-GD1b6s+3dQ{vB^u5wbA z*h?iE@rARqACZNLtJj`b^ai2@dOrr*r&FZzr!nfWb!ew9*Zk_Utps!E{v|ZGl;t0k z@8^ZOz1r=+<=Gkuw1P#u%N1XvG;!&roG*)#mvU*pat2@6G6OqyXBeA=j0>hqVcc&8s>HB1?wmjC!A-7in)apgPx2m7US&-l0G8Dc`d5BeKtvq0h zg4p@mlnmUReQKL+^>MT3xbM+=6x(yvxJ7!?m~18ml{gX^S2vZs)TVtU0k+s~x$nXm z9`@B!c?JNNQYUvkUEmP`aQ*vc))GsuwoBBt+pC&yMkn(u#+Wf$2@Jh32c*%~8EOAf zkenq?#+p6DoH7~NyFk^;-@3VIv4+?>}QjJCYBiI?<9BB^MoEtaQjm|9tW zd~#zR;;GF}&WIFbTIuXnX)Tp;JE@pj{9ZvLFn>z6;U#Aar%`6SvKL7qmE;I!0%@&Jj9N$fVp6!1_&nbMJ zwt^;JBNec6a+esI3ciFSlQ{rG=2M6qjN?KM2g_-h>R*a{P%)>-!bTt799J! z$sO%hF}&QBe0HKB4#ViT=hX?B2v2tQa##g8q#QE^hVkHnd2@KGzF&P5D6-JjS}C?2 z^wy62p6Yn$-O7Dv;itkIg1+#@EIyCTXEjYJrzN>#&^HXJSnk%nz>4&D(@0CkbaI^y zG?SjygzfLt(@rmXyC=j+E~t#1ZiF<=hB?$A+JLd zgn8PC>{c9ZRaKQmk|-z7dgL`6tE007=FI)2_DoJ7|Gpp`c?=gY^@Jsh%nlSPJbsDU z%SyJc6p4{rN}ph<8uW7A>gPZmuBsq_EI&j0r{ta1C3)j~bqi=Kl5~A8fr)on*@R)A zH7ZJm>WyG>9+few@}!zmWOxsd>Ctj=)yw(#< zP2Z{b#UZpicsmm!>3h9uzI8~duuT%Ra4WN;F5e#k-%gPK_r|hxa(!*GS+}dz9cAPa z^Gy3Y>{LQm8=_{HR1qdCL1jahG?{G$RSdQBQ+XIN%)5hHdo*jpdrnp5B~a5#AXi?m zE8J!@0tq3uH!=v!DentcPnmA->D6HbqC)AWHO_@>Nm$`vw{?v*XW%+~HS&aPP-kIWo>vOykMO?L!5ov5ggz)+H%dt3|fEe!?7+>|A2b zJ!)vk?AG)&O<y9O1zWo#hW-4KFA;)Nn}yBFLx+HvdCAevZ`z&sMKT+mDwq^D6xu{Gq zf6hQE4aUGj$)U2f*BjfES(^$5wd_r1)K7Mt_vCf|vbU2A^P;<*5mp6h9({C2vn z8Vx>Zw|sSSg!QF4S6zV{{E9f_*>Sg(zcx9ejNg}NL&H)1WQj2-^L}BO0;KjE{s49+ zyY99BExBXVlZuH1N;qx}f5f%wS{-U(vSHa&oO+A9N_u~pjVxX*-)Ni_!;zq|b!@v9 z81}S24lLQq^p}(k8#TI_FX!J?h3HlLd;rH4w5!oy4z4ASmciuJui zq1YCqx-96-5p5VM6gTK^G`^tCH&K8vMq`XPc^92|tyWR46A|i#R;C=HGb7&INV6d{WD`we+?QxsMU}0Acpmu5xH&?gy+e{J^qXM(GQj(tJi|`Kb4sq>a?%Z)SdfEJ$#MP@QpBpmP zJo;hY;KM_?qwWKj-a+%hjWuDBw)>Ew$h%5cNu60uVogy9d*ymQohUI=^M*$wXo*kw zG4gsQ+-7_aHr71I`-k&0jmpSAr?dEFq>|QFQmEy@6roHYEB}2*fQav6F$W||!7tAO zmKy@H1lqjy(_9(8JApmg{RPxhnGQ*ygDBP=;n?DwJid#@FIy-_nRK zlj5)@H}Nbz*aW7PpFSR|xTQ~-z|_Ik9J4w>R#BIk{?lMZb~<3!N&V)D5qUE}6UdDa z!YMqNCz9^y8Gj4mYK0LFK5Y$F%RO%1wp>@EpF6}lqkcW!w_eXx=l7s-6caMh&y+Bn zAXR(b?OUTg3J$k2$s4if;0mJum#DMFyXD3qf7bpRaP}(!1I_PLUnYqyg+kqbtYe&e zY{-pab)N2UlAa7iaf^iD^hvh7ukfoZS*H>7$$fr?rUrND;-L^KiD}{T>^!t-x&|bQ zUXr^)JsDh5+kdz|jfBL$Df4Z1NWI037FGT}OR7ZmD#C?zBw9;!qycI>_iBcQw0^PJ zr}C8gL~4TDf)iebcW!1coaL&!y{*qB$>8()$lLr^L3@k=z9!}0=DNrG&GjE*AUOxL z$g?&U+1oemx+D$6xbwxU-0#$$*Sk4`Tl702&v7Sfd86eQWp{vNz9130wQz6rD7T$q zIDMgd$miN>=NL}*&vHFiF+^_vp{RLNmt5S!w?4T9qYcL-M)_Tg3F}ioQnhM{CZ!I@ zpz?c-V8G16-OBBeBb&bU`8GN7Je?@u{Db)VXuTeNy!5_X?y(GE)$uZ$(ylZ+Neg)M zvZq;2kZ8I~dl!CL!-u*_yDK~P%?1R_wep%T6GT@&%ubBHGLUMiQY8_5Pp1GuUAG3t z(d6QgZ}5mR-mic%!Pp;4%OYn2N5|gUuS4SK?jK_?m?q9q=j7M>IqOKNI`^tI+sMx6 zoQ$-Gh42kwCJ6=KWB#G1 zX44%ZsBB!fVI0kVPU}X}hR?x8p6M`7WZpLdO5EI=67g;F7wHlp@w?6b_rJ z{OvH+{hfE;aOsl;WnSOjQtTWx`i1MKwz~v=WDG=)%j9LKp!~1YWKU9mHS^zd@qyxjW9o<(rjz`d_a2)=(~-e!~Ac%5&jEHUeLVRo5c1wBKuNc+ce%0JHCYrECoX8 zf4g;wg>8sl0{!0Md@yU+TOXMrbAo*B(2t)^)0=bOx~p6GTdCY^?1yw|Ec^bB0z{th z!Qtt>pbp^Jn}2*CyCizKx{}21v(-l#h|bwNiEt0izCJmdKWY&O2N!IVEnmHJjiV9x zzS{t*TWZZ@7J#&~qVIW;=g-Q@!`evD@}E!dr+>n;;V^%`!mty>Q&|?cxEK$ZpE*X6t@Dq4lUL!d z(zg=FSHO87WDJ*n(!X@HYkwFs`>W zvV+uf>s+7jP+1G=@?ZoY(--xi=X2qFU8)T?wa5jHs}YA;)6bf0B*$oLUw89Dx1(5c zGL%}X&dhcE5A4H&W*=NvFP^ERgmQAj&?p;*KtJ9|dE)Bb-TZg&3%|-&UDK|TqfN1} z)zj(aCQH)UxIF!bA-=w3tLKf}(d}G&uvWblp`e4-e^NB)FSEXfzPxQfR>StQ#3Dm1 zq+Ts*VU(@pJmjt;Tt$C#BPt-f!AB(>dObB?vA-9JJ%&5O90Cz~Jsf5jX7YM3&kZbC z;tFyuRk67#)dh=%%eM9V^pf4*u-wIGR~^uZvVQ6Ico}XdykH{MvQ1s!4ZCAX`5lAH zWBL^}0=*V5JyWMMdRET(y!3PJrnM5X03FPcGx;y=y5|6;oI^LwC19C3|GG`A~8f;)Oe8Wnob6cVCy#jt`iS4~okvgT*^X>_}dIc?y znP4lg#CmZ}-+0w~^T**HjMymHh%&z4I@vKNhI;%ogd8Try04Iy(x4uxQ0T%?3xqxf?UxT)eLei=-R<&|8y&Mv zCDPIt+A`Ba4>f(>y&zgc{3+D^LgOr+?pQrn@G2DCdLDWq?kbzC-2fE#w$?_PpuM3y z%rcSMZQT5NCLCLw%gCr$aEuzUw`JRrudg#+rGi!7Hf6Ryt+Z!H`8`a?%1E)W1#x-DqSw~als+>$83v3=ma$=m@6rqIYz$PJVp<(#y=;2d@keEpEI~!qrISL zbx{f7rasas$%^sWYj9jcPBuD<$X7AX*F99R4M~2Yn#?6H3r`L4Ig9^j4E?oD5ksUOO_bE@zZ-zqhxA@CDs4%8J}@P zua4!?hL7hj{WWU!O(6>U_#~;grA4}hEtr4OQaZcE>pQi_l*{=cw#oFkQaDG`;R_Dw zBfv=BGiBANxD7$?UMQMV*hE9g?Y+tC*@mBV4^af$B>iElcG&(5Qt0s|m>n#LQP9O# zZWs?E4z_9E!S5wYmWc%#x1AhLC&KjdU^ES7lJbFWVz(TXjf{auG^^F@7t?3QS6u3Q zkeM%cI(UcL`^@VOlNd8BysGUHB4Z?CaM=Ex3QmF0{5$AQPeHT!vJTI>z$r}In=-Fc zq!@0NXS?+EzL2Q7iQd}*ndGr8g|?T4g@qHALQNT>cYhb}t5+ZK?Yu5%WDI8WO9;5` zjGOePC*|eO5f9p1{VOoinF05>GNyYn*P74Vu`>yM!M6FVKA_3!Q4h>!dT@+J-CZBZ z9YJ%f!Jfw7ubF-qyssyQ1tx7?KFn31*@Kwq!CoNLf+FvJA1ZsIWRMii@a%>fz!DKzg!m^`=i9b?t#j{kAJ!`{Z)&os=vw6=`K36q}-xn zVugbO?FRoN&R5-CT153Omrq;P+_sr%b`TxVL(uT8y{?C%$Ry}KhWQ}Hy0KEJUjE?4^Yy4ALdBN~SRD^ONCE=g3Z!v68c_j)Mo%LVZyZ;yr&YTk&y4#DYFYFk7 zdjdN$;|ArZV*I#>Js2ybNJAC|Yq@a=i*j;x2d}N3d&s=hw7F)+)&8?wg9KuIi=#d# z9uqgydN>-26}p3Mpl_8_f0bcF`*bI9(Szr-wSL<_T%KWDEc?YWWH;h+Jzkc z0=%CsWdhYYcRmZnBrOKWoW5spy=eL{&iNzIJVE^ZJpfU3xZV_2OBAXdztmCH&jiPF zhR*Md;rE@NDE~DB1qFO`&EK3i3hD8NXSch=EXv9Y5V?v)x}J&Xb{?bcj!Dbr&FY#X zevB6zBxCxY=kft7&Un>(KLZeDl$6)kB$SqH&^EAEluDXqfN-~ryGQ;TroauGp>yv& zNs7u=q^22smET`LpDbP7$Q$&+dYTMYH~6g8Pddc1<5Qlj`nM&+**n4q3rm;mi2*<# zU2fA+V3`+yebEsDcqlIABmjw6F?Zw%T0ak6sNM8wG7y{?TB)w0JMLr>w}rEjZ)-nvmPyFdQGPR_ZclwxJq)K0~Z{zQcviML~DV?tu6-IJR+bN zKBL{a^Hj{@f3nvj3(>-7&Irg7hulw;3YERGhcnHcUtiv8hbtw-I4$y}jF5g{yNJ-%_SN)RKmje z+=9shHGp9ODYBD>6coe7Pd3~q#a*Y~@}qoDPJ;8GOPD;vEE+N!S@^J17R^347ON1l z=+!sXR1<)m_>m6txsa7FW3|ccaA@dMmALv~`bh?wE5Mr0r~imhd|XoLwml7 zw}$D3IE?E+X8`}6-g5vj>2f=BQD8w40cbl`Fb!xGyjALbc6p|6YRY}J(Jgl}Ftt2h z;UC&H%411pQ6tPx9&!xswKoHt@CyA_b6xktsza0#n&Q&&_zT=r6G3+Ee}v zJ0an8r)qOwm*|K>OYQH|V*)Mggl!ck6|!v^!=YExSI~ccf7|rTt6d05BmlW}#u>O* zy)^>o`KUDfDMiEIzb!0h?D&<*7|di9(l^ns(YjTx(bm`S!q!4HOS9Z3DH~`E4JS2+ zB`x~MC}3W4sVTjk7V0FBSYRr(F;W*2tgnv zF9xhnK|3=!t(GpNEdwmwL1SUU|9JGrJ>5Z#wk<%k2Wf-e$4&mpF}@Y?Pmg8g_gB2D zJ=Rz$0qK8xeuH3FOtBzT0C3#U4~o<{VN zNCfmI4lue)Uq}JaUGs9l|HI-H!}A0dQ!I=0aM}`O*F0uky^ zMBa40s+SlQklY-I8R;U~sRzsRx`i)$@T06(ZUC&2?5O`3Fp}X0RS1*A?~zX)Vdd}3 z_|K%K1z0=8kQHCmj!y_pUNnCpP#`CfNCzN>0KMk3kuTxi6{nQu(3=QuDGT(nmV`J!7yw# zQAGqfc0E`*>U^GcTLA{DZRgLvWzqyt2WsaHKz;KjQJey1Aism^-VRDUSX4DAI#MJH zmc`1fb~D}zU#_NCC??%$F=^`RZb@=!0j7caRM{}wzwuN4YHi{U|5=sckKAlM=L|z@ z<1{)HqgtFKx+d-~xC_1HO35XHE&sF4FcvkQ|7Q~M>)_i}Z_Onh6vAPxC0 zzWd0G)o%2`kLk3PX($jff#EC~@zR)W)v9@C$~MV+?R + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXGtT2zhcdTAwMTf+3l/hyX5535mNV/fLftlcdIFcdTAwMDKFXinQ7bLDmMRJXGaJndpcdTAwMGVcdTAwMDF2+t/3yEDs2Fx1MDAwZdhcdTAwMTBaulxydDogybF0dJ5HzzmS+OeFZTXiy7Hb+N1quFx1MDAxN1x1MDAxZGfodUNn2vjVlJ+7YeRcdTAwMDU+VJHk9yiYhJ2k5SCOx9Hvv/2WPmF3gtH1U+7QXHUwMDFkuX5cdTAwMWNBu7/gd8v6J/lcdTAwMWZqvK55tvWa8d2dXHUwMDE2XHUwMDE2XHUwMDFmz1x1MDAwZTc/XHUwMDBmxcln1jlMXHUwMDFlTVx1MDAxYd12JnYv4rT0XHUwMDAyijBW3NZcdTAwMTRcdTAwMTGNXHRcdTAwMTNcYolZ7SXUNlx1MDAwNaW2UJpRxTQlgpFZ9dTrxlx1MDAwM2jCXHSytVx1MDAxMEIyhZhQks9aXGZcXK8/iKGJRrMyx+9cdTAwMGZNT9KSKFx1MDAwZYMzt1x1MDAxZFxmg9D08Fx1MDAxN6wl7pC0kydO56xcdTAwMWZcdTAwMDZcdTAwMTO/O2tcdTAwMTOHjlx1MDAxZo2dXHUwMDEwXGaStut5w+FefJl8eqNcdTAwMTNcdTAwMDZR1Fx1MDAxYzhxZ9DIvenwpt8kVz57NlxuwPjpU/Dq/sB3I2N6PCtccsZOx4uNiTBKx2L6Od7uJrP0d9qz0Fx1MDAxObnbZpr8yXA4K/b8rmtmoHHS/jz3Or9787q55pHrdpP50lhihmg6UalHMYzzpW9cdTAwMDI/8S7MqWBYaZ6O24vWwa3i5GN7zjByU5ubTmxkXFwuXHUwMDFkzGTcda5cdTAwMWbBkjNk5l1wJGf1Q88/y3d9XHUwMDE4dM5K3pI4I4yf2NZ+5FqOXHUwMDA13j6a+GBWy1x1MDAxYjl9KPG7R77T7UJVz51aYPIzKI6sS4BM5Fx1MDAwZXuZyVx1MDAwZvx4z7syXHUwMDAzzVx1MDAxOMaUvnRG3tDMXHUwMDEzn3tva+j1/cRTYIhu2MiaLfZcdTAwMDB/s1x1MDAwNnEwTms78ImO57thcTqD0Ot7vjP8uLxROZM4+OBG1+OKw4mbtbK7dVx1MDAwYi9sXHUwMDEznlR8/bWMXHUwMDFh0FaTr13wkK5cdTAwMTF5PI1aXHUwMDFk/2xzUIlcdTAwMWEkXHUwMDA3aDOtXHRcdTAwMTGEa6HUXHUwMDFjN8BrJWOEXHUwMDEygjGWQlx1MDAxMlrgXHUwMDA2JqlNXHUwMDEwQphcdTAwMTAkXHUwMDExxaSEXHUwMDFjXHUwMDE4s1x1MDAxNUVSMsxcdTAwMDXlXFzrXHUwMDE1V9zJXHUwMDE1bnWuYERqirVCWe++pYpi6YwqMMWMKZiuZ0dcdTAwMTVsXHUwMDA2qklcdTAwMTRcdTAwMDcja900XHUwMDBmYTrdci7gtlx1MDAxMkxgWLo4UkzqetwwdHvxXHUwMDEzMEOVQSxcdTAwMDf6jow/Xenz12+mhExeue/w4EpcXFSBvoRFncOSr4T5ljr1hERcdTAwMTUoQmyJuKZcdTAwMWFWXHUwMDE1sGs6p7fIp0Tdi/yVLLhcdTAwMDfqvepQN3NcdTAwMDGerrLeeoN0rFx1MDAwYlJhhnRKJVx1MDAwNVmH01x1MDAxNs9cdTAwMDXpuLB8XHUwMDFl+SNcdTAwMDBYXHUwMDAysu71UrqM9f+JMF6v+8tBe1x1MDAxM1x1MDAxZl/izrvBhVx1MDAxY+lXUWvyYfdqp1pcZiCNypeYXG6uKFx1MDAwN5eYRztNXCJcdTAwMDSmtJScM8JYauFZXHUwMDEwwCQ0oZRpgTQti1x1MDAwMVhatlx1MDAwMntcdTAwMTnY+9XBTqiAf1x1MDAxMHCVoJ3jxWhHXHUwMDA0Zk8h/vzQTq/hXHUwMDEyuuOAdJPlXHUwMDEwgOP3vL5llsXoWVx1MDAwYv3KfV9cdTAwMGXKdfe9Opzuv/X7py2O1q9cdTAwMGWcXHUwMDAxqyTnuWS2XHUwMDEwXHUwMDA0c1D0SCqVi/QxwsImminMOaJUy6Kcx4wz2yxcdTAwMThSgPvh0lhcdTAwMWYjZXOKXHUwMDA1lrDsa4nq4d413z9cdTAwMTfuz2vE/lx1MDAwMDUuVEaXZ/S8YItwzzhcdTAwMDdeV1x1MDAxOcG/JNhLLlx1MDAxNcs6cV3YXHUwMDFmXHUwMDBlXFzfxMPWIJhacWBN5nFUXG57JWxFODgqXHUwMDE2XHUwMDE0wk4q51x1MDAxYX03XHUwMDE2qDyU5bBAu9V6e7DJd95yb1x1MDAxY269eeNNw1x1MDAwZnGltV5cdTAwMGJcdTAwMWKWcaVcdTAwMTSmjECcN89cdTAwMDKCKltwwWGl4Fx1MDAxMiORev1M2Uv4XHUwMDAwbJZcdTAwMTGlIfJcdTAwMTep/TNcdTAwMWOwXHUwMDAy/d2gv6pcdTAwMGV6xYUxNirA23QlXHUwMDEzVuVBz6hcdTAwMTKcPVxm9DdcdTAwMTWp12U8T223Q2ft02feP1x1MDAxOeJ+97jpnoZyNpw573PCMJg2ZjVfb366U0kgRVRcdTAwMTZcdTAwMTF1KWU9cKO5pJszXGZdp5uR34DSm0zc1ItcdTAwMDdWPHCPfNc/98LAN1x1MDAwNrC2LVx1MDAxZiz/Ryn5ZPr2XHUwMDFkg4tFY7RcdTAwMTZcdTAwMGbRunOEc5w0b9c6pHS3a+TcXCKnTaRccmzDXHUwMDE5MDrHmORcIlx1MDAxMFx1MDAwZaRP7mQlYDXEXHUwMDA0pYJRTFx1MDAxOCdpi5SVKIZ3gLqhmCtOUDqV93OUiyg8/lNx1DqqzlFcdTAwMTTMg1x1MDAxMOdlwlx1MDAwNFOaL51cdTAwMDUkQjGQXHUwMDEwiC2RpEpXvoyPrq+Ld63X59vki3yzSzq775zP/HM9jqKcZTywXHUwMDA2R41cdTAwMDMv3/e/Mj1E2e6i2c9//1raeqHHm6+Cr6efVlx1MDAxOODQieI2UIlcdTAwMTfDMN+ZLlx1MDAxNmY5dsJ4XHJcXMPz+1CX2vt2W3K7giZJKLMzMcNvXCJbMSEh0qDgNFx1MDAxMChcdTAwMTCRadV3xsalbEG5SS1SXHUwMDA1XHKxZvymxddZt1xcv5t2qtjhlqGZXHUwMDAx8GK+XHUwMDE2nsvW5fnIXHUwMDFknlx1MDAwNNOS2et5XHUwMDE3bnfP7d86YPGN29He2O14zrDkjfm6O2i03EUraDuBkS2JxJorolx1MDAwNUK5rC2nJidcdTAwMGJhoFx1MDAwNOlukFfUdlx1MDAxOGI3+FwiijBp8rZFXHUwMDE2pXWk3c9Im7g6bXJMXHUwMDAxXHUwMDAxVJTtz8h82S1pKq1cdTAwMTlFmD4kiTPXiVx1MDAwMrFcdTAwMDGHcP0gYrtcdTAwMTVffrBcZtV0b4w28rrd7GbJvHS6T4bk1VS208tcdM7WW/5GZ+1w9/j9x6smOT9jSO6UpGjKdFx1MDAxMFxiXHUwMDFkUMCcY0RcdMih1ELX0ZkkNlx1MDAxNVx1MDAxMPMymC/GSzI0SNtMXHUwMDEyqjVGXGbCMJl6SbrtwmwpzbZcZkZcdTAwMDTeUCtW+1x1MDAxOVx1MDAwMc1qJGhcdTAwMDBISmlJylx1MDAxME3RwmBccitMNDe76N9OXGKNOpung1x1MDAwMySba2jt6nCt31x1MDAxZWy8368thND3XHUwMDE3Qot93nw1XHUwMDBi7r5MKZRf5f+TeqTcUyrpXHUwMDExbVx1MDAwYqa5XHUwMDA0KYJcdM6sLVx0m0kqgUdBaUhoXCKB9FxudMa4XHJ+XHUwMDA2K1x1MDAxM3xcbsNcZpWw2UqP3ENfvMa+XHUwMDEyRlxuaUFKN5bwwvNcIsB5QiOe2XxeTn6ZY63Yo/TI5YKto28sSO7RXHUwMDAzeUFyufxNI+GdTrxcdTAwMGI92lx1MDAxZl9cdTAwMDbNabN9JdmmW1x0wkrZJlDTJjeniZw/XHUwMDAy1mRcdTAwMTRcdTAwMTBKMFxiXHUwMDEyXG7Ll9C0uDVcXCVfzGqdXHUwMDA0+fnyxeuqzqEvLlx1MDAwNFG87HwoxVx1MDAwYiVcYlWCXHUwMDEwpTP7OcvaXHUwMDFifnxG11x1MDAxY420TidRnOQtr89NXHUwMDFl+VBcdTAwMWQ66fFJk/Xsdr1cdTAwMTjGdOTHgTWFyc0mSZvFXHUwMDAzXHUwMDE4VtDrgVx1MDAxNZ53qrds8NbisVtlQ79/4MvKXHUwMDAwf9o48dvue/9L83iHRFx1MDAwM1x1MDAxMXD5qlLkg5FktkJMI8mJolKl50CvXHUwMDBmoXBkc0JcdFx1MDAxMlJiqUnGUVc54CfjXHUwMDFkXSP2XHUwMDAx6aAwXHUwMDA0pmXigVx1MDAxNrev0iQw4Vx1MDAxNCElXHUwMDFmdNr0YbGP77h73ulB0DrYabuv+jHa3Pv0549cdTAwMTj7fL8k8E9cdTAwMTH5lPtJXHUwMDA12Vx1MDAwNPa2uVZKcVBGiohcXOTDJLdhxiRcdTAwMDJlxYDQyCpcdTAwMTV7XbpcXPZq1WAvplx1MDAxNFZUs9Jt9sW3alx1MDAxNKZcdTAwMWHDXHUwMDFjL/uoPES8UqZcdTAwMTb4cXOxd1x1MDAwYoKnz8W+6TTHZ+/d5v7e8U4zPLhSk1x1MDAxZOVUVCSKQuyDNMQsmuusWLiJfYRcctRcdTAwMGKBr4lraObiyipcdTAwMWL7dJheq3NcXE4hUIyKlWVjs5dcdTAwMTbyoNaSS6Qp+Ybb0uz05YHwxl+i9eNX3NP6+HR9d+1HVCSrbOxcdTAwMTNrknJPqaJJwPagXHUwMDEwXHTXXHUwMDFhXFyFsVx1MDAxY51BpFx1MDAwZVx1MDAxM6fMTV/KOJfFm76rbOzj6atdR5JQyjVeIElcdTAwMTbHU0poxmGal33K//GS5JmkY++RXHUwMDA03yBcdTAwMWT7crTzct+9XHUwMDFjf9KdU7nzdrI/7cheXHUwMDE1XGZjWJtsXG7LmjLHpijLneEnXHUwMDEy20zBmiekolx1MDAxNDNRsqVCXHUwMDA0wFx1MDAxY1x1MDAxMagkSPOM6WcgJniVjr1cdTAwMWLF6zVQXGZcdTAwMGKiJKAhy0SIXCI6X5pezTNcdTAwMTexXHUwMDE0fdiW8JMmZNuOn1xcVp87U3riXHUwMDFlgX16SY7x5LLkNsyRn1xch/njyD/y/1x1MDAwN8ZJTqVCi8jqXHUwMDA14XXK0ouO/DE4gncydP//jJOyXHUwMDBiXGZg3Tl+q8LwrZLRLykz+6559frjZGvDoZ2Atz+J18c0qHY21yTobFx1MDAwNdJAIFxy2oDnL1x1MDAwM2NGbESSXHKg5Kp1ybmyVWZ26Vx1MDAxNLRR41x1MDAwNoHknIDeK0vMsjtO55o/yaA4Z1x1MDAwZtpcdTAwMTJ6WFx1MDAxODTdOt9cdTAwMWRv7+x92DrF28fb76fxZVx1MDAxMNRcboNcdTAwMDTEbplbXHUwMDExq8TsfzJcYir3kypcdTAwMDJcbjjMNlaXhGmE8kdSsFx1MDAwNqrjVJgjXFxcdTAwMDRcdTAwMGJdXGaCVnnZx3PXy1x1MDAxYfLJbPlJVbzUbOpcdTAwMTZuZif5OKXRsjezhaSMPuqi8/PIyt4jXHUwMDA2nj4rO8CbXHUwMDFmRu1h72PbR9Pp26u1XrBcdTAwMWZVVCOU2Vx1MDAxMOIoiGE41ihcdTAwMDdgQlx1MDAwMN6UXHUwMDExZFx1MDAwZVTybI5ilZR9OkBvVlx1MDAwN7TAXHUwMDE0NFx1MDAwNS69wyzQwr9dIFx1MDAxNFx1MDAxN1x1MDAxMEOhXHUwMDA3nTF7mFx1MDAxNkG7W293d3u9zY3+3p8x3/OizpfLXHUwMDFmUYusUrJPrEbKPaWKXHUwMDFhwUja5swlXHUwMDEzQmGJdO68P4W5XHUwMDAxlcKIZIogpnExtFolZVx1MDAxZk9fWzXoXHUwMDBigaVcdTAwMTWSpTdcdTAwMWRcdTAwMGJcdTAwMDHWLXtprrRcdTAwMTT8XHUwMDE56pFnkpK9R1x1MDAwZiw3JfvihtFcdTAwMWHOeLxcdTAwMTeDRVx1MDAxYrd3XHUwMDFhXHUwMDFi5547XSt6/C+95MuQf8JcdTAwMDCN67/sXHUwMDAyj3198fVf2zvMXHUwMDEwIn0=2. Use a community image andadd a few packages yourself4. Use a custom Dockerfile1. Use a communitymaintained image3. Use repo2docker config filesWhen and how to use repo2dockerDoes a community alreadymaintain an image with theenvironment I need?noyesDo you just need a fewextra packages in additionto what a community-maintained image offers?noyesCan your environment bedefined by repo2docker configfiles?(see the docs for what ispossible)noyes \ No newline at end of file diff --git a/docs/source/architecture.md b/docs/source/architecture.md index 2d14daf36..40e91a4c3 100644 --- a/docs/source/architecture.md +++ b/docs/source/architecture.md @@ -20,11 +20,11 @@ with explicit **versions** is all that is needed. In repo2docker, a Buildpack does the following things: 1. **Detect** if it can handle a given repository -2. **Build** a base language environment in the docker image -3. **Copy** the contents of the repository into the docker image -4. **Assemble** a specific environment in the docker image based on repository contents -5. **Push** the built docker image to a specific docker registry (optional) -6. **Run** the build docker image as a docker container (optional) +2. **Build** a base language environment in the Docker image +3. **Copy** the contents of the repository into the Docker image +4. **Assemble** a specific environment in the Docker image based on repository contents +5. **Push** the built Docker image to a specific Docker registry (optional) +6. **Run** the build Docker image as a Docker container (optional) ### Detect @@ -56,15 +56,15 @@ repositories built with the same buildpack. For example, in `CondaBuildPack`, the base environment consists of installing [miniconda](https://conda.io/miniconda.html) and basic notebook packages (from `repo2docker/buildpacks/conda/environment.yml`). This is going to be the same for most repositories built with `CondaBuildPack`, so we want to use -[docker layer caching](https://thenewstack.io/understanding-the-docker-cache-for-faster-builds/) as +[Docker layer caching](https://thenewstack.io/understanding-the-docker-cache-for-faster-builds/) as much as possible for performance reasons. Next time a repository is built with `CondaBuildPack`, -we can skip straight to the **copy** step (since the base environment docker image _layers_ have +we can skip straight to the **copy** step (since the base environment Docker image _layers_ have already been built and cached). The `get_build_scripts` and `get_build_script_files` methods are primarily used for this. `get_build_scripts` can return arbitrary bash script lines that can be run as different users, and `get_build_script_files` is used to copy specific scripts (such as a conda installer) into -the image to be run as pat of `get_build_scripts`. Code in either has following constraints: +the image to be run as part of `get_build_scripts`. Code in either has following constraints: 1. You can _not_ use the contents of repository in them, since this happens before the repository is copied into the image. For example, `pip install -r requirements.txt` will not work, @@ -91,22 +91,20 @@ This usually means installing required libraries specified in a format native to Most of this work is done in `get_assemble_scripts` method. It can return arbitrary bash script lines that can be run as different users, and has access to the repository contents (unlike -`get_build_scripts`). The docker image layers produced by this usually can not be cached, +`get_build_scripts`). The Docker image layers produced by this usually can not be cached, so less restrictions apply to this than to `get_build_scripts`. -At the end of the assemble step, the docker image is ready to be used in various ways! +At the end of the assemble step, the Docker image is ready to be used in various ways! ### Push -Optionally, repo2docker can **push** a built image to a [docker registry](https://docs.docker.com/registry/), +Optionally, repo2docker can **push** a built image to a [Docker registry](https://docs.docker.com/registry/), if you specify the `--push` flag. ### Run -Optionally, repo2docker can **run** the built image and allow the user to access the Jupyter Notebook -running inside by default. This is also done as a convenience only (since you can do the same with `docker run` -after using repo2docker only to build), and implemented in `Repo2Docker.run`. It is activated by default -unless the `--no-run` commandline flag is passed. +Optionally, repo2docker can **run** the built image and allow the user to access the Jupyter Notebook running inside by default. +This is also done as a convenience only (since you can do the same with `docker run` after using repo2docker only to build), and implemented in `Repo2Docker.run`. It is activated by default unless the `--no-run` commandline flag is passed. ## ContentProviders diff --git a/docs/source/changelog.md b/docs/source/changelog.md index 58cef1cff..dc415acab 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -134,7 +134,7 @@ - pre-commit update to fix ci [#1238](https://github.com/jupyterhub/repo2docker/pull/1238) ([@minrk](https://github.com/minrk)) - Upgrade to mamba 1.1 and enable rich SAT error messages [#1232](https://github.com/jupyterhub/repo2docker/pull/1232) ([@SylvainCorlay](https://github.com/SylvainCorlay)) - Upgrade to mamba 1.0 [#1213](https://github.com/jupyterhub/repo2docker/pull/1213) ([@SylvainCorlay](https://github.com/SylvainCorlay)) -- docker image: update alpine to 3.16 [#1212](https://github.com/jupyterhub/repo2docker/pull/1212) ([@consideRatio](https://github.com/consideRatio)) +- Docker image: update alpine to 3.16 [#1212](https://github.com/jupyterhub/repo2docker/pull/1212) ([@consideRatio](https://github.com/consideRatio)) - reconcile CLI/config priority [#1211](https://github.com/jupyterhub/repo2docker/pull/1211) ([@minrk](https://github.com/minrk)) - pipfile: pass --clear flag, and do it separetely to not be ignored [#1208](https://github.com/jupyterhub/repo2docker/pull/1208) ([@consideRatio](https://github.com/consideRatio)) - run submodule test over https [#1204](https://github.com/jupyterhub/repo2docker/pull/1204) ([@minrk](https://github.com/minrk)) @@ -299,12 +299,12 @@ The repo2docker container image has moved to [quay.io/jupyterhub/repo2docker](ht - Workaround docker-py dependency's failure to import six {pr}`1066:` by {user}`consideratio` - fix: add chardet, a not explicitly declared dependency {pr}`1064` by {user}`johnhoman` -- Add build-base to build stage of docker image {pr}`1051` by {user}`yuvipanda` +- Add build-base to build stage of Docker image {pr}`1051` by {user}`yuvipanda` - Fix regression in hydroshare introduced after moving to requests {pr}`1034` by {user}`MridulS` ### Other merged PRs -- Update README quay.io URL, Add docker latest tag {pr}`1075` by {user}`manics` +- Update README quay.io URL, add Docker latest tag {pr}`1075` by {user}`manics` - GitHub workflow build and push to Docker hub {pr}`1071` by {user}`manics` - Rename master branch to main {pr}`1068` by {user}`manics` - Remove Pipfile & Pipfile.lock {pr}`1054` by {user}`yuvipanda` @@ -343,7 +343,7 @@ The repo2docker container image has moved to [quay.io/jupyterhub/repo2docker](ht ### Other merged PRs - Cleanup install_requires including duplicates {pr}`1020` by {user}`manics` -- bump docker action version {pr}`1018` by {user}`minrk` +- bump Docker action version {pr}`1018` by {user}`minrk` - bump python in circleci test {pr}`1013` by {user}`minrk` - Investigating the missing logs {pr}`1008` by {user}`betatim` - Experiment with different install mechanism to get code coverage stats again {pr}`982` by {user}`betatim` @@ -376,7 +376,7 @@ The repo2docker container image has moved to [quay.io/jupyterhub/repo2docker](ht - chmod start script from repo2docker-entrypoint {pr}`886` by {user}`danlester` - pypi jupyter-offlinenotebook==0.1.0 {pr}`880` by {user}`manics` - Add support for Julia 1.4.1 {pr}`878` by {user}`davidanthoff` -- Change --env option to work like docker's {pr}`874` by {user}`hwine` +- Change --env option to work like Docker's {pr}`874` by {user}`hwine` - Add support for Julia 1.4.0 {pr}`870` by {user}`davidanthoff` - Update server proxy and rsession proxy {pr}`869` by {user}`betatim` - Use miniforge instead of miniconda to get conda {pr}`859` by {user}`yuvipanda` @@ -549,7 +549,7 @@ Release date: 2019-02-21 ### New features -- Add additional metadata to docker images about how they were built {pr}`500` by +- Add additional metadata to Docker images about how they were built {pr}`500` by {user}`jrbourbeau`. - Allow users to install global NPM packages: {pr}`573` by {user}`GladysNalvarte`. - Add documentation on switching the user interface presented by a @@ -579,7 +579,7 @@ Release date: 2019-02-21 - Fix quoting issue in `GIT_CREDENTIAL_ENV` environment variable by {user}`minrk` in {pr}`572`. - Change to using the first 8 characters of each Git commit, not the last 8, - to tag each built docker image of repo2docker itself. {user}`minrk` in {pr}`562`. + to tag each built Docker image of repo2docker itself. {user}`minrk` in {pr}`562`. - Allow users to select the Julia when using a `requirements.txt` by {user}`yuvipanda` in {pr}`557`. - Set `JULIA_DEPOT_PATH` to install packages outside the home directory by diff --git a/docs/source/cli.md b/docs/source/cli.md new file mode 100644 index 000000000..ac60bda8e --- /dev/null +++ b/docs/source/cli.md @@ -0,0 +1,87 @@ +# Command-line usage and API + +`repo2docker` is called with this command: + +``` +jupyter-repo2docker +``` + +where `` is a repository in one of [the supported repository providers](#repository-providers). + +For example, the following command will build an image of Peter Norvig's +[Pytudes] repository: + +``` +jupyter-repo2docker https://github.com/norvig/pytudes +``` + +Building the image may take a few minutes. + +[Pytudes] uses a [`requirements.txt` file](https://github.com/norvig/pytudes/blob/HEAD/requirements.txt) to specify its Python environment. Because of this, `repo2docker` will use `pip` to install dependencies listed in this `requirements.txt` file, and these will be present in the generated Docker image. To learn more about configuration files in `repo2docker` visit [](#config-files). + +When the image is built, a message will be output to your terminal: + +``` +Copy/paste this URL into your browser when you connect for the first time, +to login with a token: + http://0.0.0.0:36511/?token=f94f8fabb92e22f5bfab116c382b4707fc2cade56ad1ace0 +``` + +Pasting the URL into your browser will open Jupyter Notebook with the +dependencies and contents of the source repository in the built image. + +## Debug repo2docker with `--debug` and `--no-build` + +To debug the container image being built, pass the `--debug` parameter: + +> ```bash +> jupyter-repo2docker --debug https://github.com/norvig/pytudes +> ``` + +This will print the generated `Dockerfile`, build it, and run it. + +To see the generated `Dockerfile` without actually building it, pass `--no-build` to the commandline. +This `Dockerfile` output is for **debugging purposes** of `repo2docker` only - it can not be used by Docker directly. + +> ```bash +> jupyter-repo2docker --no-build --debug https://github.com/norvig/pytudes +> ``` + +## Build from a branch, commit or tag + +To build a particular branch and commit, use the argument `--ref` and +specify the `branch-name` or `commit-hash`. For example: + +``` +jupyter-repo2docker --ref 9ced85dd9a84859d0767369e58f33912a214a3cf https://github.com/norvig/pytudes +``` + +:::{tip} +For reproducible builds, we recommend specifying a commit-hash to +deterministically build a fixed version of a repository. Not specifying a +commit-hash will result in the latest commit of the repository being built. +::: + +## Set environment variables during builds + +When running repo2docker locally you can use the `-e` or `--env` command-line +flag for each variable that you want to define. + +For example: + +```bash +jupyter-repo2docker -e VAR1=val1 -e VAR2=val2 ... +``` + +You can also configure environment variables for all users of a repository using the +[](#config-start) configuration file. + +(command-line-api)= + +## Command-line API + +```{autoprogram} repo2docker.__main__:argparser +:prog: jupyter-repo2docker +``` + +[pytudes]: https://github.com/norvig/pytudes diff --git a/docs/source/conf.py b/docs/source/conf.py index 2dcb08615..590400c75 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -22,6 +22,7 @@ "sphinxcontrib.autoprogram", "sphinxext.opengraph", "sphinxext.rediraffe", + "sphinx_design", ] root_doc = "index" source_suffix = [".md", ".rst"] @@ -40,6 +41,7 @@ # myst_enable_extensions = [ "colon_fence", + "substitution", ] @@ -58,8 +60,11 @@ from repo2docker.buildpacks.conda import CondaBuildPack -default_python = CondaBuildPack.major_pythons["3"] - +default_python = f"`Python {CondaBuildPack.major_pythons['3']}`" +myst_substitutions = { + "default_python": default_python, + "default_python_version": default_python, +} rst_prolog = f""" .. |default_python| replace:: **Python {default_python}** .. |default_python_version| replace:: {default_python} @@ -73,12 +78,20 @@ html_favicon = "_static/images/favicon.ico" html_static_path = ["_static"] html_css_files = ["custom.css"] +html_sidebars = { + "changelog": [], + "start": [], +} # pydata_sphinx_theme reference: https://pydata-sphinx-theme.readthedocs.io/en/latest/ html_theme = "pydata_sphinx_theme" html_theme_options = { "use_edit_page_button": True, "github_url": "https://github.com/jupyterhub/repo2docker", + "logo": { + "image_dark": "_static/images/logo-dark.png", + "image_light": "_static/images/logo.png", + }, } html_context = { "github_user": "jupyterhub", diff --git a/docs/source/config_files.rst b/docs/source/config_files.rst deleted file mode 100644 index 975f82c85..000000000 --- a/docs/source/config_files.rst +++ /dev/null @@ -1,245 +0,0 @@ -.. _config-files: - -=================== -Configuration Files -=================== - -``repo2docker`` looks for configuration files in the repository being built -to determine how to build it. In general, ``repo2docker`` uses the same -configuration files as other software installation tools, -rather than creating new custom configuration files. - -A number of ``repo2docker`` configuration files can be combined to compose more -complex setups. - -The `binder examples `_ organization on -GitHub contains a list of sample repositories for common configurations -that ``repo2docker`` can build with various configuration files such as -Python and R installation in a repository. - -A list of supported configuration files (roughly in the order of build priority) -can be found on this page (and to the right). - -.. _environment.yml: - -``environment.yml`` - Install a conda environment -================================================= - -``environment.yml`` is the standard configuration file used by `conda `_ -that lets you install any kind of package, -including Python, R, and C/C++ packages. -``repo2docker`` does not use your ``environment.yml`` to create and activate a new conda environment. -Rather, it updates a base conda environment `defined here `_ with the packages listed in your ``environment.yml``. -This means that the environment will always have the same default name, not the name -specified in your ``environment.yml``. - -.. note:: - - You can install files from pip in your ``environment.yml`` as well. - For example, see the `binder-examples environment.yml - `_ - file. - -You can also specify which Python version to install in your built environment -with ``environment.yml``. By default, ``repo2docker`` installs -|default_python| with your ``environment.yml`` unless you include the version of -Python in this file. ``conda`` Should support all versions of Python, -though ``repo2docker`` support is best with Python 3.7-3.11. - -.. warning:: - If you include a Python version in a ``runtime.txt`` file in addition to your - ``environment.yml``, your ``runtime.txt`` will be ignored. - -.. _Pipfile: - -``Pipfile`` and/or ``Pipfile.lock`` - Install a Python environment -================================================================== - -`pipenv `_ allows you to manage a virtual -environment Python dependencies. When using ``pipenv``, you end up with -``Pipfile`` and ``Pipfile.lock`` files. The lock file contains explicit details -about the packages that has been installed that met the criteria within the -``Pipfile``. - -If both ``Pipfile`` and ``Pipfile.lock`` are found by repo2docker, the former -will be ignored in favor of the lock file. Also note that these files -distinguish packages and development packages and that repo2docker will install -both kinds. - -.. _requirements.txt: - -``requirements.txt`` - Install a Python environment -=================================================== - -This specifies a list of Python packages that should be installed in your -environment. Our -`requirements.txt example `_ -on GitHub shows a typical requirements file. - - -.. _setup.py: - -``setup.py`` - Install Python packages -====================================== - -To install your repository like a Python package, you may include a -``setup.py`` file. repo2docker installs ``setup.py`` files by running -``pip install -e .``. - -.. _Project.toml: - -``Project.toml`` - Install a Julia environment -============================================== - -A ``Project.toml`` (or ``JuliaProject.toml``) file can specify both the -version of Julia to be used and a list of Julia packages to be installed. -If a ``Manifest.toml`` is present, it will determine the exact versions -of the Julia packages that are installed. - - -.. _REQUIRE: - -``REQUIRE`` - Install a Julia environment (legacy) -================================================== - -``REQUIRE`` files no longer work, and are no longer supported. -The recommended way of installing a Julia environment is to use a ``Project.toml`` file. - - -.. _install.R: - -``install.R`` - Install an R/RStudio environment -================================================ - -This is used to install R libraries pinned to a specific snapshot on -`Posit Package Manager `_. -To set the date of the snapshot add a runtime.txt_. -For an example ``install.R`` file, visit our `example install.R file `_. - - -.. _apt.txt: - -``apt.txt`` - Install packages with apt-get -=========================================== - -A list of Debian packages that should be installed. The base image used is usually the latest released -version of Ubuntu. - -We use ``apt.txt``, for example, to install LaTeX in our -`example apt.txt for LaTeX `_. - - -.. _DESCRIPTION: - -``DESCRIPTION`` - Install an R package -====================================== - -To install your repository like an R package, you may include a -``DESCRIPTION`` file. repo2docker installs the package and dependencies -from the ``DESCRIPTION`` by running ``devtools::install_local(getwd())``. - -You can also have have a ``runtime.txt`` file that is formatted as -``r---
``, where YYYY-MM-DD is a snapshot of CRAN that will be used -for your R installation. If ``runtime.txt`` isn't provided in this case, a -recent date will be used. - - -.. _postBuild: - -``postBuild`` - Run code after installing the environment -========================================================= - -A script that can contain arbitrary commands to be run after the whole repository has been built. If you -want this to be a shell script, make sure the first line is ``#!/bin/bash``. - -Note that by default the build will not be stopped if an error occurs inside a shell script. -You should include ``set -e`` or the equivalent at the start of the script to avoid errors being silently ignored. - -An example use-case of ``postBuild`` file is JupyterLab's demo on mybinder.org. -It uses a ``postBuild`` file in a folder called ``.binder`` to `prepare -their demo for binder `_. - - -.. _start: - -``start`` - Run code before the user sessions starts -==================================================== - -A script that can contain simple commands to be run at runtime (as an -`ENTRYPOINT `_ -to the docker container). If you want this to be a shell script, make sure the -first line is ``#!/bin/bash``. The last line must be ``exec "$@"`` -or equivalent. - -Use this to set environment variables that software installed in your container -expects to be set. This script is executed each time your binder is started and -should at most take a few seconds to run. - -If you only need to run things once during the build phase use :ref:`postBuild`. - - -.. TODO: Discuss runtime limits, best practices, etc. - -.. _runtime.txt: - -``runtime.txt`` - Specifying runtimes -===================================== - -Sometimes you want to specify the version of the runtime -(e.g. the version of Python or R), -but the environment specification format will not let you specify this information -(e.g. requirements.txt or install.R). -For these cases, we have a special file, ``runtime.txt``. - -.. note:: - - ``runtime.txt`` is only supported when used with environment specifications - that do not already support specifying the runtime - (when using ``environment.yml`` for conda or ``Project.toml`` for Julia, - ``runtime.txt`` will be ignored). - -Have ``python-x.y`` in ``runtime.txt`` to run the repository with Python version x.y. -See our `Python2 example repository `_. - -Have ``r----
`` in ``runtime.txt`` to run the repository with R version RVERSION and libraries from a YYYY-MM-DD snapshot of `Posit Package Manager `__. -RVERSION can be set to 3.4, 3.5, 3.6, or to patch releases for the 3.5 and 3.6 series. -If you do not specify a version, the latest release will be used (currently R 3.6). -See our `R example repository `_. - -.. _default.nix: - -``default.nix`` - the nix package manager -========================================= - -Specify packages to be installed by the `nix package manager `_. -When you use this config file all other configuration files (like ``requirements.txt``) -that specify packages are ignored. When using ``nix`` you have to specify all -packages and dependencies explicitly, including the Jupyter notebook package that -repo2docker expects to be installed. If you do not install Jupyter explicitly -repo2docker will no be able to start your container. - -`nix-shell `_ is used to evaluate -a ``nix`` expression written in a ``default.nix`` file. Make sure to -`pin your nixpkgs `_ -to produce a reproducible environment. - -To see an example repository visit -`nix binder example `_. - - -.. _dockerfile: - -``Dockerfile`` - Advanced environments -====================================== - -In the majority of cases, providing your own Dockerfile is not necessary as the base -images provide core functionality, compact image sizes, and efficient builds. We recommend -trying the other configuration files before deciding to use your own Dockerfile. - -With Dockerfiles, a regular Docker build will be performed. - -.. note:: - If a Dockerfile is present, all other configuration files will be ignored. - -See the `Advanced Binder Documentation `_ for -best-practices with Dockerfiles. diff --git a/docs/source/configuration/actions.md b/docs/source/configuration/actions.md new file mode 100644 index 000000000..a441893da --- /dev/null +++ b/docs/source/configuration/actions.md @@ -0,0 +1,39 @@ +# Configuration files for post-build actions + +These files control behavior that happens _after_ the image is initially built (AKA, after the packages and languages have been installed). It's useful if you need to ensure files are in a particular place, or certain commands are run when a new session launches. + +:::{note} +After building the image, all actions are run as a user named `jovyan`. +You do not have root permissions on the machine! + +See [the Jupyter Docker Stacks definition of `jovyan`](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/faq.html#who-is-jovyan) for more details. +::: + +(postbuild)= + +## `postBuild` - Run code after installing the environment + +A script that can contain arbitrary commands to be run after the whole repository has been built. If you want this to be a shell script, make sure the first line is `#!/bin/bash`. + +Note that by default the build will not be stopped if an error occurs inside a shell script. +You should include `set -e` or the equivalent at the start of the script to avoid errors being silently ignored. + +An example use-case of `postBuild` file is JupyterLab's demo on mybinder.org. +It uses a `postBuild` file in a folder called `.binder` to [prepare +their demo for binder](https://github.com/jupyterlab/jupyterlab-demo/blob/HEAD/.binder/postBuild). + +(config-start)= + +## `start` - Run code before the user sessions starts + +A script that can contain simple commands to be run at runtime (as an +[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint) +to the Docker container). If you want this to be a shell script, make sure the first line is `#!/bin/bash`. The last line must be `exec "$@"` or equivalent. + +Use this to set environment variables that software installed in your container +expects to be set. This script is executed each time your binder is started and +should at most take a few seconds to run. + +If you only need to run things once during the build phase use [](#postBuild). + +% TODO: Discuss runtime limits, best practices, etc. diff --git a/docs/source/configuration/development.md b/docs/source/configuration/development.md new file mode 100644 index 000000000..1084303c1 --- /dev/null +++ b/docs/source/configuration/development.md @@ -0,0 +1,33 @@ +# Configuration files for software development workflows + +(pipfile)= + +## `Pipfile` and/or `Pipfile.lock` - Install a Python environment + +[pipenv](https://github.com/pypa/pipenv/) allows you to manage a virtual +environment Python dependencies. When using `pipenv`, you end up with +`Pipfile` and `Pipfile.lock` files. The lock file contains explicit details +about the packages that has been installed that met the criteria within the +`Pipfile`. + +If both `Pipfile` and `Pipfile.lock` are found by `repo2docker`, the former +will be ignored in favor of the lock file. Also note that these files +distinguish packages and development packages and that `repo2docker` will install +both kinds. + +(requirements-txt)= + +## `requirements.txt` - Install a Python environment + +This specifies a list of Python packages that should be installed in your +environment. Our +[requirements.txt example](https://github.com/binder-examples/requirements/blob/HEAD/requirements.txt) +on GitHub shows a typical requirements file. + +(setup-py)= + +## `setup.py` - Install Python packages + +To install your repository like a Python package, you may include a +`setup.py` file. `repo2docker` installs `setup.py` files by running +`pip install -e .`. diff --git a/docs/source/configuration/index.md b/docs/source/configuration/index.md new file mode 100644 index 000000000..c64189d8c --- /dev/null +++ b/docs/source/configuration/index.md @@ -0,0 +1,26 @@ +(config-files)= + +# Configuration files supported by repo2docker + +`repo2docker` looks for configuration files in the repository being built +to determine how to build it. In general, `repo2docker` uses the same +configuration files as other software installation tools, +rather than creating new custom configuration files. + +:::{seealso} +The [binder examples](https://github.com/binder-examples) organization on +GitHub contains a list of sample repositories for common configurations +that `repo2docker` can build with various configuration files such as +Python and R installation in a repository. +::: + +A list of supported configuration files (roughly in the order of build priority) +can be found on this page (and to the right). + +```{toctree} +:maxdepth: 2 +./research +./development +./system +./actions +``` diff --git a/docs/source/configuration/index.rst b/docs/source/configuration/index.rst deleted file mode 100644 index de8e579e3..000000000 --- a/docs/source/configuration/index.rst +++ /dev/null @@ -1,15 +0,0 @@ -=========================== -Configuring your repository -=========================== - -Information about configuring your repository to work with repo2docker, -and controlling elements of the built environment using configuration files. - -For information on where to put your configuration files see :ref:`usage-config-file-location`. - -.. toctree:: - :maxdepth: 2 - :caption: Complete list of configuration files - - ../config_files - ../specification diff --git a/docs/source/configuration/research.md b/docs/source/configuration/research.md new file mode 100644 index 000000000..0df6d4a85 --- /dev/null +++ b/docs/source/configuration/research.md @@ -0,0 +1,66 @@ +# Configuration for research and data science workflows + +(environment-yml)= + +## `environment.yml` - Install a conda environment + +`environment.yml` is the standard configuration file used by [conda](https://conda.io) +that lets you install any kind of package, +including Python, R, and C/C++ packages. +`repo2docker` does not use your `environment.yml` to create and activate a new conda environment. +Rather, it updates a base conda environment [defined here](https://github.com/jupyterhub/repo2docker/blob/HEAD/repo2docker/buildpacks/conda/environment.yml) with the packages listed in your `environment.yml`. +This means that the environment will always have the same default name, not the name +specified in your `environment.yml`. + +:::{note} +You can install files from pip in your `environment.yml` as well. +For example, see the [binder-examples environment.yml](https://github.com/binder-examples/python-conda_pip/blob/HEAD/environment.yml) file. See [the `conda` environment management instructions](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-file-manually) for more information. +::: + +You can also specify which Python version to install in your built environment with `environment.yml`. +By default, `repo2docker` installs {{ default_python }} with your `environment.yml` unless you include the version of Python in the `environment.yml` of your Git repository. +`conda` should support all versions of Python, though `repo2docker` support is best with `Python 3.7-3.11`. + +:::{warning} +If you include a Python version in a `runtime.txt` file in addition to your +`environment.yml`, your `runtime.txt` will be ignored. +::: + +(install-r)= + +## `install.R` - Install packages with R/RStudio + +This is used to install R libraries pinned to a specific snapshot on +[Posit Package Manager](https://packagemanager.posit.co/). +For an example `install.R` file, visit our [example `install.R` file](https://github.com/binder-examples/r/blob/HEAD/install.R). + +To set the date of the snapshot, or to specify a specific version of R, add a [runtime.txt](#runtime-txt). + +(description)= + +## `DESCRIPTION` - Install an R package + +To install your repository like an R package, you may include a `DESCRIPTION` file. +`repo2docker` installs the package and dependencies from the `DESCRIPTION` by running `devtools::install_local(getwd())`. + +To define the date of the package manager snapshot, add a line to [`runtime.txt`](#runtime-txt) like so: + +``` +r---
+``` + +Where `YYYY-MM-DD` is a snapshot of [CRAN](https://cran.r-project.org/) that will be used for your R installation. +If `runtime.txt` isn't provided in this case, the most recent date on CRAN will be used. + +(project-toml)= + +## `Project.toml` - Install a Julia environment + +A `Project.toml` (or `JuliaProject.toml`) file can specify both the +version of Julia to be used and a list of Julia packages to be installed. +If a `Manifest.toml` is present, it will determine the exact versions +of the Julia packages that are installed. + +:::{admonition} `REQUIRE` files are no longer supported +The recommended way of installing a Julia environment is to use a `Project.toml` file. +::: diff --git a/docs/source/configuration/system.md b/docs/source/configuration/system.md new file mode 100644 index 000000000..b3f5f9626 --- /dev/null +++ b/docs/source/configuration/system.md @@ -0,0 +1,72 @@ +# System-wide configuration + +(apt-txt)= + +## `apt.txt` - Install packages with apt-get + +A list of Debian packages that should be installed. The base image used is usually the latest released +version of Ubuntu. + +We use `apt.txt`, for example, to install LaTeX in our +[example apt.txt for LaTeX](https://github.com/binder-examples/latex/blob/HEAD/apt.txt). + +(runtime-txt)= + +## `runtime.txt` - Specifying runtimes + +Sometimes you want to specify the version of the runtime (e.g. the version of Python or R), but the environment specification format will not let you specify this information (e.g. `requirements.txt` or `install.R`). +For these cases, we have a special file, `runtime.txt`. + +:::{warning} +`runtime.txt` is only supported when used with environment specifications +that do not already support specifying the runtime +(when using [`environment.yml`](#environment-yml) for conda or [`Project.toml`](#project-toml) for Julia, `runtime.txt` will be ignored). +::: + +### Set the Python version + +Add the line `python-x.y` in `runtime.txt` to run the repository with Python version x.y. +See our [Python2 example repository](https://github.com/binder-examples/python2_runtime/blob/HEAD/runtime.txt). + +### Set the R version + +Add the line `r----
` in `runtime.txt` to run the repository with R version `RVERSION` and libraries from a `YYYY-MM-DD` snapshot of the [Posit Package Manager](https://packagemanager.posit.co/client/#/repos/2/overview). + +`RVERSION` can be set to 3.4, 3.5, 3.6, or to patch releases for the 3.5 and 3.6 series. +If you do not specify a version, the latest release will be used. + +See our [R example repository](https://github.com/binder-examples/r/blob/HEAD/runtime.txt). + +(default-nix)= + +## `default.nix` - the nix package manager + +Specify packages to be installed by the [nix package manager](https://github.com/NixOS/nixpkgs). +When you use this config file all other configuration files (like `requirements.txt`) +that specify packages are ignored. When using `nix` you have to specify all +packages and dependencies explicitly, including the Jupyter notebook package that +`repo2docker` expects to be installed. If you do not install Jupyter explicitly +`repo2docker` will not be able to start your container. + +[nix-shell](https://nixos.org/nix/manual/#sec-nix-shell) is used to evaluate +a `nix` expression written in a `default.nix` file. Make sure to +[pin your nixpkgs](https://discourse.nixos.org/t/nixops-pinning-nixpkgs/734) +to produce a reproducible environment. + +To see an example repository visit +[nix binder example](https://github.com/binder-examples/nix). + +(dockerfile)= + +## `Dockerfile` - Advanced environments + +In the majority of cases, providing your own `Dockerfile` is not necessary as the base images provide core functionality, compact image sizes, and efficient builds. We recommend trying the other configuration files before deciding to use your own `Dockerfile`. + +With `Dockerfile`s, a regular Docker build will be performed. + +:::{warning} +If a Dockerfile is present, all other configuration files will be ignored. +::: + +See the [Advanced Binder Documentation](https://mybinder.readthedocs.io/en/latest/tutorials/dockerfile.html) for +best-practices with Dockerfiles. diff --git a/docs/source/contributing/buildpack.md b/docs/source/contribute/buildpack.md similarity index 100% rename from docs/source/contributing/buildpack.md rename to docs/source/contribute/buildpack.md diff --git a/docs/source/contributing/contentprovider.rst b/docs/source/contribute/contentprovider.rst similarity index 100% rename from docs/source/contributing/contentprovider.rst rename to docs/source/contribute/contentprovider.rst diff --git a/docs/source/contributing/contributing.md b/docs/source/contribute/contributing.md similarity index 99% rename from docs/source/contributing/contributing.md rename to docs/source/contribute/contributing.md index 8e26bcda2..d68ea5d4b 100644 --- a/docs/source/contributing/contributing.md +++ b/docs/source/contribute/contributing.md @@ -150,7 +150,7 @@ according to black's style guide. You can activate it with `pre-commit install`. As part of our continuous integration tests we will check that code is formatted properly and the tests will fail if this is not the case. -### Verify that docker is installed and running +### Verify that Docker is installed and running If you do not already have [Docker](https://www.docker.com/), you should be able to download and install it for your operating system using the links from the diff --git a/docs/source/contributing/index.rst b/docs/source/contribute/index.rst similarity index 71% rename from docs/source/contributing/index.rst rename to docs/source/contribute/index.rst index 09939de58..75f2342da 100644 --- a/docs/source/contributing/index.rst +++ b/docs/source/contribute/index.rst @@ -1,6 +1,6 @@ -============ -Contributing -============ +================= +Contributor guide +================= The repo2docker community is welcoming of all kinds of help and participation from others. Below are a few ways that you can get involved, @@ -8,11 +8,16 @@ as well as resources for understanding the structure and design of the repo2docker package. .. toctree:: + :caption: Contributing to repo2docker contributing roadmap + tasks + +.. toctree:: + :caption: Developer guide + ../architecture ../design - tasks buildpack contentprovider diff --git a/docs/source/contributing/roadmap.md b/docs/source/contribute/roadmap.md similarity index 100% rename from docs/source/contributing/roadmap.md rename to docs/source/contribute/roadmap.md diff --git a/docs/source/contributing/tasks.md b/docs/source/contribute/tasks.md similarity index 95% rename from docs/source/contributing/tasks.md rename to docs/source/contribute/tasks.md index 30be8c662..6e5835558 100644 --- a/docs/source/contributing/tasks.md +++ b/docs/source/contribute/tasks.md @@ -39,10 +39,9 @@ Mercurial and hg-evolve), one can use the environment variable Some of the tests have non-python requirements for your development machine. They are: - `git-lfs` must be installed ([instructions](https://github.com/git-lfs/git-lfs)). It need not be activated -- there is no need to run the `git lfs install` command. It just needs to be available to the test suite. - - If your test failure messages include "`git-lfs filter-process: git-lfs: command not found`", this step should address the problem. -- Minimum Docker Image size of 128GB is required. If you are not running docker on a linux OS, you may need to expand the runtime image size for your installation. See Docker's instructions for [macOS](https://docs.docker.com/docker-for-mac/space/) or [Windows 10](https://docs.docker.com/docker-for-windows/#resources) for more information. +- Minimum Docker Image size of `128GB` is required. If you are not running Docker on a Linux OS, you may need to expand the runtime image size for your installation. See Docker's [instructions for macOS](https://docs.docker.com/docker-for-mac/space/) or [instructions for Windows 10](https://docs.docker.com/docker-for-windows/#resources) for more information. - If your test failure messages include "`No space left on device: '/home/...`", this step should address the problem. ## Update and Freeze BuildPack Dependencies @@ -69,7 +68,6 @@ See the subsections below for more detailed instructions. ### Conda dependencies 1. There are two files related to conda dependencies. Edit as needed. - - `repo2docker/buildpacks/conda/environment.yml` Contains list of packages to install in Python3 conda environments, diff --git a/docs/source/design.md b/docs/source/design.md index 6077621d7..6d7cdcad7 100644 --- a/docs/source/design.md +++ b/docs/source/design.md @@ -43,7 +43,7 @@ This provides a few advantages: Many ingredients go into making an image from a repository: -1. version of the base docker image +1. version of the base Docker image 1. version of `repo2docker` itself 1. versions of the libraries installed by the repository @@ -62,7 +62,7 @@ explicitly in your dependencies. `repo2docker` should do one thing, and do it well. This one thing is: -> Given a repository, deterministically build a docker image from +> Given a repository, deterministically build a Docker image from > it. There's also some convenience code (to run the built image) for users, but diff --git a/docs/source/faq.md b/docs/source/faq.md new file mode 100644 index 000000000..43187b89b --- /dev/null +++ b/docs/source/faq.md @@ -0,0 +1,106 @@ +(faq)= + +# Frequently Asked Questions (FAQ) + +A collection of frequently asked questions with answers. If you have a question +and have found an answer, send a PR to add it here! + +## Why is my repository failing to build with `ResolvePackageNotFound` ? + +If you used `conda env export` to generate your `environment.yml` it will generate a list of packages and versions of packages that is pinned to platform specific versions. +These very specific versions are not available in the Linux Docker image used by `repo2docker`. A typical error message will look like the following: + +``` +Step 39/44 : RUN conda env update -n root -f "environment.yml" && conda clean -tipsy && conda list -n root +---> Running in ebe9a67762e4 +Solving environment: ...working... failed + +ResolvePackageNotFound: +- jsonschema==2.6.0=py36hb385e00_0 +- libedit==3.1.20181209=hb402a30_0 +- tornado==5.1.1=py36h1de35cc_0 +... +``` + +We recommend to use `conda env export --no-builds -f environment.yml` to export +your environment and then edit the file by hand to remove platform specific +packages like `appnope`. + +See {ref}`export-environment` for a recipe on how to create strict exports of +your environment that will work with `repo2docker`. + +## Can I add executable files to the user's PATH? + +Yes! With a [](#postBuild) file, you can place any files that should be called from the command line in the folder `~/.local/bin`. +This folder will be available in a user's PATH, and can be run from the command line (or as a subsequent build step.) + +## Can I use repo2docker to bootstrap my own `Dockerfile` to edit by hand? + +No, you can't. + +If you pass the `--debug` flag to `repo2docker`, it outputs the +intermediate `Dockerfile` that is used to build the Docker image. While +it is tempting to copy this as a base for your own `Dockerfile`, that is +not supported & in most cases will not work. The `--debug` output is +just our intermediate generated `Dockerfile`, and is meant to be built +in a very specific way. Hence the output of `--debug` can not be +built with a normal `docker build -t .` or similar traditional +Docker command. + +Check out the [binder-examples](http://github.com/binder-examples/) GitHub +organization for example repositories you can copy & modify for your own use! + +## Can I use repo2docker to edit a local host repository within a Docker environment? + +Yes: use the `--editable` or `-E` flag (don't confuse this with +the `-e` flag for environment variables), and run repo2docker on a +local repository: + +``` +repo2docker -E my-repository/ +``` + +This builds a Docker container from the files in that repository +(using, for example, a `requirements.txt` or `install.R` file), +then runs that container, while connecting the working directory +inside the container to the local repository outside the +container. For example, in case there is a notebook file (`.ipynb`), +this will open in a local web browser, and one can edit it and save +it. The resulting notebook is updated in both the Docker container and +the local repository. Once the container is exited, the changed file +will still be in the local repository. + +This allows for easy testing of the container while debugging some +items, as well as using a fully customizable container to edit +notebooks (among others). + +:::{note} +Editable mode is a convenience option that will bind the +repository to the container working directory (usually +`$HOME`). If you need to mount to a different location in +the container, use the `--volumes` option instead. Similarly, +for a fully customized user Dockerfile, this option is not +guaranteed to work. +::: + +## Why is my R shiny app not launching? + +If you are trying to run an R shiny app using the `/shiny/folder_containing_shiny` +url option, but the launch returns "The application exited during initialization.", +there might be something wrong with the specification of the app. One way of debugging +the app in the container is by running the `rstudio` url, open either the ui or +server file for the app, and run the app in the container rstudio. This way you can +see the rstudio logs as it tries to initialize the shiny app. If you are missing a +package or other dependency for the container, this will be obvious at this stage. + +## Why does repo2docker need to exist? Why not use tool like source2image? + +The Jupyter community believes strongly in building on top of pre-existing tools whenever +possible (this is why repo2docker buildpacks largely build off of patterns that already +exist in the data analytics community). We try to perform due-diligence and search for +other communities to leverage and help, but sometimes it makes the most sense to build +our own new tool. In the case of repo2docker, we spent time integrating with a pre-existing +tool called [source2image](https://github.com/openshift/source-to-image/). +This is an excellent open tool for containerization, but we +ultimately decided that it did not fit the use-case we wanted to address. For more information, +read our [blog post about why we built repo2docker](https://github.com/yuvipanda/words/blob/fd096dd49d87e624acd8bdf6d13c0cecb930bb3f/content/post/why-not-s2i.md). diff --git a/docs/source/faq.rst b/docs/source/faq.rst deleted file mode 100644 index d643264b8..000000000 --- a/docs/source/faq.rst +++ /dev/null @@ -1,192 +0,0 @@ -.. _faq: - -Frequently Asked Questions (FAQ) -================================ - -A collection of frequently asked questions with answers. If you have a question -and have found an answer, send a PR to add it here! - -How should I specify another version of Python? ------------------------------------------------ - -One can specify a Python version in the ``environment.yml`` file of a repository -or ``runtime.txt`` file if using ``requirements.txt`` instead of ``environment.yml``. - -What versions of Python (or R or Julia...) are supported? ---------------------------------------------------------- - -Python -~~~~~~ - -Repo2docker officially supports the following versions of Python -(specified in your :ref:`environment.yml ` or -:ref:`runtime.txt ` file): - -- 3.11 (added in 2023) -- 3.10 (added in 2022, default in 2023) -- 3.9 (added in 2021) -- 3.8 (added in 0.11) -- 3.7 (added in 0.7, default in 0.8) -- 3.6 (default in 0.7 and earlier) -- 3.5 -- 2.7 - -Additional versions may work, as long as the -`base environment `_ -can be installed for your version of Python. -The most likely source of incompatibility is if one of the packages -in the base environment is not packaged for your Python, -either because the version of the package is too new and your chosen Python is too old, -or vice versa. - -If an old version of Python is specified (3.6 or earlier in 2023), a separate environment for the kernel will be installed with your requested Python version. -The notebook server will run in the default |default_python| environment. -That is, your _notebooks_ will run with Python 3.6, while your notebook _server_ will run with |default_python|. - -These two environments can be distinguished with ``$NB_PYTHON_PREFIX/bin/python`` for the server and ``$KERNEL_PYTHON_PREFIX/bin/python`` for the kernel. -Both of these environment variables area always defined, even when they are the same. - -Starting in 2023, the default version of Python used when Python version is unspecified will be updated more often. -Python itself releases a new version every year now, and repo2docker will follow, with the default Python version generally trailing the latest stable version of Python itself by 1-2 versions. - -If you choose not to specify a Python version, your repository is _guaranteed_ to stop working, eventually. -We **strongly** recommend specifying a Python version (in environment.yml, runtime.txt, Pipfile, etc.) - -Julia -~~~~~ - -All Julia versions since Julia 1.3 are supported via a :ref:`Project.toml ` -file, and this is the recommended way to install Julia environments. - -Julia < 1.3 and the older Julia REQUIRE file is no longer supported because required infrastructure has been removed. - -R -~ - -The default version of R is currently R 4.2. You can select the version of -R you want to use by specifying it in the :ref:`runtime.txt ` -file. - -We support R versions 3.4, 3.5, 3.6, 4.0, 4.1 and 4.2. - - -Why is my repository failing to build with ``ResolvePackageNotFound`` ? --------------------------------------------------------------------------- - -If you used ``conda env export`` to generate your ``environment.yml`` it will -generate a list of packages and versions of packages that is pinned to platform -specific versions. These very specific versions are not available in the linux -docker image used by ``repo2docker``. A typical error message will look like -the following:: - - Step 39/44 : RUN conda env update -n root -f "environment.yml" && conda clean -tipsy && conda list -n root - ---> Running in ebe9a67762e4 - Solving environment: ...working... failed - - ResolvePackageNotFound: - - jsonschema==2.6.0=py36hb385e00_0 - - libedit==3.1.20181209=hb402a30_0 - - tornado==5.1.1=py36h1de35cc_0 - ... - -We recommend to use ``conda env export --no-builds -f environment.yml`` to export -your environment and then edit the file by hand to remove platform specific -packages like ``appnope``. - -See :ref:`export-environment` for a recipe on how to create strict exports of -your environment that will work with ``repo2docker``. - - -Can I add executable files to the user's PATH? ----------------------------------------------- - -Yes! With a :ref:`postBuild` file, you can place any files that should be called -from the command line in the folder ``~/.local/``. This folder will be -available in a user's PATH, and can be run from the command line (or as -a subsequent build step.) - -How do I set environment variables? ------------------------------------ - -To configure environment variables for all users of a repository use the -:ref:`start ` configuration file. - -When running repo2docker locally you can use the ``-e`` or ``--env`` command-line -flag for each variable that you want to define. - -For example ``jupyter-repo2docker -e VAR1=val1 -e VAR2=val2 ...`` - -Can I use repo2docker to bootstrap my own Dockerfile? ------------------------------------------------------ - -No, you can't. - -If you pass the ``--debug`` flag to ``repo2docker``, it outputs the -intermediate Dockerfile that is used to build the docker image. While -it is tempting to copy this as a base for your own Dockerfile, that is -not supported & in most cases will not work. The ``--debug`` output is -just our intermediate generated Dockerfile, and is meant to be built -in a very specific way. Hence the output of ``--debug`` can not be -built with a normal ``docker build -t .`` or similar traditional -docker command. - -Check out the `binder-examples `_ GitHub -organization for example repositories you can copy & modify for your own use! - -Can I use repo2docker to edit a local host repository within a Docker environment? ----------------------------------------------------------------------------------- - -Yes: use the ``--editable`` or ``-E`` flag (don't confuse this with -the ``-e`` flag for environment variables), and run repo2docker on a -local repository:: - - repo2docker -E my-repository/ - -This builds a Docker container from the files in that repository -(using, for example, a ``requirements.txt`` or ``install.R`` file), -then runs that container, while connecting the working directory -inside the container to the local repository outside the -container. For example, in case there is a notebook file (``.ipynb``), -this will open in a local web browser, and one can edit it and save -it. The resulting notebook is updated in both the Docker container and -the local repository. Once the container is exited, the changed file -will still be in the local repository. - -This allows for easy testing of the container while debugging some -items, as well as using a fully customizable container to edit -notebooks (among others). - -.. note:: - - Editable mode is a convenience option that will bind the - repository to the container working directory (usually - ``$HOME``). If you need to mount to a different location in - the container, use the ``--volumes`` option instead. Similarly, - for a fully customized user Dockerfile, this option is not - guaranteed to work. - - -Why is my R shiny app not launching? ----------------------------------------------------------------------------------- - -If you are trying to run an R shiny app using the ``/shiny/folder_containing_shiny`` -url option, but the launch returns "The application exited during initialization.", -there might be something wrong with the specification of the app. One way of debugging -the app in the container is by running the ``rstudio`` url, open either the ui or -server file for the app, and run the app in the container rstudio. This way you can -see the rstudio logs as it tries to initialise the shiny app. If you a missing a -package or other dependency for the container, this will be obvious at this stage. - - -Why does repo2docker need to exist? Why not use tool like source2image? ------------------------------------------------------------------------ - -The Jupyter community believes strongly in building on top of pre-existing tools whenever -possible (this is why repo2docker buildpacks largely build off of patterns that already -exist in the data analytics community). We try to perform due-diligence and search for -other communities to leverage and help, but sometimes it makes the most sense to build -our own new tool. In the case of repo2docker, we spent time integrating with a pre-existing -tool called `source2image `_. -This is an excellent open tool for containerization, but we -ultimately decided that it did not fit the use-case we wanted to address. For more information, -`here `_ is a short blog post about the decision and the reasoning behind it. diff --git a/docs/source/getting-started/index.rst b/docs/source/getting-started/index.rst deleted file mode 100644 index 96e5f2958..000000000 --- a/docs/source/getting-started/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -=============== -Getting Started -=============== - -Instructions and information on how to get started with repo2docker -on your own machine. Select from the pages listed below to begin. - -.. toctree:: - :maxdepth: 2 - - ../install - ../usage - ../faq \ No newline at end of file diff --git a/docs/source/howto/breaking_changes.md b/docs/source/howto/breaking_changes.md index 80ab1ed09..c51e4d686 100644 --- a/docs/source/howto/breaking_changes.md +++ b/docs/source/howto/breaking_changes.md @@ -6,13 +6,13 @@ Repo2docker occasionally has to make breaking changes in how repositories are bu The base image used by repo2docker was [upgraded from Ubuntu 18.04 to Ubuntu 22.04](https://github.com/jupyterhub/repo2docker/pull/1287) in version 2023.10.0 due to Ubuntu 18.04 going out of support. -This is unlikely to affect you unless you are using {ref}`apt.txt `. +This is unlikely to affect you unless you are using {ref}`apt.txt `. -{ref}`apt.txt ` installs packages from the official Ubuntu package repositories, and is intrinsically tied to the Ubuntu version. +{ref}`apt.txt ` installs packages from the official Ubuntu package repositories, and is intrinsically tied to the Ubuntu version. Many packages will be available in both Ubuntu 18.04 and Ubuntu 22.04, however some may be renamed (for example if multiple incompatible versions are available). Some packages may be removed, or may not be compatible with the previous version. -In this case you should see if your packages can be installed using a {ref}`Conda environment.yml file ` using either the default [conda-forge channel](https://conda-forge.org/feedstock-outputs/) or in one of the many [third-party channels](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/channels.html). +In this case you should see if your packages can be installed using a {ref}`Conda environment.yml file ` using either the default [conda-forge channel](https://conda-forge.org/feedstock-outputs/) or in one of the many [third-party channels](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/channels.html). Alternatively you can try installing the packages from source, using a {ref}`postBuild ` script. diff --git a/docs/source/howto/export_environment.rst b/docs/source/howto/export_environment.rst index 4aa87f980..0aa72fd25 100644 --- a/docs/source/howto/export_environment.rst +++ b/docs/source/howto/export_environment.rst @@ -1,7 +1,7 @@ .. _export-environment: ============================================================================= -How to automatically create a ``environment.yml`` that works with repo2docker +Export your environment to an ``environment.yml`` that works with repo2docker ============================================================================= This how-to explains how to create a ``environment.yml`` that specifies all @@ -16,12 +16,9 @@ This is the most robust for reproducibility, but it does bake in potential platform-specific packages, so you can only use an exported environment on the same platform. -``repo2docker`` uses a linux based image as the starting point for every docker -image it creates. However a lot of people use OSX or Windows as their day to -day operating system. This means that the ``environment.yml`` created by a strict -export will not work with error messages saying that certain packages can not -be resolved (``ResolvePackageNotFound``). - +``repo2docker`` uses a Linux-based image as the starting point for every Docker image it creates. +However a lot of people use OSX or Windows as their day to day operating system. +This means that the ``environment.yml`` created by a strict export will not work with error messages saying that certain packages can not be resolved (``ResolvePackageNotFound``). The solution ============ @@ -48,7 +45,7 @@ Strict version export Follow this procedure to create a strict export of your environment that will work with ``repo2docker`` and sites like `mybinder.org `_. -We will launch a terminal inside a basic docker image, install the packages +We will launch a terminal inside a basic Docker image, install the packages you need and then perform a strict export of the environment. #. install repo2docker on your computer by following :ref:`install` diff --git a/docs/source/howto/index.rst b/docs/source/howto/index.rst deleted file mode 100644 index 12ce3595c..000000000 --- a/docs/source/howto/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -============= -How-to Guides -============= - -Short, actionable guides that cover specific topics with repo2docker. -Select from the pages listed below to get started. - -.. toctree:: - :maxdepth: 2 - :caption: How-To guides - - user_interface - languages - export_environment - lab_workspaces - breaking_changes - jupyterhub_images - deploy - base_image diff --git a/docs/source/howto/languages.md b/docs/source/howto/languages.md new file mode 100644 index 000000000..7661a39d7 --- /dev/null +++ b/docs/source/howto/languages.md @@ -0,0 +1,135 @@ +(languages)= + +# Choose languages for your environment + +You can define many different languages in your configuration files. This +page describes how to use some of the more common ones. + +## Python + +Your environment will have Python (and specified dependencies) installed when +you use one of the following configuration files: + +- `requirements.txt` +- `environment.yml` + +By default, the environment will have {{ default_python }}. + +### Specify a version of Python + +To specify a specific version of Python, you have two options: + +- Use [environment.yml](#environment-yml). Conda environments let you define + the Python version in `environment.yml`. + To do so, add `python=X.X` to your dependencies section, like so: + + ``` + name: python 2.7 + dependencies: + - python=2.7 + - numpy + ``` + +- Use [runtime.txt](#runtime-txt) with [requirements.txt](#requirements-txt). + If you are using `requirements.txt` instead of `environment.yml`, + you can specify the Python runtime version in a separate file called `runtime.txt`. + This file contains a single line of the following form: + + ``` + python-X.X + ``` + + For example: + + ``` + python-3.6 + ``` + +### Supported versions of Python + +Repo2docker officially supports the following versions of Python: + +- 3.11 (added in 2023) +- 3.10 (added in 2022, default in 2023) +- 3.9 (added in 2021) +- 3.8 (added in 0.11) +- 3.7 (added in 0.7, default in 0.8) +- 3.6 (default in 0.7 and earlier) +- 3.5 +- 2.7 + +Additional versions may work, as long as the [base environment](https://github.com/jupyterhub/repo2docker/blob/HEAD/repo2docker/buildpacks/conda/environment.yml) can be installed for your version of Python. +The most likely source of incompatibility is if one of the packages in the base environment is not packaged for your Python, either because the version of the package is too new and your chosen Python is too old, or vice versa. + +If an old version of Python is specified (3.6 or earlier in 2023), a separate environment for the kernel will be installed with your requested Python version. +The notebook server will run in the default {{ default_python }} environment. +That is, your _notebooks_ will run with Python 3.6, while your notebook _server_ will run with {{ default_python }}. + +These two environments can be distinguished with `$NB_PYTHON_PREFIX/bin/python` for the server and `$KERNEL_PYTHON_PREFIX/bin/python` for the kernel. +Both of these environment variables are always defined, even when they are the same. + +Starting in 2023, the default version of Python used when Python version is unspecified will be updated more often. +Python itself releases a new version every year now, and repo2docker will follow, with the default Python version generally trailing the latest stable version of Python itself by 1-2 versions. + +If you choose not to specify a Python version, your repository is _guaranteed_ to stop working, eventually. +We **strongly** recommend specifying a Python version (in environment.yml, runtime.txt, Pipfile, etc.) + +## The R Language + +repo2docker supports R, the open source [RStudio IDE](https://www.rstudio.com/) as well +as Jupyter support for R with the [IRKernel](https://irkernel.github.io/). To set it up, +you need to create a `runtime.txt` file with the following format: + +> r-\-\-\-\
+ +This will provide you R of given version (such as 4.1, 3.6, etc), and a CRAN snapshot +to install libraries from on the given date. You can install more R packages from CRAN +by adding a [install.R](#install-R) file to your repo. RStudio and IRKernel are +installed by default for all R versions. + +[packagemanager.posit.co](https://packagemanager.posit.co/client/#/) +will be used to provide much faster installations via [binary packages](https://www.rstudio.com/blog/package-manager-v1-1-no-interruptions/). +For _some_ packages, this might require you install underlying system libraries +using [apt.txt](#apt-txt) - look at the page for the CRAN package you are interested in at +[packagemanager.posit.co](https://packagemanager.posit.co/client/#/) to find +a list. + +repo2docker stopped using the Microsoft mirror MRAN for older R versions after its shutdown in July, 2023. + +### Supported versions of R + +The default version of R is currently R 4.2. You can select the version of +R you want to use by specifying it in the [runtime.txt](#runtime-txt) +file. + +We support R versions 3.4, 3.5, 3.6, 4.0, 4.1 and 4.2. + +## Julia + +To build an environment with Julia, include a configuration file called +`Project.toml`. The format of this file is documented at +[the Julia Pkg.jl documentation](https://julialang.github.io/Pkg.jl/v1/). +To specify a specific version of Julia to install, put a Julia version in the +`[compat]` section of the `Project.toml` file, as described +here: . + +### Supported versions of Julia + +All Julia versions since Julia 1.3 are supported via a [Project.toml](project-toml) +file, and this is the recommended way to install Julia environments. + +Julia < 1.3 and the older Julia REQUIRE file is no longer supported because required infrastructure has been removed. + +## Languages not covered here + +If a language is not "officially" supported by a build pack, it can often be +installed with a `postBuild` script. This will run arbitrary `bash` commands, +and can be used to download / install a language. + +## Using multiple languages at once + +It may also be possible to combine multiple languages in a single environment. +The details on how to accomplish this with all possible combinations are outside +the scope of this guide. However we recommend that you take a look at the +[Multi-Language Demo](https://github.com/binder-examples/multi-language-demo) +repository for some inspiration. diff --git a/docs/source/howto/languages.rst b/docs/source/howto/languages.rst deleted file mode 100644 index af51a6fdf..000000000 --- a/docs/source/howto/languages.rst +++ /dev/null @@ -1,102 +0,0 @@ -.. _languages: - -===================================== -Choose languages for your environment -===================================== - -You can define many different languages in your configuration files. This -page describes how to use some of the more common ones. - -Python -====== - -Your environment will have Python (and specified dependencies) installed when -you use one of the following configuration files: - -* ``requirements.txt`` -* ``environment.yml`` - -.. note:: - - By default, the environment will have |default_python|. - -.. versionchanged:: 0.8 - - Upgraded default Python from 3.6 to 3.7. - - -Specifying a version of Python ------------------------------- - -To specify a specific version of Python, you have two options: - -* Use :ref:`environment.yml `. Conda environments let you define - the Python version in ``environment.yml``. - To do so, add ``python=X.X`` to your dependencies section, like so:: - - name: python 2.7 - dependencies: - - python=2.7 - - numpy - -* Use :ref:`runtime.txt ` with :ref:`requirements.txt `. - If you are using ``requirements.txt`` instead of ``environment.yml``, - you can specify the Python runtime version in a separate file called ``runtime.txt``. - This file contains a single line of the following form:: - - python-X.X - - For example:: - - python-3.6 - - -The R Language -============== - -repo2docker supports R, the open source `RStudio IDE `_ as well -as Jupyter support for R with the `IRKernel `_. To set it up, -you need to create a ``runtime.txt`` file with the following format: - - r----
- -This will provide you R of given version (such as 4.1, 3.6, etc), and a CRAN snapshot -to install libraries from on the given date. You can install more R packages from CRAN -by adding a :ref:`install.R` file to your repo. RStudio and IRKernel are -installed by default for all R versions. - -`packagemanager.posit.co `_ -will be used to provide much faster installations via `binary packages `_. -For *some* packages, this might require you install underlying system libraries -using :ref:`apt.txt` - look at the page for the CRAN package you are interested in at -`packagemanager.posit.co `_ to find -a list. - -repo2docker stopped using the Microsoft mirror MRAN for older R versions after its shutdown in July, 2023. - - -Julia -===== - -To build an environment with Julia, include a configuration file called -``Project.toml``. The format of this file is documented at -`the Julia Pkg.jl documentation `_. -To specify a specific version of Julia to install, put a Julia version in the -``[compat]`` section of the ``Project.toml`` file, as described -here: https://julialang.github.io/Pkg.jl/v1/compatibility/. - -Languages not covered here -========================== - -If a language is not "officially" supported by a build pack, it can often be -installed with a ``postBuild`` script. This will run arbitrary ``bash`` commands, -and can be used to download / install a language. - -Using multiple languages at once -================================ - -It may also be possible to combine multiple languages in a single environment. -The details on how to accomplish this with all possible combinations are outside -the scope of this guide. However we recommend that you take a look at the -`Multi-Language Demo `_ -repository for some inspiration. diff --git a/docs/source/index.md b/docs/source/index.md new file mode 100644 index 000000000..43593c8a9 --- /dev/null +++ b/docs/source/index.md @@ -0,0 +1,91 @@ +# Welcome to `repo2docker`'s documentation + +`repo2docker` lets you **reproducibly build, run, and deploy user environment images for interactive computing and data workflows from source code repositories**. + +`repo2docker` can be used to explore a repository locally by building and executing the +constructed image of the repository, or as a means of building images that +are pushed to a Docker registry. It is the tool used by [BinderHub](https://binderhub.readthedocs.io) to build images on demand. + +::::{grid} +:::{grid-item-card} 🔧 Build reproducible data science environments from repositories +Build a reproducible data science environment as a Docker image and execute code interactively. Use many [configuration files](#config-files) to control language, tools, and setup instructions. +::: +:::{grid-item-card} 🚀 Deploy environments in JupyterHub or Binder +Push environment images to a Docker registry for re-use in data science environment services like [JupyterHub](https://jupyterhub.readthedocs.io) or [a Binder instance](https://mybinder.org), or for other communities to build upon your base environment. +::: +:::{grid-item-card} ☁️ Host repositories in many providers +Host repositories in a provider like GitHub, an open science repository like [Zenodo](https://zenodo.org) or [Figshare](https://figshare.com), a hosted data platform like a [Dataverse installation](https://dataverse.org/), an archive like the +[Software Heritage Archive](https://archive.softwareheritage.org). +::: +:::: + +## What is a user image and why would I build one with `repo2docker`? + +A **user image** contains the entire software environment that a user may access from an interactive data science session. For example, it might contain many **programming languages**, **software for data analysis**, or even **content files and datasets** available to anybody that accesses that environment. User images are built with [Docker](https://www.docker.com/), a standard open source tool for defining, building, and deploying images. + +Many data science platforms and services like [JupyterHub](https://jupyterhub.readthedocs.io) and [Binder](https://mybinder.org) launch interactive data science sessions **with a user image attached**, meaning that the user gains access to whatever is in the image. In short, this allows somebody to define and build the user image one time, in a way that users can reproducibly re-use many times. + +Dockerfiles are the standard way that Docker images are defined[^use-dockerfile]. +However, **building images with Dockerfiles takes expertise and time** that is outside the scope of a data scientist or researcher. `repo2docker` makes this workflow more accessible by using community-standard configuration files for computational reproducibility to build user images. + +In short, `repo2docker` is a tool to reproducibly build, run, and deploy these user environment Docker images for data science from source code repositories. + +[^use-dockerfile]: That said, you can still use a Dockerfile if you really want to! + +## How `repo2docker` works + +When you call `repo2docker` like so: + +``` +jupyter-repo2docker +``` + +It performs these steps: + +1. Inspects the repository for [configuration files](#config-files). These will be used to build the environment needed to run the repository. +2. Builds a Docker image with an environment specified in these [configuration files](#config-files). +3. Runs the image to let you explore the repository interactively via Jupyter notebooks, RStudio, or many other interfaces (this is optional). +4. Pushes the images to a Docker registry so that it may be accessed remotely (this is optional). + +[swhid]: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html + +Please report [Bugs](https://github.com/jupyterhub/repo2docker/issues), +[ask questions](https://gitter.im/jupyterhub/binder) or +[contribute to the project](https://github.com/jupyterhub/repo2docker/blob/HEAD/CONTRIBUTING.md). + +## Get started with repo2docker + +This tutorial walks you through setting up repo2docker, building your first environment image, and running it locally with Docker. + +```{toctree} +:maxdepth: 2 + +start +``` + +## Learn how to use repo2docker + +Our user guide provides all of the information you need to configure and deploy the environment image you want. + +```{toctree} +:maxdepth: 2 +use/index +``` + +## Contribute to repo2docker + +Our contributor guide describes how you can follow along with the project, learn how to collaborate with our open team, and learn developer workflows and information. + +```{toctree} +:maxdepth: 2 + +contribute/index +``` + +```{toctree} +:caption: Changelog +:maxdepth: 2 +:hidden: true + +changelog +``` diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index 09be2503f..000000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,42 +0,0 @@ -jupyter-repo2docker -=================== - -``jupyter-repo2docker`` is a tool to **build, run, and push Docker -images from source code repositories**. - -``repo2docker`` fetches a repository -(from GitHub, GitLab, Zenodo, Figshare, Dataverse installations, a Git repository or a local directory) -and builds a container image in which the code can be executed. -The image build process is based on the configuration files found in the repository. - -``repo2docker`` can be -used to explore a repository locally by building and executing the -constructed image of the repository, or as a means of building images that -are pushed to a Docker registry. - -``repo2docker`` is the tool used by `BinderHub `_ -to build images on demand. - -Please report `Bugs `_, -`ask questions `_ or -`contribute to the project `_. - -.. toctree:: - :maxdepth: 2 - :caption: Getting started with repo2docker - - getting-started/index - howto/index - configuration/index - -.. toctree:: - :maxdepth: 2 - :caption: Contribute to repo2docker - - contributing/index - -.. toctree:: - :maxdepth: 2 - :caption: Changelog - - changelog diff --git a/docs/source/install.rst b/docs/source/install.rst deleted file mode 100644 index be9c91b23..000000000 --- a/docs/source/install.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. _install: - -Installing ``repo2docker`` -========================== - -repo2docker requires Python 3.6 or above on Linux and macOS. See -:ref:`below ` for more information about Windows support. - -Prerequisite: Docker --------------------- - -Install `Docker `_ as it is required -to build Docker images. The -`Community Edition `_, -is available for free. - -Recent versions of Docker are recommended. -The latest version of Docker, ``18.03``, successfully builds repositories from -`binder-examples `_. -The `BinderHub `_ helm chart uses version -``17.11.0-ce-dind``. See the -`helm chart `_ -for more details. - -Optional: Mercurial -------------------- - -For `Mercurial `_ repositories, Mercurial and -`hg-evolve `_ need to be -installed. For example, on Debian based distributions, one can do:: - - sudo apt install mercurial - $(hg debuginstall --template "{pythonexe}") -m pip install hg-evolve --user - -To install Mercurial on other systems, see `here -`_. - -Note that for old Mercurial versions, you may need to specify a version for -hg-evolve. For example, ``hg-evolve==9.2`` for hg 4.5 (which is installed with -`apt` on Ubuntu 18.4). - -Installing with ``pip`` ------------------------ - -We recommend installing ``repo2docker`` with the ``pip`` tool:: - - python3 -m pip install jupyter-repo2docker - -for the latest release. To install the most recent code from the upstream repository, run:: - - python3 -m pip install https://github.com/jupyterhub/repo2docker/archive/main.zip - -For information on using ``repo2docker``, see :ref:`usage`. - -Installing from source code ---------------------------- - -Alternatively, you can install repo2docker from a local source tree, -e.g. in case you are contributing back to this project:: - - git clone https://github.com/jupyterhub/repo2docker.git - cd repo2docker - python3 -m pip install -e . - -That's it! For information on using ``repo2docker``, see -:ref:`usage`. - -.. _windows: - -Windows support ---------------- - -Windows support for ``repo2docker`` is still in the experimental stage. - -An article about `using Windows and the WSL`_ (Windows Subsytem for Linux or -Bash on Windows) provides additional information about Windows and docker. - - -.. _using Windows and the WSL: https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly diff --git a/docs/source/specification.md b/docs/source/specification.md new file mode 100644 index 000000000..fb7cc40c9 --- /dev/null +++ b/docs/source/specification.md @@ -0,0 +1,30 @@ +(specification)= + +# The Reproducible Execution Environment Specification + +repo2docker scans a repository for particular {ref}`config-files`, such +as `requirements.txt` or `Project.toml`. The collection of files, their contents, +and the resulting actions that repo2docker takes is known +as the **Reproducible Execution Environment Specification** (or REES). + +The goal of the REES is to automate and encourage existing community best practices +for reproducible computational environments. This includes installing packages using +community-standard specification files and their corresponding tools, +such as `requirements.txt` (with `pip`), `Project.toml` (with Julia), or +`apt.txt` (with `apt`). While repo2docker automates the +creation of the environment, a human should be able to look at a REES-compliant +repository and reproduce the environment using common, clear steps without +repo2docker software. + +Currently, the definition of the REE Specification is the following: + +> Any directory containing zero or more files from the {ref}`config-files` list is a +> valid reproducible execution environment as defined by the REES. The +> configuration files have to all be placed either in the root of the +> directory, in a `binder/` sub-directory or a `.binder/` sub-directory. + +For example, the REES recognises `requirements.txt` as a valid config file. +The file format is as defined by the `requirements.txt` standard of the Python +community. A REES-compliant tool will install a Python interpreter (of unspecified version) +and perform the equivalent action of `pip install -r requirements.txt` so that the +user can afterwards run python and use the packages installed. diff --git a/docs/source/specification.rst b/docs/source/specification.rst deleted file mode 100644 index bd635b231..000000000 --- a/docs/source/specification.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. _specification: - -==================================================== -The Reproducible Execution Environment Specification -==================================================== - -repo2docker scans a repository for particular :ref:`config-files`, such -as ``requirements.txt`` or ``Project.toml``. The collection of files, their contents, -and the resulting actions that repo2docker takes is known -as the **Reproducible Execution Environment Specification** (or REES). - -The goal of the REES is to automate and encourage existing community best practices -for reproducible computational environments. This includes installing packages using -community-standard specification files and their corresponding tools, -such as ``requirements.txt`` (with ``pip``), ``Project.toml`` (with Julia), or -``apt.txt`` (with ``apt``). While repo2docker automates the -creation of the environment, a human should be able to look at a REES-compliant -repository and reproduce the environment using common, clear steps without -repo2docker software. - -Currently, the definition of the REE Specification is the following: - - Any directory containing zero or more files from the :ref:`config-files` list is a - valid reproducible execution environment as defined by the REES. The - configuration files have to all be placed either in the root of the - directory, in a ``binder/`` sub-directory or a ``.binder/`` sub-directory. - -For example, the REES recognises ``requirements.txt`` as a valid config file. -The file format is as defined by the ``requirements.txt`` standard of the Python -community. A REES-compliant tool will install a Python interpreter (of unspecified version) -and perform the equivalent action of ``pip install -r requirements.txt`` so that the -user can afterwards run python and use the packages installed. diff --git a/docs/source/start.md b/docs/source/start.md new file mode 100644 index 000000000..87d148fc9 --- /dev/null +++ b/docs/source/start.md @@ -0,0 +1,62 @@ +# Get started + +This tutorial guides you through installing `repo2docker` and building your first environment image. + +(install)= + +## Install `repo2docker` + +repo2docker requires Python 3.6 or above on Linux and macOS. + +:::{admonition} Windows support is experimental + +This [article about using Windows and the WSL](https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly) (Windows Subsystem for Linux or +Bash on Windows) provides additional information about Windows and Docker. +::: + +### Prerequisite: Install Docker + +Install [Docker](https://www.docker.com), as it is required to build Docker images. +The [Community Edition](https://docs.docker.com/install/) is available for free. + +Recent versions of Docker are recommended. + +### Install `repo2docker` with `pip` + +We recommend installing `repo2docker` with the `pip` tool: + +``` +python3 -m pip install jupyter-repo2docker +``` + +(usage)= + +## Build a repository with `repo2docker` + +Now that you've installed Docker and `repo2docker`, we can build a repository. +To do so, follow these steps. + +### Start Docker + +Follow the [instructions for starting Docker](https://docs.docker.com/engine/daemon/start/) to start a Docker process. + +### Build an image from a URL + +Next we'll build a reproducible image from a URL. We'll use the [Binder `requirements.txt` example](https://github.com/binder-examples/requirements), which installs a simple Python environment. Run the following command: + +```bash +jupyter-repo2docker https://github.com/binder-examples/requirements +``` + +You'll see `repo2docker` take the following actions: + +1. Inspect the repository for [configuration files](#config-files). It will detect the `requirements.txt` file in the repository. +2. Build a Docker image using the configuration files. In this case, the `requirements.txt` file will correspond to a Python environment. +3. Run the image to let you explore the repository interactively. + +Click the link provided and you'll be taken to an interactive Jupyter Notebook interface where you can run commands interactively inside the environment. + +## Learn more + +This is a simple example building an environment image for your repository. +To learn more about the kinds of source repositories, environments, and use-cases that repo2docker supports, see [the `repo2docker` user guide](./use/index.md). diff --git a/docs/source/usage.rst b/docs/source/usage.rst deleted file mode 100644 index e89eb8ff6..000000000 --- a/docs/source/usage.rst +++ /dev/null @@ -1,140 +0,0 @@ -.. _usage: - -===================== -Using ``repo2docker`` -===================== - -.. note:: - - `Docker `_ **must be running** in - order to run ``repo2docker``. For more information on installing - ``repo2docker``, see :ref:`install`. - -``repo2docker`` can build a reproducible computational environment for any repository that -follows :ref:`specification`. repo2docker is called with the URL of a Git repository, -a `DOI `_ from Zenodo or Figshare, -a `Handle `_ or DOI from a Dataverse installation, -a `SWHID`_ of a directory of a revision archived in the -`Software Heritage Archive `_, -or a path to a local directory. - -It then performs these steps: - -1. Inspects the repository for :ref:`configuration files `. These will be used to build - the environment needed to run the repository. -2. Builds a Docker image with an environment specified in these :ref:`configuration files `. -3. Launches the image to let you explore the - repository interactively via Jupyter notebooks, RStudio, or many other interfaces (optional) -4. Pushes the images to a Docker registry so that it may be accessed remotely - (optional) - -Calling repo2docker -=================== - -repo2docker is called with this command:: - - jupyter-repo2docker - -where ```` is: - - * a URL of a Git repository (``https://github.com/binder-examples/requirements``), - * a Zenodo DOI (``10.5281/zenodo.1211089``), - * a SWHID_ (``swh:1:rev:999dd06c7f679a2714dfe5199bdca09522a29649``), - * a URL of a CKAN_ dataset (``https://demo.ckan.org/dataset/sample-dataset-1``), or - * a path to a local directory (``a/local/directory``) - -of the source repository you want to build. - -For example, the following command will build an image of Peter Norvig's -Pytudes_ repository:: - - jupyter-repo2docker https://github.com/norvig/pytudes - -Building the image may take a few minutes. - -Pytudes_ -uses a `requirements.txt file `_ -to specify its Python environment. Because of this, ``repo2docker`` will use -``pip`` to install dependencies listed in this ``requirement.txt`` file, and -these will be present in the generated Docker image. To learn more about -configuration files in ``repo2docker`` visit :ref:`config-files`. - -When the image is built, a message will be output to your terminal:: - - Copy/paste this URL into your browser when you connect for the first time, - to login with a token: - http://0.0.0.0:36511/?token=f94f8fabb92e22f5bfab116c382b4707fc2cade56ad1ace0 - -Pasting the URL into your browser will open Jupyter Notebook with the -dependencies and contents of the source repository in the built image. - - -Building a specific branch, commit or tag -========================================= - -To build a particular branch and commit, use the argument ``--ref`` and -specify the ``branch-name`` or ``commit-hash``. For example:: - - jupyter-repo2docker --ref 9ced85dd9a84859d0767369e58f33912a214a3cf https://github.com/norvig/pytudes - -.. tip:: - For reproducible builds, we recommend specifying a commit-hash to - deterministically build a fixed version of a repository. Not specifying a - commit-hash will result in the latest commit of the repository being built. - - -.. _usage-config-file-location: - -Where to put configuration files -================================ - -``repo2docker`` will look for configuration files in: - -* A folder named ``binder/`` in the root of the repository. -* A folder named ``.binder/`` in the root of the repository. -* The root directory of the repository. - -Having both ``binder/`` and ``.binder/`` folders is not allowed. -If one of these folders exists, only configuration files in that folder are considered, configuration in the root directory will be ignored. - -Check the complete list of :ref:`configuration files ` supported -by ``repo2docker`` to see how to configure the build process. - -.. note:: - - ``repo2docker`` builds an environment with Python 3.7 by default. If you'd - like a different version, you can specify this in your - :ref:`configuration files `. - - -Debugging repo2docker with ``--debug`` and ``--no-build`` -========================================================= - -To debug the docker image being built, pass the ``--debug`` parameter: - - .. code-block:: bash - - jupyter-repo2docker --debug https://github.com/norvig/pytudes - -This will print the generated ``Dockerfile``, build it, and run it. - -To see the generated ``Dockerfile`` without actually building it, -pass ``--no-build`` to the commandline. This ``Dockerfile`` output -is for **debugging purposes** of ``repo2docker`` only - it can not -be used by docker directly. - - .. code-block:: bash - - jupyter-repo2docker --no-build --debug https://github.com/norvig/pytudes - - -Command line API -================ - -.. autoprogram:: repo2docker.__main__:argparser - :prog: jupyter-repo2docker - - -.. _Pytudes: https://github.com/norvig/pytudes -.. _SWHID: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html -.. _CKAN: https://ckan.org diff --git a/docs/source/use/action.md b/docs/source/use/action.md new file mode 100644 index 000000000..ec2df5649 --- /dev/null +++ b/docs/source/use/action.md @@ -0,0 +1,7 @@ +(github-action)= + +# Use GitHub Actions to build environment images + +The [`repo2docker` GitHub Action](https://github.com/jupyterhub/repo2docker-action) allows you to use `repo2docker` in your GitHub CI/CD to build environment images and push them to a registry. It is a useful way to automate building and pushing images to reduce deployment toil. + +See [the `repo2docker` GitHub Action README](https://github.com/jupyterhub/repo2docker-action) for documentation about how to use this tool. diff --git a/docs/source/use/community-image.md b/docs/source/use/community-image.md new file mode 100644 index 000000000..d499768c5 --- /dev/null +++ b/docs/source/use/community-image.md @@ -0,0 +1,54 @@ +# Use a community-maintained image in a JupyterHub + +The simplest way to deploy environment images to a JupyterHub or BinderHub is to _find and re-use a pre-existing image maintained by a community_. +In this case, you won't have to maintain anything -- you'll simply use a community's image and contribute upstream if you wish. + +Here are some steps to follow. + +## First, find a community-maintained image for your workflow + +Many communities define their own user envionment images for re-use. Here are a few to look into: + +1. [jupyter Docker-stacks](https://jupyter-docker-stacks.readthedocs.io/) has a number of user images for general data science workflows. +2. [pangeo Docker-stacks](https://github.com/pangeo-data/pangeo-docker-images) has images for geospatial workflows in the cloud +3. [rocker](https://rocker-project.org/) has images meant for reproducibility with the R computing language. + +For example, the [Jupyter Docker Stacks images](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#core-stacks) define images for several core datascience workflows. Each one points to a **hosted version of the image** on an image repository (such as [quay.io](https://quay.io)). + +## Pick a tag for the image + +Tags are a way to checkpoint an image so that you know exactly what is inside. They are similar to released versions of software. Tags will be listed in the image provider used by the community. For example: + +[Here's the list of tags for the `Docker-stacks-foundation` image](https://quay.io/repository/jupyter/docker-stacks-foundation?tab=tags). + +:::{admonition} Don't use the `latest` tag +:class: warning +`latest` is a special tag for "the latest tag to be released". This is generally a bad idea when using environment images for your interactive data science sessions. Here are a few reasons why: + +- The environment may regularly change without warning as new versions of the image are released. +- The `JUPYTER_IMAGE` environment variable will not be useful because it's a generic `latest` variable. +- If you use tools that _themselves_ use Docker, you might have different images on your interactive environment vs. the images the tools use, because they haven't all updated at once. + +Instead, we recommend periodically manually updating the tag you use over time. +::: + +## Configure JupyterHub to use the tag + +Once you have an image and a tag, you can configure your JupyterHub to use it. + +Here's a sample configuration if you're using the [Zero to JupyterHub for Kubernetes distribution](https://z2jh.jupyter.org): + +```yaml +singleuser: + image: + name: pangeo/pangeo-notebook + tag: 2023.04.15 +``` + +Here's a sample configuration if you're using the [Dockerspawner for JupyterHub spawner](https://jupyterhub-dockerspawner.readthedocs.io/en/latest/): + +```python +c.DockerSpawner.image = 'pangeo/pangeo-notebook:2023.04.15' +``` + +When you re-deploy your JupyterHub application, it should now spawn user environments from the image you've configured. diff --git a/docs/source/use/extend-community-image.md b/docs/source/use/extend-community-image.md new file mode 100644 index 000000000..f4bf5159d --- /dev/null +++ b/docs/source/use/extend-community-image.md @@ -0,0 +1,91 @@ +# Extend a community image with your own packages + +If [using a community image alone](./community-image.md) doesn't provide the environment you need, you might get away with just installing one or two extra things on top of it. + +To do this, you should define a `Dockerfile` that "inherits" the community image, and "extend" it to add a few extra things. + +[Here's a repository that demonstrates how to do this using the `repo2docker` github action](https://github.com/2i2c-org/example-inherit-from-community-image). Below is a summary of the most important parts. + +A [local `environment.yml` file](https://github.com/2i2c-org/example-inherit-from-community-image/blob/main/environment.yml) defines **only the extra things to install** in addition to the upstream image. + +```{code-block} +:caption: environment.yml +channels: + - conda-forge + +dependencies: + - jupyterhub-singleuser>=3.0,<4.0 + + # Everyone wants to use nbgitpuller for everything, so let's do that + - nbgitpuller=1.1.* + # Install packages from pip + - pip + - pip: + - otter-grader +``` + +A local `Dockerfile` does the following things: + +- Inherits from the upstream image. +- Copies your local `environment.yml` file into a directory in the image. +- Updates the `conda` environment with it to install the extra packages. + +For example, the following inherits the `scipy-notebook` image with the `2023-05-01` tag and takes the above steps. (you could follow a similar workflow with other package managers). + +```{code-block} Dockerfile +:caption: Dockerfile +FROM jupyter/scipy-notebook:2023-05-01 +COPY environment.yml /tmp/environment.yml +RUN mamba env update --prefix ${CONDA_DIR} --file /tmp/environment.yml +COPY image-tests image-tests +RUN ls +``` + +A [github workflow](https://github.com/2i2c-org/example-inherit-from-community-image/blob/main/.github/workflows/build.yaml) uses the [`repo2docker` GitHub action](#github-action) to build and push a Docker image using repo2docker. Here's an example of what the GitHub workflow looks like: + +````{dropdown} Example GitHub workflow code +```{code-block} yaml +:caption: .github/workflows/build.yaml +name: Build and push container image + +on: + push: + branches: + - main + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + + # For biggish images, github actions runs out of disk space. + # So we cleanup some unwanted things in the disk image, and reclaim that space for our Docker use + # https://github.com/actions/virtual-environments/issues/2606#issuecomment-772683150 + # and https://github.com/easimon/maximize-build-space/blob/b4d02c14493a9653fe7af06cc89ca5298071c66e/action.yml#L104 + # This gives us a total of about 52G of free space, which should be enough for now + - name: cleanup disk space + run: | + sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc + df -h + + - name: Checkout files in repo + uses: actions/checkout@main + + - name: Build and push the image to quay.io + uses: jupyterhub/repo2docker-action@master + with: + # Make sure username & password/token pair matches your registry credentials + DOCKER_USERNAME: ${{ secrets.QUAY_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.QUAY_PASSWORD }} + DOCKER_REGISTRY: "quay.io" + # Disable pushing a 'latest' tag, as this often just causes confusion + LATEST_TAG_OFF: true + # + # Uncomment and modify the following line with your image name, otherwise no push will happen + IMAGE_NAME: "yuvipanda/example-inherit-from-community-image" + + # Lets us monitor disks getting full as images get bigger over time + - name: Show how much disk space is left + run: df -h +``` +```` diff --git a/docs/source/use/index.md b/docs/source/use/index.md new file mode 100644 index 000000000..7f8a953e0 --- /dev/null +++ b/docs/source/use/index.md @@ -0,0 +1,47 @@ +# User guide + +Short, actionable guides that cover specific topics with repo2docker. +Select from the pages listed below to get started. + +Information about configuring your repository to work with repo2docker, +and controlling elements of the built environment using configuration files. + +```{toctree} +:caption: Image building basics +:maxdepth: 1 +pathways +../configuration/index +repository +../cli +``` + +```{toctree} +:maxdepth: 1 +:caption: Customize your environment + +../howto/user_interface +../howto/languages +../howto/lab_workspaces +../howto/export_environment +../howto/base_image +``` + +```{toctree} +:maxdepth: 1 +:caption: Deploy images into production + +../howto/deploy +./community-image +./extend-community-image +../howto/jupyterhub_images +./action +../howto/breaking_changes +``` + +```{toctree} +:maxdepth: 2 +:caption: Learn about repo2docker + +../faq +../specification +``` diff --git a/docs/source/use/pathways.md b/docs/source/use/pathways.md new file mode 100644 index 000000000..5375152df --- /dev/null +++ b/docs/source/use/pathways.md @@ -0,0 +1,102 @@ +# Four ways to use `repo2docker` images in a JupyterHub + +Many users of `repo2docker` primarily wish to define the environment for a Binder or a JupyterHub. Here are four ways to accomplish this, from least-to-most work. + +% TO EDIT THIS FIGURE: Load the linked SVG into excalidraw.com, make edits, and re-export. + +```{figure} ../_static/images/whentouse.svg +A decision tree for the recommended way to get your reproducible user environment using `repo2docker` or a community image built with `repo2docker`. +``` + +## 1. Use a community maintained image + +The simplest thing to do is check whether another community already maintains and offers an image that you can simply re-use. This reduces the burden on you to keep the image up-to-date, and gives you an opportunity to collaborate and make contributions rather than building something yourself from scratch. + +See [](./community-image.md) for a brief how-to on using a community maintained image. + +::::{grid} 2 +:::{grid-item-card} Benefits + +- A community of experts maintains the image with you! +- Don’t struggle alone with your problems, drag others along! +- Good choices (base image, how python is installed, etc) made on your behalf +- Updates happen without you needing to do much + ::: + :::{grid-item-card} Drawbacks +- Might have lots of stuff you don’t need +- Large image sizes, slower pulling +- Might get you 98% of the way there, but that isn't 100% +- Architectural choices made might not fit your use case +- Updates are not on your schedule + ::: + :::: + +## 2. Inherit from a community maintained image and add a few extras + +Sometimes a community-maintained environment image has **almost** what you need, but there are a few extra packages you'd like to install yourself. In this case, it's easiest to **inherit and extend the community image**. + +This is not the same thing as forking the repository for the community image, modifying it, and re-building it from scratch. It's similar to depending on an upstream piece of software and then building upon it in your own tool. + +::::{grid} 2 +:::{grid-item-card} Benefits + +- Only need to maintain the changes you make +- Update the FROM tag to keep up with upstream changes +- You must manage a GH repo +- Works well with mybinder.org + ::: + :::{grid-item-card} Drawbacks +- Need to understand how upstream image is built so you can customize +- Documentation for this method currently sucks (but can be fixed!) +- Removing existing packages might break things +- You must manage a GH repo + ::: + :::: + +See [](./extend-community-image.md) for a how-to guide. + +## 3. Use repo2docker to build your environment image + +If your needs differ far enough from the community-maintained images that you find, you can use `repo2docker` to build your environment image using [supported configuration files](#config-files). +To learn how to do this, follow the [getting started with repo2docker guide](../start.md) and look at the [list of supported configuration files](#config-files). +Check out the other sections under "Image building basics" for more useful how-tos. + +::::{grid} 2 +:::{grid-item-card} Benefits + +- Works well with mybinder.org +- No need to learn Dockerfile syntax +- Use language specific, well understood file formats +- Only get whatever packages you want +- Good defaults chosen by the community + ::: + :::{grid-item-card} Drawbacks +- Build time is slower +- Images may be bigger +- Might not support 100% of what you want, and at some point you might have to take the ramp-off to a Dockerfile + ::: + :::: + +## 4. Use a full fledged custom Dockerfile + +If you need full control over the entire computational environment, you can always create your own `Dockerfile` from scratch, and repo2docker will build an image out of it. + +This is for advanced users only that know what they're doing - full guidance on how to use `Dockerfiles` is out of scope for this tutorial. + +[Here's an example repository that uses a `Dockerfile` to build with repo2docker](https://github.com/yuvipanda/example-use-dockerfile). + +::::{grid} 2 +:::{grid-item-card} Benefits + +- Get exactly what you want +- Can be optimized for small image size & fast build times +- Lots of existing documentation in the SRE world on how to use these + +::: +:::{grid-item-card} Drawbacks + +- Requires a lot of knowledge for ongoing maintenance +- Might have to solve problems yourself that were solved in upstream images / repo2docker +- Need to adapt existing documentation from the SRE use case to interactive computing use case + ::: + :::: diff --git a/docs/source/use/repository.md b/docs/source/use/repository.md new file mode 100644 index 000000000..0c9d95f0c --- /dev/null +++ b/docs/source/use/repository.md @@ -0,0 +1,63 @@ +# Using source repositories + +(usage-config-file-location)= + +## Where to put configuration files in a repository + +`repo2docker` will look for configuration files in the following order: + +- The root directory of the repository. +- A folder named `binder/` or `.binder/` in the root of the repository. + + If one of these folders exists, only configuration files in that folder are considered, configuration in the root directory will be ignored. + Having both `binder/` and `.binder/` folders is not allowed. + +Check the complete list of [configuration files](#config-files) supported +by `repo2docker` to see how to configure the build process. + +(repository-providers)= + +## Supported repository providers + +`repo2docker` can fetch repositories from a number of repositories. Here are the various types of _repository references_ we support: + +- A URL of a Git repository (`https://github.com/binder-examples/requirements`), +- A Zenodo DOI (`10.5281/zenodo.1211089`), +- A [SWHID] (`swh:1:rev:999dd06c7f679a2714dfe5199bdca09522a29649`), +- A URL of a [CKAN] dataset (`https://demo.ckan.org/dataset/sample-dataset-1`) +- A path to a local directory (`a/local/directory`) + +[swhid]: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html +[ckan]: https://ckan.org + +In each case you can build from these repository sources like so: + +```bash +jupyter-repo2docker +``` + +## Supported version control systems + +These Version Control Systems are supported by `repo2docker`. + +### Git + +Any `git` repository is supported with `repo2docker`. +These are generally stored in [a git repository provider](#repository-providers) like [GitHub](https://github.com). + +### Mercurial + +For [Mercurial](https://www.mercurial-scm.org) repositories, Mercurial and +[hg-evolve](https://www.mercurial-scm.org/doc/evolution/) need to be +installed. For example, on Debian based distributions, one can do: + +``` +sudo apt install mercurial +$(hg debuginstall --template "{pythonexe}") -m pip install hg-evolve --user +``` + +To install Mercurial on other systems, see [here](https://www.mercurial-scm.org/download). + +Note that for old Mercurial versions, you may need to specify a version for +hg-evolve. For example, `hg-evolve==9.2` for hg 4.5 (which is installed with +`apt` on Ubuntu 18.4). From 714d4e394cd1948aa5be0f2f3952ccab743c39b2 Mon Sep 17 00:00:00 2001 From: choldgraf Date: Sun, 3 Aug 2025 13:21:30 -0700 Subject: [PATCH 123/299] Simplify our release docs --- docs/source/contribute/tasks.md | 47 +++++++++------------------------ 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/docs/source/contribute/tasks.md b/docs/source/contribute/tasks.md index 6e5835558..c953d5cf1 100644 --- a/docs/source/contribute/tasks.md +++ b/docs/source/contribute/tasks.md @@ -112,47 +112,26 @@ See the subsections below for more detailed instructions. ## Creating a Release -We make a release of whatever is on `main` every month. We use "calendar versioning". -Monthly releases give users a predictable pattern for when releases are going to -happen and prevents locking up improvements for fixes for long periods of time. +We encourage a release of whatever is on `main` every month. We use "[calendar versioning](https://calver.org/)". A new release will automatically be created when a new git tag is created -and pushed to the repository. +and pushed to the repository. See [previous releases](https://github.com/jupyterhub/repo2docker/releases) for examples. To create a new release, follow these steps: -### Create a new tag and push it +- Go to the [GitHub repository](https://github.com/jupyterhub/repo2docker) +- Click `Draft a new release` +- Click `Tag` + - Type in a new tag like `YYYY.MM.N` (where `N` is the release number this month, usually it is `0`) +- Title: ` ` (E.g., `August 2025`) +- Body: Paste the output of `github-activity` since the date of the last release. + - E.g. `github-activity jupyterhub/repo2docker -s 2025-08-01 +- Click `Publish release` -First, tag a new release locally: +This will create a new release **and a new tag**. +The creation of the tag will trigger the `.github/workflows/release.yml` action to publish the latest repo2docker package to PyPI. -```bash -V=YYYY.MM.0; git tag -am "release $V" $V -``` - -> If you need to make a second (or third) release in a month increment the -> trailing 0 of the version to 1 (or 2). - -Then push this change up to the main repository - -``` -git push origin --tags -``` - -GitHub Actions should create a -new release on the [repo2docker PyPI](https://pypi.org/project/jupyter-repo2docker/). -Once this has completed, make sure that the new version has been updated. - -### Create a new release on the GitHub repository - -Once the new release has been pushed to PyPI, we need to create a new -release on the [GitHub repository releases page](https://github.com/jupyterhub/repo2docker/releases). Once on that page, follow these steps: - -- Click "Draft a new release" -- Choose a tag version using the same tag you just created above -- The release name is simply the tag version -- Finally, click "Publish release" - -That's it! +You can confirm the new package is released [in our PyPI page](https://pypi.org/project/jupyter-repo2docker/#history). # Uncommon tasks From 0b12f5f4ba4469fc09d2ac2b53c5cec5f354401c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 20:23:12 +0000 Subject: [PATCH 124/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/contribute/tasks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/contribute/tasks.md b/docs/source/contribute/tasks.md index c953d5cf1..7fd636894 100644 --- a/docs/source/contribute/tasks.md +++ b/docs/source/contribute/tasks.md @@ -122,10 +122,10 @@ To create a new release, follow these steps: - Go to the [GitHub repository](https://github.com/jupyterhub/repo2docker) - Click `Draft a new release` - Click `Tag` - - Type in a new tag like `YYYY.MM.N` (where `N` is the release number this month, usually it is `0`) + - Type in a new tag like `YYYY.MM.N` (where `N` is the release number this month, usually it is `0`) - Title: ` ` (E.g., `August 2025`) - Body: Paste the output of `github-activity` since the date of the last release. - - E.g. `github-activity jupyterhub/repo2docker -s 2025-08-01 + - E.g. `github-activity jupyterhub/repo2docker -s 2025-08-01 - Click `Publish release` This will create a new release **and a new tag**. From b5e4b3c4c07d413a9bd281aed6a126b9d90e73dd Mon Sep 17 00:00:00 2001 From: choldgraf Date: Fri, 8 Aug 2025 10:06:37 -0700 Subject: [PATCH 125/299] Add note on root --- docs/source/use/actions-and-scripts.md | 38 ++++++++++++++++++++++++++ docs/source/use/index.md | 1 + 2 files changed, 39 insertions(+) create mode 100644 docs/source/use/actions-and-scripts.md diff --git a/docs/source/use/actions-and-scripts.md b/docs/source/use/actions-and-scripts.md new file mode 100644 index 000000000..b2a373510 --- /dev/null +++ b/docs/source/use/actions-and-scripts.md @@ -0,0 +1,38 @@ +# Run scripts, commands, and actions as part of environment building + +In addition to installing using [standard configuration files](#config-files), you can run your own custom actions and commands as part of the build or user session launch process. + +(commands-jovyan)= +## Commands are run as the `jovyan` user and not root + +Whenever you run a custom command, it is run as a special user called `jovyan`. +It **does not have `root` privileges**. +So, you should choose actions that do not require these privileges. + +For example, if you're using a `postBuild` script to install and use a new environment manager like [the `pixi` CLI](https://pixi.sh/latest/), make sure to install and configure it to a location accessible (and writable) to a user. For example: + +- ✅ `$CONDA_BIN` would work, because `conda` puts its binary folder in a user-accessible space. +- ✅ `~/.local/bin` would work, because it's in the home directory. +- ❌ `/usr/bin` would *NOT* work, because it requires root privileges to write to. + +## Run commands before finalizing your environment image + +You can run arbitrary commands before finalizing your environment image. +This is useful in cases like: + +- You want to install and use custom environment management software that isn't supported by [repo2docker's configuration files](#config-files) (e.g., `pixi`). +- You want to run custom commands to setup the environment properly (e.g., download a small dataset and put it in a specific location in the image). + +To do so, use a `postBuild` script, see [](#postbuild) for more information. + +## Run commands before launching a new user session + +You can run commands before launching a new **user session**. +These are not baked into the environment image, they'll only be run once an image has been launched, but before the user's interactive session has been created. + +This is useful for things like: + +- Start a local server running that you want a user to have access to. +- Updating a local dataset that always needs to have the latest information in it. + +To do so, use a `start` script. See [](#config-start) for more information. diff --git a/docs/source/use/index.md b/docs/source/use/index.md index 7f8a953e0..b27c579ad 100644 --- a/docs/source/use/index.md +++ b/docs/source/use/index.md @@ -22,6 +22,7 @@ repository ../howto/user_interface ../howto/languages ../howto/lab_workspaces +./actions-and-scripts ../howto/export_environment ../howto/base_image ``` From b19093445718d5e291f2055c2d6108b7273eabb0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 17:07:24 +0000 Subject: [PATCH 126/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/use/actions-and-scripts.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/use/actions-and-scripts.md b/docs/source/use/actions-and-scripts.md index b2a373510..36ad2c173 100644 --- a/docs/source/use/actions-and-scripts.md +++ b/docs/source/use/actions-and-scripts.md @@ -3,6 +3,7 @@ In addition to installing using [standard configuration files](#config-files), you can run your own custom actions and commands as part of the build or user session launch process. (commands-jovyan)= + ## Commands are run as the `jovyan` user and not root Whenever you run a custom command, it is run as a special user called `jovyan`. @@ -13,7 +14,7 @@ For example, if you're using a `postBuild` script to install and use a new envir - ✅ `$CONDA_BIN` would work, because `conda` puts its binary folder in a user-accessible space. - ✅ `~/.local/bin` would work, because it's in the home directory. -- ❌ `/usr/bin` would *NOT* work, because it requires root privileges to write to. +- ❌ `/usr/bin` would _NOT_ work, because it requires root privileges to write to. ## Run commands before finalizing your environment image From ab26c12d73074bab5d73a683f6ba090733f44463 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 13:15:50 +0200 Subject: [PATCH 127/299] Avoid use of jupyter-repo2docker Closes https://github.com/jupyterhub/repo2docker/issues/1437 --- docs/source/cli.md | 14 +++++++------- docs/source/contribute/tasks.md | 6 +++--- docs/source/design.md | 2 +- docs/source/index.md | 2 +- docs/source/use/repository.md | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/source/cli.md b/docs/source/cli.md index ac60bda8e..82a29c1bd 100644 --- a/docs/source/cli.md +++ b/docs/source/cli.md @@ -3,7 +3,7 @@ `repo2docker` is called with this command: ``` -jupyter-repo2docker +repo2docker ``` where `` is a repository in one of [the supported repository providers](#repository-providers). @@ -12,7 +12,7 @@ For example, the following command will build an image of Peter Norvig's [Pytudes] repository: ``` -jupyter-repo2docker https://github.com/norvig/pytudes +repo2docker https://github.com/norvig/pytudes ``` Building the image may take a few minutes. @@ -35,7 +35,7 @@ dependencies and contents of the source repository in the built image. To debug the container image being built, pass the `--debug` parameter: > ```bash -> jupyter-repo2docker --debug https://github.com/norvig/pytudes +> repo2docker --debug https://github.com/norvig/pytudes > ``` This will print the generated `Dockerfile`, build it, and run it. @@ -44,7 +44,7 @@ To see the generated `Dockerfile` without actually building it, pass `--no-build This `Dockerfile` output is for **debugging purposes** of `repo2docker` only - it can not be used by Docker directly. > ```bash -> jupyter-repo2docker --no-build --debug https://github.com/norvig/pytudes +> repo2docker --no-build --debug https://github.com/norvig/pytudes > ``` ## Build from a branch, commit or tag @@ -53,7 +53,7 @@ To build a particular branch and commit, use the argument `--ref` and specify the `branch-name` or `commit-hash`. For example: ``` -jupyter-repo2docker --ref 9ced85dd9a84859d0767369e58f33912a214a3cf https://github.com/norvig/pytudes +repo2docker --ref 9ced85dd9a84859d0767369e58f33912a214a3cf https://github.com/norvig/pytudes ``` :::{tip} @@ -70,7 +70,7 @@ flag for each variable that you want to define. For example: ```bash -jupyter-repo2docker -e VAR1=val1 -e VAR2=val2 ... +repo2docker -e VAR1=val1 -e VAR2=val2 ... ``` You can also configure environment variables for all users of a repository using the @@ -81,7 +81,7 @@ You can also configure environment variables for all users of a repository using ## Command-line API ```{autoprogram} repo2docker.__main__:argparser -:prog: jupyter-repo2docker +:prog: repo2docker ``` [pytudes]: https://github.com/norvig/pytudes diff --git a/docs/source/contribute/tasks.md b/docs/source/contribute/tasks.md index 6e5835558..3aabac1b5 100644 --- a/docs/source/contribute/tasks.md +++ b/docs/source/contribute/tasks.md @@ -165,13 +165,13 @@ automates this test. ```bash #! /bin/bash -e -current_version=$(jupyter-repo2docker --version | sed s@+@-@) +current_version=$(repo2docker --version | sed s@+@-@) echo "Comparing $(pwd) (local $current_version vs. $R2D_COMPARE_TO)" basename="dockerfilediff" diff_r2d_dockerfiles_with_version () { - docker run --rm -t -v "$(pwd)":"$(pwd)" --user 1000 jupyterhub/repo2docker:"$1" jupyter-repo2docker --no-build --debug "$(pwd)" &> "$basename"."$1" - jupyter-repo2docker --no-build --debug "$(pwd)" &> "$basename"."$current_version" + docker run --rm -t -v "$(pwd)":"$(pwd)" --user 1000 jupyterhub/repo2docker:"$1" repo2docker --no-build --debug "$(pwd)" &> "$basename"."$1" + repo2docker --no-build --debug "$(pwd)" &> "$basename"."$current_version" # remove first line logging the path sed -i '/^\[Repo2Docker\]/d' "$basename"."$1" diff --git a/docs/source/design.md b/docs/source/design.md index 6d7cdcad7..8d81e2326 100644 --- a/docs/source/design.md +++ b/docs/source/design.md @@ -16,7 +16,7 @@ The use cases for `repo2docker` which drive most design decisions are: 1. Automated image building used by projects like [BinderHub](http://github.com/jupyterhub/binderhub) 2. Manual image building and running the image from the command line client, - `jupyter-repo2docker`, by users interactively on their workstations + `repo2docker`, by users interactively on their workstations ## Deterministic output diff --git a/docs/source/index.md b/docs/source/index.md index 43593c8a9..8b1aa2b43 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -37,7 +37,7 @@ In short, `repo2docker` is a tool to reproducibly build, run, and deploy these u When you call `repo2docker` like so: ``` -jupyter-repo2docker +repo2docker ``` It performs these steps: diff --git a/docs/source/use/repository.md b/docs/source/use/repository.md index 0c9d95f0c..3206ccb6c 100644 --- a/docs/source/use/repository.md +++ b/docs/source/use/repository.md @@ -33,7 +33,7 @@ by `repo2docker` to see how to configure the build process. In each case you can build from these repository sources like so: ```bash -jupyter-repo2docker +repo2docker ``` ## Supported version control systems From 2c256482c5fd7dad6822684b3d59739a461e099f Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 13:21:33 +0200 Subject: [PATCH 128/299] Add a admonition regading the name of the package on PyPI Related to https://github.com/jupyterhub/repo2docker/issues/1437 --- docs/source/start.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/start.md b/docs/source/start.md index 87d148fc9..ef5fe7d22 100644 --- a/docs/source/start.md +++ b/docs/source/start.md @@ -6,7 +6,7 @@ This tutorial guides you through installing `repo2docker` and building your firs ## Install `repo2docker` -repo2docker requires Python 3.6 or above on Linux and macOS. +`repo2docker` requires Python 3.6 or above on Linux and macOS. :::{admonition} Windows support is experimental @@ -23,6 +23,10 @@ Recent versions of Docker are recommended. ### Install `repo2docker` with `pip` +```{warning} +The name of the package on [PyPI](https://pypi.org/) is [`jupyter-repo2docker`](https://pypi.org/project/jupyter-repo2docker/) instead of `repo2docker`. +``` + We recommend installing `repo2docker` with the `pip` tool: ``` From 1a677317f25e26aa5f2dfa89dd6b9560e9556a1b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 13:56:29 +0200 Subject: [PATCH 129/299] Review "User guide" index page --- docs/source/use/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/use/index.md b/docs/source/use/index.md index 7f8a953e0..839017008 100644 --- a/docs/source/use/index.md +++ b/docs/source/use/index.md @@ -1,9 +1,9 @@ # User guide -Short, actionable guides that cover specific topics with repo2docker. +Short, actionable guides that cover specific topics with `repo2docker`. Select from the pages listed below to get started. -Information about configuring your repository to work with repo2docker, +Information about configuring your repository to work with `repo2docker`, and controlling elements of the built environment using configuration files. ```{toctree} From 564eb0d41f1829e7a3b4501ffad7b9c6563f9b3f Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 13:56:47 +0200 Subject: [PATCH 130/299] Review "Four ways to use repo2docker images" page --- docs/source/use/pathways.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/source/use/pathways.md b/docs/source/use/pathways.md index 5375152df..f4906d34c 100644 --- a/docs/source/use/pathways.md +++ b/docs/source/use/pathways.md @@ -41,21 +41,21 @@ This is not the same thing as forking the repository for the community image, mo :::{grid-item-card} Benefits - Only need to maintain the changes you make -- Update the FROM tag to keep up with upstream changes -- You must manage a GH repo -- Works well with mybinder.org +- Update the `FROM` tag to keep up with upstream changes +- You must manage a Git repository +- Works well with [mybinder.org] ::: :::{grid-item-card} Drawbacks - Need to understand how upstream image is built so you can customize - Documentation for this method currently sucks (but can be fixed!) - Removing existing packages might break things -- You must manage a GH repo +- You must manage a Git repository ::: :::: See [](./extend-community-image.md) for a how-to guide. -## 3. Use repo2docker to build your environment image +## 3. Use `repo2docker` to build your environment image If your needs differ far enough from the community-maintained images that you find, you can use `repo2docker` to build your environment image using [supported configuration files](#config-files). To learn how to do this, follow the [getting started with repo2docker guide](../start.md) and look at the [list of supported configuration files](#config-files). @@ -64,7 +64,7 @@ Check out the other sections under "Image building basics" for more useful how-t ::::{grid} 2 :::{grid-item-card} Benefits -- Works well with mybinder.org +- Works well with [mybinder.org] - No need to learn Dockerfile syntax - Use language specific, well understood file formats - Only get whatever packages you want @@ -79,7 +79,7 @@ Check out the other sections under "Image building basics" for more useful how-t ## 4. Use a full fledged custom Dockerfile -If you need full control over the entire computational environment, you can always create your own `Dockerfile` from scratch, and repo2docker will build an image out of it. +If you need full control over the entire computational environment, you can always create your own `Dockerfile` from scratch, and `repo2docker` will build an image out of it. This is for advanced users only that know what they're doing - full guidance on how to use `Dockerfiles` is out of scope for this tutorial. @@ -90,13 +90,15 @@ This is for advanced users only that know what they're doing - full guidance on - Get exactly what you want - Can be optimized for small image size & fast build times -- Lots of existing documentation in the SRE world on how to use these +- Lots of existing documentation in the site reliability engineer world on how to use these ::: :::{grid-item-card} Drawbacks - Requires a lot of knowledge for ongoing maintenance - Might have to solve problems yourself that were solved in upstream images / repo2docker -- Need to adapt existing documentation from the SRE use case to interactive computing use case +- Need to adapt existing documentation from the site reliability engineer use case to interactive computing use case ::: :::: + +[mybinder.org]: https://mybinder.org From e3d3e2b4fa5d35646161a69d1cd8cd4ab4cb715e Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 13:58:51 +0200 Subject: [PATCH 131/299] Review "Configuration files supported by repo2docker" page --- docs/source/configuration/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/configuration/index.md b/docs/source/configuration/index.md index c64189d8c..ba4b69629 100644 --- a/docs/source/configuration/index.md +++ b/docs/source/configuration/index.md @@ -1,6 +1,6 @@ (config-files)= -# Configuration files supported by repo2docker +# Configuration files supported by `repo2docker` `repo2docker` looks for configuration files in the repository being built to determine how to build it. In general, `repo2docker` uses the same @@ -15,7 +15,7 @@ Python and R installation in a repository. ::: A list of supported configuration files (roughly in the order of build priority) -can be found on this page (and to the right). +can be found in the next sections. ```{toctree} :maxdepth: 2 From ba71070b5780107fe161374e0bb5a22c580944f3 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 14 Aug 2025 14:52:43 +0200 Subject: [PATCH 132/299] Review "Configuration files supported" page --- docs/source/conf.py | 2 +- docs/source/configuration/development.md | 2 +- docs/source/configuration/research.md | 12 ++++++------ docs/source/configuration/system.md | 25 +++++++++++++----------- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 590400c75..03a2697a2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -60,7 +60,7 @@ from repo2docker.buildpacks.conda import CondaBuildPack -default_python = f"`Python {CondaBuildPack.major_pythons['3']}`" +default_python = f"Python {CondaBuildPack.major_pythons['3']}" myst_substitutions = { "default_python": default_python, "default_python_version": default_python, diff --git a/docs/source/configuration/development.md b/docs/source/configuration/development.md index 1084303c1..a770f0cb7 100644 --- a/docs/source/configuration/development.md +++ b/docs/source/configuration/development.md @@ -21,7 +21,7 @@ both kinds. This specifies a list of Python packages that should be installed in your environment. Our -[requirements.txt example](https://github.com/binder-examples/requirements/blob/HEAD/requirements.txt) +[example `requirements.txt` file](https://github.com/binder-examples/requirements/blob/HEAD/requirements.txt) on GitHub shows a typical requirements file. (setup-py)= diff --git a/docs/source/configuration/research.md b/docs/source/configuration/research.md index 0df6d4a85..dbcc00019 100644 --- a/docs/source/configuration/research.md +++ b/docs/source/configuration/research.md @@ -8,18 +8,18 @@ that lets you install any kind of package, including Python, R, and C/C++ packages. `repo2docker` does not use your `environment.yml` to create and activate a new conda environment. -Rather, it updates a base conda environment [defined here](https://github.com/jupyterhub/repo2docker/blob/HEAD/repo2docker/buildpacks/conda/environment.yml) with the packages listed in your `environment.yml`. +Rather, it updates a [pre-defined base conda environment](https://github.com/jupyterhub/repo2docker/blob/HEAD/repo2docker/buildpacks/conda/environment.yml) with the packages listed in your `environment.yml`. This means that the environment will always have the same default name, not the name specified in your `environment.yml`. :::{note} -You can install files from pip in your `environment.yml` as well. -For example, see the [binder-examples environment.yml](https://github.com/binder-examples/python-conda_pip/blob/HEAD/environment.yml) file. See [the `conda` environment management instructions](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-file-manually) for more information. +You can install files from [PyPI](https://pypi.org/) in your `environment.yml` as well. +For example, see the [example `environment.yml` file](https://github.com/binder-examples/python-conda_pip/blob/HEAD/environment.yml) file. See [the `conda` environment management instructions](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-file-manually) for more information. ::: You can also specify which Python version to install in your built environment with `environment.yml`. By default, `repo2docker` installs {{ default_python }} with your `environment.yml` unless you include the version of Python in the `environment.yml` of your Git repository. -`conda` should support all versions of Python, though `repo2docker` support is best with `Python 3.7-3.11`. +`conda` should support all versions of Python, though `repo2docker` support is best with Python 3.7-3.11. :::{warning} If you include a Python version in a `runtime.txt` file in addition to your @@ -28,7 +28,7 @@ If you include a Python version in a `runtime.txt` file in addition to your (install-r)= -## `install.R` - Install packages with R/RStudio +## `install.R` - Install R packages This is used to install R libraries pinned to a specific snapshot on [Posit Package Manager](https://packagemanager.posit.co/). @@ -38,7 +38,7 @@ To set the date of the snapshot, or to specify a specific version of R, add a [r (description)= -## `DESCRIPTION` - Install an R package +## `DESCRIPTION` - Install as an R package To install your repository like an R package, you may include a `DESCRIPTION` file. `repo2docker` installs the package and dependencies from the `DESCRIPTION` by running `devtools::install_local(getwd())`. diff --git a/docs/source/configuration/system.md b/docs/source/configuration/system.md index b3f5f9626..de75ceca3 100644 --- a/docs/source/configuration/system.md +++ b/docs/source/configuration/system.md @@ -2,20 +2,23 @@ (apt-txt)= -## `apt.txt` - Install packages with apt-get +## `apt.txt` - Install packages with `apt-get` -A list of Debian packages that should be installed. The base image used is usually the latest released -version of Ubuntu. +A list of packages in the [`.deb`]() format that should be installed. The `.deb` files are downloaded from the server configured in the Docker base image. + +```{note} +If a `Dockerfile` is not used to change the Docker base image, the base image is [Ubuntu](https://ubuntu.com/) [22.04 LTS (Jammy Jellyfish)](https://releases.ubuntu.com/jammy/). All `.deb` files availables are listed in [Ubuntu Packages](https://packages.ubuntu.com/jammy/). +``` We use `apt.txt`, for example, to install LaTeX in our -[example apt.txt for LaTeX](https://github.com/binder-examples/latex/blob/HEAD/apt.txt). +[example `apt.txt` file for LaTeX](https://github.com/binder-examples/latex/blob/HEAD/apt.txt). (runtime-txt)= ## `runtime.txt` - Specifying runtimes Sometimes you want to specify the version of the runtime (e.g. the version of Python or R), but the environment specification format will not let you specify this information (e.g. `requirements.txt` or `install.R`). -For these cases, we have a special file, `runtime.txt`. +For these cases, we have a special `runtime.txt` file. :::{warning} `runtime.txt` is only supported when used with environment specifications @@ -25,23 +28,23 @@ that do not already support specifying the runtime ### Set the Python version -Add the line `python-x.y` in `runtime.txt` to run the repository with Python version x.y. +Add the line `python-x.y` in `runtime.txt` to run the repository with Python version `x.y`. See our [Python2 example repository](https://github.com/binder-examples/python2_runtime/blob/HEAD/runtime.txt). ### Set the R version -Add the line `r----
` in `runtime.txt` to run the repository with R version `RVERSION` and libraries from a `YYYY-MM-DD` snapshot of the [Posit Package Manager](https://packagemanager.posit.co/client/#/repos/2/overview). +Add the line `r-x.y-YYYY-MM-DD` in `runtime.txt` to run the repository with R version `x.y` and libraries from a `YYYY-MM-DD` snapshot of the [Posit Package Manager](https://packagemanager.posit.co/client/#/repos/2/overview). -`RVERSION` can be set to 3.4, 3.5, 3.6, or to patch releases for the 3.5 and 3.6 series. +The version of R, i.e. `x.y`, can be set to 3.4, 3.5, 3.6, or to patch releases for the 3.5 and 3.6 series. If you do not specify a version, the latest release will be used. See our [R example repository](https://github.com/binder-examples/r/blob/HEAD/runtime.txt). (default-nix)= -## `default.nix` - the nix package manager +## `default.nix` - the `nix` package manager -Specify packages to be installed by the [nix package manager](https://github.com/NixOS/nixpkgs). +Specify packages to be installed by the [`nix` package manager](https://github.com/NixOS/nixpkgs). When you use this config file all other configuration files (like `requirements.txt`) that specify packages are ignored. When using `nix` you have to specify all packages and dependencies explicitly, including the Jupyter notebook package that @@ -54,7 +57,7 @@ a `nix` expression written in a `default.nix` file. Make sure to to produce a reproducible environment. To see an example repository visit -[nix binder example](https://github.com/binder-examples/nix). +[nix example repository](https://github.com/binder-examples/nix). (dockerfile)= From 8b3f8ccc31dca518bc29ebc653e5d46bb77d6ae3 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 15 Aug 2025 08:42:21 +0200 Subject: [PATCH 133/299] Fix list of supported R versions in the documentation --- docs/source/configuration/system.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/source/configuration/system.md b/docs/source/configuration/system.md index de75ceca3..0756cdf6a 100644 --- a/docs/source/configuration/system.md +++ b/docs/source/configuration/system.md @@ -35,7 +35,18 @@ See our [Python2 example repository](https://github.com/binder-examples/python2_ Add the line `r-x.y-YYYY-MM-DD` in `runtime.txt` to run the repository with R version `x.y` and libraries from a `YYYY-MM-DD` snapshot of the [Posit Package Manager](https://packagemanager.posit.co/client/#/repos/2/overview). -The version of R, i.e. `x.y`, can be set to 3.4, 3.5, 3.6, or to patch releases for the 3.5 and 3.6 series. +The version of R, i.e. `x.y`, can be set to + +- `4.4` +- `4.3` +- `4.2` +- `4.1` +- `4.0` +- `3.6` +- `3.5` +- `3.4` +- `3.3` + If you do not specify a version, the latest release will be used. See our [R example repository](https://github.com/binder-examples/r/blob/HEAD/runtime.txt). From 765757eeb162ed75e5072b92d0e89ed8e0c6a500 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 10:20:55 +0200 Subject: [PATCH 134/299] Improve documentation index page --- docs/source/index.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index 8b1aa2b43..831b88776 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -1,10 +1,8 @@ # Welcome to `repo2docker`'s documentation -`repo2docker` lets you **reproducibly build, run, and deploy user environment images for interactive computing and data workflows from source code repositories**. +`repo2docker` lets you **reproducibly build and run user environment container images for interactive computing and data workflows from source code repositories**. Optionally, the container image can be pushed to a Docker registry. -`repo2docker` can be used to explore a repository locally by building and executing the -constructed image of the repository, or as a means of building images that -are pushed to a Docker registry. It is the tool used by [BinderHub](https://binderhub.readthedocs.io) to build images on demand. +Also, `repo2docker` is the tool used to build container images for [JupyterHub](https://jupyterhub.readthedocs.io/en/stable/) and the tool used by [BinderHub](https://binderhub.readthedocs.io) to build images on demand. ::::{grid} :::{grid-item-card} 🔧 Build reproducible data science environments from repositories @@ -14,23 +12,25 @@ Build a reproducible data science environment as a Docker image and execute code Push environment images to a Docker registry for re-use in data science environment services like [JupyterHub](https://jupyterhub.readthedocs.io) or [a Binder instance](https://mybinder.org), or for other communities to build upon your base environment. ::: :::{grid-item-card} ☁️ Host repositories in many providers -Host repositories in a provider like GitHub, an open science repository like [Zenodo](https://zenodo.org) or [Figshare](https://figshare.com), a hosted data platform like a [Dataverse installation](https://dataverse.org/), an archive like the +Host repositories in: a Git server like [GitHub](https://github.com/) or [GitLab](https://gitlab.com/), an open science repository like [Zenodo](https://zenodo.org) or [Figshare](https://figshare.com), a hosted data platform like a [Dataverse installation](https://dataverse.org/), an archive like the [Software Heritage Archive](https://archive.softwareheritage.org). ::: :::: -## What is a user image and why would I build one with `repo2docker`? +## What is a user environment container image and why would I build one with `repo2docker`? -A **user image** contains the entire software environment that a user may access from an interactive data science session. For example, it might contain many **programming languages**, **software for data analysis**, or even **content files and datasets** available to anybody that accesses that environment. User images are built with [Docker](https://www.docker.com/), a standard open source tool for defining, building, and deploying images. +A **user environment container image** contains the entire software environment that a user may access from an interactive data science session. For example, it might contain many **programming languages**, **software for data analysis**, or even **content files and datasets** available to anybody that accesses that environment. Container images are built with [Docker](https://www.docker.com/), a standard open source tool for defining, building, and deploying images. -Many data science platforms and services like [JupyterHub](https://jupyterhub.readthedocs.io) and [Binder](https://mybinder.org) launch interactive data science sessions **with a user image attached**, meaning that the user gains access to whatever is in the image. In short, this allows somebody to define and build the user image one time, in a way that users can reproducibly re-use many times. +Many data science platforms and services like [JupyterHub](https://jupyterhub.readthedocs.io) and [Binder](https://mybinder.org) launch interactive data science sessions **with a user environment container image attached**, meaning that the user gains access to whatever is in the container image. In short, this allows somebody to define and build the user image one time, in a way that users can reproducibly re-use many times. -Dockerfiles are the standard way that Docker images are defined[^use-dockerfile]. -However, **building images with Dockerfiles takes expertise and time** that is outside the scope of a data scientist or researcher. `repo2docker` makes this workflow more accessible by using community-standard configuration files for computational reproducibility to build user images. +`Dockerfile`s are the standard way that Docker container images are defined. +However, **building images with `Dockerfile`s takes expertise and time** that is outside the scope of a data scientist or researcher. `repo2docker` makes this workflow more accessible by using community-standard configuration files for computational reproducibility to build user environment container images. -In short, `repo2docker` is a tool to reproducibly build, run, and deploy these user environment Docker images for data science from source code repositories. +```{note} +You can still use a `Dockerfile` with `repo2docker` if you really want to! +``` -[^use-dockerfile]: That said, you can still use a Dockerfile if you really want to! +In short, `repo2docker` is a tool to reproducibly build and run these user environment container images for data science from source code repositories. ## How `repo2docker` works @@ -49,13 +49,13 @@ It performs these steps: [swhid]: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html -Please report [Bugs](https://github.com/jupyterhub/repo2docker/issues), +Please report [bugs](https://github.com/jupyterhub/repo2docker/issues), [ask questions](https://gitter.im/jupyterhub/binder) or [contribute to the project](https://github.com/jupyterhub/repo2docker/blob/HEAD/CONTRIBUTING.md). -## Get started with repo2docker +## Get started with `repo2docker` -This tutorial walks you through setting up repo2docker, building your first environment image, and running it locally with Docker. +This tutorial walks you through setting up `repo2docker`, building your first environment image, and running it locally with Docker. ```{toctree} :maxdepth: 2 @@ -63,7 +63,7 @@ This tutorial walks you through setting up repo2docker, building your first envi start ``` -## Learn how to use repo2docker +## Learn how to use `repo2docker` Our user guide provides all of the information you need to configure and deploy the environment image you want. @@ -72,7 +72,7 @@ Our user guide provides all of the information you need to configure and deploy use/index ``` -## Contribute to repo2docker +## Contribute to `repo2docker` Our contributor guide describes how you can follow along with the project, learn how to collaborate with our open team, and learn developer workflows and information. From 6cb5210793ffb43d330d1e1d26b17a784ad9c96b Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 27 Jan 2025 09:50:33 +0100 Subject: [PATCH 135/299] Upgrade R to 4.4.2 Released on 2024-10-31. --- repo2docker/buildpacks/r.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 0c5c6c439..35703162e 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -69,9 +69,9 @@ def r_version(self): """ # Available versions at https://cran.r-project.org/src/base/ version_map = { - "4.4": "4.4.1", + "4.4": "4.4.2", "4.3": "4.3.3", - "4.2": "4.2.1", + "4.2": "4.2.3", "4.1": "4.1.3", "4.0": "4.0.5", "3.6": "3.6.3", @@ -87,7 +87,7 @@ def r_version(self): # - tests/unit/test_r.py -> test_version_specification # - tests/r/r-rspm-apt/verify # - r_version = version_map["4.2"] + r_version = version_map["4.4"] if not hasattr(self, "_r_version"): parts = self.runtime.split("-") From 80e561afb9f5e0a6f8b43a7dab914e5a157a336b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 15:11:39 +0200 Subject: [PATCH 136/299] Fix test for default version of R --- tests/r/r-rspm-apt-file/verify.r | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/r/r-rspm-apt-file/verify.r b/tests/r/r-rspm-apt-file/verify.r index 30117134a..ca5b27d14 100755 --- a/tests/r/r-rspm-apt-file/verify.r +++ b/tests/r/r-rspm-apt-file/verify.r @@ -2,8 +2,8 @@ library('digest') -# Fail if version isn't 4.2, the default version for the RBuildPack +# Fail if version isn't 4.4, the default version for the RBuildPack print(version) -if (!(version$major == "4" && as.double(version$minor) >= 2 && as.double(version$minor) < 3)) { +if (!(version$major == "4" && as.double(version$minor) >= 4 && as.double(version$minor) < 5)) { quit("yes", 1) } From d83fd102bbb1a365f9d568dae0318bd8e8d6802c Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 15:12:55 +0200 Subject: [PATCH 137/299] Fix more test related with R version --- tests/unit/test_r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_r.py b/tests/unit/test_r.py index a7028d829..24c486093 100644 --- a/tests/unit/test_r.py +++ b/tests/unit/test_r.py @@ -8,7 +8,7 @@ @pytest.mark.parametrize( - "runtime_version, expected", [("", "4.2"), ("3.6", "3.6"), ("3.5.1", "3.5")] + "runtime_version, expected", [("", "4.4"), ("3.6", "3.6"), ("3.5.1", "3.5")] ) def test_version_specification(tmpdir, runtime_version, expected, base_image): tmpdir.chdir() From f2641f3edf91e5007881c0de8e0a4629f5e98e59 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 17:23:03 +0200 Subject: [PATCH 138/299] Change the date used for the R snapshot because the previous date was too old and didn't support the new version of R. --- tests/r/r-rspm-apt-file/runtime.txt | 2 +- tests/r/r-rspm-description-file/DESCRIPTION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/r/r-rspm-apt-file/runtime.txt b/tests/r/r-rspm-apt-file/runtime.txt index aa35fc0b3..fac25eae6 100644 --- a/tests/r/r-rspm-apt-file/runtime.txt +++ b/tests/r/r-rspm-apt-file/runtime.txt @@ -1 +1 @@ -r-2022-06-23 +r-2025-07-01 diff --git a/tests/r/r-rspm-description-file/DESCRIPTION b/tests/r/r-rspm-description-file/DESCRIPTION index 2c51fc3c7..a63e8d622 100644 --- a/tests/r/r-rspm-description-file/DESCRIPTION +++ b/tests/r/r-rspm-description-file/DESCRIPTION @@ -1,6 +1,6 @@ Package: binderdescription Version: 0.1 -Date: 2022-06-23 +Date: 2025-07-01 Title: Binder R DESCRIPTION support Description: Test that automatically building R packages works Author: Bastian Greshake Tzovaras From 387155ae2157a209d6c1d7f33697f5aacb89af29 Mon Sep 17 00:00:00 2001 From: Yuvi Date: Mon, 18 Aug 2025 17:29:40 -0700 Subject: [PATCH 139/299] Add some missing words --- docs/source/use/actions-and-scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/use/actions-and-scripts.md b/docs/source/use/actions-and-scripts.md index 36ad2c173..71555b971 100644 --- a/docs/source/use/actions-and-scripts.md +++ b/docs/source/use/actions-and-scripts.md @@ -1,6 +1,6 @@ # Run scripts, commands, and actions as part of environment building -In addition to installing using [standard configuration files](#config-files), you can run your own custom actions and commands as part of the build or user session launch process. +In addition to installing packages using the [standard configuration files](#config-files), you can run your own custom actions and commands as part of the build or user session launch process. (commands-jovyan)= From 673e1bdab39a8a4201d360df792b6ea0e1a48ba4 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 21 Aug 2025 17:21:59 +0200 Subject: [PATCH 140/299] Replace --vanilla with --no-init-file Closes https://github.com/jupyterhub/repo2docker/issues/1450 --- repo2docker/buildpacks/r.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 35703162e..9a81f0465 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -358,8 +358,8 @@ def get_build_scripts(self): # Install a pinned version of devtools, IRKernel and shiny rf""" export EXPANDED_CRAN_MIRROR_URL="$(. /etc/os-release && echo {cran_mirror_url} | envsubst)" && \ - R --vanilla --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ - R --vanilla --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" + R --no-save --no-restore --no-init-file --no-environ --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ + R --no-save --no-restore --no-init-file --no-environ --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" """, ), ] @@ -395,7 +395,7 @@ def get_preassemble_scripts(self): "${NB_USER}", # Delete /tmp/downloaded_packages only if install.R fails, as the second # invocation of install.R might be able to reuse them - f"Rscript --vanilla {installR_path} && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages", + f"Rscript --no-save --no-restore --no-init-file --no-environ {installR_path} && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages", ) ] @@ -413,7 +413,7 @@ def get_assemble_scripts(self): "${NB_USER}", # only run install.R if the pre-assembly failed # Delete any downloaded packages in /tmp, as they aren't reused by R - f"""if [ ! -f /tmp/.preassembled ]; then Rscript --vanilla {installR_path}; rm -rf /tmp/downloaded_packages; fi""", + f"""if [ ! -f /tmp/.preassembled ]; then Rscript --no-save --no-restore --no-init-file --no-environ {installR_path}; rm -rf /tmp/downloaded_packages; fi""", ) ] @@ -422,7 +422,7 @@ def get_assemble_scripts(self): assemble_scripts += [ ( "${NB_USER}", - 'R --vanilla --quiet -e "devtools::install_local(getwd())"', + 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "devtools::install_local(getwd())"', ) ] From 88d489de52d40ed61ea73e30907576ebee754828 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 22 Aug 2025 12:58:30 +0200 Subject: [PATCH 141/299] Fail earlier when user try to install future version of R Closes https://github.com/jupyterhub/repo2docker/issues/1455 --- repo2docker/buildpacks/r.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 9a81f0465..a70576753 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -1,6 +1,7 @@ import datetime import os import re +import warnings from functools import lru_cache import requests @@ -99,9 +100,18 @@ def r_version(self): # available. Users can however explicitly specify the full version to get something specific if r_version in version_map: r_version = version_map[r_version] - elif len(r_version.split(".")) == 2: - # must have x.y.z version, add .0 for unrecognized (future) R versions - r_version += ".0" + else: + # Instead of appending ".0" to future R versions, + # repo2docker fails earlier with a meaningful message to the user. + # If repo2docker doesn't fail here, repo2docker might fail later + # without a meaningul message to the user. + raise RuntimeError( + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + ) + else: + warnings.warn( + f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." + ) # translate to the full version string self._r_version = r_version From 9bf010eea2fa44ba378eee48c4520d64436c7099 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 22 Aug 2025 16:38:05 +0200 Subject: [PATCH 142/299] Add check for docker buildx Closes https://github.com/jupyterhub/repo2docker/issues/1452 --- repo2docker/docker.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index e6d3958c6..984c074dd 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -107,6 +107,13 @@ def build( ): if not shutil.which("docker"): raise RuntimeError("The docker commandline client must be installed") + + # docker buildx is based in a plugin that might not be installed + # https://github.com/docker/buildx + docker_buildx_version = subprocess.run(["docker", "buildx", "version"]) + if docker_buildx_version.returncode: + raise RuntimeError("The docker buildx plugin must be installed") + args = ["docker", "buildx", "build", "--progress", "plain"] if load: if push: From ffaa9bb3d82ea79f67ccc4edb26c66a46eef5efa Mon Sep 17 00:00:00 2001 From: lixiname Date: Sat, 23 Aug 2025 17:30:22 +0800 Subject: [PATCH 143/299] =?UTF-8?q?=E4=BB=8Esetup=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E8=87=B3toml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 80 ++++++++++++++++++++++++++++++++++++++++++++++ test_setuptools.py | 17 ++++++++++ 2 files changed, 97 insertions(+) create mode 100644 pyproject.toml create mode 100644 test_setuptools.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..697856dd4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,80 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel", "setuptools-scm"] +build-backend = "setuptools.build_meta" + +[project] +name = "jupyter-repo2docker" +dynamic = ["version"] +description = "Repo2docker: Turn code repositories into Jupyter enabled Docker Images" +readme = "README.md" +license = {text = "BSD"} +authors = [ + {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"} +] +maintainers = [ + {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"} +] +keywords = ["reproducible", "science", "environments", "docker"] +classifiers = [ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering", + "Topic :: Software Development", + "Topic :: System :: Systems Administration", +] +requires-python = ">=3.9" +dependencies = [ + "chardet", + "docker!=5.0.0", + "entrypoints", + "escapism", + "iso8601", + "jinja2", + "python-json-logger", + "requests", + "ruamel.yaml>=0.15", + "semver", + "toml", + "traitlets", +] + +[project.urls] +Homepage = "https://repo2docker.readthedocs.io/en/latest/" +Documentation = "https://repo2docker.readthedocs.io" +Funding = "https://jupyter.org/about" +Source = "https://github.com/jupyterhub/repo2docker/" +Tracker = "https://github.com/jupyterhub/repo2docker/issues" + +[project.scripts] +jupyter-repo2docker = "repo2docker.__main__:main" +repo2docker = "repo2docker.__main__:main" + +[project.entry-points."repo2docker.engines"] +docker = "repo2docker.docker:DockerEngine" + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +where = ["."] + + +[tool.wheel] +universal = 1 + + +[tool.setuptools_scm] +# 这个配置会让 setuptools-scm 自动创建一个 my_awesome_project/_version.py 文件, +# 并在里面写入版本号。这样你的项目代码在运行时可以通过 my_awesome_project._version +# 来获取自身的版本。 +write_to = "repo2docker/_version.py" diff --git a/test_setuptools.py b/test_setuptools.py new file mode 100644 index 000000000..a8a58741c --- /dev/null +++ b/test_setuptools.py @@ -0,0 +1,17 @@ + +from setuptools.config.pyprojecttoml import read_configuration +import tomllib +if __name__ == '__main__': + try: + with open('pyproject.toml', 'rb') as f: + tomllib.load(f) + print('✅ TOML语法正确') + except Exception as e: + print(f'❌ TOML语法错误: {e}') + + try: + config = read_configuration('pyproject.toml') + print('✅ 配置文件语法正确') + print('项目名称:', config.get('name')) + except Exception as e: + print('❌ 配置错误:', e) From fe7bce0049d7849116ef7bac6627f3f739ce8e36 Mon Sep 17 00:00:00 2001 From: lixiname Date: Mon, 25 Aug 2025 08:50:07 +0800 Subject: [PATCH 144/299] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E4=BB=8Eset?= =?UTF-8?q?up->toml=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repo2docker/__init__.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/repo2docker/__init__.py b/repo2docker/__init__.py index 23bc5700e..0ee4db194 100644 --- a/repo2docker/__init__.py +++ b/repo2docker/__init__.py @@ -1,9 +1,5 @@ -from ._version import get_versions - -__version__ = get_versions()["version"] -del get_versions - -from . import _version +from ._version import __version__ from .app import Repo2Docker -__version__ = _version.get_versions()["version"] +# You can add this if you want an __all__ variable to control imports +__all__ = ["__version__", "Repo2Docker"] From a78d344285f1d9add435cc79b1aa1251f9c94b66 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 01:03:31 +0000 Subject: [PATCH 145/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test_setuptools.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/test_setuptools.py b/test_setuptools.py index a8a58741c..a53c83018 100644 --- a/test_setuptools.py +++ b/test_setuptools.py @@ -1,17 +1,18 @@ +import tomllib from setuptools.config.pyprojecttoml import read_configuration -import tomllib -if __name__ == '__main__': + +if __name__ == "__main__": try: - with open('pyproject.toml', 'rb') as f: - tomllib.load(f) - print('✅ TOML语法正确') + with open("pyproject.toml", "rb") as f: + tomllib.load(f) + print("✅ TOML语法正确") except Exception as e: - print(f'❌ TOML语法错误: {e}') - + print(f"❌ TOML语法错误: {e}") + try: - config = read_configuration('pyproject.toml') - print('✅ 配置文件语法正确') - print('项目名称:', config.get('name')) + config = read_configuration("pyproject.toml") + print("✅ 配置文件语法正确") + print("项目名称:", config.get("name")) except Exception as e: - print('❌ 配置错误:', e) + print("❌ 配置错误:", e) From 13134ce88de1393bde819151d37d01cee17217a3 Mon Sep 17 00:00:00 2001 From: shane knapp Date: Mon, 25 Aug 2025 10:46:04 -0700 Subject: [PATCH 146/299] add support for R 4.5.1 --- repo2docker/buildpacks/r.py | 1 + 1 file changed, 1 insertion(+) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 9a81f0465..094c0ae18 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -69,6 +69,7 @@ def r_version(self): """ # Available versions at https://cran.r-project.org/src/base/ version_map = { + "4.5": "4.5.1", "4.4": "4.4.2", "4.3": "4.3.3", "4.2": "4.2.3", From e58829348d6ec1a2962f0aaac2b3ce1a95dc5063 Mon Sep 17 00:00:00 2001 From: shane knapp Date: Tue, 26 Aug 2025 11:37:08 -0700 Subject: [PATCH 147/299] porting tests to r4.5.1 --- tests/r/r4.4-rspm/runtime.txt | 1 - tests/r/{r4.4-rspm => r4.5-rspm}/install.R | 0 tests/r/r4.5-rspm/runtime.txt | 1 + tests/r/{r4.4-rspm => r4.5-rspm}/verify | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 tests/r/r4.4-rspm/runtime.txt rename tests/r/{r4.4-rspm => r4.5-rspm}/install.R (100%) create mode 100644 tests/r/r4.5-rspm/runtime.txt rename tests/r/{r4.4-rspm => r4.5-rspm}/verify (65%) diff --git a/tests/r/r4.4-rspm/runtime.txt b/tests/r/r4.4-rspm/runtime.txt deleted file mode 100644 index 1375871dd..000000000 --- a/tests/r/r4.4-rspm/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -r-4.4-2025-01-01 diff --git a/tests/r/r4.4-rspm/install.R b/tests/r/r4.5-rspm/install.R similarity index 100% rename from tests/r/r4.4-rspm/install.R rename to tests/r/r4.5-rspm/install.R diff --git a/tests/r/r4.5-rspm/runtime.txt b/tests/r/r4.5-rspm/runtime.txt new file mode 100644 index 000000000..83911bf8e --- /dev/null +++ b/tests/r/r4.5-rspm/runtime.txt @@ -0,0 +1 @@ +r-4.5.1-2025-05-13 diff --git a/tests/r/r4.4-rspm/verify b/tests/r/r4.5-rspm/verify similarity index 65% rename from tests/r/r4.4-rspm/verify rename to tests/r/r4.5-rspm/verify index 0e02bdd40..6d9130610 100755 --- a/tests/r/r4.4-rspm/verify +++ b/tests/r/r4.5-rspm/verify @@ -1,9 +1,9 @@ #!/usr/bin/env Rscript library('digest') -# Fail if version is not 4.0 +# Fail if version is not 4.5 print(version) -if (!(version$major == "4" && as.double(version$minor) >= 4 && as.double(version$minor) < 5)) { +if (!(version$major == "4" && as.double(version$minor) >= 5 && as.double(version$minor) < 6)) { quit("yes", 1) } From 541229b01021c5c8e32e31a56ca9a8cf5dfdf852 Mon Sep 17 00:00:00 2001 From: shane knapp Date: Tue, 26 Aug 2025 11:40:48 -0700 Subject: [PATCH 148/299] fat-fingered month from the cran repo: https://cran.r-project.org/src/base/R-4/ --- tests/r/r4.5-rspm/runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/r/r4.5-rspm/runtime.txt b/tests/r/r4.5-rspm/runtime.txt index 83911bf8e..a57181976 100644 --- a/tests/r/r4.5-rspm/runtime.txt +++ b/tests/r/r4.5-rspm/runtime.txt @@ -1 +1 @@ -r-4.5.1-2025-05-13 +r-4.5.1-2025-06-13 From 48cf0399657b51d1eff5b80ea1be80373b499ec6 Mon Sep 17 00:00:00 2001 From: shane knapp Date: Wed, 27 Aug 2025 11:36:56 -0700 Subject: [PATCH 149/299] s/contributing/contribute/g --- CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1dfc19576..0056f4c3c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,23 +5,23 @@ (And thank you particularly for coming to read the guidelines! :heart_eyes:) The repo2docker developer documentation is all rendered on our documentation website: [https://repo2docker.readthedocs.io](https://repo2docker.readthedocs.io). -If you're here, you're probably looking for the [Contributing to repo2docker development](https://repo2docker.readthedocs.io/en/latest/contributing/contributing.html) page. +If you're here, you're probably looking for the [Contributing to repo2docker development](https://repo2docker.readthedocs.io/en/latest/contribute/contributing.html) page. Please make sure you've read the following sections before opening an issue/pull request: -- [Process for making a contribution](https://repo2docker.readthedocs.io/en/latest/contributing/contributing.html#process-for-making-a-contribution). +- [Process for making a contribution](https://repo2docker.readthedocs.io/en/latest/contribute/contributing.html#process-for-making-a-contribution). - These steps talk you through choosing the right issue template (bug report or feature request) and making a change. -- [Guidelines to getting a Pull Request merged](https://repo2docker.readthedocs.io/en/latest/contributing/contributing.html#guidelines-to-getting-a-pull-request-merged). +- [Guidelines to getting a Pull Request merged](https://repo2docker.readthedocs.io/en/latest/contribute/contributing.html#guidelines-to-getting-a-pull-request-merged). - These are tips and tricks to help make your contribution as smooth as possible for you and for the repo2docker maintenance team. There are a few other pages to highlight: -- [Our roadmap](https://repo2docker.readthedocs.io/en/latest/contributing/roadmap.html) +- [Our roadmap](https://repo2docker.readthedocs.io/en/latest/contribute/roadmap.html) - We use the roadmap to develop a shared understanding of the project's vision and direction amongst the community of users, contributors, and maintainers. This is a great place to get a feel for what the maintainers are thinking about for the short, medium, and long term future of the project. - [Design of repo2docker](https://repo2docker.readthedocs.io/en/latest/design.html) - This page explains some of the design principles behind repo2docker. Its a good place to understand _why_ the team have made the decisions that they have along the way! - We absolutely encourage discussion around refactoring, updating or extending repo2docker, but please make sure that you've understood this page before opening an issue to discuss the change you'd like to propose. -- [Common developer tasks and how-tos](https://repo2docker.readthedocs.io/en/latest/contributing/tasks.html) +- [Common developer tasks and how-tos](https://repo2docker.readthedocs.io/en/latest/contribute/tasks.html) - Some notes on running tests, buildpack dependencies, creating a release, and keeping the pip files up to date. From 3079a04fb8b611c226b4bc989db174dddee5e3d2 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 28 Aug 2025 10:23:31 +0200 Subject: [PATCH 150/299] Support R full version provided by user i.e. MAJOR.MINOR.PATCH. --- repo2docker/buildpacks/r.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index a70576753..556f66913 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -101,13 +101,18 @@ def r_version(self): if r_version in version_map: r_version = version_map[r_version] else: - # Instead of appending ".0" to future R versions, - # repo2docker fails earlier with a meaningful message to the user. - # If repo2docker doesn't fail here, repo2docker might fail later - # without a meaningul message to the user. - raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", - ) + r_version_parts = r_version.split(".") + if len(r_version_parts) == 3: + warnings.warn( + f"Using R full version, {r_version}, provided by user." + ) + else: + # repo2docker fails earlier with a meaningful message to the user. + # If repo2docker doesn't fail here, repo2docker might fail later + # without a meaningul message to the user. + raise RuntimeError( + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + ) else: warnings.warn( f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." From 2a143125e2d7d3991996c7195252d6b5ba15f8a8 Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Thu, 28 Aug 2025 10:34:29 +0200 Subject: [PATCH 151/299] Add missing 2025.08.0 release in changelog Closes https://github.com/jupyterhub/repo2docker/issues/1449 --- docs/source/changelog.md | 70 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index dc415acab..1b6d5719d 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -1,5 +1,75 @@ # Changelog +## 2025.08.0 + +([full changelog](https://github.com/jupyterhub/repo2docker/compare/4da768765372c602c06606cb79d21a398fcc2987...6cf91e45d5b03f79e365cd82eda09d1178d03327)) + +### API and Breaking Changes + +- Switch to using CLI for everything except running the container [#1421](https://github.com/jupyterhub/repo2docker/pull/1421) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- Require Python 3.9 to run repo2docker [#1411](https://github.com/jupyterhub/repo2docker/pull/1411) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk), [@yuvipanda](https://github.com/yuvipanda)) +- Shell out to `docker buildx build` to build images [#1402](https://github.com/jupyterhub/repo2docker/pull/1402) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- notebook 7 [#1363](https://github.com/jupyterhub/repo2docker/pull/1363) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- Major version bump node (18->20) and jupyterhub-singleuser (3->5) [#1359](https://github.com/jupyterhub/repo2docker/pull/1359) ([@consideRatio](https://github.com/consideRatio), [@yuvipanda](https://github.com/yuvipanda)) + +### Enhancements made + +- add triplets for r versions 4.3, 4.4 [#1403](https://github.com/jupyterhub/repo2docker/pull/1403) ([@minrk](https://github.com/minrk), [@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) +- Upgrade Shiny server to 2024.12 [#1400](https://github.com/jupyterhub/repo2docker/pull/1400) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics)) +- Upgrade RStudio to 2024.12 [#1399](https://github.com/jupyterhub/repo2docker/pull/1399) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics)) +- Use REST APIs to resolve DOIs + cleanup dataverse provider [#1390](https://github.com/jupyterhub/repo2docker/pull/1390) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk), [@pdurbin](https://github.com/pdurbin)) +- exclude defaults channel by default [#1365](https://github.com/jupyterhub/repo2docker/pull/1365) ([@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs)) + +### Bugs fixed + +- [MRG] Disable bash trace output in conda activation script [#1425](https://github.com/jupyterhub/repo2docker/pull/1425) ([@mfisher87](https://github.com/mfisher87), [@manics](https://github.com/manics)) +- Simulate json output from docker buildx build [#1413](https://github.com/jupyterhub/repo2docker/pull/1413) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- `set -e` should not be set after conda environment is sourced [#1409](https://github.com/jupyterhub/repo2docker/pull/1409) ([@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- Use self.log rather than logging module directly [#1378](https://github.com/jupyterhub/repo2docker/pull/1378) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) +- julia_project.py: fix Pkg REPL api warning [#1376](https://github.com/jupyterhub/repo2docker/pull/1376) ([@fonsp](https://github.com/fonsp), [@GeorgianaElena](https://github.com/GeorgianaElena), [@agoose77](https://github.com/agoose77)) +- TarFile.add: don't add recursively [#1371](https://github.com/jupyterhub/repo2docker/pull/1371) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) + +### Maintenance and upkeep improvements + +- Bump mamba from 2.0.5 to 2.1.0 [#1423](https://github.com/jupyterhub/repo2docker/pull/1423) ([@weiji14](https://github.com/weiji14), [@yuvipanda](https://github.com/yuvipanda)) +- maint: Adapt mamba activation [#1419](https://github.com/jupyterhub/repo2docker/pull/1419) ([@jjerphan](https://github.com/jjerphan), [@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- Add a test for runtime.txt with full R version specified [#1416](https://github.com/jupyterhub/repo2docker/pull/1416) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- Bump alpine docker to 3.21 [#1412](https://github.com/jupyterhub/repo2docker/pull/1412) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- Refreeze base environment for package upgrades [#1407](https://github.com/jupyterhub/repo2docker/pull/1407) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) +- Remove unused _urlopen method [#1392](https://github.com/jupyterhub/repo2docker/pull/1392) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- Upgraded to micromamba 2.0.5 [#1387](https://github.com/jupyterhub/repo2docker/pull/1387) ([@JohanMabille](https://github.com/JohanMabille), [@yuvipanda](https://github.com/yuvipanda), [@SylvainCorlay](https://github.com/SylvainCorlay)) +- Use self.log.warning instead of warnings.warn [#1384](https://github.com/jupyterhub/repo2docker/pull/1384) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) +- call close_handlers before garbage collection [#1380](https://github.com/jupyterhub/repo2docker/pull/1380) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- [pre-commit.ci] pre-commit autoupdate [#1377](https://github.com/jupyterhub/repo2docker/pull/1377) ([@minrk](https://github.com/minrk)) +- Update to mamba 1.5.9 [#1370](https://github.com/jupyterhub/repo2docker/pull/1370) ([@SylvainCorlay](https://github.com/SylvainCorlay), [@manics](https://github.com/manics)) +- Refreeze conda packages (JupyterLab 4.2.3 -> 4.2.5) [#1369](https://github.com/jupyterhub/repo2docker/pull/1369) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- Update for mamba 1.5.8 [#1367](https://github.com/jupyterhub/repo2docker/pull/1367) ([@jjerphan](https://github.com/jjerphan), [@manics](https://github.com/manics), [@SylvainCorlay](https://github.com/SylvainCorlay)) +- update import of shlex.quote [#1364](https://github.com/jupyterhub/repo2docker/pull/1364) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- [pre-commit.ci] pre-commit autoupdate [#1362](https://github.com/jupyterhub/repo2docker/pull/1362) ([@minrk](https://github.com/minrk)) + +### Documentation improvements + +- Revamp our documentation and refactor a bit [#1433](https://github.com/jupyterhub/repo2docker/pull/1433) ([@choldgraf](https://github.com/choldgraf), [@chuckwondo](https://github.com/chuckwondo), [@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) +- bug report.rst [#1429](https://github.com/jupyterhub/repo2docker/pull/1429) ([@nadiaguiffant](https://github.com/nadiaguiffant), [@manics](https://github.com/manics)) +- Add changelog for 2024.07.0 [#1356](https://github.com/jupyterhub/repo2docker/pull/1356) ([@yuvipanda](https://github.com/yuvipanda), [@consideRatio](https://github.com/consideRatio), [@manics](https://github.com/manics)) + +### Continuous integration improvements + +- Add basic UI Playwright tests [#1410](https://github.com/jupyterhub/repo2docker/pull/1410) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- Don't run scheduled workflows on forks [#1408](https://github.com/jupyterhub/repo2docker/pull/1408) ([@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- build(deps): bump codecov/codecov-action from 4 to 5 [#1381](https://github.com/jupyterhub/repo2docker/pull/1381) ([@minrk](https://github.com/minrk)) +- [pre-commit.ci] pre-commit autoupdate [#1358](https://github.com/jupyterhub/repo2docker/pull/1358) ([@minrk](https://github.com/minrk)) +- build(deps): bump docker/build-push-action from 5 to 6 [#1357](https://github.com/jupyterhub/repo2docker/pull/1357) ([@manics](https://github.com/manics)) + +### Contributors to this release + +The following people contributed discussions, new ideas, code and documentation contributions, and review. +See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports). + +([GitHub contributors page for this release](https://github.com/jupyterhub/repo2docker/graphs/contributors?from=2024-07-01&to=2025-08-03&type=c)) + +@agoose77 ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aagoose77+updated%3A2024-07-01..2025-08-03&type=Issues)) | @AliMirlou ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AAliMirlou+updated%3A2024-07-01..2025-08-03&type=Issues)) | @betatim ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Abetatim+updated%3A2024-07-01..2025-08-03&type=Issues)) | @choldgraf ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Acholdgraf+updated%3A2024-07-01..2025-08-03&type=Issues)) | @chuckwondo ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Achuckwondo+updated%3A2024-07-01..2025-08-03&type=Issues)) | @consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AconsideRatio+updated%3A2024-07-01..2025-08-03&type=Issues)) | @d70-t ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ad70-t+updated%3A2024-07-01..2025-08-03&type=Issues)) | @felder ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Afelder+updated%3A2024-07-01..2025-08-03&type=Issues)) | @fonsp ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Afonsp+updated%3A2024-07-01..2025-08-03&type=Issues)) | @GeorgianaElena ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AGeorgianaElena+updated%3A2024-07-01..2025-08-03&type=Issues)) | @Hind-M ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AHind-M+updated%3A2024-07-01..2025-08-03&type=Issues)) | @hiroyuki-sato ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ahiroyuki-sato+updated%3A2024-07-01..2025-08-03&type=Issues)) | @jjerphan ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ajjerphan+updated%3A2024-07-01..2025-08-03&type=Issues)) | @JohanMabille ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AJohanMabille+updated%3A2024-07-01..2025-08-03&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Amanics+updated%3A2024-07-01..2025-08-03&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Amfisher87+updated%3A2024-07-01..2025-08-03&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aminrk+updated%3A2024-07-01..2025-08-03&type=Issues)) | @nadiaguiffant ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Anadiaguiffant+updated%3A2024-07-01..2025-08-03&type=Issues)) | @pdurbin ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Apdurbin+updated%3A2024-07-01..2025-08-03&type=Issues)) | @rgaiacs ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Argaiacs+updated%3A2024-07-01..2025-08-03&type=Issues)) | @ryanlovett ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aryanlovett+updated%3A2024-07-01..2025-08-03&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3ASylvainCorlay+updated%3A2024-07-01..2025-08-03&type=Issues)) | @weiji14 ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aweiji14+updated%3A2024-07-01..2025-08-03&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ayuvipanda+updated%3A2024-07-01..2025-08-03&type=Issues)) + ## 2024.07.0 ([full changelog](https://github.com/jupyterhub/repo2docker/compare/2024.03.0...2024.07.0)) From 42154849fe0b794085707e4e591d1ae4a5cf3c6e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Aug 2025 08:38:23 +0000 Subject: [PATCH 152/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index 1b6d5719d..6fd445fe9 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -36,7 +36,7 @@ - Add a test for runtime.txt with full R version specified [#1416](https://github.com/jupyterhub/repo2docker/pull/1416) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) - Bump alpine docker to 3.21 [#1412](https://github.com/jupyterhub/repo2docker/pull/1412) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) - Refreeze base environment for package upgrades [#1407](https://github.com/jupyterhub/repo2docker/pull/1407) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) -- Remove unused _urlopen method [#1392](https://github.com/jupyterhub/repo2docker/pull/1392) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- Remove unused \_urlopen method [#1392](https://github.com/jupyterhub/repo2docker/pull/1392) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) - Upgraded to micromamba 2.0.5 [#1387](https://github.com/jupyterhub/repo2docker/pull/1387) ([@JohanMabille](https://github.com/JohanMabille), [@yuvipanda](https://github.com/yuvipanda), [@SylvainCorlay](https://github.com/SylvainCorlay)) - Use self.log.warning instead of warnings.warn [#1384](https://github.com/jupyterhub/repo2docker/pull/1384) ([@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) - call close_handlers before garbage collection [#1380](https://github.com/jupyterhub/repo2docker/pull/1380) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) From bc5704d73873827a63797681daf3e7b40ef4ea51 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Mon, 1 Sep 2025 12:24:54 +0100 Subject: [PATCH 153/299] Always call `ContainerEngine.build()` when `push`ing This is so that if the image is built but not pushed it will still be pushed --- repo2docker/app.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index b9684c118..7a70a470d 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -733,7 +733,10 @@ def build(self): try: self.fetch(self.repo, self.ref, checkout_path) - if self.find_image(): + if self.find_image() and not self.push: + # If push is requested we don't have a general way to query the registry. + # ContainerEngine.build() also handles pushing, so always "build" and + # rely on the implementation to decide whether to rebuild. self.log.info( f"Reusing existing image ({self.output_image_spec}), not building." ) From c054a36340eb622725ad9cc648fb05d21c8c3108 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:57:33 +1200 Subject: [PATCH 154/299] Bump mamba from 2.1.0 to 2.3.2 Bumps [mamba](https://github.com/mamba-org/mamba) from 2.1.0 to 2.3.2 - [Release notes](https://github.com/mamba-org/mamba/releases) - [Commits](https://github.com/mamba-org/mamba/compare/2.1.0...2.3.2) --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- tests/conda/py35-binder-dir/verify | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index 65d07a627..d9d2e7bbc 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,7 +5,7 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION="2.1.0" +export MAMBA_VERSION="2.3.2" export CONDA_VERSION=24.11.0 URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index 11a1b3d7f..315384389 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -16,10 +16,10 @@ v = out.split()[1] assert v[:3] == "3.5", out out = sh(["micromamba", "--version"]) -assert out == "2.1.0", out +assert out == "2.3.2", out out = sh(["mamba", "--version"]) -assert out == "2.1.0", out +assert out == "2.3.2", out sh([kernel_python, "-c", "import numpy"]) From 0e47641b11ae5b6f67187b4392fdf78767ab6d90 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Thu, 4 Sep 2025 08:37:27 +1200 Subject: [PATCH 155/299] Switch downgrade check to be on krb5=1.17.2 that pins to openssl=1.1.1 --- tests/conda/downgrade/verify | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conda/downgrade/verify b/tests/conda/downgrade/verify index 2c69b3e81..4eead7dfa 100755 --- a/tests/conda/downgrade/verify +++ b/tests/conda/downgrade/verify @@ -24,7 +24,7 @@ assert pkgs["xeus-cling"]["version"] == "0.6.0" # this may be brittle, but it's unlikely any of these old versions # of packages will be rebuilt # xeus-cling 0.6.0 pins xeus 0.20, which pins openssl 1.1.1, -# which in turn downgrades Python from >=3.9.16 to 3.9.6 +# which in turn downgrades krb5 from >=1.21.3 to 1.17.2 assert pkgs["openssl"]["version"].startswith("1.1.1"), pkgs["openssl"]["version"] -assert pkgs["python"]["version"] == "3.9.0", pkgs["python"]["version"] +assert pkgs["krb5"]["version"] == "1.17.2", pkgs["krb5"]["version"] From f5c8366aebf5a8b0966b56be65f17d34bdc963f3 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:58:45 +1200 Subject: [PATCH 156/299] Bump conda from 24.11.0 to 25.7.0 Bumps [conda](https://github.com/conda/conda) from 24.11.0 to 25.7.0 - [Release notes](https://github.com/conda/conda/releases) - [Commits](https://github.com/conda/conda/compare/24.11.0...25.7.0) --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index d9d2e7bbc..7d327052c 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -6,7 +6,7 @@ set -ex cd $(dirname $0) export MAMBA_VERSION="2.3.2" -export CONDA_VERSION=24.11.0 +export CONDA_VERSION="25.7.0" URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" From 1f83d7608bb4be3ec8088edd12328794bdf0bfdb Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 16:32:27 +0200 Subject: [PATCH 157/299] Address comments from @minrk --- repo2docker/buildpacks/r.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index a10443fee..93bc7bf74 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -89,7 +89,7 @@ def r_version(self): else: r_version_parts = r_version.split(".") if len(r_version_parts) == 3: - warnings.warn( + self.log.warning( f"Using R full version, {r_version}, provided by user." ) else: @@ -97,11 +97,11 @@ def r_version(self): # If repo2docker doesn't fail here, repo2docker might fail later # without a meaningul message to the user. raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) else: - warnings.warn( - f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." + self.log.warning( + f"R version unspecified, using default R version {r_version}. You can specify the R version in runtime.txt." ) # translate to the full version string From 460d3c1fb0cf75ae61dc77252d57b2c347d0ef9b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 16:59:10 +0200 Subject: [PATCH 158/299] Remove requirement of date in runtime.txt for R based on comment from @maniacs --- repo2docker/buildpacks/r.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 93bc7bf74..520bc48c8 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -78,9 +78,9 @@ def r_version(self): if not hasattr(self, "_r_version"): _, version, date = self.runtime - # If runtime.txt is not set, or if it isn't of the form r----
, + # If runtime.txt is not set, or if it isn't of the form r--*, # we don't use any of it in determining r version and just use the default - if version and date: + if version: r_version = version # For versions of form x.y, we want to explicitly provide x.y.z - latest patchlevel # available. Users can however explicitly specify the full version to get something specific From 6b00d6fb0f065b011349ac4038217d827e8679de Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 17:01:04 +0200 Subject: [PATCH 159/299] Replace warning with info in log --- repo2docker/buildpacks/r.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 520bc48c8..8cb0ffbb9 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -89,13 +89,13 @@ def r_version(self): else: r_version_parts = r_version.split(".") if len(r_version_parts) == 3: - self.log.warning( + self.log.info( f"Using R full version, {r_version}, provided by user." ) else: # repo2docker fails earlier with a meaningful message to the user. # If repo2docker doesn't fail here, repo2docker might fail later - # without a meaningul message to the user. + # without a meaningful message to the user. raise RuntimeError( f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) From b650d28849e8a6b63ab16cb57816086a710e0992 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 17:02:18 +0200 Subject: [PATCH 160/299] Minor improvement on English in error message --- repo2docker/buildpacks/r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 8cb0ffbb9..4483300ac 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -97,7 +97,7 @@ def r_version(self): # If repo2docker doesn't fail here, repo2docker might fail later # without a meaningful message to the user. raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", + f"R version {r_version} is not supported. Please open an issue at https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) else: self.log.warning( From ff6fb61be6d384ae371f41593fa771dc328cf11c Mon Sep 17 00:00:00 2001 From: Anthony Gitter Date: Tue, 16 Sep 2025 11:16:14 -0500 Subject: [PATCH 161/299] Fix broken readme doc links --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 89d09b3c6..17db70694 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/jupyterhub/repo2docker/workflows/Test/badge.svg)](https://github.com/jupyterhub/repo2docker/actions) [![Documentation Status](https://readthedocs.org/projects/repo2docker/badge/?version=latest)](http://repo2docker.readthedocs.io/en/latest/?badge=latest) -[![Contribute](https://img.shields.io/badge/I_want_to_contribute!-grey?logo=jupyter)](https://repo2docker.readthedocs.io/en/latest/contributing/contributing.html) +[![Contribute](https://img.shields.io/badge/I_want_to_contribute!-grey?logo=jupyter)](https://repo2docker.readthedocs.io/en/latest/contribute/) [![Docker Repository on Quay](https://img.shields.io/badge/quay.io-container-green "Docker Repository on Quay")](https://quay.io/repository/jupyterhub/repo2docker?tab=tags) `repo2docker` fetches a git repository and builds a container image based on @@ -38,11 +38,11 @@ For more information, please visit is recommended. 2. Python 3.9+. -Supported on Linux and macOS. [See documentation note about Windows support.](http://repo2docker.readthedocs.io/en/latest/install.html#note-about-windows-support) +Supported on Linux and macOS. [See documentation note about Windows support.](https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly) ### Installation -This a quick guide to installing `repo2docker`, see our documentation for [a full guide](https://repo2docker.readthedocs.io/en/latest/install.html). +This a quick guide to installing `repo2docker`, see our documentation for [a full guide](https://repo2docker.readthedocs.io/en/latest/start/#install-repo2docker). To install from PyPI: @@ -85,14 +85,14 @@ If you copy paste that URL into your browser you will see a Jupyter Notebook with the contents of the repository you had just built! For more information on how to use `repo2docker`, see the -[usage guide](http://repo2docker.readthedocs.io/en/latest/usage.html). +[user guide](https://repo2docker.readthedocs.io/en/latest/use/). ## Repository specifications Repo2Docker looks for configuration files in the source repository to determine how the Docker image should be built. For a list of the configuration files that `repo2docker` can use, see the -[complete list of configuration files](https://repo2docker.readthedocs.io/en/latest/config_files.html). +[complete list of configuration files](https://repo2docker.readthedocs.io/en/latest/configuration/). The philosophy of repo2docker is inspired by [Heroku Build Packs](https://devcenter.heroku.com/articles/buildpacks). From 6e1865f77c74b8cb41a89df7dc6afd406a284d84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 05:01:25 +0000 Subject: [PATCH 162/299] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d1fa1c5aa..cbaf04841 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3e0b4cead..ebd3e3d78 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: build-n-publish: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: "3.13" @@ -86,7 +86,7 @@ jobs: echo "Publishing to $REGISTRY" # versioneer requires the full git history for non-tags - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7e89cab59..8cd2cd191 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -75,7 +75,7 @@ jobs: repo_type: venv steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: From 9f49f7427c2cdd78831a75dcc6bad5b4f509020c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 06:09:11 +0000 Subject: [PATCH 163/299] Bump actions/setup-python from 5 to 6 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ebd3e3d78..8e8485e72 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.13" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8cd2cd191..4645d8c43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -77,7 +77,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "${{ matrix.python_version }}" From dfa405ba02f09c020e40844e1997cbdc5c02bb48 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 13:19:02 +0200 Subject: [PATCH 164/299] Add Python 3.13 to freeze.py Related to https://github.com/jupyterhub/repo2docker/issues/1446 --- repo2docker/buildpacks/conda/freeze.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index d4697e69e..c46f7488f 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -113,7 +113,7 @@ def set_python(py_env_file, py): "py", nargs="*", help="Python version(s) to update and freeze", - default=("3.8", "3.9", "3.10", "3.11", "3.12"), + default=("3.8", "3.9", "3.10", "3.11", "3.12", "3.13"), ) parser.add_argument( "platform", From 1269dd2521870b431acb2ea4eb538d0a7817eedc Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 13:26:26 +0200 Subject: [PATCH 165/299] Update conda environments using freeze.py script --- .../conda/environment.py-3.10-linux-64.lock | 189 ++++++++--------- .../environment.py-3.10-linux-aarch64.lock | 189 ++++++++--------- .../buildpacks/conda/environment.py-3.10.yml | 2 +- .../conda/environment.py-3.11-linux-64.lock | 191 +++++++++--------- .../environment.py-3.11-linux-aarch64.lock | 191 +++++++++--------- .../buildpacks/conda/environment.py-3.11.yml | 2 +- .../conda/environment.py-3.12-linux-64.lock | 191 +++++++++--------- .../environment.py-3.12-linux-aarch64.lock | 191 +++++++++--------- .../buildpacks/conda/environment.py-3.12.yml | 2 +- .../buildpacks/conda/environment.py-3.13.yml | 15 ++ .../conda/environment.py-3.8-linux-64.lock | 56 ++--- .../environment.py-3.8-linux-aarch64.lock | 56 ++--- .../buildpacks/conda/environment.py-3.8.yml | 2 +- .../conda/environment.py-3.9-linux-64.lock | 191 +++++++++--------- .../environment.py-3.9-linux-aarch64.lock | 191 +++++++++--------- .../buildpacks/conda/environment.py-3.9.yml | 2 +- 16 files changed, 840 insertions(+), 821 deletions(-) create mode 100644 repo2docker/buildpacks/conda/environment.py-3.13.yml diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock index 9392cd7be..7c3963b93 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock @@ -1,96 +1,96 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:05:17 UTC +# Frozen on 2025-08-18 11:22:28 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 9914f3a970025d1c558275701d8a6a00f78464325df880885601a031faf3452a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py310hf71b8c6_0.conda#9b1dedfc47e1242253d6e2ca3b864693 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py310h25320af_0.conda#6d5a504fd7f16e9a1fa36994bae7c6a5 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py310hf71b8c6_1.conda#973d74c46d37ed8bbdbe721fb64a4357 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py310hea6c23e_0.conda#2e49ba3735f24d0cede54e1b77e78d48 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py310hff52083_1.conda#ce614a01b0aee1b29cee13d606bcb5d5 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py310h505e2c1_0.conda#3c12053527c50b3f825dd6dd0861832d +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py310hd8f68c5_0.conda#40a2626d9988362dfaa3c5e888735bc8 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py310h7c4b9e2_0.conda#1653341c07e20f4670eff86cad216515 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -98,78 +98,79 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py310h71f11fc_0.conda#7793fb5339be966e5f28971fd6025a9e +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py310h9a5fd63_0.conda#6fcb193c9cd6ba0fab3a12b7e360ec81 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310ha75aee5_5.conda#a2da54f3a705d518c95a5b6de8ad8af6 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py310h7c4b9e2_0.conda#3fd41ccdb9263ad51cf89b05cade6fb7 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py310h6c63255_1.conda#30cff8c312637e4b30a4a4f1b7a68ca4 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py310hed992bd_0.conda#2b99fe21291903be462bb6dc4b87b8da https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.37.0-pyh8f84b5b_0.conda#177cfa19fe3d74c87a8889286dc64090 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py310hcb5633a_0.conda#7314a7344c7e4b5e97f6819a09fa0114 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py310ha75aee5_0.conda#11bb9ab95d526337cb9672fe69209b29 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py310hbcd0ec0_0.conda#6b210a72e9e1b1cb6d30b266b84ca993 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py310h7c4b9e2_0.conda#ef71b1b926213f1b198486604727709e +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock index 8b26b054d..0fcafda0e 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock @@ -1,95 +1,95 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:05:33 UTC +# Frozen on 2025-08-18 11:22:38 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: f532024d27b7260ff8e8e6db3f3e99af408d28961320c7a5c8046c9b6df251ee @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-5_cp310.conda#c6694ec383fb171da3ab68cae8d0e8f1 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 -https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.16-h57b00e1_1_cpython.conda#c4b3a08e4d6fc7b070720f75bc883b47 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.18-h256493d_0_cpython.conda#766640fd0208e1d277a26d3497cc4b63 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310he30c3ed_2.conda#3d7dcdcc65649814f571bf0671b5c5c8 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310he30c3ed_3.conda#7bb1742f4df1a0e4040b37391261874b https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py310he30c3ed_0.conda#10265307919ae9fccffe9a522047a1a0 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py310heccc163_0.conda#954564e30fdff26e8cb8ed1975b27502 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py310he30c3ed_1.conda#f0e06167a871874b814d4202f63dc870 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py310h57cea71_0.conda#87619dd21087026f7139070efbf111fa https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py310h4c7bcd0_1.conda#39313b5bbbd430af02824edd103ed1a7 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py310h66848f9_1.conda#f0f91c0ef87d60f043e00b540293795d https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py310hb299538_0.conda#3f89fc474876c9fd15bb3d9fd51976e6 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py310heeae437_2.conda#b4b5eb2276b14c3a487032bedd1493dc https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py310hd0ab5f2_0.conda#62a11e8fa75cb4a0b06c8a2c26a7c542 +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py310haddc216_0.conda#3b5566058ca434de616775759cc7e16e https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py310h78583b1_0.conda#68a2bd5dcbb6feac96dee39f4b49fe0f +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py310ha7967c6_0.conda#443b9fabfa1a26f93551ba75797b658a https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -97,78 +97,79 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py310h1451162_0.conda#c845d656240655e00d62f28efccac070 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py310h55e1596_0.conda#2223394e55f512265afd1da3e08b06a9 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py310h7e65305_0.conda#150803dd52207944a70e18b561b66bba https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py310ha766c32_5.conda#7f6f2689cb20f42767cb421f078a89c2 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py310h5b55623_0.conda#39ac524c8de279b94308c9c907259cca https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py310h42c23b7_1.conda#a4acd1fd7ab3607039adbd819c42885f +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py310hd154c19_0.conda#11dadac3c889e8222b8db731fa56a503 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.37.0-pyh8f84b5b_0.conda#177cfa19fe3d74c87a8889286dc64090 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py310hfd680ee_0.conda#21da056dae8a75293731cc07ff64bec8 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py310h78583b1_0.conda#101005bb0bebcbcc96572dd7fd4f0e40 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py310h6a57b22_1.conda#5f992a3d612038e0125b6a1437b35a3c -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py310hdff938d_0.conda#e0aac200a8e6bd0a86f37d1485245094 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py310ha7967c6_0.conda#a689b776f8e080343c271601794e0605 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py310ha766c32_2.conda#3402f3e15d8f9240f2c6ea0ec1368ad9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.10.yml b/repo2docker/buildpacks/conda/environment.py-3.10.yml index 56178fb2b..fa347622a 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.10.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-02-09 21:05:17 UTC +# Generated on 2025-08-18 11:22:28 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock index 15aa35232..eb84e7023 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock @@ -1,97 +1,96 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:05:55 UTC +# Frozen on 2025-08-18 11:22:58 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 5214f3fab8b6c89efc84e2138d15b78e5cad1444f8a79cea06169a23bd87ff15 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py311hfdbb021_0.conda#2a34eab62b5927587e04c7f8beeaf0d7 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda#c6e461ca971ca858743101f4d73d7de4 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py311hfdbb021_1.conda#d44da5fc47328530ad83e190af89576f +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py311h1ddb823_0.conda#f15c0de21acba18ed30624272ebc0db0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda#5ca76f61b00a15a9be0612d4d883badc -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py311h9e33e62_0.conda#b1f5799ae0cc22198928f09879da01f5 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py311h902ca64_0.conda#397e7e07356db9425069fa86e8920404 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda#df3aee9c3e44489257a840b8354e77b9 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda#8e82bf1a7614ac43096a5c8d726030a3 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -99,78 +98,80 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda#52457fbaa0aef8136d5dd7bb8a36db9e +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py311hc251a9f_0.conda#83c2c7413f58bf7caf7b969d867f8ae8 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311h9ecbd09_5.conda#18143eab7fcd6662c604b85850f0db1e +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py311h49ec1c0_0.conda#112c5e2b7fe99e3678bbd64316d38f0c https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py311hafd3f86_1.conda#e00f4c7e371b53053b8bf008c25aaf1c +https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py311h8488d03_0.conda#0ffbf52c0881015b16fcd45a5e42f1f6 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py311h46250e7_0.conda#99ca132ca705de6765df5e3c4c346572 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py311h9ecbd09_0.conda#abf26162851979957e29e2952b8a62d9 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py311hdae7d1d_0.conda#484d0d62d4b069d5372680309fc5f00c +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py311h49ec1c0_0.conda#d666d60bafc3dee42ebc74f0362ac619 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock index aa63b0e66..ee5cdc6c3 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock @@ -1,96 +1,95 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:06:11 UTC +# Frozen on 2025-08-18 11:23:09 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 01b1a051ebf91f5c3936a15c8560ba613c4a46024cfd45434b27e1aa53b4d00f @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda#c2078141f21872cc34d9305123ba08f2 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 -https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.11-h1683364_1_cpython.conda#7e8786cbe7b83e7011e681a4780c9b7f -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.13-h1683364_0_cpython.conda#4efe51e746f7c0abc30338e6b3d13323 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h89d996e_2.conda#c62b4c4d3eb1d13dfe16abbe648c28b7 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h89d996e_3.conda#12df18683972ad90e8c365f7dfd02cb3 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py311h89d996e_0.conda#91d6fac128f753ec214d9fdd4e7a0fd2 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py311h8e4e6a5_0.conda#07ef728beae669d72a008430697829fb +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py311h89d996e_1.conda#9878fa7923a54e8b83776b01ba43b198 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py311h2cb90db_0.conda#e97fc7fb0ae0dd13fc024afc201252bc https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py311hec3470c_1.conda#67852e00a2929ce334c6b2f58a1b437a -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_1.conda#eb3611be0cc15845bf6e5075adc520ee https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py311hcd402e7_0.conda#858767f880caa447ae640a991ec5ba9e https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py311h58d527c_2.conda#01b93dc85ced3be09926e04498cbd260 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py311h7270cec_0.conda#e2235bd1223f3eaf22cc50e1578e26f4 +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py311hc91c717_0.conda#1d58853f1279289e1e03cb8ed98d41ca https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py311h5487e9b_0.conda#fe331d12b7fccca2348a114c4742a0e0 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py311hb9158a3_0.conda#26d69246b1f4d99b327fbd418ef5d5ce https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -98,78 +97,80 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py311h14e8bb7_0.conda#616d65d1eea809af7e2b5f7ea36350fc -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py311h826da9f_0.conda#919dc1bfa979c20c6358f06e4ee8529f +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py311h69a0203_0.conda#f7382c3e6dd0b0b85bbce9eba381271f https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py311ha879c10_5.conda#1dc6f6a28b06e858d39fb5fb3edcf6e1 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py311h19352d5_0.conda#616959368032d4c1c2ff55792d728934 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py311h4047cc9_1.conda#0c63f82ee165c4e7d089bfbcc226e3ec +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py311h2822d24_0.conda#d7d40624d58088466a9d1c50e7608a9f https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py311h2bdde80_0.conda#2373c6117c5b60ea238eb56ecec4ae62 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py311h5487e9b_0.conda#6d85aad0cc4b0d548c86da1f560443b2 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py311hd5293d8_1.conda#7a022310d8759b7d251717b09242ee13 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py311h73012f0_0.conda#4cc79852bcefbe079420f5d4758921c0 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py311hb9158a3_0.conda#7541dc53bfa57453b572f5f9df5c0eb8 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py311ha879c10_2.conda#afdd16aff670dff1cf10fdcb92759234 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.11.yml b/repo2docker/buildpacks/conda/environment.py-3.11.yml index 9e8dc7e77..7e8196d9d 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.11.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-02-09 21:05:55 UTC +# Generated on 2025-08-18 11:22:58 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock index a2710c909..d7fc6d19b 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock @@ -1,97 +1,96 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:07:33 UTC +# Frozen on 2025-08-18 11:23:29 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 879482ba73e3629ab14f1a6fdd329717bfdaaeb40e99a61c7084b15f78e4cc60 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda#6be6dcb4bffd1d456bdad28341d507bd -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_0.conda#6205bf8723b4b79275dd52ef60cf6af1 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py312h2ec8cdc_1.conda#38c2f46af8b45f914f55911006cd7056 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py312h1289d80_0.conda#20613c19390027c191c9a882a62c10c4 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda#6b51f7459ea4073eeb5057207e2e1e3d -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda#3facaca6cc0f7988df3250efccd32da3 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda#bfb49da0cc9098597d527def04d66f8b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py312h868fb18_0.conda#3d3d11430ec826a845a0e9d6ccefa294 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda#e417822cb989e80a0d2b1b576fdd1657 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda#82dacd4832dcde0c2b7888248a3b3d7c https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -99,78 +98,80 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda#7cec8d0dac15a2d9fea8e49879aa779d +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py312h6748674_0.conda#14f393a112e2ac0e87d257a25ff23ed2 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py312h66e93f0_5.conda#1505fc57c305c0a3174ea7aae0a0db25 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_0.conda#fdcda5c2e5c6970e9f629c37ec321037 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py312hda17c39_1.conda#d74f8fee018276daaee383e18b1c6fd1 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py312hee9fe19_0.conda#8cabf722a579fb85f4dfe56146b20dab https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda#bae01b2563030c085f5158c518b84e86 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py312h66e93f0_0.conda#91e345de80d0dc238b598683b69da123 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py312h680f630_0.conda#cfbd96e5a0182dfb4110fc42dda63e57 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py312h4c3975b_0.conda#8a8ae29bfb3353ef70ebdad2ca373a40 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda#c69f87041cf24dfc8cb6bf64ca7133c7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock index 9710d935c..51e02d0f8 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock @@ -1,96 +1,95 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:08:25 UTC +# Frozen on 2025-08-18 11:23:43 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e263b45a59d809c19e20cb9963be2bc27bee0b7135e9e5d7b43ae4e6ed990812 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda#62b20f305498284a07dc6c45fd0e5c87 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 -https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.8-h1683364_1_cpython.conda#09ec612ea05370989eaa3d81abf0f369 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.11-h1683364_0_cpython.conda#faec7db17a9ed4cba1c4f6098225be39 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda#e1e9727063057168d95f27a032acd0a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_3.conda#d5b7dc5e567566e3e59bbfc782cc0f37 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py312h6f74592_0.conda#f54f7b0bad14e9bbba256a21238d2630 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py312hf55c4e8_0.conda#06000eefce4af70868b88fce4579587a +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py312h6f74592_1.conda#d9ccd43f6648449f80b098709e2450c7 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py312h1ab2c47_0.conda#9e89e3c2348bff9378721e92ea995737 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_1.conda#2257c5f33024274faadf6a88a7d62807 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda#bc8607ab678073a0441808a31465f4fb https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py312hdd3e373_0.conda#1a87f588762a48fb42311b0c40fa1920 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda#4de4a5ff81c941674e08595244e7cd61 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py312ha4e36d7_0.conda#4d41b57d0d3933b9cab7ac8c05745123 +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py312h75d7d99_0.conda#87209c59d804b82b55793918deea5dd0 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda#e28996d9d2d44d777b7e6fb12f63715b +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py312hefbd42c_0.conda#7e76140855bf18739ad9f79e50d97141 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -98,78 +97,80 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda#1a256e5581b1099e9295cb84d53db3ea -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda#0520da8de6870d8ff63e818e927d1524 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py312h5c1d9af_0.conda#d956d61bafc705264e6bd77441193ec5 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py312hb2c0f52_5.conda#c3b818a44ce51af3de80cf6523cfe216 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py312hcd1a082_0.conda#4e4f1fb565fa36f5dbac29e14d457d78 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py312he723553_1.conda#79d0edec50132197f929147c03d1dba2 +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py312h4cd2d69_0.conda#44970f23cede461d58a627bea07699da https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda#9de86472b8f207fb098c69daaad50e67 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda#9677f6ab4bf27ba3c2aee70d08c7b27c -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py312h52516f5_0.conda#6432576daff7263e75a7afec80e5effd -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda#ffcb8e97e62af42075e0e5f46bb9856e -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py312h1c19210_0.conda#41d484b72868e384739a34d8c040f55e +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py312hefbd42c_0.conda#e9624d2cd8cc3f048fbc8321e9efdad8 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb2c0f52_2.conda#6b56dc2918477bc635ef293e05d286f8 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda#c69f87041cf24dfc8cb6bf64ca7133c7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.12.yml b/repo2docker/buildpacks/conda/environment.py-3.12.yml index 490e8277b..f94947f17 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.12.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-02-09 21:07:33 UTC +# Generated on 2025-08-18 11:23:29 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.13.yml b/repo2docker/buildpacks/conda/environment.py-3.13.yml new file mode 100644 index 000000000..efb91001a --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.13.yml @@ -0,0 +1,15 @@ +# AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY +# Generated on 2025-08-18 11:23:43 UTC +channels: +- conda-forge +dependencies: +- python=3.13.* +- nodejs=20 +- pip +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.3.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==1.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==2.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==5.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==4.* # https://github.com/jupyterlab/jupyterlab +- notebook==7.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock index 7b02a87db..726828061 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock @@ -1,45 +1,45 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:03:25 UTC +# Frozen on 2025-08-18 11:21:26 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: f8b3a4482f740b178955326cfa6805eb6b64fb0f84fab45fc27a59d87113d326 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-5_cp38.conda#7caf714d16205dca32687a95ae71a472 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda#4f7b6e3de4f15cc44e0f93b39f07205d +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda#5ab1a0df19c8f3ec00d5e63458e0a420 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda#f61edadbb301530bd65a32646bd81552 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda#246840b451f7a66bd68869e56b066dd5 -https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda#a098f9f949af52610fdceb8e35b57513 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.1-hbcc6ac9_2.conda#bf627c16aa26231720af037a2709ab09 +https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.1-hb9d3cd8_2.conda#1bad2995c8f1c8075c6c331bf96e46fb https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda#bb511c87804cf7220246a3a6efc45c22 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda#68eae977d7d1196d32b636a026dc015d https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda#05ffff2f44ad60b94ecb53d029c6bdf7 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py38h01eb140_0.conda#aeeb09febb02542e020c3ba7084ead01 https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.cond https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.6-pyhd8ed1ab_0.conda#cbee5eb469aa483fee70f6a1b4e955dd https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py38hfb59056_0.conda#ca6a0889b55d598c8fe154005cee15ef https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 @@ -117,12 +117,12 @@ https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.t https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py38heb5c249_0.conda#b41a6ee3a5b044185b5f46aaf6082388 https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/linux-64/h2-4.1.0-py38h578d9bd_0.tar.bz2#aa0b1b3f33dea4c04034c1af2b63fdea +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock index 79bae4c60..e33c1d0eb 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock @@ -1,44 +1,44 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:04:20 UTC +# Frozen on 2025-08-18 11:21:40 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e0b2884c1574bbc561e310e8ca9cd0e290d8a28c115e948c1aae949cd36da52a @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.8-5_cp38.conda#2c2cf003fc370241ed16a73f4ee6d798 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda#4f7b6e3de4f15cc44e0f93b39f07205d https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 -https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.6.4-h86ecc28_0.conda#e9e33059c0262c70538581e3a2205fb4 -https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.1-h86ecc28_2.conda#236d1ebc954a963b3430ce403fbb0896 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-gpl-tools-5.6.4-h2dbfc1b_0.conda#c43dd63b7ffb096cd1de6392b2a6f5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-tools-5.6.4-h86ecc28_0.conda#f99b6cd964d91182b36681fba1170965 -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-gpl-tools-5.8.1-h2dbfc1b_2.conda#0d5f95b450e75655b5e76ae626197383 +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-tools-5.8.1-h86ecc28_2.conda#04a5f1734c23daf8c7fe59045f755efb https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.6.4-h2dbfc1b_0.conda#106b4128bc624409d2685c5a395c6778 +https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.8.1-h2dbfc1b_2.conda#176b552740e8836d92c4935244d6756b https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.8.20-hbf90c55_2_cpython.conda#077f3c1075e039bbd186570ea88f42f7 https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py38hea3b116_0.conda#33014d4448003d2d713a81f0c9f6b95a https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda#6598c056f64dc8800d40add25e4e2c34 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhff2d567_0.conda#adb3a4c7f269923b7f2ccff0ef071102 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda#81534b420deb77da8833f2289b8d47ac @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.cond https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda#490730480d76cf9c8f8f2849719c6e2b -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.6-pyhd8ed1ab_0.conda#cbee5eb469aa483fee70f6a1b4e955dd https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py38h34c6dc0_0.conda#d116dc4e4b2ac2f644c1945907303a99 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 @@ -116,12 +116,12 @@ https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.t https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.0-py38hf2f4906_0.conda#ca4e3c70903a44b1e8ca0871671cf1a6 https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda#948d84721b578d426294e17a02e24cbb https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2#b21ed0883505ba1910994f1df031a428 -https://conda.anaconda.org/conda-forge/linux-aarch64/h2-4.1.0-py38h2063c64_0.tar.bz2#684eb0d9dfdf2909107dc2e561bb1918 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a3be0b2023e1ea8555781f0ad904a2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda#24fba5a9d161ad8103d4e84c0e1a3ed4 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8.yml b/repo2docker/buildpacks/conda/environment.py-3.8.yml index aaaf7a12e..f388d8247 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.8.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-02-09 21:03:25 UTC +# Generated on 2025-08-18 11:21:26 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock index e7e31140f..1d113133c 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock @@ -1,97 +1,96 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:04:41 UTC +# Frozen on 2025-08-18 11:21:59 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: bd4d374cae58bd84b0ba870367f38a90b671ab1c952a6cf4a62296b73b6accc9 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-8_cp39.conda#c2f0c4bf417925c27b62ab50264baa98 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.21-h9c0c6dc_1_cpython.conda#b4807744af026fdbe8c05131758fb4be -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.23-hc30ae73_0_cpython.conda#624ab0484356d86a54297919352d52b6 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_2.conda#8ea5af6ac902f1a4429190970d9099ce +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_3.conda#1ccd2aba673acca7aa2f289266efe2db https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py39hf88036b_0.conda#fea41cd6f4815e2bdcb7c32e0b2e03ed -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py39haef64b4_0.conda#ad12118b06c2596073c843e6d47978c2 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.1.1-py39hf88036b_1.conda#a229aa70d1de2f6b7580b7723f3ae33c +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py39h818bca1_0.conda#38d510d03b8fc261a73366f10f649188 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py39hf3d152e_1.conda#ab01fa677a681147a10f39680e6886fa -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py39h9399b63_1.conda#7821f0938aa629b9f17efd98c300a487 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.18.1-hc55a1b2_0.conda#65d4cfcb1793a3e4f102da0d0ce9ebd8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39h9399b63_2.conda#13fd88296a9f19f5e3ac0c69d4b64cc6 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py39he612d8f_0.conda#f78f4ac18603f12bcabec0219df9ea15 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py39h17f49b6_0.conda#de935a1880d17308167b723231e87f9d https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py39h8cd3c5a_0.conda#ebfd05ae1501660e995a8b6bbe02a391 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py39hd399759_0.conda#9546db52eccafee2fa2675653fec04f9 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -99,79 +98,79 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py39h4e4fb57_0.conda#9e8fb468734ff97268065206ae697ce3 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py39haa5fa38_0.conda#13fdb8706d284668b450fc13a05e78d0 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py39h8cd3c5a_5.conda#ebf59f90740b2b77e3d71c6855a7935d +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py39hd399759_0.conda#dfa88a4227076fa51b9a8afd0ed06cee https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py39h7170ec2_1.conda#ebd0f49ef632dd56ecb09a12582bc25c +https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py39hb2f7f84_0.conda#09c640d5a5798c2f520baf821a0fc0fa https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.50-hd8ed1ab_0.conda#b5114235809f754b9bff0d14d3d712bc -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.3.0-py39h9fdd4d6_0.conda#e5ce95bf75a59918fd88f7e2ed487ccf -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.38-py39h8cd3c5a_0.conda#2f97a396b05cd92a3e77d1bbd6515760 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h08a7858_1.conda#cd9fa334e11886738f17254f52210bc3 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.0-pyh41d4057_0.conda#e89d0c5836e45f9e6a66c5c24fc9ef35 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py39h20260ba_0.conda#38b79310c98c3a2270e1d19589205a6a +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py39hd399759_0.conda#227867c51ee09b270f31ca28221e57d1 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h8cd3c5a_2.conda#1cd0ce98dc34bdf4b0dd5db70591c63a +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock index 45319fc86..822241d63 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock @@ -1,96 +1,95 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-02-09 21:04:56 UTC +# Frozen on 2025-08-18 11:22:10 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 6f3b845e2c93dcbf3f05c9ce5f84b712a90b3d0fe3853e8acd6d5a969499a235 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda#fcbde5ea19d55468953bf588770c0501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda#376f0e73abbda6d23c0cb749adc195ef -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-5_cp39.conda#2d2843f11ec622f556137d72d9c72d89 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-8_cp39.conda#c2f0c4bf417925c27b62ab50264baa98 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda#511b511c5445e324066c3377481bcab8 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda#0694c249c61469f2c0f7e2990782af21 -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda#37f489acd39e22b623d2d1e5ac6d195c -https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda#915db044076cbbdffb425170deb4ce38 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda#e21c4767e783a58c373fdb99de6211bf +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 -https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda#4f3a61fe206f20b27c385ee608bcdfda -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda#0e75771b8a03afae5a2c6ce71bc733f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2#b853307650cb226731f653aa623936a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.21-hb97c71e_1_cpython.conda#49094665d26eac2d8a199169cf0989db -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.23-h0819846_0_cpython.conda#21a981b12ae698947a1119a089761db6 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h7dbf29c_2.conda#adacf334f92a835cb7a055b3e2150502 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h7dbf29c_3.conda#93037d0a51c2eaa7d9c48e73fd539460 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py39h7dbf29c_0.conda#bbbfba6984d0623a8da117ff3f947af9 -https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda#d622d8d7ee8868870f9cbe259f381181 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py39h32b2888_0.conda#b3d18c17e230a3e0245a68d8d7d85931 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda#ef8b5fca76806159fc25b4f48d8737eb -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.1.1-py39h7dbf29c_1.conda#e2bbe9ddbac623ab77834f155d9532e2 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py39h6794839_0.conda#7b6e993444bb86d657b361fe14afdb89 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 -https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda#cd170f82d8e5b355dfdea6adab23e4af +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py39h4420490_1.conda#30963643485d0a06b6d4405a6900ac15 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda#b26e487434032d7f486277beb0cead3a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py39h36a3f59_1.conda#1f1db1d0f7440f52e35cba3c061b97f1 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.18.1-hf3efe76_0.conda#4975e6d447cb53e0cd08a3f2b994c67f -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda#3e01e386307acc60b2f89af0b2e161aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py39h898b7ef_0.conda#a26ed32a36891fcd36f5ea88f0b8a2f7 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py39hbebea31_2.conda#59d83d45572c9e21d865dd6e4d75c20f https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py39hda8d5af_0.conda#690276959a2dbb0baa149c704535cd5c +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py39h8aac8b2_0.conda#9cd7386f22dccc206be8fe68d9f6eba0 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py39h3e3acee_0.conda#fdf7a3dc0d7e6ca4cc792f1731d282c4 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py39hd7e5afa_0.conda#e47bef54bd34bc1184ef75509f3de787 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda#1dbc4a115e2ad9fb7f9d5b68397f66f9 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 @@ -98,79 +97,79 @@ https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda#237db148cc37a466e4222d589029b53e +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda#848d25bfbadf020ee4d4ba90e5668252 -https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda#40c673c7d585623b8f1ee650c8734eb6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py39hecfc5ed_0.conda#5c431ce74f9fcffca9e9a29990b318e5 -https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda#74673132601ec2b7fc592755605f4c1b -https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda#7ee49e89531c0dcbba9466f6d115d585 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda#6e6b93442c2ab2f9902a3637b70c720f +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda#7d823138f550b14ecae927a5ff3286de -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py39he601760_0.conda#b20ce05e5df88020539cca45c672e6c7 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py39hf5a39f7_0.conda#499a5f888e11feb0d51ae55f07be389b https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py39h060674a_5.conda#81bd8f40cdc2ef6d2b60cb7dbfb243d2 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py39h0f7a62b_0.conda#9bd48007d6957f1e5750e6123cf0d83c https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-44.0.0-py39h11f9b69_1.conda#7d6d4e06ab5f88240b77994e79b7d55e +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py39hd05fe37_0.conda#c99a5e93aca7691707bafb653a14fd04 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda#2ca8e6dbc86525c8b95e3c0ffa26442e -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd -https://conda.anaconda.org/conda-forge/noarch/mako-1.3.9-pyhd8ed1ab_0.conda#422113c902cc5181ccaafbb4b827e492 -https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.50-hd8ed1ab_0.conda#b5114235809f754b9bff0d14d3d712bc -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.3.0-py39hf916c31_0.conda#b90efaf9a210d0ad66efbb459b0d4031 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.38-py39h3e3acee_0.conda#2348cd1b73190bec86e7355cb3ffa0b5 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h5934b9c_1.conda#43f0ab97684dc1facf7acf5bc24919e5 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.14.1-pyhd8ed1ab_0.conda#0b211ee9f81a025906738697c0ecce55 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda#a7ee488b71c30ada51c48468337b85ba -https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.1-pyhd8ed1ab_1.conda#40cc21890ee2e9eca7cbc795d233e118 -https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.0-pyh41d4057_0.conda#e89d0c5836e45f9e6a66c5c24fc9ef35 +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py39h4e6e209_0.conda#2559b148415324e44af043e168ea85fe +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py39hd7e5afa_0.conda#b5b22a9ed1abb261031a2d040bd75ab2 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h060674a_2.conda#5ffc6d85214f05e9fcf8d3c74a86acfa +https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_1.conda#bf5f2c90d503d43a8c45cedf766b4b8e -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.0.3-pyhd8ed1ab_1.conda#77753c350c42e70dd3e9919dd8099fc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda#b40131ab6a36ac2c09b7c57d4d3fbf99 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda#bb19ad65196475ab6d0bb3532d7f8d96 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda#a5b1a8065857cc4bd8b7a38d063bb728 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.2.1-pyh31011fe_0.conda#2d61d811311bedad7bb86b29bd537cd5 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda#6ba8c206b5c6f52b82435056cf74ee46 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda#0b4c3908e5a38ea22ebb98ee5888c768 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.0-pyhd8ed1ab_1.conda#cfd007391753bef610981301b8ac50fa +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda#ec1f95d39ec862a7a87de0662a98ce3e -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.2.1-pyh31011fe_0.conda#26b02c4e1060f33741de65e2983cc51f -https://conda.anaconda.org/conda-forge/noarch/notebook-7.3.2-pyhd8ed1ab_0.conda#48b0461a947a0537427fc836b9bd2d33 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e diff --git a/repo2docker/buildpacks/conda/environment.py-3.9.yml b/repo2docker/buildpacks/conda/environment.py-3.9.yml index 8d74b9820..a5481025d 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.9.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-02-09 21:04:41 UTC +# Generated on 2025-08-18 11:21:59 UTC channels: - conda-forge dependencies: From a39849b87ebd149b0bd9b28af060d606eb671c71 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 1 Oct 2025 09:32:05 -0700 Subject: [PATCH 166/299] fix venv/postBuild test - switch to simpler jupyter-keepalive extension - set -e in postBuild to catch errors - set -x to see steps as they go for easier debugging --- tests/venv/postBuild/postBuild | 4 +++- tests/venv/postBuild/requirements.txt | 2 +- tests/venv/postBuild/verify | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/venv/postBuild/postBuild b/tests/venv/postBuild/postBuild index 808562da7..20d1354de 100755 --- a/tests/venv/postBuild/postBuild +++ b/tests/venv/postBuild/postBuild @@ -1,4 +1,6 @@ #!/bin/bash -jupyter server extension disable --sys-prefix jupyter_collaboration +set -ex + +jupyter server extension disable --sys-prefix jupyter_keepalive npm install --global configurable-http-proxy npm cache clean --force diff --git a/tests/venv/postBuild/requirements.txt b/tests/venv/postBuild/requirements.txt index 2249db5c1..04eb8c7e0 100644 --- a/tests/venv/postBuild/requirements.txt +++ b/tests/venv/postBuild/requirements.txt @@ -1 +1 @@ -jupyter-collaboration +jupyter-keepalive diff --git a/tests/venv/postBuild/verify b/tests/venv/postBuild/verify index 7281d3f80..cba277bb6 100755 --- a/tests/venv/postBuild/verify +++ b/tests/venv/postBuild/verify @@ -1,4 +1,5 @@ #!/bin/bash -set -euo pipefail -jupyter server extension list 2>&1 | grep 'jupyter_collaboration' | grep disabled +set -xeuo pipefail +jupyter server extension list +jupyter server extension list 2>&1 | grep 'jupyter_keepalive' | grep disabled which configurable-http-proxy From 690ede817b6225f7bce4c705f8cb5299b7093513 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Thu, 2 Oct 2025 19:11:40 +0100 Subject: [PATCH 167/299] Delete gitpod config --- .gitpod.yml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 69e7aa86d..000000000 --- a/.gitpod.yml +++ /dev/null @@ -1,12 +0,0 @@ -tasks: - - init: | - pip3 install sphinx-autobuild - pip3 install -r dev-requirements.txt - pip3 install -r docs/requirements.txt - pip3 install -e . - command: | - sphinx-autobuild docs/source/ docs/_build/html/ - name: Sphinx preview - -ports: - - port: 8000 From 430d707836ea4f23229f2c7a505ef5d8be1d7ac5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 21:54:59 +0000 Subject: [PATCH 168/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - https://github.com/psf/black → https://github.com/psf/black-pre-commit-mirror - [github.com/psf/black-pre-commit-mirror: 25.1.0 → 25.9.0](https://github.com/psf/black-pre-commit-mirror/compare/25.1.0...25.9.0) - [github.com/pycqa/isort: 6.0.1 → 6.1.0](https://github.com/pycqa/isort/compare/6.0.1...6.1.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b87234df3..a091aa1a7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,8 +22,8 @@ repos: exclude: check-tmp # Autoformat: Python code - - repo: https://github.com/psf/black - rev: 25.1.0 + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 25.9.0 hooks: - id: black args: @@ -35,7 +35,7 @@ repos: # Autoformat: Python code - repo: https://github.com/pycqa/isort - rev: 6.0.1 + rev: 6.1.0 hooks: - id: isort args: From 5406885a0d7dfe1e52942448ee12d2642ee06e75 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 15 Oct 2025 17:25:14 +0200 Subject: [PATCH 169/299] Add Python 3.14 to list of available versions Related to https://github.com/jupyterhub/repo2docker/issues/1474 --- repo2docker/buildpacks/conda/freeze.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index c46f7488f..7c9de38bb 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -113,7 +113,7 @@ def set_python(py_env_file, py): "py", nargs="*", help="Python version(s) to update and freeze", - default=("3.8", "3.9", "3.10", "3.11", "3.12", "3.13"), + default=("3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"), ) parser.add_argument( "platform", From 45c24d10704168b84f35a2c032c674eed67de412 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 15 Oct 2025 09:45:47 -0700 Subject: [PATCH 170/299] fix import of datetime.timezone.utc datetime.UTC alias new in 3.11 --- repo2docker/buildpacks/conda/freeze.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index d37c834c3..c380ec4d9 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -12,11 +12,12 @@ import os import pathlib from argparse import ArgumentParser -from datetime import UTC, datetime +from datetime import datetime, timezone from subprocess import check_call from ruamel.yaml import YAML +UTC = timezone.utc HERE = pathlib.Path(os.path.dirname(os.path.abspath(__file__))) ENV_FILE = HERE / "environment.yml" From 8f6c01cd1d1fdf2e3a4661893b3d857a054e510b Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:57:18 +1300 Subject: [PATCH 171/299] Bump conda from 25.7.0 to 25.9.1 Bumps [conda](https://github.com/conda/conda) from 25.7.0 to 25.9.1 - [Release notes](https://github.com/conda/conda/releases) - [Commits](https://github.com/conda/conda/compare/25.7.0...25.9.1) --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index 7d327052c..78f74a303 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -6,7 +6,7 @@ set -ex cd $(dirname $0) export MAMBA_VERSION="2.3.2" -export CONDA_VERSION="25.7.0" +export CONDA_VERSION="25.9.1" URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" From 69279c57430708128c265b50df7f0b223a9aea30 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 16 Oct 2025 09:21:35 +0200 Subject: [PATCH 172/299] Updating conda buildpacks for Python <= 3.12 --- .../conda/environment.py-3.10-linux-64.lock | 137 ++++++++--------- .../environment.py-3.10-linux-aarch64.lock | 137 ++++++++--------- .../buildpacks/conda/environment.py-3.10.yml | 2 +- .../conda/environment.py-3.11-linux-64.lock | 139 ++++++++--------- .../environment.py-3.11-linux-aarch64.lock | 139 ++++++++--------- .../buildpacks/conda/environment.py-3.11.yml | 2 +- .../conda/environment.py-3.12-linux-64.lock | 144 +++++++++--------- .../environment.py-3.12-linux-aarch64.lock | 144 +++++++++--------- .../buildpacks/conda/environment.py-3.12.yml | 2 +- .../conda/environment.py-3.8-linux-64.lock | 26 ++-- .../environment.py-3.8-linux-aarch64.lock | 26 ++-- .../buildpacks/conda/environment.py-3.8.yml | 2 +- .../conda/environment.py-3.9-linux-64.lock | 42 ++--- .../environment.py-3.9-linux-aarch64.lock | 42 ++--- .../buildpacks/conda/environment.py-3.9.yml | 2 +- 15 files changed, 499 insertions(+), 487 deletions(-) diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock index 7c3963b93..e4b658141 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:22:28 UTC +# Frozen on 2025-10-16 07:17:13 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 9914f3a970025d1c558275701d8a6a00f78464325df880885601a031faf3452a @@ -7,68 +7,69 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-hd994cfb_1_cpython.conda#3dc262bc5af2a90635384b5ab76545ba https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hea6c23e_4.conda#6ef43db290647218e1e04c2601675bff https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py310h25320af_0.conda#6d5a504fd7f16e9a1fa36994bae7c6a5 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py310h25320af_0.conda#df12e1e922f79a4a407bc9566e9fba3f https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py310hea6c23e_0.conda#2e49ba3735f24d0cede54e1b77e78d48 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py310hea6c23e_1.conda#a6a889b87b0358306e257dc7767d58be https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py310hff52083_1.conda#ce614a01b0aee1b29cee13d606bcb5d5 +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py310hff52083_2.conda#71d5cc5161f9ddac9d9f50c26cf0d85f https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py310h7c4b9e2_0.conda#b1683bdb8b834126823a034d5f29efb2 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -78,28 +79,28 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py310hd8f68c5_0.conda#40a2626d9988362dfaa3c5e888735bc8 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py310hd8f68c5_1.conda#7afa2dfd1c7d29316b36697e25ccb5d9 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py310h7c4b9e2_0.conda#1653341c07e20f4670eff86cad216515 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py310h7c4b9e2_1.conda#c5f63ba41df24b9025c9196353541ed5 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -108,69 +109,69 @@ https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.t https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py310h9a5fd63_0.conda#6fcb193c9cd6ba0fab3a12b7e360ec81 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py310h4f33d48_0.conda#d175993378311ef7c74f17971a380655 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py310h7c4b9e2_0.conda#3fd41ccdb9263ad51cf89b05cade6fb7 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py310h7c4b9e2_1.conda#aa3adecd8dd686ae1c28008b6d976b3f https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py310hed992bd_0.conda#2b99fe21291903be462bb6dc4b87b8da +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py310hed992bd_0.conda#0c0f1a59e82a6477ef00a602920a89c3 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 https://conda.anaconda.org/conda-forge/noarch/ipython-8.37.0-pyh8f84b5b_0.conda#177cfa19fe3d74c87a8889286dc64090 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py310hbcd0ec0_0.conda#6b210a72e9e1b1cb6d30b266b84ca993 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py310h7c4b9e2_0.conda#ef71b1b926213f1b198486604727709e -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py310hd8f68c5_0.conda#e6a2c9696ff99ae8a47c898f643cc2b0 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.44-py310h7c4b9e2_0.conda#60c06302d59e6b96f899c53fba8ab776 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_0.conda#6b243b9f9477ad0b0a90552ebddb27e7 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock index 0fcafda0e..74bd30f78 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock @@ -1,73 +1,74 @@ # AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:22:38 UTC +# Frozen on 2025-10-16 07:17:25 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: f532024d27b7260ff8e8e6db3f3e99af408d28961320c7a5c8046c9b6df251ee @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda#0c5ad486dcfb188885e3cf8ba209b97b +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.18-h256493d_0_cpython.conda#766640fd0208e1d277a26d3497cc4b63 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.19-hcb9654d_1_cpython.conda#c9f6883e1812ecb434221f6b67ee84e2 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310he30c3ed_3.conda#7bb1742f4df1a0e4040b37391261874b +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py310h57cea71_4.conda#c6d7c1743e0cac81664337a27069bdbc https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py310heccc163_0.conda#954564e30fdff26e8cb8ed1975b27502 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.17-py310heccc163_0.conda#de593b3f2962851aa4a34bdf6a50cf1c https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py310h57cea71_0.conda#87619dd21087026f7139070efbf111fa +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py310h57cea71_1.conda#a8a63571ca1c1ca1c602ef60f268d9f0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py310h4c7bcd0_1.conda#39313b5bbbd430af02824edd103ed1a7 +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py310h4c7bcd0_2.conda#c4239e3839f15bd173875bb364a11bc2 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py310h66848f9_1.conda#f0f91c0ef87d60f043e00b540293795d +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py310h3b5aacf_0.conda#9a2b8d81828ff25f9eadc71e225bd223 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py310hb299538_0.conda#3f89fc474876c9fd15bb3d9fd51976e6 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.1.0-py310h5b55623_0.conda#4727a9b22e24bc3053eb943f0ae5f0ec https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -77,28 +78,28 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py310heeae437_2.conda#b4b5eb2276b14c3a487032bedd1493dc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py310h2d8da20_0.conda#872dcca76a05bdbc9ddcdbb77896d464 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py310haddc216_0.conda#3b5566058ca434de616775759cc7e16e +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.1-py310haddc216_1.conda#05e007a25a5aed9dc6760250ef6a2a61 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py310ha7967c6_0.conda#443b9fabfa1a26f93551ba75797b658a +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py310ha7967c6_1.conda#0b562e3fe4edc05b105e95a595079dd2 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -107,69 +108,69 @@ https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.t https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py310h1451162_0.conda#c845d656240655e00d62f28efccac070 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py310h7e65305_0.conda#150803dd52207944a70e18b561b66bba -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py310h5df05d2_0.conda#e43ca0f0b397a3b6085f1658dccc5722 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py310h5b55623_0.conda#39ac524c8de279b94308c9c907259cca +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py310h5b55623_1.conda#e6292cc16634cb3f23a495e20149cfd2 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py310hd154c19_0.conda#11dadac3c889e8222b8db731fa56a503 +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.2-py310hd154c19_0.conda#eb25cea45cf70d29392f4112a35e4134 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 https://conda.anaconda.org/conda-forge/noarch/ipython-8.37.0-pyh8f84b5b_0.conda#177cfa19fe3d74c87a8889286dc64090 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py310hdff938d_0.conda#e0aac200a8e6bd0a86f37d1485245094 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py310ha7967c6_0.conda#a689b776f8e080343c271601794e0605 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py310ha766c32_2.conda#3402f3e15d8f9240f2c6ea0ec1368ad9 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py310h598bb90_0.conda#efa04a8b32c9a042c4f01f8084517675 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.44-py310ha7967c6_0.conda#f5e6bcceafc979c2f0e3f8004ba0331c +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py310hef25091_0.conda#338ea1a8618f7f0c126d1945f71a553b +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10.yml b/repo2docker/buildpacks/conda/environment.py-3.10.yml index fa347622a..64fd9fb38 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.10.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:22:28 UTC +# Generated on 2025-10-16 07:17:13 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock index eb84e7023..0778a8cbb 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:22:58 UTC +# Frozen on 2025-10-16 07:17:45 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 5214f3fab8b6c89efc84e2138d15b78e5cad1444f8a79cea06169a23bd87ff15 @@ -7,68 +7,69 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hfe2f287_1_cpython.conda#e87c753e04bffcda4cbfde7d052c1f7a https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda#7138a06a7b0d11a23cfae323e6010a08 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda#c6e461ca971ca858743101f4d73d7de4 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py311hc665b79_0.conda#af20efc4f52675e7ce9a3e3ed8447fbb https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py311h1ddb823_0.conda#f15c0de21acba18ed30624272ebc0db0 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py311h1ddb823_1.conda#210ecbcac24f0148147fb8def5652d7a https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda#5ca76f61b00a15a9be0612d4d883badc +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_2.conda#5dd29601defbcc14ac6953d9504a80a7 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py311h49ec1c0_0.conda#eaf20d52642262d2987c3cdc7423649e https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -78,37 +79,37 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py311h902ca64_0.conda#397e7e07356db9425069fa86e8920404 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py311h902ca64_1.conda#622c389c080689ba1575a0750eb0209d https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda#8e82bf1a7614ac43096a5c8d726030a3 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_1.conda#18a98f4444036100d78b230c94453ff4 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda#6cb6c4d57d12dfa0ecdd19dbe758ffc9 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -116,62 +117,62 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py311hc251a9f_0.conda#83c2c7413f58bf7caf7b969d867f8ae8 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py311h2315fbb_0.conda#6c87a0f4566469af3585b11d89163fd7 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py311h49ec1c0_0.conda#112c5e2b7fe99e3678bbd64316d38f0c +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py311h49ec1c0_1.conda#f3d6bb9cae7a99bb6cd6fdaa09fe394d https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py311h8488d03_0.conda#0ffbf52c0881015b16fcd45a5e42f1f6 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py311h8488d03_0.conda#fee8a1f28d20aa480aff55318fc18dfd https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py311hdae7d1d_0.conda#484d0d62d4b069d5372680309fc5f00c -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py311h49ec1c0_0.conda#d666d60bafc3dee42ebc74f0362ac619 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py311h902ca64_0.conda#a440367c3ba0b93cfb7c6b1b93989720 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.44-py311h49ec1c0_0.conda#1a4718360f83e252305752c5dee5a31d +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda#0fd242142b0691eb9311dc32c1d4ab76 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock index ee5cdc6c3..d5d569c46 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock @@ -1,73 +1,74 @@ # AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:23:09 UTC +# Frozen on 2025-10-16 07:17:57 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 01b1a051ebf91f5c3936a15c8560ba613c4a46024cfd45434b27e1aa53b4d00f @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.13-h1683364_0_cpython.conda#4efe51e746f7c0abc30338e6b3d13323 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.14-hcfbf8c2_1_cpython.conda#6190c58a8b68e9f18fb751f7702870c1 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h89d996e_3.conda#12df18683972ad90e8c365f7dfd02cb3 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py311h2cb90db_4.conda#885e3ee3d1d7019a8b6c2e1cf8492bea https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py311h8e4e6a5_0.conda#07ef728beae669d72a008430697829fb +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.17-py311h8e4e6a5_0.conda#b4ca891da67dc4f17e387fa9f05fa2da https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py311h2cb90db_0.conda#e97fc7fb0ae0dd13fc024afc201252bc +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py311h2cb90db_1.conda#924d4bbdcc31c59a535873b5466cda02 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py311hec3470c_1.conda#67852e00a2929ce334c6b2f58a1b437a +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py311hec3470c_2.conda#49be99374ac54a8cb6c98948233170a4 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_1.conda#eb3611be0cc15845bf6e5075adc520ee +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py311h2dad8b0_0.conda#ff6e48e0ba263a5f446237001fd59c4a https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py311hcd402e7_0.conda#858767f880caa447ae640a991ec5ba9e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.1.0-py311h19352d5_0.conda#39cbc056a3c90098a1b8b13e31c1e8c6 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -77,37 +78,37 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py311h58d527c_2.conda#01b93dc85ced3be09926e04498cbd260 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py311h164a683_0.conda#3b798096c0411fe74c24a95c3965a62a https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py311hc91c717_0.conda#1d58853f1279289e1e03cb8ed98d41ca +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.1-py311hc91c717_1.conda#6315a262e3d9feb00eb5e768689d5a0f https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py311hb9158a3_0.conda#26d69246b1f4d99b327fbd418ef5d5ce +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py311hb9158a3_1.conda#9355a7de2012e18e6ae1d2d0395260d8 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py311h14e8bb7_0.conda#616d65d1eea809af7e2b5f7ea36350fc +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py311h3324b35_0.conda#606a6f422c769fd5180ceca519200ee9 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -115,62 +116,62 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py311h69a0203_0.conda#f7382c3e6dd0b0b85bbce9eba381271f -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py311h5e4e491_0.conda#e000dfab1843362bc7030a3a957b3146 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py311h19352d5_0.conda#616959368032d4c1c2ff55792d728934 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py311h19352d5_1.conda#59a01216703b8f29b4da69cb34858d1c https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py311h2822d24_0.conda#d7d40624d58088466a9d1c50e7608a9f +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.2-py311h2822d24_0.conda#c0a7cc61793cf7ec5f1fd02ddb862122 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py311h73012f0_0.conda#4cc79852bcefbe079420f5d4758921c0 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py311hb9158a3_0.conda#7541dc53bfa57453b572f5f9df5c0eb8 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py311ha879c10_2.conda#afdd16aff670dff1cf10fdcb92759234 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py311hddf1d3d_0.conda#ea720d76d38146a7beb7a9d00279c689 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.44-py311hb9158a3_0.conda#74701eefe002e59ab62dfe4f4e205619 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py311h51cfe5d_0.conda#295a2d74143c0b2621123d0c628c599f +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11.yml b/repo2docker/buildpacks/conda/environment.py-3.11.yml index 7e8196d9d..acf07daf2 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.11.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.11.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:22:58 UTC +# Generated on 2025-10-16 07:17:45 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock index d7fc6d19b..4854584f5 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-64.lock @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:23:29 UTC +# Frozen on 2025-10-16 07:18:17 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: 879482ba73e3629ab14f1a6fdd329717bfdaaeb40e99a61c7084b15f78e4cc60 @@ -7,68 +7,70 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hfe2f287_0_cpython.conda#ceada987beec823b3c702710ee073fba https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda#fd0e7746ed0676f008daacb706ce69e4 https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_0.conda#6205bf8723b4b79275dd52ef60cf6af1 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_0.conda#f929705f660039f25f18e96a11ff17a0 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py312h8285ef7_0.conda#14938d17d7a91e2bf132330c7f2f61a2 https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py312h1289d80_0.conda#20613c19390027c191c9a882a62c10c4 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py312h1289d80_1.conda#e5e4c495ffa157da0c9a0457736f18cd https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda#6b51f7459ea4073eeb5057207e2e1e3d +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_2.conda#eeaf37c3dc2d1660668bd102c841f783 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda#3facaca6cc0f7988df3250efccd32da3 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py312h4c3975b_0.conda#d99ab14339ac25676f1751b76b26c9b2 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -78,37 +80,37 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py312h868fb18_0.conda#3d3d11430ec826a845a0e9d6ccefa294 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py312h868fb18_1.conda#0e32f9c8ca00c1b926a1b77be6937112 https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda#82dacd4832dcde0c2b7888248a3b3d7c +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_1.conda#66b988f7f1dc9fcc9541483cb0ab985b https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h35888ee_0.conda#60b9cd087d22272885a6b8366b1d3d43 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -116,62 +118,64 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py312h6748674_0.conda#14f393a112e2ac0e87d257a25ff23ed2 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_0.conda#b317ae484dd8214de8ee7f0839be3500 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_0.conda#fdcda5c2e5c6970e9f629c37ec321037 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_1.conda#161fbbd6a2f41743c687ef83ba220ce9 https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py312hee9fe19_0.conda#8cabf722a579fb85f4dfe56146b20dab +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py312hee9fe19_0.conda#3c4a18c7e247b6db8cf5605b1846d511 https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py312h680f630_0.conda#cfbd96e5a0182dfb4110fc42dda63e57 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py312h4c3975b_0.conda#8a8ae29bfb3353ef70ebdad2ca373a40 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py312h868fb18_0.conda#e0767518fa45df8b484421a405f764c6 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.44-py312h4c3975b_0.conda#21edaf3d8f04da6258c30be095012ea7 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_0.conda#05d73100768745631ab3de9dc1e08da2 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda#3399d43f564c905250c1aea268ebb935 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock index 51e02d0f8..c8507741a 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.12-linux-aarch64.lock @@ -1,73 +1,75 @@ # AUTO GENERATED FROM environment.py-3.12.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:23:43 UTC +# Frozen on 2025-10-16 07:18:29 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e263b45a59d809c19e20cb9963be2bc27bee0b7135e9e5d7b43ae4e6ed990812 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.11-h1683364_0_cpython.conda#faec7db17a9ed4cba1c4f6098225be39 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.12-hcfbf8c2_0_cpython.conda#08c82423fa3c2153c34f54505a2897c9 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_3.conda#d5b7dc5e567566e3e59bbfc782cc0f37 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h1ab2c47_4.conda#53b2f879d6c80546213803f756ddedab https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 -https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.16-py312hf55c4e8_0.conda#06000eefce4af70868b88fce4579587a +https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_0.conda#f929705f660039f25f18e96a11ff17a0 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.17-py312hf55c4e8_0.conda#e66a45ad7233832259fb5f985b6d6963 https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14 -https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py312h1ab2c47_0.conda#9e89e3c2348bff9378721e92ea995737 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py312h1ab2c47_1.conda#9e4aa6b9e34017304d6e44d45e519521 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca -https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_1.conda#2257c5f33024274faadf6a88a7d62807 +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_2.conda#46075b80a4b1295bffdeb9dd1f43b1c5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f -https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda#bc8607ab678073a0441808a31465f4fb +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_0.conda#d4e5ac7000bdc398b3cfba57f01e7e63 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py312hdd3e373_0.conda#1a87f588762a48fb42311b0c40fa1920 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.1.0-py312hcd1a082_0.conda#56488e632cba932320e5b0833a61126c https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -77,37 +79,37 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda#4de4a5ff81c941674e08595244e7cd61 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_0.conda#428aed4a70236d95492c11da941fe1dc https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.0-py312h75d7d99_0.conda#87209c59d804b82b55793918deea5dd0 +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.1-py312h75d7d99_1.conda#b7c5243a280c24a2f97d9b5f2407cf8e https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py312hefbd42c_0.conda#7e76140855bf18739ad9f79e50d97141 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py312hefbd42c_1.conda#d979131a81d6ac66c26e8cc7b41cdf16 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda#63a644e158c4f8eeca0d1290ac25e0cc -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 -https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda#1a256e5581b1099e9295cb84d53db3ea +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py312h2fc7fbd_0.conda#b1e3867af2555753272e3d53798147bb https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -115,62 +117,64 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b -https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda#7ec6576e328bc128f4982cd646eeba85 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py312h5c1d9af_0.conda#d956d61bafc705264e6bd77441193ec5 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_0.conda#b317ae484dd8214de8ee7f0839be3500 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda#e0c3cd765dc15751ee2f0b03cd015712 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda#cc2613bfa71dec0eb2113ee21ac9ccbf -https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py312hcd1a082_0.conda#4e4f1fb565fa36f5dbac29e14d457d78 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py312hcd1a082_1.conda#320cb23e259bf7b6cd375d570f0348ac https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d -https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-45.0.6-py312h4cd2d69_0.conda#44970f23cede461d58a627bea07699da +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.2-py312h4cd2d69_0.conda#4c5929a449a1cf0c7751e8ce72a5bb0b https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 -https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda#cb7706b10f35e7507917cefa0978a66d -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py312h1c19210_0.conda#41d484b72868e384739a34d8c040f55e -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py312hefbd42c_0.conda#e9624d2cd8cc3f048fbc8321e9efdad8 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb2c0f52_2.conda#6b56dc2918477bc635ef293e05d286f8 -https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py312h5eb8f6c_0.conda#56be5302d17deaf7776c8f112d755359 +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.44-py312hefbd42c_0.conda#94976c89cb4a8812e27e404d11db9461 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py312hd41f8a7_0.conda#74aa2fbcdcbb153dc324cd09e437b63e +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda#c9aadf2edd39b56ad34dc5f775626d5b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 -https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 -https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.3.0-h4422900_0.conda#c4e0da69399fb5bd8e314ec2da0f0119 -https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.5-pyhd8ed1ab_0.conda#28062c17cdb444388c00903eaec1ba0e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.12.yml b/repo2docker/buildpacks/conda/environment.py-3.12.yml index f94947f17..815f7d85b 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.12.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.12.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:23:29 UTC +# Generated on 2025-10-16 07:18:17 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock index 726828061..711d55663 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock @@ -1,34 +1,34 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:21:26 UTC +# Frozen on 2025-10-16 07:16:06 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: f8b3a4482f740b178955326cfa6805eb6b64fb0f84fab45fc27a59d87113d326 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda#4f7b6e3de4f15cc44e0f93b39f07205d -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda#f61edadbb301530bd65a32646bd81552 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b1893 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda#68eae977d7d1196d32b636a026dc015d https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda#05ffff2f44ad60b94ecb53d029c6bdf7 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock index e33c1d0eb..e69a93990 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock @@ -1,33 +1,33 @@ # AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:21:40 UTC +# Frozen on 2025-10-16 07:16:22 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: e0b2884c1574bbc561e310e8ca9cd0e290d8a28c115e948c1aae949cd36da52a @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda#4f7b6e3de4f15cc44e0f93b39f07205d https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda#0c5ad486dcfb188885e3cf8ba209b97b +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.1-h86ecc28_2.conda#236d1ebc954a963b3430ce403fbb0896 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2#d09ab3c60eebb6f14eb4d07e172775cc https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c @@ -38,7 +38,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#2 https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.8.1-h2dbfc1b_2.conda#176b552740e8836d92c4935244d6756b https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.8.20-hbf90c55_2_cpython.conda#077f3c1075e039bbd186570ea88f42f7 https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h28faeed_4.conda#ae8c0108b4d6a5981bce484eeaaf1b55 https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_0.conda#454950e9fa3a0c59880de0ac7a6bc8c4 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8.yml b/repo2docker/buildpacks/conda/environment.py-3.8.yml index f388d8247..d5742a96d 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.8.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:21:26 UTC +# Generated on 2025-10-16 07:16:06 UTC channels: - conda-forge dependencies: diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock index 1d113133c..332e72525 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:21:59 UTC +# Frozen on 2025-10-16 07:16:41 UTC # Generated by conda-lock. # platform: linux-64 # input_hash: bd4d374cae58bd84b0ba870367f38a90b671ab1c952a6cf4a62296b73b6accc9 @@ -7,29 +7,29 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-8_cp39.conda#c2f0c4bf417925c27b62ab50264baa98 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 @@ -60,7 +60,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py39h9399b63_1.conda#7821f0938aa629b9f17efd98c300a487 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.4-hf7ee748_0.conda#cb478d75c54de187e55624862dc18a23 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c0 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py39h8cd3c5a_0.conda#851ab4da2babaf8d6968a64dd348ca88 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.co https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -121,7 +121,7 @@ https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py39haa5fa38_0.conda#13fdb8706d284668b450fc13a05e78d0 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.2-py39haa5fa38_0.conda#a12afe53883b54e2df984dd45bc36063 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyh https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py39h20260ba_0.conda#38b79310c98c3a2270e1d19589205a6a https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.43-py39hd399759_0.conda#227867c51ee09b270f31ca28221e57d1 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h8cd3c5a_2.conda#1cd0ce98dc34bdf4b0dd5db70591c63a +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39hd399759_3.conda#2f6845f6cdf545845a60c4dcbd017c78 https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 @@ -153,14 +153,14 @@ https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda# https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0 https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock index 822241d63..5ef6b572c 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock @@ -1,34 +1,34 @@ # AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2025-08-18 11:22:10 UTC +# Frozen on 2025-10-16 07:16:53 UTC # Generated by conda-lock. # platform: linux-aarch64 # input_hash: 6f3b845e2c93dcbf3f05c9ce5f84b712a90b3d0fe3853e8acd6d5a969499a235 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h5e2c951_1.conda#c10832808cf155953061892b3656470a -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_4.conda#2ae9e35d98743bd474b774221f53bc3f +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-8_cp39.conda#c2f0c4bf417925c27b62ab50264baa98 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_4.conda#56f856e779238c93320d265cc20d0191 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_4.conda#fddaeda6653bf30779a821819152d567 +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda#0c5ad486dcfb188885e3cf8ba209b97b +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda#d5d58b2dc3e57073fe22303f5fed4db7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_4.conda#a87010172783a6a452e58cd1bf0dccee +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.2-h8e36d6e_0.conda#ed060dc5bd1dc09e8df358fbba05d27c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_4.conda#b213d079f1b9ce04e957c0686f57ce13 -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c @@ -59,7 +59,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda#3a8063b25e603999188ed4bbf3485404 https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py39h36a3f59_1.conda#1f1db1d0f7440f52e35cba3c061b97f1 https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 -https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.4-h6feb2b4_0.conda#41468bf2b028bf53c020a57a2154dcb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c0 https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda#c64b77ccab10b822722904d889fa83b5 -https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py39h898b7ef_0.conda#a26ed32a36891fcd36f5ea88f0b8a2f7 +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py39h060674a_0.conda#5d0d600ba618fe729153d87ff3303401 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -98,7 +98,7 @@ https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.co https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda#84f8f77f0a9c6ef401ee96611745da8f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c -https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda#f2f3282559a4b87b7256ecafb4610107 +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -120,7 +120,7 @@ https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.1-py39hf5a39f7_0.conda#499a5f888e11feb0d51ae55f07be389b +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.0.2-py39h8dcef23_0.conda#55c47cd39123fa01060b990722951b87 https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7 https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyh https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.2-py39h4e6e209_0.conda#2559b148415324e44af043e168ea85fe https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.43-py39hd7e5afa_0.conda#b5b22a9ed1abb261031a2d040bd75ab2 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h060674a_2.conda#5ffc6d85214f05e9fcf8d3c74a86acfa +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py39h0f7a62b_3.conda#dcca87609d31463211de720255de713c https://conda.anaconda.org/conda-forge/noarch/alembic-1.16.4-pyhd8ed1ab_0.conda#b17cf31f353008d23a6fd8bd90efcfc2 https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 @@ -152,14 +152,14 @@ https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda# https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda#b0cc25825ce9212b8bee37829abad4d6 https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda#c6e3fd94e058dba67d917f38a11b50ab +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda#1b337e3d378cde62889bb735c024b7a2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda#f4c7afaf838ab5bb1c4e73eb3095fb26 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.3.0-pyhda7c55b_0.conda#2a47623cd374e67413707b9925908313 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0 https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda#f062e04d7cd585c937acbf194dceec36 https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda#7129ed52335cc7164baf4d6508a3f233 https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.1-pyh885dcc9_1.conda#aff9028145d26b0987d0959a989e40cf -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.1.1-pyhd8ed1ab_0.conda#2d7371814049db8228fb4d945d2b455e +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda#70cb2903114eafc6ed5d70ca91ba6545 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9.yml b/repo2docker/buildpacks/conda/environment.py-3.9.yml index a5481025d..ea3ededfa 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.9.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:21:59 UTC +# Generated on 2025-10-16 07:16:41 UTC channels: - conda-forge dependencies: From 638911c31b918e4f03b3acdb6c9366625166716f Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 16 Oct 2025 09:22:23 +0200 Subject: [PATCH 173/299] Updating conda buildpacks for Python == 3.13 This includes the missing files pointed by @matthewfeickert in https://github.com/jupyterhub/repo2docker/issues/1446#issuecomment-3406802488. --- .../conda/environment.py-3.13-linux-64.lock | 179 ++++++++++++++++++ .../environment.py-3.13-linux-aarch64.lock | 178 +++++++++++++++++ .../buildpacks/conda/environment.py-3.13.yml | 2 +- 3 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 repo2docker/buildpacks/conda/environment.py-3.13-linux-64.lock create mode 100644 repo2docker/buildpacks/conda/environment.py-3.13-linux-aarch64.lock diff --git a/repo2docker/buildpacks/conda/environment.py-3.13-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.13-linux-64.lock new file mode 100644 index 000000000..930ed014d --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.13-linux-64.lock @@ -0,0 +1,179 @@ +# AUTO GENERATED FROM environment.py-3.13.yml, DO NOT MANUALLY MODIFY +# Frozen on 2025-10-16 07:18:48 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: ee50f459b6ce40535eaf2ee74bdcb5ab6d90d2523f9b369c7e2a3b938901c080 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#94305520c52a4aa3f6c2b1ff6008d9f8 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.8-h2b335a9_101_cp313.conda#ae8cf86b9140c7b6a6593a582a8eab8a +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda#bc8624c405856b1d047dd0a81829b08c +https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.8-py313hd8ed1ab_101.conda#d60198f8c2b5cf84e195791f540935ba +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py313h5d5ffb9_0.conda#be318961d544421f4c8d8a91bff4f118 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py313h7033f15_1.conda#54e4dec31235bbc794d091af9afcd845 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda#c1375f38e5f3ee38a9ee0e405a601c35 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda#c14389156310b8ed3520d84f854be1ee +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py313h07c4f96_0.conda#f25cdf145885936fe458452d73d991dc +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda#4794ea0adaebd9f844414e594b142cb2 +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda#06c117e49934b564ef9ff6e61f279301 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda#45821154b9cb2fb63c2b354c76086954 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf01b4d8_0.conda#062317cc1cd26fbf6454e86ddd3622c4 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.8-h4df99d1_101.conda#2af36fadd7f3804bc6d414655c282fa5 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py313h07c4f96_1.conda#0d56c6a245ef9528644a33947a4dca4f +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py313hafb0bba_0.conda#5473e4a4a4fd596593e65357ab6cd188 +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py313h843e2db_0.conda#d42ccdecefbe670d2a50ee3ce784166b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.44-py313h07c4f96_0.conda#57247c3902e6466acad8dad9963bb146 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_0.conda#1fe43bd1fc86e22ad3eb0edec637f8a2 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda#3399d43f564c905250c1aea268ebb935 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.13-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.13-linux-aarch64.lock new file mode 100644 index 000000000..a304b5984 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.13-linux-aarch64.lock @@ -0,0 +1,178 @@ +# AUTO GENERATED FROM environment.py-3.13.yml, DO NOT MANUALLY MODIFY +# Frozen on 2025-10-16 07:19:00 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: e406ec9c02cfaad96f1da2e1a38a4d5e71dc18ba2e5e0d7a126fa0592e7f7f55 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#94305520c52a4aa3f6c2b1ff6008d9f8 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda#78cfed3f76d6f3f279736789d319af76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c +https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.8-h23354eb_101_cp313.conda#6e3659f24f886b4148dfee0fe670b307 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py313he352c24_4.conda#d5993a664b52718233b0d7d8c72f71aa +https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.8-py313hd8ed1ab_101.conda#d60198f8c2b5cf84e195791f540935ba +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.17-py313h59403f9_0.conda#57d79b7e7af2bf4b268f7e983b2c3d6c +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py313he352c24_1.conda#170153d3987689b4f25ff40699c0cfcf +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py313hd81a959_2.conda#d4ef48fa823e725c9cd29e85214f09d0 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda#59fc93a010d6e8a08a4fa32424d86a82 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.1.0-py313h6194ac5_0.conda#2561a70b42eb4837cb2175260dac6224 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda#cd0891668088a005cb45b344d84a3955 +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.1-py313h8f1d341_1.conda#fe4c2012bb7dcd65bb93de1d6874a3d9 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda#f896700632061a8dafa2f80bb178909c +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py313h0f41b0d_0.conda#fdf143708b2f5ffadcd8eefb2a45f021 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.8-h4df99d1_101.conda#2af36fadd7f3804bc6d414655c282fa5 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py313h6194ac5_1.conda#62d8cb2d243865ea058634dfcda33db6 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.2-py313hbc6eba2_0.conda#d778fd3fa7204c76043ef94db686c239 +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py313h5e7b836_0.conda#b57f95d059ea5468dd99a5c08a20f63c +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.44-py313he149459_0.conda#36dc21f9851a86b88563752507fbac11 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_0.conda#fcde9124e91d6525cc8357273adc06f4 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda#c9aadf2edd39b56ad34dc5f775626d5b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.13.yml b/repo2docker/buildpacks/conda/environment.py-3.13.yml index efb91001a..5e0930f8b 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.13.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.13.yml @@ -1,5 +1,5 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2025-08-18 11:23:43 UTC +# Generated on 2025-10-16 07:18:48 UTC channels: - conda-forge dependencies: From 9b85b720b199419794bd5439e02da1b442ebccf5 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 16 Oct 2025 09:22:58 +0200 Subject: [PATCH 174/299] Add conda buildpacks for Python == 3.14 --- .../conda/environment.py-3.14-linux-64.lock | 179 ++++++++++++++++++ .../environment.py-3.14-linux-aarch64.lock | 178 +++++++++++++++++ .../buildpacks/conda/environment.py-3.14.yml | 15 ++ 3 files changed, 372 insertions(+) create mode 100644 repo2docker/buildpacks/conda/environment.py-3.14-linux-64.lock create mode 100644 repo2docker/buildpacks/conda/environment.py-3.14-linux-aarch64.lock create mode 100644 repo2docker/buildpacks/conda/environment.py-3.14.yml diff --git a/repo2docker/buildpacks/conda/environment.py-3.14-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.14-linux-64.lock new file mode 100644 index 000000000..2f5c4d135 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.14-linux-64.lock @@ -0,0 +1,179 @@ +# AUTO GENERATED FROM environment.py-3.14.yml, DO NOT MANUALLY MODIFY +# Frozen on 2025-10-16 07:19:22 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 1c090db128135ee50a4880ad7ceebffccc9d1f840ba314aa2893d9f7bcd5fe6f +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda#0f03292cc56bf91a077a134ea8747118 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h5989046_101_cp314.conda#b2ad21488149ec2c4d83640619de2430 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py314ha160325_4.conda#a5529cb388bf7c6c9ae3d9d1ae54be56 +https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_101.conda#d1caec8d6086bcd2c30dfdd0af222d2d +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py314h8c728da_0.conda#c9367a2d02bab08fa4eb887349f0ca4a +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py314ha160325_1.conda#99623248a2c58194abe517fd26cc4aa4 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca +https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py314hdafbbf9_2.conda#719919b86b506f0307c5c93cbe23917e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.19.5-hf7ee748_0.conda#2cbd9a01ac939d85f137ee44c64fb705 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda#3bba9ff64ab2030c4c28c0d225864196 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py314h68536ef_1.conda#b1397d3afad6dbd7c33a1993699a735b +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_1.conda#aa5552df9b306a67e7d2cd3333fb2ea5 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda#8035e5b54c08429354d5d64027041cad +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314ha6a4811_0.conda#f572c769fb8bfa15708594c6f7f354e0 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_101.conda#ff70037e37dbf735066dec79c1e93c76 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_1.conda#632897d781dc39527007493c6cfe9d21 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py314hb613cbf_0.conda#19ed3f93a65fe3f057594cb3195e956f +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py314h2e6c369_0.conda#ae0e353f3f4f4c556526d4687545d9d8 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.44-py314h5bd0f2a_0.conda#82327fd3a951d713637da7a4d98a2866 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda#3399d43f564c905250c1aea268ebb935 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.14-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.14-linux-aarch64.lock new file mode 100644 index 000000000..b71a8925b --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.14-linux-aarch64.lock @@ -0,0 +1,178 @@ +# AUTO GENERATED FROM environment.py-3.14.yml, DO NOT MANUALLY MODIFY +# Frozen on 2025-10-16 07:19:33 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: d0b876e5fc2ac8930813bd91d3f1882993042b8ded7b205a5210eb88213ee95a +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda#c82b1aeb48ef8d5432cbc592716464ba +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda#34cef4753287c36441f907d5fdd78d42 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda#afa05d91f8d57dd30985827a09c21464 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda#2921ac0b541bf37c69e66bd6d9a43bca +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda#e7df0aab10b9cbb73ab2a467ebfaf8c7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda#f75d19f3755461db2eb69401f5514f4c +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda#a5ce1f0a32f02c75c11580c5b2f9258a +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda#7d362346a479256857ab338588190da0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda#78cfed3f76d6f3f279736789d319af76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda#6a2f0ee17851251a85fbebafbe707d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda#3a68e44fdf2a2811672520fdd62996bd +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda#8e62bf5af966325ee416f19c6f14ffa3 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda#9303e8887afe539f78517951ce25cd13 +https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda#2e4a8f23bebdcb85ca8e5a0fbe75666a +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda#0ad1b73a3df7e3376c14efe6dabe6987 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda#9e5deec886ad32f3c6791b3b75c78681 +https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 +https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda#2562c9bfd1de3f9c590f0fe53858d85c +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda#bc230abb5d21b63ff4799b0e75204783 +https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c +https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-ha9132a3_101_cp314.conda#9c53b4419016565f7a004dfa04a709f9 +https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-pyhd8ed1ab_2.conda#0c07617cd436b9cd5570dc34f3af642b +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py314h02b5315_4.conda#f9701a01df90cefee62d0ac602107bfd +https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2#576d629e47797577ab0f1b351297ef4a +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda#2da13f2b299d8e1995bafbbe9689a2f7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_101.conda#d1caec8d6086bcd2c30dfdd0af222d2d +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.17-py314h3642cf7_0.conda#c515777bac2a8d4f6d9c55dc52aef24d +https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda#ff9efb7f7469aed3c4a8106ffa29593c +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.2.4-py314h02b5315_1.conda#6df10bfe6137db723c18f1d9ac6208b1 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda#0fc93f473c31a2f85c0bde213e7c63ca +https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py314h28a4750_2.conda#149accb2f37040efbb393a0ed7b1b32b +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.15-pyhd8ed1ab_0.conda#ad100d215fad890ab0ee10418f36876f +https://conda.anaconda.org/conda-forge/noarch/lark-1.3.0-pyhd8ed1ab_0.conda#c9ee16acbcea5cc91d9f3eb1d8f903bd +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.19.5-h6feb2b4_0.conda#5b886141d3ae96e3fcfddbe1a1edd81b +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.2.0-pyhd8ed1ab_1.conda#a3a069b6dbf63e1a635f3feeffdaeb4e +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda#a110716cdb11cf51482ff4000dc253d7 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda#a1e91db2d17fd258c64921cb38e6745a +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.1.0-py314h51f160d_0.conda#dcaddc080ba0140f801b22be85df88ee +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.27.1-py314h7a73458_1.conda#aa31149bfbd82a68c2a3271dc347d782 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda#938c8de6b9de091997145b3bf25cdbf9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda#18c019ccf43769d211f2cf78e9ad46c2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_1.conda#daa0018e557e1e2e7587e3ec4a048b8c +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20251008-pyhd8ed1ab_0.conda#6835489fc689d7ca90cb7bffb01eaac1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda#f6d7aa696c67756a650e91e15e88223c +https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda#e7cb0f5745e4c5035a460248334af7eb +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda#7e1e5ff31239f9cd5855714df8a3783d +https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda#b49f7b291e15494aafb0a7d74806f337 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.14-pyhd8ed1ab_0.conda#2f1f99b13b9d2a03570705030a0b3e7c +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda#5676806bba055c901a62f969cb3fbe02 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda#d9d0f99095a9bb7e3641bca8c6ad2ac7 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2#9b347a7ec10940d3f7941ff6c460b551 +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h7fea217_0.conda#f28e78fdcb6b2e9ef869372d78fdf6dd +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda#bd80ba060603cc228d9d81c257093119 +https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda#f5a4d548d1d3bdd517260409fc21e205 +https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda#e51f1e4089cad105b6cac64bd8166587 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda#edb16f14d920fb3faf17f5ce582942d6 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_101.conda#ff70037e37dbf735066dec79c1e93c76 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda#36de09a8d3e5d5e6f4ee63af49e59706 +https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda#7234f99325263a5af6d4cd195035e8f2 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda#efba281bbdae5f6b0a1d53c6d4a97c93 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-25.1.0-py314h51f160d_1.conda#19257b153ca4a3309d17788fbed6fc68 +https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda#46b53236fdd990271b03c3978d4218a9 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.2-pyha770c72_0.conda#749ebebabc2cae99b2e5b3edd04c6ca2 +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.2-py314h606d956_0.conda#aa72d21b96dddc1c70ee1bc0d8f69d7e +https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda#d3549fd50d450b6d9e7dddff25dd2110 +https://conda.anaconda.org/conda-forge/noarch/ipython-9.6.0-pyhfa0c392_0.conda#ad6641ef96dd7872acbb802fa3fcb8d1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda#2d983ff1b82a1ccb6f2e9d8784bdd6bd +https://conda.anaconda.org/conda-forge/noarch/mako-1.3.10-pyhd8ed1ab_0.conda#c5bb3eea5f1a00fcf3d7ea186209ce33 +https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py314h451b6cc_0.conda#628ba641f070f008f56a14bdccd1139b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.44-py314hafb4487_0.conda#d5e9ed49f0cfc37f9f628125eef6cdae +https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py314hc032435_0.conda#0a3cf4cedfa2f5ce88b1f4025a2df4d6 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.17.0-pyhd8ed1ab_0.conda#2ef5bb4a16331cfac0f1c92d4bca115e +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda#8ac12aff0860280ee0cff7fa2cf63f3b +https://conda.anaconda.org/conda-forge/noarch/certipy-0.2.2-pyhd8ed1ab_0.conda#7bacdbd6bb3b4fe905a3235d2799ca78 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.7-pyhd8ed1ab_0.conda#7c9449eac5975ef2d7753da262a72707 +https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda#0b0154421989637d424ccf0f104be51a +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.2-pyh3cfb1c2_0.conda#fc3a3515b4e71b22b635c4ae34e2f3ea +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda#c9aadf2edd39b56ad34dc5f775626d5b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda#13e31c573c884962318a738405ca3487 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.0.1-pyha191276_0.conda#637e206802904ecc10a558262631f132 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda#f56000b36f09ab7533877e695e4e8cb0 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-5.4.0-pyhc90fa1f_0.conda#593072c956378468fbadead64d403b17 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda#d24beda1d30748afcc87c429454ece1b +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda#d79a87dcfa726bcea8e61275feed6f83 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda#62b7c96c6cd77f8173cc5cada6a9acaa +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.3.2-pyh9692d8f_0.conda#f1ba04028264a73d571eecbbdb26d589 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.0-pyhd8ed1ab_0.conda#9ef4adccd3a32f3f01fc998f2ad4bdf5 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda#9dc4b2b0f41f0de41d27f3293e319357 +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda#e7f89ea5f7ea9401642758ff50a2d9c1 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.9-pyhd8ed1ab_0.conda#6fcc0ffe96c13a864ec6a1defc830526 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-5.4.0-hd843c07_0.conda#4fe3d3bb1cf147634aea983a483c773a +https://conda.anaconda.org/conda-forge/noarch/notebook-7.4.7-pyhd8ed1ab_0.conda#8265e246510553a4bcec1af4378d3c96 diff --git a/repo2docker/buildpacks/conda/environment.py-3.14.yml b/repo2docker/buildpacks/conda/environment.py-3.14.yml new file mode 100644 index 000000000..f449ac61a --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.14.yml @@ -0,0 +1,15 @@ +# AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY +# Generated on 2025-10-16 07:19:22 UTC +channels: +- conda-forge +dependencies: +- python=3.14.* +- nodejs=20 +- pip +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.3.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==1.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==2.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==5.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==4.* # https://github.com/jupyterlab/jupyterlab +- notebook==7.* # https://github.com/jupyter/notebook From df7ff49ee4fde312447f23e16a06f665a2e6f086 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 20 Feb 2025 14:57:01 -0800 Subject: [PATCH 175/299] Bump base image used to latest LTS Moves from 22.04 to 24.04 --- repo2docker/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 7a70a470d..fe85e899b 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -459,7 +459,7 @@ def _dry_run_changed(self, change): ) base_image = Unicode( - "docker.io/library/buildpack-deps:jammy", + "docker.io/library/buildpack-deps:24.04", config=True, help=""" Base image to use when building docker images. From 1fafb950ca1816151ddc353e1a02af22cdfb6aa4 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 20 Oct 2025 15:20:20 -0700 Subject: [PATCH 176/299] update docs with 24.04 --- docs/source/configuration/system.md | 6 +++++- docs/source/design.md | 3 ++- docs/source/howto/breaking_changes.md | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/source/configuration/system.md b/docs/source/configuration/system.md index 0756cdf6a..89bcc71d2 100644 --- a/docs/source/configuration/system.md +++ b/docs/source/configuration/system.md @@ -7,7 +7,11 @@ A list of packages in the [`.deb`]() format that should be installed. The `.deb` files are downloaded from the server configured in the Docker base image. ```{note} -If a `Dockerfile` is not used to change the Docker base image, the base image is [Ubuntu](https://ubuntu.com/) [22.04 LTS (Jammy Jellyfish)](https://releases.ubuntu.com/jammy/). All `.deb` files availables are listed in [Ubuntu Packages](https://packages.ubuntu.com/jammy/). +If a `Dockerfile` is not used to change the Docker base image, the base image is [Ubuntu](https://ubuntu.com/) [24.04 LTS (Noble Numbat)](https://releases.ubuntu.com/noble/). All `.deb` files availables are listed in [Ubuntu Packages](https://packages.ubuntu.com/noble/). +``` + +```{versionchanged} +Base ubuntu image upgraded from 22.04 to 24.04 in October, 2025 ``` We use `apt.txt`, for example, to install LaTeX in our diff --git a/docs/source/design.md b/docs/source/design.md index 8d81e2326..bb1d449b1 100644 --- a/docs/source/design.md +++ b/docs/source/design.md @@ -49,7 +49,8 @@ Many ingredients go into making an image from a repository: `repo2docker` controls the first two, the user controls the third one. The current policy for the version of the base image is that we will use the current LTS -version Jammy Jellyfish (22.04) for the foreseeable future. +version (24.04) until the start to be build challenges associated with the age of the base system, +at which point it will be increased to the 'current' LTS when that occurs - typically between 2-5 years from the age of release. The version of `repo2docker` used to build an image can influence which packages are installed by default and which features are supported during the build diff --git a/docs/source/howto/breaking_changes.md b/docs/source/howto/breaking_changes.md index c51e4d686..a424807aa 100644 --- a/docs/source/howto/breaking_changes.md +++ b/docs/source/howto/breaking_changes.md @@ -2,6 +2,12 @@ Repo2docker occasionally has to make breaking changes in how repositories are built. +## Upgrade of base image from Ubuntu 22.04 to 24.04 + +The base image used by repo2docker was [upgraded from Ubuntu 22.04 to Ubuntu 24.04](https://github.com/jupyterhub/repo2docker/pull/1287) October 2025 (2025.10). + +This is unlikely to affect you unless you are using {ref}`apt.txt `. + ## Upgrade of base image from Ubuntu 18.04 to 22.04 The base image used by repo2docker was [upgraded from Ubuntu 18.04 to Ubuntu 22.04](https://github.com/jupyterhub/repo2docker/pull/1287) in version 2023.10.0 due to Ubuntu 18.04 going out of support. From fe215ba13adde55765f0c7020451b85129744968 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 21 Oct 2025 21:59:30 -0700 Subject: [PATCH 177/299] fetch dataverse installations at runtime rather than a statically encoded file not updated very often --- repo2docker/contentproviders/dataverse.json | 680 -------------------- repo2docker/contentproviders/dataverse.py | 39 +- 2 files changed, 23 insertions(+), 696 deletions(-) delete mode 100644 repo2docker/contentproviders/dataverse.json diff --git a/repo2docker/contentproviders/dataverse.json b/repo2docker/contentproviders/dataverse.json deleted file mode 100644 index 3444069f6..000000000 --- a/repo2docker/contentproviders/dataverse.json +++ /dev/null @@ -1,680 +0,0 @@ -{ - "installations": [ - { - "description": "Open for researchers associated with British Columbia universities to deposit data.", - "full_name": "Abacus (British Columbia Research Libraries' Data Services) Dataverse", - "id": 1740, - "is_active": true, - "lat": 49.259982, - "lng": -123.250212, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/abacus-46x46.jpg", - "name": "Abacus", - "slug": "abacus", - "url": "https://dvn.library.ubc.ca/dvn/", - "version": "3.6" - }, - { - "description": "Free, open access repository of research data and software produced and developed by CIMMYT scientists.", - "full_name": "International Maize and Wheat Improvement Center", - "id": 1741, - "is_active": true, - "lat": 19.531535, - "lng": -98.846064, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/cimmyt-46x46.jpg", - "name": "CIMMYT Research Data", - "slug": "cimmyt-research-data", - "url": "http://data.cimmyt.org/", - "version": "3.0" - }, - { - "description": "Open for researchers and organizations associated with Dutch universities to deposit data.", - "full_name": "DataverseNL", - "id": 1742, - "is_active": true, - "lat": 52.54726, - "lng": 5.242346, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/logosdataverseNL-46x46.png", - "name": "DataverseNL", - "slug": "dataversenl", - "url": "https://dataverse.nl/", - "version": "4.6.1" - }, - { - "description": "", - "full_name": "DataSpace@HKUST", - "id": 1743, - "is_active": true, - "lat": 22.336281, - "lng": 114.266721, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/dataspace-46x46.jpg", - "name": "DataSpace@HKUST", - "slug": "dataspacehkust", - "url": "https://dataspace.ust.hk/", - "version": "4.2" - }, - { - "description": "Open for Fudan University affiliated researchers to deposit data.", - "full_name": "Fudan University Dataverse", - "id": 1744, - "is_active": true, - "lat": 31.298531, - "lng": 121.501446, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/fudan-46x46.png", - "name": "Fudan University", - "slug": "fudan-university", - "url": "https://dvn.fudan.edu.cn/home/", - "version": "4.x" - }, - { - "description": "Share, archive, and get credit for your data. Find and cite data across all research fields.", - "full_name": "Harvard University", - "id": 1745, - "is_active": true, - "lat": 42.380098, - "lng": -71.116629, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/harvard-46x46.png", - "name": "Harvard Dataverse", - "slug": "harvard-dataverse", - "url": "https://dataverse.harvard.edu", - "version": "4.12" - }, - { - "description": "Open for Heidelberg University affiliated researchers to deposit data.", - "full_name": "Heidelberg University", - "id": 1746, - "is_active": true, - "lat": 49.39875, - "lng": 8.672434, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/heidelberg-46x46.jpg", - "name": "HeiDATA", - "slug": "heidata", - "url": "https://heidata.uni-heidelberg.de/", - "version": "4.8.2" - }, - { - "description": "The network Cariniana, cariniana.ibict.br, is funded entirely by the Brazilian government and in particular by MCTI (Minist\u00e9rio da Ci\u00eancia, Tecnologia e Inova\u00e7\u00e3o). It is a project for long-term preservation of scientific publications in Brazil.", - "full_name": "IBICT (Brazil)", - "id": 1747, - "is_active": true, - "lat": -15.805842, - "lng": -47.881369, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ibict-46x46.jpg", - "name": "IBICT", - "slug": "ibict", - "url": "https://repositoriopesquisas.ibict.br/", - "version": "4.5.1" - }, - { - "description": "The IISH Dataverse contains micro-, meso-, and macro-level datasets on social and economic history.", - "full_name": "International Institute of Social History", - "id": 1748, - "is_active": true, - "lat": 52.369021, - "lng": 4.939226, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/internationalInstituteOfSocialHistory-46x46.jpg", - "name": "IISH Dataverse", - "slug": "iish-dataverse", - "url": "https://datasets.socialhistory.org/", - "version": "4.3" - }, - { - "description": "Johns Hopkins University Data Archive", - "full_name": "Johns Hopkins", - "id": 1749, - "is_active": true, - "lat": 39.329055, - "lng": -76.620335, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/johns-46x46.jpg", - "name": "Johns Hopkins University", - "slug": "johns-hopkins-university", - "url": "https://archive.data.jhu.edu/", - "version": "4.6" - }, - { - "description": "Libra Data is a place for UVA researchers to share data publicly, and is part of the Libra Scholarly Repository suite of services which includes works of UVA scholarship such as articles, books, theses, and data.", - "full_name": "Libra Data (University of Virginia)", - "id": 1750, - "is_active": true, - "lat": 38.034578, - "lng": -78.507394, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/libra-46x46.jpg", - "name": "Libra Data", - "slug": "libra-data", - "url": "https://dataverse.lib.virginia.edu/", - "version": "4.7.1" - }, - { - "description": "Open for all researchers worldwide from all disciplines to deposit data. The Odum Institute also offers multiple data curation service levels. For more information, go to http://www.irss.unc.edu/odum/contentPrimary.jsp?nodeid=5.", - "full_name": "Odum Institute for Research in Social Science", - "id": 1751, - "is_active": true, - "lat": 35.905022, - "lng": -79.050851, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/unc-46x46.png", - "name": "UNC Dataverse", - "slug": "unc-dataverse", - "url": "https://dataverse.unc.edu/", - "version": "4.7.1" - }, - { - "description": "Peking University Open Research Data Platform", - "full_name": "Peking University", - "id": 1752, - "is_active": true, - "lat": 39.993923, - "lng": 116.306539, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/peking-46x46.jpg", - "name": "Peking University", - "slug": "peking-university", - "url": "http://opendata.pku.edu.cn/", - "version": "4.0" - }, - { - "description": "Open for University of Alberta affiliated researchers to deposit data.", - "full_name": "University of Alberta Libraries Dataverse", - "id": 1755, - "is_active": true, - "lat": 53.494321, - "lng": -113.549027, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/uOfAlberta-46x46.jpg", - "name": "UAL Dataverse", - "slug": "ual-dataverse", - "url": "https://dataverse.library.ualberta.ca/dvn/", - "version": "4.5.1" - }, - { - "description": "A service brought to you by the ACG@UMaine. The way Supercomputing should be!", - "full_name": "Maine Dataverse Network", - "id": 1756, - "is_active": true, - "lat": 44.901349, - "lng": -68.671815, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/uOfMaine-46x46.jpg", - "name": "Maine Dataverse Network", - "slug": "maine-dataverse-network", - "url": "http://dataverse.acg.maine.edu/dvn/", - "version": "3.5.1" - }, - { - "description": "International Crops Research Institute for the Semi-Arid Tropics. Free open data repository of ICRISAT research data including Social science, Phenotypic, Genotypic, Spatial and Soil & Weather data which are linked with open publications.", - "full_name": "ICRISAT", - "id": 1757, - "is_active": true, - "lat": 17.385, - "lng": 78.4867, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/icrisat-46x46.png", - "name": "ICRISAT", - "slug": "icrisat", - "url": "http://dataverse.icrisat.org/", - "version": "4.8.1" - }, - { - "description": "Open for researchers and organizations associated with Ontario universities to deposit data.", - "full_name": "Scholars Portal Dataverse", - "id": 1758, - "is_active": true, - "lat": 43.6532, - "lng": -79.3832, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/scholarsportal-46x46.jpg", - "name": "Scholars Portal", - "slug": "scholars-portal", - "url": "https://dataverse.scholarsportal.info/", - "version": "4.10.1" - }, - { - "description": "Open for researchers and organizations associated with\r\nFrench universities to deposit data. Hosted by the Center for\r\nSocio-Political Data (Sciences Po and CNRS).", - "full_name": "Catalogues (CDSP)", - "id": 1759, - "is_active": true, - "lat": 48.854027, - "lng": 2.328351, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/catalogues-46x46.png", - "name": "Catalogues (CDSP)", - "slug": "catalogues-cdsp", - "url": "https://catalogues.cdsp.sciences-po.fr/", - "version": "4.6.1" - }, - { - "description": "A statewide archive of research data from Texas Digital Library (TDL) member institutions.", - "full_name": "Texas Data Repository Dataverse", - "id": 1761, - "is_active": true, - "lat": 30.307182, - "lng": -97.755996, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/tdl-46x46.png", - "name": "Texas Data Repository Dataverse", - "slug": "texas-data-repository-dataverse", - "url": "https://dataverse.tdl.org/", - "version": "4.7.1" - }, - { - "description": "Repositorio de Datos del Consorcio Madro\u00f1o.", - "full_name": "Dataverse e-cienciaDatos", - "id": 1762, - "is_active": true, - "lat": 40.416775, - "lng": -3.7492, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/consorciomadrono-46x46.gif", - "name": "Dataverse e-cienciaDatos", - "slug": "dataverse-e-cienciadatos", - "url": "https://edatos.consorciomadrono.es/", - "version": "4.8.4" - }, - { - "description": "Center for International Forestry Research (CIFOR) Dataverse", - "full_name": "Center for International Forestry Research (CIFOR) Dataverse", - "id": 1763, - "is_active": true, - "lat": -6.594293, - "lng": 106.806, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/CIFOR-46x46.png", - "name": "CIFOR", - "slug": "cifor", - "url": "https://data.cifor.org", - "version": "4.6" - }, - { - "description": "Organisme fran\u00e7ais de recherche agronomique et de coop\u00e9ration internationale pour le d\u00e9veloppement durable des r\u00e9gions tropicales et m\u00e9diterran\u00e9ennes, les activit\u00e9s du CIRAD rel\u00e8vent des sciences du vivant, des sciences sociales et des sciences de l\u2019ing\u00e9nieur appliqu\u00e9es \u00e0 l\u2019agriculture, \u00e0 l\u2019alimentation, \u00e0 l\u2019environnement et \u00e0 la gestion des territoires.\r\n\r\nFrench agricultural research and international cooperation organization working for the sustainable development of tropical and Mediterranean regions, CIRAD's activities concern the life sciences, social sciences and engineering sciences, applied to agriculture, the environment and territorial management.", - "full_name": "CIRAD Dataverse", - "id": 1764, - "is_active": true, - "lat": 43.650089, - "lng": 3.869122, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/cirad-46x46.jpg", - "name": "CIRAD", - "slug": "cirad", - "url": "https://dataverse.cirad.fr/", - "version": "4.5" - }, - { - "description": "", - "full_name": "University of Manitoba Dataverse", - "id": 1765, - "is_active": true, - "lat": 49.895077, - "lng": -97.138451, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/manitoba-46x46.jpg", - "name": "University of Manitoba Dataverse", - "slug": "university-of-manitoba-dataverse", - "url": "https://dataverse.lib.umanitoba.ca/", - "version": "4.8.4" - }, - { - "description": "Research data archive open for Norwegian research institutions. Operated by UiT The Arctic University of Norway.", - "full_name": "Dataverse Network Norway", - "id": 1767, - "is_active": true, - "lat": 69.649208, - "lng": 18.955324, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/dataverseNO-46x46.png", - "name": "DataverseNO", - "slug": "dataverseno", - "url": "https://dataverse.no/", - "version": "4.9.4" - }, - { - "description": "The institutional open access research data repository for Nanyang Technological University (NTU). NTU researchers are encouraged to use DR-NTU (Data) to deposit, publish and archive their final research data in order to make their research data discoverable, accessible and reusable.", - "full_name": "Nanyang Technological University", - "id": 1768, - "is_active": true, - "lat": 1.348668, - "lng": 103.683104, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/NTULogo_2.gif", - "name": "DR-NTU (Data)", - "slug": "dr-ntu-data", - "url": "https://researchdata.ntu.edu.sg", - "version": "4.7.1" - }, - { - "description": "The Australian Data Archive provides a national service for collecting, preserving, publishing and accessing digital research data.", - "full_name": "Australian Data Archive", - "id": 1771, - "is_active": true, - "lat": -35.343784, - "lng": 149.082977, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ada-46x46.jpg", - "name": "ADA Dataverse", - "slug": "ada-dataverse", - "url": "https://dataverse.ada.edu.au/", - "version": "4.6.1" - }, - { - "description": "", - "full_name": "University of New Brunswick Libraries", - "id": 1772, - "is_active": true, - "lat": 45.964993, - "lng": -66.646332, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/unbDataverse-46x46.png", - "name": "UNB Libraries Dataverse", - "slug": "unb-libraries-dataverse", - "url": "https://dataverse.lib.unb.ca/", - "version": "4.8.2" - }, - { - "description": "AUSSDA - The Austrian Social Science Data Archive makes social science data accessible, creating opportunities for research and data reuse, benefitting science and society. AUSSDA serves as the Austrian representative in the Consortium of European Social Science Data Archives (CESSDA ERIC).", - "full_name": "Austrian Social Science Data Archive", - "id": 1773, - "is_active": true, - "lat": 48.210033, - "lng": 16.363449, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/aussda-46x46.png", - "name": "AUSSDA Dataverse", - "slug": "aussda-dataverse", - "url": "https://data.aussda.at/", - "version": "4.6.2" - }, - { - "description": "Share, publish and get credit for your data. Find and cite research data from across all research fields.", - "full_name": "Dalhousie University", - "id": 1774, - "is_active": true, - "lat": 44.637484, - "lng": -63.59122, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/dalhousie-46x46.png", - "name": "Dalhousie University Dataverse", - "slug": "dalhousie-university-dataverse", - "url": "https://dataverse.library.dal.ca", - "version": "4.7" - }, - { - "description": "The University of the West Indies Research Datasets Repository.", - "full_name": "The University of the West Indies", - "id": 1775, - "is_active": true, - "lat": 18.006372, - "lng": -76.747148, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/uwi-46x46.png", - "name": "UWI", - "slug": "uwi", - "url": "http://dataverse.sta.uwi.edu/", - "version": "4.8.4" - }, - { - "description": "The Repositori Ilmiah Nasional (RIN) is a means to share, preserve, cite, explore, and analyze research data. RIN increases data availability and allows others to reproduce research more easily. Researchers, data authors, publishers, data distributors, and affiliate institutions all receive academic credit and web visibility. Researchers, agencies, and funders have full control over research data.", - "full_name": "Lembaga Ilmu Pengetahuan Indonesia (LIPI) Dataverse", - "id": 1776, - "is_active": true, - "lat": -6.228771, - "lng": 106.818082, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/LIPI-46x46.png", - "name": "LIPI Dataverse", - "slug": "lipi-dataverse", - "url": "https://data.lipi.go.id", - "version": "4.6.2" - }, - { - "description": "INRA is Europe\u2019s top agricultural research institute and the world\u2019s number two centre for the agricultural sciences. Data Inra is offered by INRA as part of its mission to open the results of its research.\r\n\r\nData Inra will share research data in relation with food, nutrition, agriculture and environment. It includes experimental, simulation and observation data, omic data, survey and text data.\r\n\r\nOnly data produced by or in collaboration with INRA will be hosted in the repository, but anyone can access the metadata and the open data.", - "full_name": "National Institute of Agricultural Research (INRA)", - "id": 1777, - "is_active": true, - "lat": 48.801407, - "lng": 2.130122, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/inra-46x46-2.jpg", - "name": "Data Inra", - "slug": "data-inra", - "url": "https://data.inra.fr/", - "version": "4.5.1" - }, - { - "description": "The Botswana Harvard AIDS Institute Partneship is a world-renowned educational institution of excellence in research and education pertinent to HIV/AIDS and other emerging public health challenges. Established in 1996, the Botswana Harvard AIDS Institute Partnership (BHP) is a collaborative research and training initiative between Botswana\u2019s Ministry of Health and Wellness and the Harvard T.H. Chan School of Public Health AIDS Initiative. The BHP Dataverse is a data repository for all the research done at BHP. Raw data, anonymised data and final analysis data for every research. This repository will achieve and also easy data sharing within the organisation and outside.", - "full_name": "Botswana Harvard AIDS Institute Partnership", - "id": 1778, - "is_active": true, - "lat": -24.653257, - "lng": 25.906792, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/botswana-46x46.png", - "name": "Botswana Harvard Data", - "slug": "botswana-harvard-data", - "url": "https://dataverse.bhp.org.bw/", - "version": "4.9.4" - }, - { - "description": "Transportation data repository maintained by the Virginia Tech Transportation Institute.", - "full_name": "Virginia Tech Transportation Institute", - "id": 1779, - "is_active": true, - "lat": 37.190102, - "lng": -80.396776, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/vtti-46x46_Q6PC6r7.png", - "name": "VTTI", - "slug": "vtti", - "url": "https://dataverse.vtti.vt.edu/", - "version": "4.9.4" - }, - { - "description": "", - "full_name": "Universidade Federal do ABC (UFABC)", - "id": 1780, - "is_active": true, - "lat": -23.643807, - "lng": -46.528304, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ufabc-46x46_pWiXhTC.png", - "name": "Reposit\u00f3rio de Dados de Pesquisa da UFABC", - "slug": "repositorio-de-dados-de-pesquisa-da-ufabc", - "url": "http://dataverse.ufabc.edu.br", - "version": "4.8.5" - }, - { - "description": "QDR curates, stores, preserves, publishes, and enables the download of digital data generated through qualitative and multi-method research in the social sciences. The repository develops and disseminates guidance for managing, sharing, citing, and reusing qualitative data, and contributes to the generation of common standards for doing so. QDR\u2019s overarching goals are to make sharing qualitative data customary in the social sciences, to broaden access to social science data, and to strengthen qualitative and multi-method research.", - "full_name": "Qualitative Data Repository", - "id": 1781, - "is_active": true, - "lat": 43.038013, - "lng": -76.135566, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/qdr-46x46_kCBOWwk.png", - "name": "QDR Main Collection", - "slug": "qdr-main-collection", - "url": "https://data.qdr.syr.edu", - "version": "4.10.1" - }, - { - "description": "Ifsttar Dataverse is an institutional repository for research data of the French Institute of Science and Technology for Transport, Development and Networks. It catalogues research data in the field of transports, spatial planning and civil engineering.", - "full_name": "French Institute of Science and Technology for Transport, Development and Networks", - "id": 1782, - "is_active": true, - "lat": 48.8528, - "lng": 2.6027, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ifsttar-46x46.jpg", - "name": "Ifsttar Dataverse", - "slug": "ifsttar-dataverse", - "url": "https://research-data.ifsttar.fr/dataverse/data", - "version": "4.10.1" - }, - { - "description": "Centro Internacional De La Papa (International Potato Center) is a member of the CGIAR Consortium, an international organization made up of 15 centers engaged in research for a food secure future.", - "full_name": "International Potato Center", - "id": 1783, - "is_active": true, - "lat": -12.077791, - "lng": -76.946888, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/cip-46x46.png", - "name": "International Potato Center", - "slug": "international-potato-center", - "url": "https://data.cipotato.org/dataverse.xhtml", - "version": "4.8.1" - }, - { - "description": "Datasets from the International AAAI Conference on Web and Social Media (ICWSM).", - "full_name": "International AAAI Conference on Web and Social Media", - "id": 1784, - "is_active": true, - "lat": 37.432057, - "lng": -122.175297, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/icwsm-46x46.jpg", - "name": "ICWSM", - "slug": "icwsm", - "url": "https://dataverse.mpi-sws.org/dataverse/icwsm", - "version": "4.8.5" - }, - { - "description": "Research data repository of Institute of Linguistics and Literature / Federal University of Uberlandia", - "full_name": "Institute of Linguistics and Literature (Federal University of Uberl\u00e2ndia)", - "id": 1785, - "is_active": true, - "lat": -18.908702, - "lng": -48.291944, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ileel-46x46_JPxxGBm.png", - "name": "Reposit\u00f3rio de Dados de Pesquisa do ILEEL", - "slug": "repositorio-de-dados-de-pesquisa-do-ileel", - "url": "http://dataverse.ileel.ufu.br", - "version": "4.11" - }, - { - "description": "NIE Data Repository is the institutional open access research data repository for National Institute of Education, Singapore. NIE researchers are encouraged to use NIE Data Repository to deposit, publish and archive their final research data in order to make their research data discoverable, accessible and reusable.", - "full_name": "National Institute of Education", - "id": 1786, - "is_active": true, - "lat": 1.349115, - "lng": 103.678829, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/nie-46x46.png", - "name": "NIE Data Repository", - "slug": "nie-data-repository", - "url": "https://researchdata.nie.edu.sg", - "version": "4.10.1" - }, - { - "description": "The Dataverse portal of the International Center for Agricultural Research in Dry Ares.", - "full_name": "International Center for Agriculture Research in the Dry Areas", - "id": 1787, - "is_active": true, - "lat": 33.88863, - "lng": 35.49548, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/meldata-46x46.png", - "name": "MELDATA", - "slug": "meldata", - "url": "http://data.mel.cgiar.org", - "version": "4.8.5" - }, - { - "description": "", - "full_name": "UCLA Data Science Center", - "id": 1788, - "is_active": true, - "lat": 34.0689, - "lng": -118.4452, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ucla-46x46.png", - "name": "UCLA Dataverse", - "slug": "ucla-dataverse", - "url": "https://dataverse.ucla.edu", - "version": "4.13" - }, - { - "description": "Explore research data from Universidad del Rosario affiliated researchers.", - "full_name": "Universidad del Rosario", - "id": 1789, - "is_active": true, - "lat": 4.600598, - "lng": -74.073352, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ur-46x46_ohTqcfg.png", - "name": "Repositorio de Datos de Investigaci\u00f3n Universidad del Rosario", - "slug": "repositorio-de-datos-de-investigacion-universidad-del-rosario", - "url": "http://research-data.urosario.edu.co/", - "version": "4.9.4" - }, - { - "description": "The University of Milan is home to important research teams operating in the university's extremely rich variety of scientific-disciplinary sectors. Besides taking part in the most relevant national and international research programs, the University is also very active in the field of technology transfer and developing applications for scientific research results. dataverse.unimi.it is the repository for research data offered to all researchers in disciplines from health sciences to laws, from economics to hard sciences, from humanities to mathematics.", - "full_name": "University of Milan", - "id": 1790, - "is_active": true, - "lat": 45.4601, - "lng": 9.1946, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/milan-46x46.png", - "name": "Universit\u00e0 degli Studi di Milano", - "slug": "universita-degli-studi-di-milano", - "url": "https://dataverse.unimi.it/", - "version": null - }, - { - "description": "G\u00f6ttingen Research Online is an institutional repository for the publication of research data at the G\u00f6ttingen Campus. It is managed by the G\u00f6ttingen eResearch Alliance, a joint group of the G\u00f6ttingen State and University Library and Gesellschaft f\u00fcr wissenschaftliche Datenverarbeitung mbH G\u00f6ttingen.", - "full_name": "G\u00f6ttingen eResearch Alliance", - "id": 1791, - "is_active": true, - "lat": 51.533713, - "lng": 9.932198, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/gottingen-46x46_ZryDdtE.jpg", - "name": "G\u00f6ttingen Research Online", - "slug": "gottingen-research-online", - "url": "https://data.gro.uni-goettingen.de/", - "version": "4.14" - }, - { - "description": "Hosted by IRD, a french public research institution, who defends an original model of equitable scientific partnership with the countries of the South and an interdisciplinary and citizen science, committed to the achievement of the Sustainable Development Goals.", - "full_name": "French Research Institute for Development", - "id": 1792, - "is_active": true, - "lat": 43.309873, - "lng": 5.368818, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/ird-46x46.png", - "name": "Data Suds", - "slug": "data-suds", - "url": "https://dataverse.ird.fr", - "version": "4.14" - }, - { - "description": "El Instituto de Opini\u00f3n P\u00fablica de la Pontificia Universidad Cat\u00f3lica del Per\u00fa (IOP) se cre\u00f3 a finales del 2005 con la finalidad de generar un mayor conocimiento acerca de los fen\u00f3menos que interesan, preocupan y afectan a la sociedad peruana. Teniendo como eje metodol\u00f3gico el estudio de la opini\u00f3n p\u00fablica, el IOP investiga las creencias, actitudes y sentimientos que configuran las din\u00e1micas sociales en el Per\u00fa.", - "full_name": "Pontificia Universidad Cat\u00f3lica del Per\u00fa", - "id": 1793, - "is_active": true, - "lat": -12.068924, - "lng": -77.079338, - "logo": "https://dvn-h-prod.hz.lib.harvard.edu/media/logos/pucp-46x46.png", - "name": "Pontificia Universidad Cat\u00f3lica del Per\u00fa", - "slug": "pontificia-universidad-catolica-del-peru", - "url": "http://datos.pucp.edu.pe", - "version": "4.13" - }, - { - "description": "The Jet Propulsion Laboratory is a federally funded research and development center and NASA field center.", - "full_name": "NASA/Caltech Jet Propulsion Laboratory", - "id": 1794, - "is_active": true, - "lat": 34.201694, - "lng": -118.171667, - "logo": "https://www.jpl.nasa.gov/assets/images/logo_nasa_trio_black@2x.png", - "name": "Jet Propulsion Laboratory", - "slug": "jpl", - "url": "https://dataverse.jpl.nasa.gov", - "version": "5.9" - }, - { - "description": "The Research Data Repository for the Max Planck Society.", - "full_name": "Edmond - Research Data Repository for the Max Planck Society (old domain)", - "id": 1795, - "is_active": true, - "lat": 48.1366, - "lng": 11.5771, - "logo": "https://edmond.mpdl.mpg.de/logos/navbar/logo_for_bright.png", - "name": "Edmond (old domain)", - "slug": "edmond_mpdl_mpg_de", - "url": "https://edmond.mpdl.mpg.de", - "version": "5.14" - }, - { - "description": "The Research Data Repository for the Max Planck Society.", - "full_name": "Edmond - Research Data Repository for the Max Planck Society", - "id": 1796, - "is_active": true, - "lat": 48.1366, - "lng": 11.5771, - "logo": "https://edmond.mpg.de/logos/navbar/logo_for_bright.png", - "name": "Edmond", - "slug": "edmond_mpg_de", - "url": "https://edmond.mpg.de", - "version": "5.14" - }, - { - "description": "The institutional research data repository of the National Yang Ming Chiao Tung University", - "full_name": "National Yang Ming Chiao Tung University", - "id": 1797, - "is_active": true, - "lat": 24.7867714, - "lng": 120.9984256, - "logo": "https://dataverse.lib.nycu.edu.tw/logos/navbar/logo.png", - "name": "NYCU Dataverse", - "slug": "nycu-dataverse", - "url": "https://dataverse.lib.nycu.edu.tw", - "version": "5.10.1" - } - ] -} diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 248a3f3a2..64852f088 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -1,10 +1,10 @@ -import hashlib -import json import os import shutil from typing import List, Tuple from urllib.parse import parse_qs, urlparse +import requests + from ..utils import copytree, deep_get, is_doi from .doi import DoiProvider @@ -13,17 +13,27 @@ class Dataverse(DoiProvider): """ Provide contents of a Dataverse dataset. - This class loads a a list of existing Dataverse installations from the internal - file dataverse.json. This file is manually updated with the following command: - - python setup.py generate_dataverse_file + Dataverse installations are downloaded from + https://iqss.github.io/dataverse-installations/data/data.json + or $R2D_DATAVERSE_INSTALLATIONS_URL if specified. """ - def __init__(self): - data_file = os.path.join(os.path.dirname(__file__), "dataverse.json") - with open(data_file) as fp: - self.hosts = json.load(fp)["installations"] - super().__init__() + dataverse_installations_url = ( + os.environ.get("R2D_DATAVERSE_INSTALLATIONS_URL") + or "https://iqss.github.io/dataverse-installations/data/data.json" + ) + + hosts = None + + def load_hosts(self): + if self.hosts is None: + self.log.info( + "Retrieving dataverse installations from %s", + self.dataverse_installations_url, + ) + r = requests.get(self.dataverse_installations_url) + r.raise_for_status() + self.hosts = r.json()["installations"] def detect(self, spec, ref=None, extra_args=None): """ @@ -47,12 +57,9 @@ def detect(self, spec, ref=None, extra_args=None): parsed_url = urlparse(url) # Check if the url matches any known Dataverse installation, bail if not. + self.load_hosts() host = next( - ( - host - for host in self.hosts - if urlparse(host["url"]).netloc == parsed_url.netloc - ), + (host for host in self.hosts if host["hostname"] == parsed_url.netloc), None, ) if host is None: From a6e02db5472c360381b43d7a8d6a0ed4bc2ccafd Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 21 Oct 2025 21:55:05 -0700 Subject: [PATCH 178/299] finish updating to pyproject.toml removes: - MANIFEST.in (handled by setuptools-scm) - setup.py (declarative in pyproject.toml) - versioneer (replaced with setuptools-scm) - setup.cfg (was for versioneer) --- .gitignore | 2 + MANIFEST.in | 7 - pyproject.toml | 20 +- repo2docker/__init__.py | 6 +- repo2docker/_version.py | 716 ------------ setup.cfg | 16 - setup.py | 100 -- test_setuptools.py | 18 - versioneer.py | 2333 --------------------------------------- 9 files changed, 11 insertions(+), 3207 deletions(-) delete mode 100644 MANIFEST.in delete mode 100644 repo2docker/_version.py delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 test_setuptools.py delete mode 100644 versioneer.py diff --git a/.gitignore b/.gitignore index 1f6672428..913074575 100644 --- a/.gitignore +++ b/.gitignore @@ -191,3 +191,5 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +repo2docker/_version.py diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 997a413f5..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -include *.md -include LICENSE -include setup.cfg -recursive-include repo2docker/buildpacks * -include versioneer.py -include repo2docker/_version.py -include repo2docker/contentproviders/dataverse.json diff --git a/pyproject.toml b/pyproject.toml index 697856dd4..6d3b7db2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,9 +5,9 @@ build-backend = "setuptools.build_meta" [project] name = "jupyter-repo2docker" dynamic = ["version"] -description = "Repo2docker: Turn code repositories into Jupyter enabled Docker Images" +description = "repo2docker: Turn code repositories into Jupyter enabled Docker Images" readme = "README.md" -license = {text = "BSD"} +license = "BSD-3-Clause" authors = [ {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"} ] @@ -21,13 +21,8 @@ classifiers = [ "Intended Audience :: Developers", "Intended Audience :: System Administrators", "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering", "Topic :: Software Development", "Topic :: System :: Systems Administration", @@ -49,10 +44,10 @@ dependencies = [ ] [project.urls] -Homepage = "https://repo2docker.readthedocs.io/en/latest/" +Homepage = "https://repo2docker.readthedocs.io" Documentation = "https://repo2docker.readthedocs.io" Funding = "https://jupyter.org/about" -Source = "https://github.com/jupyterhub/repo2docker/" +Source = "https://github.com/jupyterhub/repo2docker" Tracker = "https://github.com/jupyterhub/repo2docker/issues" [project.scripts] @@ -69,12 +64,5 @@ include-package-data = true where = ["."] -[tool.wheel] -universal = 1 - - [tool.setuptools_scm] -# 这个配置会让 setuptools-scm 自动创建一个 my_awesome_project/_version.py 文件, -# 并在里面写入版本号。这样你的项目代码在运行时可以通过 my_awesome_project._version -# 来获取自身的版本。 write_to = "repo2docker/_version.py" diff --git a/repo2docker/__init__.py b/repo2docker/__init__.py index 0ee4db194..002d83e0d 100644 --- a/repo2docker/__init__.py +++ b/repo2docker/__init__.py @@ -1,4 +1,8 @@ -from ._version import __version__ +try: + from ._version import __version__ +except ImportError: + __version__ = "0.0.0+unknown" + from .app import Repo2Docker # You can add this if you want an __all__ variable to control imports diff --git a/repo2docker/_version.py b/repo2docker/_version.py deleted file mode 100644 index 065fdc81f..000000000 --- a/repo2docker/_version.py +++ /dev/null @@ -1,716 +0,0 @@ -# This file helps to compute a version number in source trees obtained from -# git-archive tarball (such as those provided by githubs download-from-tag -# feature). Distribution tarballs (built by setup.py sdist) and build -# directories (produced by setup.py build) will contain a much shorter file -# that just contains the computed version number. - -# This file is released into the public domain. -# Generated by versioneer-0.29 -# https://github.com/python-versioneer/python-versioneer - -"""Git implementation of _version.py.""" - -import errno -import functools -import os -import re -import subprocess -import sys -from typing import Any, Callable, Dict, List, Optional, Tuple - - -def get_keywords() -> Dict[str, str]: - """Get the keywords needed to look up the version information.""" - # these strings will be replaced by git during git-archive. - # setup.py/versioneer.py will grep for the variable names, so they must - # each be defined on a line of their own. _version.py will just call - # get_keywords(). - git_refnames = "$Format:%d$" - git_full = "$Format:%H$" - git_date = "$Format:%ci$" - keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} - return keywords - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - VCS: str - style: str - tag_prefix: str - parentdir_prefix: str - versionfile_source: str - verbose: bool - - -def get_config() -> VersioneerConfig: - """Create, populate and return the VersioneerConfig() object.""" - # these strings are filled in when 'setup.py versioneer' creates - # _version.py - cfg = VersioneerConfig() - cfg.VCS = "git" - cfg.style = "pep440" - cfg.tag_prefix = "" - cfg.parentdir_prefix = "repo2docker-" - cfg.versionfile_source = "repo2docker/_version.py" - cfg.verbose = False - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} - - -def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator - """Create decorator to mark a method as the handler of a VCS.""" - - def decorate(f: Callable) -> Callable: - """Store f in HANDLERS[vcs][method].""" - if vcs not in HANDLERS: - HANDLERS[vcs] = {} - HANDLERS[vcs][method] = f - return f - - return decorate - - -def run_command( - commands: List[str], - args: List[str], - cwd: Optional[str] = None, - verbose: bool = False, - hide_stderr: bool = False, - env: Optional[Dict[str, str]] = None, -) -> Tuple[Optional[str], Optional[int]]: - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - - popen_kwargs: Dict[str, Any] = {} - if sys.platform == "win32": - # This hides the console window if pythonw.exe is used - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - popen_kwargs["startupinfo"] = startupinfo - - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen( - [command] + args, - cwd=cwd, - env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr else None), - **popen_kwargs, - ) - break - except OSError as e: - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %s" % dispcmd) - print(e) - return None, None - else: - if verbose: - print(f"unable to find command, tried {commands}") - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %s (error)" % dispcmd) - print("stdout was %s" % stdout) - return None, process.returncode - return stdout, process.returncode - - -def versions_from_parentdir( - parentdir_prefix: str, - root: str, - verbose: bool, -) -> Dict[str, Any]: - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return { - "version": dirname[len(parentdir_prefix) :], - "full-revisionid": None, - "dirty": False, - "error": None, - "date": None, - } - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print( - "Tried directories %s but none started with prefix %s" - % (str(rootdirs), parentdir_prefix) - ) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords: Dict[str, str] = {} - try: - with open(versionfile_abs) as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords( - keywords: Dict[str, str], - tag_prefix: str, - verbose: bool, -) -> Dict[str, Any]: - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG) :] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r"\d", r)} - if verbose: - print("discarding '%s', no digits" % ",".join(refs - tags)) - if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix) :] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r"\d", r): - continue - if verbose: - print("picking %s" % r) - return { - "version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": None, - "date": date, - } - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return { - "version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": "no suitable tags", - "date": None, - } - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs( - tag_prefix: str, root: str, verbose: bool, runner: Callable = run_command -) -> Dict[str, Any]: - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - - # GIT_DIR can interfere with correct operation of Versioneer. - # It may be intended to be passed to the Versioneer-versioned project, - # but that should not change where we get our version from. - env = os.environ.copy() - env.pop("GIT_DIR", None) - runner = functools.partial(runner, env=env) - - _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) - if rc != 0: - if verbose: - print("Directory %s not under git control" % root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner( - GITS, - [ - "describe", - "--tags", - "--dirty", - "--always", - "--long", - "--match", - f"{tag_prefix}[[:digit:]]*", - ], - cwd=root, - ) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces: Dict[str, Any] = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[: git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%s' doesn't start with prefix '%s'" - print(fmt % (full_tag, tag_prefix)) - pieces["error"] = "tag '{}' doesn't start with prefix '{}'".format( - full_tag, - tag_prefix, - ) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix) :] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) - pieces["distance"] = len(out.split()) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def plus_or_dot(pieces: Dict[str, Any]) -> str: - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces: Dict[str, Any]) -> str: - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces: Dict[str, Any]) -> str: - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces: Dict[str, Any]) -> str: - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post(pieces["closest-tag"]) - rendered = tag_version - if post_version is not None: - rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) - else: - rendered += ".post0.dev%d" % (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%d" % pieces["distance"] - return rendered - - -def render_pep440_post(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces: Dict[str, Any]) -> str: - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces: Dict[str, Any]) -> str: - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return { - "version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None, - } - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%s'" % style) - - return { - "version": rendered, - "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], - "error": None, - "date": pieces.get("date"), - } - - -def get_versions() -> Dict[str, Any]: - """Get version information or return default if unable to do so.""" - # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have - # __file__, we can work backwards from there to the root. Some - # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which - # case we can only use expanded keywords. - - cfg = get_config() - verbose = cfg.verbose - - try: - return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) - except NotThisMethod: - pass - - try: - root = os.path.realpath(__file__) - # versionfile_source is the relative path from the top of the source - # tree (where the .git directory might live) to this file. Invert - # this to find the root from __file__. - for _ in cfg.versionfile_source.split("/"): - root = os.path.dirname(root) - except NameError: - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to find root of source tree", - "date": None, - } - - try: - pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) - return render(pieces, cfg.style) - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - except NotThisMethod: - pass - - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", - "date": None, - } diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 42e18cad8..000000000 --- a/setup.cfg +++ /dev/null @@ -1,16 +0,0 @@ -# used by our travis auto-deployment system -# needs changing if repo2docker ever stops being -# a pure python module -[wheel] -universal = 1 - -[metadata] -license_file = LICENSE - -[versioneer] -VCS = git -style = pep440 -versionfile_source = repo2docker/_version.py -versionfile_build = repo2docker/_version.py -tag_prefix = -parentdir_prefix = repo2docker- diff --git a/setup.py b/setup.py deleted file mode 100644 index c8fcbbd73..000000000 --- a/setup.py +++ /dev/null @@ -1,100 +0,0 @@ -import sys -from distutils.cmd import Command - -from setuptools import find_packages, setup - -import versioneer - -if sys.version_info[0] < 3: - readme = None -else: - with open("README.md", encoding="utf8") as f: - readme = f.read() - - -class GenerateDataverseInstallationsFileCommand(Command): - description = "Generate Dataverse installations data map" - user_options = [] - - def initialize_options(self): - self.url = ( - "https://services.dataverse.harvard.edu/miniverse/map/installations-json" - ) - - def finalize_options(self): - pass - - def run(self): - import json - from urllib.request import urlopen - - resp = urlopen(self.url, timeout=5) - resp_body = resp.read() - data = json.loads(resp_body.decode("utf-8")) - if "installations" not in data: - raise ValueError("Malformed installation map.") - - def get_identifier(json): - return int(json["id"]) - - data["installations"].sort(key=get_identifier) - with open("repo2docker/contentproviders/dataverse.json", "w") as fp: - json.dump(data, fp, indent=4, sort_keys=True) - - -__cmdclass = versioneer.get_cmdclass() -__cmdclass["generate_dataverse_file"] = GenerateDataverseInstallationsFileCommand - -setup( - name="jupyter-repo2docker", - version=versioneer.get_version(), - install_requires=[ - "chardet", - "docker!=5.0.0", - "entrypoints", - "escapism", - "iso8601", - "jinja2", - "python-json-logger", - "requests", - "ruamel.yaml>=0.15", - "semver", - "toml", - "traitlets", - ], - python_requires=">=3.9", - author="Project Jupyter Contributors", - author_email="jupyter@googlegroups.com", - url="https://repo2docker.readthedocs.io/en/latest/", - project_urls={ - "Documentation": "https://repo2docker.readthedocs.io", - "Funding": "https://jupyter.org/about", - "Source": "https://github.com/jupyterhub/repo2docker/", - "Tracker": "https://github.com/jupyterhub/repo2docker/issues", - }, - # this should be a whitespace separated string of keywords, not a list - keywords="reproducible science environments docker", - description="Repo2docker: Turn code repositories into Jupyter enabled Docker Images", - long_description=readme, - long_description_content_type="text/markdown", - license="BSD", - classifiers=[ - "Environment :: Console", - "Intended Audience :: Developers", - "Intended Audience :: System Administrators", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - ], - packages=find_packages(), - include_package_data=True, - cmdclass=__cmdclass, - entry_points={ - "console_scripts": [ - "jupyter-repo2docker = repo2docker.__main__:main", - "repo2docker = repo2docker.__main__:main", - ], - "repo2docker.engines": ["docker = repo2docker.docker:DockerEngine"], - }, -) diff --git a/test_setuptools.py b/test_setuptools.py deleted file mode 100644 index a53c83018..000000000 --- a/test_setuptools.py +++ /dev/null @@ -1,18 +0,0 @@ -import tomllib - -from setuptools.config.pyprojecttoml import read_configuration - -if __name__ == "__main__": - try: - with open("pyproject.toml", "rb") as f: - tomllib.load(f) - print("✅ TOML语法正确") - except Exception as e: - print(f"❌ TOML语法错误: {e}") - - try: - config = read_configuration("pyproject.toml") - print("✅ 配置文件语法正确") - print("项目名称:", config.get("name")) - except Exception as e: - print("❌ 配置错误:", e) diff --git a/versioneer.py b/versioneer.py deleted file mode 100644 index 5d28b0d69..000000000 --- a/versioneer.py +++ /dev/null @@ -1,2333 +0,0 @@ -# Version: 0.29 - -"""The Versioneer - like a rocketeer, but for versions. - -The Versioneer -============== - -* like a rocketeer, but for versions! -* https://github.com/python-versioneer/python-versioneer -* Brian Warner -* License: Public Domain (Unlicense) -* Compatible with: Python 3.7, 3.8, 3.9, 3.10, 3.11 and pypy3 -* [![Latest Version][pypi-image]][pypi-url] -* [![Build Status][travis-image]][travis-url] - -This is a tool for managing a recorded version number in setuptools-based -python projects. The goal is to remove the tedious and error-prone "update -the embedded version string" step from your release process. Making a new -release should be as easy as recording a new tag in your version-control -system, and maybe making new tarballs. - - -## Quick Install - -Versioneer provides two installation modes. The "classic" vendored mode installs -a copy of versioneer into your repository. The experimental build-time dependency mode -is intended to allow you to skip this step and simplify the process of upgrading. - -### Vendored mode - -* `pip install versioneer` to somewhere in your $PATH - * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is - available, so you can also use `conda install -c conda-forge versioneer` -* add a `[tool.versioneer]` section to your `pyproject.toml` or a - `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) - * Note that you will need to add `tomli; python_version < "3.11"` to your - build-time dependencies if you use `pyproject.toml` -* run `versioneer install --vendor` in your source tree, commit the results -* verify version information with `python setup.py version` - -### Build-time dependency mode - -* `pip install versioneer` to somewhere in your $PATH - * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is - available, so you can also use `conda install -c conda-forge versioneer` -* add a `[tool.versioneer]` section to your `pyproject.toml` or a - `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) -* add `versioneer` (with `[toml]` extra, if configuring in `pyproject.toml`) - to the `requires` key of the `build-system` table in `pyproject.toml`: - ```toml - [build-system] - requires = ["setuptools", "versioneer[toml]"] - build-backend = "setuptools.build_meta" - ``` -* run `versioneer install --no-vendor` in your source tree, commit the results -* verify version information with `python setup.py version` - -## Version Identifiers - -Source trees come from a variety of places: - -* a version-control system checkout (mostly used by developers) -* a nightly tarball, produced by build automation -* a snapshot tarball, produced by a web-based VCS browser, like github's - "tarball from tag" feature -* a release tarball, produced by "setup.py sdist", distributed through PyPI - -Within each source tree, the version identifier (either a string or a number, -this tool is format-agnostic) can come from a variety of places: - -* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows - about recent "tags" and an absolute revision-id -* the name of the directory into which the tarball was unpacked -* an expanded VCS keyword ($Id$, etc) -* a `_version.py` created by some earlier build step - -For released software, the version identifier is closely related to a VCS -tag. Some projects use tag names that include more than just the version -string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool -needs to strip the tag prefix to extract the version identifier. For -unreleased software (between tags), the version identifier should provide -enough information to help developers recreate the same tree, while also -giving them an idea of roughly how old the tree is (after version 1.2, before -version 1.3). Many VCS systems can report a description that captures this, -for example `git describe --tags --dirty --always` reports things like -"0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the -0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has -uncommitted changes). - -The version identifier is used for multiple purposes: - -* to allow the module to self-identify its version: `myproject.__version__` -* to choose a name and prefix for a 'setup.py sdist' tarball - -## Theory of Operation - -Versioneer works by adding a special `_version.py` file into your source -tree, where your `__init__.py` can import it. This `_version.py` knows how to -dynamically ask the VCS tool for version information at import time. - -`_version.py` also contains `$Revision$` markers, and the installation -process marks `_version.py` to have this marker rewritten with a tag name -during the `git archive` command. As a result, generated tarballs will -contain enough information to get the proper version. - -To allow `setup.py` to compute a version too, a `versioneer.py` is added to -the top level of your source tree, next to `setup.py` and the `setup.cfg` -that configures it. This overrides several distutils/setuptools commands to -compute the version when invoked, and changes `setup.py build` and `setup.py -sdist` to replace `_version.py` with a small static file that contains just -the generated version data. - -## Installation - -See [INSTALL.md](./INSTALL.md) for detailed installation instructions. - -## Version-String Flavors - -Code which uses Versioneer can learn about its version string at runtime by -importing `_version` from your main `__init__.py` file and running the -`get_versions()` function. From the "outside" (e.g. in `setup.py`), you can -import the top-level `versioneer.py` and run `get_versions()`. - -Both functions return a dictionary with different flavors of version -information: - -* `['version']`: A condensed version string, rendered using the selected - style. This is the most commonly used value for the project's version - string. The default "pep440" style yields strings like `0.11`, - `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section - below for alternative styles. - -* `['full-revisionid']`: detailed revision identifier. For Git, this is the - full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". - -* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the - commit date in ISO 8601 format. This will be None if the date is not - available. - -* `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that - this is only accurate if run in a VCS checkout, otherwise it is likely to - be False or None - -* `['error']`: if the version string could not be computed, this will be set - to a string describing the problem, otherwise it will be None. It may be - useful to throw an exception in setup.py if this is set, to avoid e.g. - creating tarballs with a version string of "unknown". - -Some variants are more useful than others. Including `full-revisionid` in a -bug report should allow developers to reconstruct the exact code being tested -(or indicate the presence of local changes that should be shared with the -developers). `version` is suitable for display in an "about" box or a CLI -`--version` output: it can be easily compared against release notes and lists -of bugs fixed in various releases. - -The installer adds the following text to your `__init__.py` to place a basic -version in `YOURPROJECT.__version__`: - - from ._version import get_versions - __version__ = get_versions()['version'] - del get_versions - -## Styles - -The setup.cfg `style=` configuration controls how the VCS information is -rendered into a version string. - -The default style, "pep440", produces a PEP440-compliant string, equal to the -un-prefixed tag name for actual releases, and containing an additional "local -version" section with more detail for in-between builds. For Git, this is -TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags ---dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the -tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and -that this commit is two revisions ("+2") beyond the "0.11" tag. For released -software (exactly equal to a known tag), the identifier will only contain the -stripped tag, e.g. "0.11". - -Other styles are available. See [details.md](details.md) in the Versioneer -source tree for descriptions. - -## Debugging - -Versioneer tries to avoid fatal errors: if something goes wrong, it will tend -to return a version of "0+unknown". To investigate the problem, run `setup.py -version`, which will run the version-lookup code in a verbose mode, and will -display the full contents of `get_versions()` (including the `error` string, -which may help identify what went wrong). - -## Known Limitations - -Some situations are known to cause problems for Versioneer. This details the -most significant ones. More can be found on Github -[issues page](https://github.com/python-versioneer/python-versioneer/issues). - -### Subprojects - -Versioneer has limited support for source trees in which `setup.py` is not in -the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are -two common reasons why `setup.py` might not be in the root: - -* Source trees which contain multiple subprojects, such as - [Buildbot](https://github.com/buildbot/buildbot), which contains both - "master" and "slave" subprojects, each with their own `setup.py`, - `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI - distributions (and upload multiple independently-installable tarballs). -* Source trees whose main purpose is to contain a C library, but which also - provide bindings to Python (and perhaps other languages) in subdirectories. - -Versioneer will look for `.git` in parent directories, and most operations -should get the right version string. However `pip` and `setuptools` have bugs -and implementation details which frequently cause `pip install .` from a -subproject directory to fail to find a correct version string (so it usually -defaults to `0+unknown`). - -`pip install --editable .` should work correctly. `setup.py install` might -work too. - -Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in -some later version. - -[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking -this issue. The discussion in -[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the -issue from the Versioneer side in more detail. -[pip PR#3176](https://github.com/pypa/pip/pull/3176) and -[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve -pip to let Versioneer work correctly. - -Versioneer-0.16 and earlier only looked for a `.git` directory next to the -`setup.cfg`, so subprojects were completely unsupported with those releases. - -### Editable installs with setuptools <= 18.5 - -`setup.py develop` and `pip install --editable .` allow you to install a -project into a virtualenv once, then continue editing the source code (and -test) without re-installing after every change. - -"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a -convenient way to specify executable scripts that should be installed along -with the python package. - -These both work as expected when using modern setuptools. When using -setuptools-18.5 or earlier, however, certain operations will cause -`pkg_resources.DistributionNotFound` errors when running the entrypoint -script, which must be resolved by re-installing the package. This happens -when the install happens with one version, then the egg_info data is -regenerated while a different version is checked out. Many setup.py commands -cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into -a different virtualenv), so this can be surprising. - -[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes -this one, but upgrading to a newer version of setuptools should probably -resolve it. - - -## Updating Versioneer - -To upgrade your project to a new release of Versioneer, do the following: - -* install the new Versioneer (`pip install -U versioneer` or equivalent) -* edit `setup.cfg` and `pyproject.toml`, if necessary, - to include any new configuration settings indicated by the release notes. - See [UPGRADING](./UPGRADING.md) for details. -* re-run `versioneer install --[no-]vendor` in your source tree, to replace - `SRC/_version.py` -* commit any changed files - -## Future Directions - -This tool is designed to make it easily extended to other version-control -systems: all VCS-specific components are in separate directories like -src/git/ . The top-level `versioneer.py` script is assembled from these -components by running make-versioneer.py . In the future, make-versioneer.py -will take a VCS name as an argument, and will construct a version of -`versioneer.py` that is specific to the given VCS. It might also take the -configuration arguments that are currently provided manually during -installation by editing setup.py . Alternatively, it might go the other -direction and include code from all supported VCS systems, reducing the -number of intermediate scripts. - -## Similar projects - -* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time - dependency -* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of - versioneer -* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools - plugin - -## License - -To make Versioneer easier to embed, all its code is dedicated to the public -domain. The `_version.py` that it creates is also in the public domain. -Specifically, both are released under the "Unlicense", as described in -https://unlicense.org/. - -[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg -[pypi-url]: https://pypi.python.org/pypi/versioneer/ -[travis-image]: -https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg -[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer - -""" -# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring -# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements -# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error -# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with -# pylint:disable=attribute-defined-outside-init,too-many-arguments - -import configparser -import errno -import functools -import json -import os -import re -import subprocess -import sys -from pathlib import Path -from typing import Any, Callable, Dict, List, NoReturn, Optional, Tuple, Union, cast - -have_tomllib = True -if sys.version_info >= (3, 11): - import tomllib -else: - try: - import tomli as tomllib - except ImportError: - have_tomllib = False - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - VCS: str - style: str - tag_prefix: str - versionfile_source: str - versionfile_build: Optional[str] - parentdir_prefix: Optional[str] - verbose: Optional[bool] - - -def get_root() -> str: - """Get the project root directory. - - We require that all commands are run from the project root, i.e. the - directory that contains setup.py, setup.cfg, and versioneer.py . - """ - root = os.path.realpath(os.path.abspath(os.getcwd())) - setup_py = os.path.join(root, "setup.py") - pyproject_toml = os.path.join(root, "pyproject.toml") - versioneer_py = os.path.join(root, "versioneer.py") - if not ( - os.path.exists(setup_py) - or os.path.exists(pyproject_toml) - or os.path.exists(versioneer_py) - ): - # allow 'python path/to/setup.py COMMAND' - root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) - setup_py = os.path.join(root, "setup.py") - pyproject_toml = os.path.join(root, "pyproject.toml") - versioneer_py = os.path.join(root, "versioneer.py") - if not ( - os.path.exists(setup_py) - or os.path.exists(pyproject_toml) - or os.path.exists(versioneer_py) - ): - err = ( - "Versioneer was unable to run the project root directory. " - "Versioneer requires setup.py to be executed from " - "its immediate directory (like 'python setup.py COMMAND'), " - "or in a way that lets it use sys.argv[0] to find the root " - "(like 'python path/to/setup.py COMMAND')." - ) - raise VersioneerBadRootError(err) - try: - # Certain runtime workflows (setup.py install/develop in a setuptools - # tree) execute all dependencies in a single python process, so - # "versioneer" may be imported multiple times, and python's shared - # module-import table will cache the first one. So we can't use - # os.path.dirname(__file__), as that will find whichever - # versioneer.py was first imported, even in later projects. - my_path = os.path.realpath(os.path.abspath(__file__)) - me_dir = os.path.normcase(os.path.splitext(my_path)[0]) - vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) - if me_dir != vsr_dir and "VERSIONEER_PEP518" not in globals(): - print( - "Warning: build in %s is using versioneer.py from %s" - % (os.path.dirname(my_path), versioneer_py) - ) - except NameError: - pass - return root - - -def get_config_from_root(root: str) -> VersioneerConfig: - """Read the project setup.cfg file to determine Versioneer config.""" - # This might raise OSError (if setup.cfg is missing), or - # configparser.NoSectionError (if it lacks a [versioneer] section), or - # configparser.NoOptionError (if it lacks "VCS="). See the docstring at - # the top of versioneer.py for instructions on writing your setup.cfg . - root_pth = Path(root) - pyproject_toml = root_pth / "pyproject.toml" - setup_cfg = root_pth / "setup.cfg" - section: Union[Dict[str, Any], configparser.SectionProxy, None] = None - if pyproject_toml.exists() and have_tomllib: - try: - with open(pyproject_toml, "rb") as fobj: - pp = tomllib.load(fobj) - section = pp["tool"]["versioneer"] - except (tomllib.TOMLDecodeError, KeyError) as e: - print(f"Failed to load config from {pyproject_toml}: {e}") - print("Try to load it from setup.cfg") - if not section: - parser = configparser.ConfigParser() - with open(setup_cfg) as cfg_file: - parser.read_file(cfg_file) - parser.get("versioneer", "VCS") # raise error if missing - - section = parser["versioneer"] - - # `cast`` really shouldn't be used, but its simplest for the - # common VersioneerConfig users at the moment. We verify against - # `None` values elsewhere where it matters - - cfg = VersioneerConfig() - cfg.VCS = section["VCS"] - cfg.style = section.get("style", "") - cfg.versionfile_source = cast(str, section.get("versionfile_source")) - cfg.versionfile_build = section.get("versionfile_build") - cfg.tag_prefix = cast(str, section.get("tag_prefix")) - if cfg.tag_prefix in ("''", '""', None): - cfg.tag_prefix = "" - cfg.parentdir_prefix = section.get("parentdir_prefix") - if isinstance(section, configparser.SectionProxy): - # Make sure configparser translates to bool - cfg.verbose = section.getboolean("verbose") - else: - cfg.verbose = section.get("verbose") - - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -# these dictionaries contain VCS-specific tools -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} - - -def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator - """Create decorator to mark a method as the handler of a VCS.""" - - def decorate(f: Callable) -> Callable: - """Store f in HANDLERS[vcs][method].""" - HANDLERS.setdefault(vcs, {})[method] = f - return f - - return decorate - - -def run_command( - commands: List[str], - args: List[str], - cwd: Optional[str] = None, - verbose: bool = False, - hide_stderr: bool = False, - env: Optional[Dict[str, str]] = None, -) -> Tuple[Optional[str], Optional[int]]: - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - - popen_kwargs: Dict[str, Any] = {} - if sys.platform == "win32": - # This hides the console window if pythonw.exe is used - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - popen_kwargs["startupinfo"] = startupinfo - - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen( - [command] + args, - cwd=cwd, - env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr else None), - **popen_kwargs, - ) - break - except OSError as e: - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %s" % dispcmd) - print(e) - return None, None - else: - if verbose: - print(f"unable to find command, tried {commands}") - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %s (error)" % dispcmd) - print("stdout was %s" % stdout) - return None, process.returncode - return stdout, process.returncode - - -LONG_VERSION_PY[ - "git" -] = r''' -# This file helps to compute a version number in source trees obtained from -# git-archive tarball (such as those provided by githubs download-from-tag -# feature). Distribution tarballs (built by setup.py sdist) and build -# directories (produced by setup.py build) will contain a much shorter file -# that just contains the computed version number. - -# This file is released into the public domain. -# Generated by versioneer-0.29 -# https://github.com/python-versioneer/python-versioneer - -"""Git implementation of _version.py.""" - -import errno -import os -import re -import subprocess -import sys -from typing import Any, Callable, Dict, List, Optional, Tuple -import functools - - -def get_keywords() -> Dict[str, str]: - """Get the keywords needed to look up the version information.""" - # these strings will be replaced by git during git-archive. - # setup.py/versioneer.py will grep for the variable names, so they must - # each be defined on a line of their own. _version.py will just call - # get_keywords(). - git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" - git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" - git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" - keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} - return keywords - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - VCS: str - style: str - tag_prefix: str - parentdir_prefix: str - versionfile_source: str - verbose: bool - - -def get_config() -> VersioneerConfig: - """Create, populate and return the VersioneerConfig() object.""" - # these strings are filled in when 'setup.py versioneer' creates - # _version.py - cfg = VersioneerConfig() - cfg.VCS = "git" - cfg.style = "%(STYLE)s" - cfg.tag_prefix = "%(TAG_PREFIX)s" - cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" - cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" - cfg.verbose = False - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} - - -def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator - """Create decorator to mark a method as the handler of a VCS.""" - def decorate(f: Callable) -> Callable: - """Store f in HANDLERS[vcs][method].""" - if vcs not in HANDLERS: - HANDLERS[vcs] = {} - HANDLERS[vcs][method] = f - return f - return decorate - - -def run_command( - commands: List[str], - args: List[str], - cwd: Optional[str] = None, - verbose: bool = False, - hide_stderr: bool = False, - env: Optional[Dict[str, str]] = None, -) -> Tuple[Optional[str], Optional[int]]: - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - - popen_kwargs: Dict[str, Any] = {} - if sys.platform == "win32": - # This hides the console window if pythonw.exe is used - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - popen_kwargs["startupinfo"] = startupinfo - - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen([command] + args, cwd=cwd, env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None), **popen_kwargs) - break - except OSError as e: - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %%s" %% dispcmd) - print(e) - return None, None - else: - if verbose: - print("unable to find command, tried %%s" %% (commands,)) - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %%s (error)" %% dispcmd) - print("stdout was %%s" %% stdout) - return None, process.returncode - return stdout, process.returncode - - -def versions_from_parentdir( - parentdir_prefix: str, - root: str, - verbose: bool, -) -> Dict[str, Any]: - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return {"version": dirname[len(parentdir_prefix):], - "full-revisionid": None, - "dirty": False, "error": None, "date": None} - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print("Tried directories %%s but none started with prefix %%s" %% - (str(rootdirs), parentdir_prefix)) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords: Dict[str, str] = {} - try: - with open(versionfile_abs, "r") as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords( - keywords: Dict[str, str], - tag_prefix: str, - verbose: bool, -) -> Dict[str, Any]: - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %%d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r'\d', r)} - if verbose: - print("discarding '%%s', no digits" %% ",".join(refs - tags)) - if verbose: - print("likely tags: %%s" %% ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix):] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r'\d', r): - continue - if verbose: - print("picking %%s" %% r) - return {"version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": None, - "date": date} - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return {"version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": "no suitable tags", "date": None} - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs( - tag_prefix: str, - root: str, - verbose: bool, - runner: Callable = run_command -) -> Dict[str, Any]: - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - - # GIT_DIR can interfere with correct operation of Versioneer. - # It may be intended to be passed to the Versioneer-versioned project, - # but that should not change where we get our version from. - env = os.environ.copy() - env.pop("GIT_DIR", None) - runner = functools.partial(runner, env=env) - - _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, - hide_stderr=not verbose) - if rc != 0: - if verbose: - print("Directory %%s not under git control" %% root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner(GITS, [ - "describe", "--tags", "--dirty", "--always", "--long", - "--match", f"{tag_prefix}[[:digit:]]*" - ], cwd=root) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces: Dict[str, Any] = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], - cwd=root) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[:git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = ("unable to parse git-describe output: '%%s'" - %% describe_out) - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%%s' doesn't start with prefix '%%s'" - print(fmt %% (full_tag, tag_prefix)) - pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" - %% (full_tag, tag_prefix)) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix):] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) - pieces["distance"] = len(out.split()) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def plus_or_dot(pieces: Dict[str, Any]) -> str: - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces: Dict[str, Any]) -> str: - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], - pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces: Dict[str, Any]) -> str: - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], - pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces: Dict[str, Any]) -> str: - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post(pieces["closest-tag"]) - rendered = tag_version - if post_version is not None: - rendered += ".post%%d.dev%%d" %% (post_version + 1, pieces["distance"]) - else: - rendered += ".post0.dev%%d" %% (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%%d" %% pieces["distance"] - return rendered - - -def render_pep440_post(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%%s" %% pieces["short"] - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%%s" %% pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%%s" %% pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%%s" %% pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces: Dict[str, Any]) -> str: - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces: Dict[str, Any]) -> str: - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return {"version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None} - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%%s'" %% style) - - return {"version": rendered, "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], "error": None, - "date": pieces.get("date")} - - -def get_versions() -> Dict[str, Any]: - """Get version information or return default if unable to do so.""" - # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have - # __file__, we can work backwards from there to the root. Some - # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which - # case we can only use expanded keywords. - - cfg = get_config() - verbose = cfg.verbose - - try: - return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, - verbose) - except NotThisMethod: - pass - - try: - root = os.path.realpath(__file__) - # versionfile_source is the relative path from the top of the source - # tree (where the .git directory might live) to this file. Invert - # this to find the root from __file__. - for _ in cfg.versionfile_source.split('/'): - root = os.path.dirname(root) - except NameError: - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to find root of source tree", - "date": None} - - try: - pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) - return render(pieces, cfg.style) - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - except NotThisMethod: - pass - - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", "date": None} -''' - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords: Dict[str, str] = {} - try: - with open(versionfile_abs) as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords( - keywords: Dict[str, str], - tag_prefix: str, - verbose: bool, -) -> Dict[str, Any]: - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG) :] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r"\d", r)} - if verbose: - print("discarding '%s', no digits" % ",".join(refs - tags)) - if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix) :] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r"\d", r): - continue - if verbose: - print("picking %s" % r) - return { - "version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": None, - "date": date, - } - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return { - "version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": "no suitable tags", - "date": None, - } - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs( - tag_prefix: str, root: str, verbose: bool, runner: Callable = run_command -) -> Dict[str, Any]: - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - - # GIT_DIR can interfere with correct operation of Versioneer. - # It may be intended to be passed to the Versioneer-versioned project, - # but that should not change where we get our version from. - env = os.environ.copy() - env.pop("GIT_DIR", None) - runner = functools.partial(runner, env=env) - - _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) - if rc != 0: - if verbose: - print("Directory %s not under git control" % root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner( - GITS, - [ - "describe", - "--tags", - "--dirty", - "--always", - "--long", - "--match", - f"{tag_prefix}[[:digit:]]*", - ], - cwd=root, - ) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces: Dict[str, Any] = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[: git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%s' doesn't start with prefix '%s'" - print(fmt % (full_tag, tag_prefix)) - pieces["error"] = "tag '{}' doesn't start with prefix '{}'".format( - full_tag, - tag_prefix, - ) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix) :] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) - pieces["distance"] = len(out.split()) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def do_vcs_install(versionfile_source: str, ipy: Optional[str]) -> None: - """Git-specific installation logic for Versioneer. - - For Git, this means creating/changing .gitattributes to mark _version.py - for export-subst keyword substitution. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - files = [versionfile_source] - if ipy: - files.append(ipy) - if "VERSIONEER_PEP518" not in globals(): - try: - my_path = __file__ - if my_path.endswith((".pyc", ".pyo")): - my_path = os.path.splitext(my_path)[0] + ".py" - versioneer_file = os.path.relpath(my_path) - except NameError: - versioneer_file = "versioneer.py" - files.append(versioneer_file) - present = False - try: - with open(".gitattributes") as fobj: - for line in fobj: - if line.strip().startswith(versionfile_source): - if "export-subst" in line.strip().split()[1:]: - present = True - break - except OSError: - pass - if not present: - with open(".gitattributes", "a+") as fobj: - fobj.write(f"{versionfile_source} export-subst\n") - files.append(".gitattributes") - run_command(GITS, ["add", "--"] + files) - - -def versions_from_parentdir( - parentdir_prefix: str, - root: str, - verbose: bool, -) -> Dict[str, Any]: - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return { - "version": dirname[len(parentdir_prefix) :], - "full-revisionid": None, - "dirty": False, - "error": None, - "date": None, - } - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print( - "Tried directories %s but none started with prefix %s" - % (str(rootdirs), parentdir_prefix) - ) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -SHORT_VERSION_PY = """ -# This file was generated by 'versioneer.py' (0.29) from -# revision-control system data, or from the parent directory name of an -# unpacked source archive. Distribution tarballs contain a pre-generated copy -# of this file. - -import json - -version_json = ''' -%s -''' # END VERSION_JSON - - -def get_versions(): - return json.loads(version_json) -""" - - -def versions_from_file(filename: str) -> Dict[str, Any]: - """Try to determine the version from _version.py if present.""" - try: - with open(filename) as f: - contents = f.read() - except OSError: - raise NotThisMethod("unable to read _version.py") - mo = re.search( - r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S - ) - if not mo: - mo = re.search( - r"version_json = '''\r\n(.*)''' # END VERSION_JSON", contents, re.M | re.S - ) - if not mo: - raise NotThisMethod("no version_json in _version.py") - return json.loads(mo.group(1)) - - -def write_to_version_file(filename: str, versions: Dict[str, Any]) -> None: - """Write the given version number to the given _version.py file.""" - contents = json.dumps(versions, sort_keys=True, indent=1, separators=(",", ": ")) - with open(filename, "w") as f: - f.write(SHORT_VERSION_PY % contents) - - print("set {} to '{}'".format(filename, versions["version"])) - - -def plus_or_dot(pieces: Dict[str, Any]) -> str: - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces: Dict[str, Any]) -> str: - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces: Dict[str, Any]) -> str: - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces: Dict[str, Any]) -> str: - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post(pieces["closest-tag"]) - rendered = tag_version - if post_version is not None: - rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) - else: - rendered += ".post0.dev%d" % (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%d" % pieces["distance"] - return rendered - - -def render_pep440_post(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces: Dict[str, Any]) -> str: - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces: Dict[str, Any]) -> str: - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces: Dict[str, Any]) -> str: - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return { - "version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None, - } - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%s'" % style) - - return { - "version": rendered, - "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], - "error": None, - "date": pieces.get("date"), - } - - -class VersioneerBadRootError(Exception): - """The project root directory is unknown or missing key files.""" - - -def get_versions(verbose: bool = False) -> Dict[str, Any]: - """Get the project version from whatever source is available. - - Returns dict with two keys: 'version' and 'full'. - """ - if "versioneer" in sys.modules: - # see the discussion in cmdclass.py:get_cmdclass() - del sys.modules["versioneer"] - - root = get_root() - cfg = get_config_from_root(root) - - assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" - handlers = HANDLERS.get(cfg.VCS) - assert handlers, "unrecognized VCS '%s'" % cfg.VCS - verbose = verbose or bool(cfg.verbose) # `bool()` used to avoid `None` - assert ( - cfg.versionfile_source is not None - ), "please set versioneer.versionfile_source" - assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" - - versionfile_abs = os.path.join(root, cfg.versionfile_source) - - # extract version from first of: _version.py, VCS command (e.g. 'git - # describe'), parentdir. This is meant to work for developers using a - # source checkout, for users of a tarball created by 'setup.py sdist', - # and for users of a tarball/zipball created by 'git archive' or github's - # download-from-tag feature or the equivalent in other VCSes. - - get_keywords_f = handlers.get("get_keywords") - from_keywords_f = handlers.get("keywords") - if get_keywords_f and from_keywords_f: - try: - keywords = get_keywords_f(versionfile_abs) - ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) - if verbose: - print("got version from expanded keyword %s" % ver) - return ver - except NotThisMethod: - pass - - try: - ver = versions_from_file(versionfile_abs) - if verbose: - print(f"got version from file {versionfile_abs} {ver}") - return ver - except NotThisMethod: - pass - - from_vcs_f = handlers.get("pieces_from_vcs") - if from_vcs_f: - try: - pieces = from_vcs_f(cfg.tag_prefix, root, verbose) - ver = render(pieces, cfg.style) - if verbose: - print("got version from VCS %s" % ver) - return ver - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - if verbose: - print("got version from parentdir %s" % ver) - return ver - except NotThisMethod: - pass - - if verbose: - print("unable to compute version") - - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", - "date": None, - } - - -def get_version() -> str: - """Get the short version string for this project.""" - return get_versions()["version"] - - -def get_cmdclass(cmdclass: Optional[Dict[str, Any]] = None): - """Get the custom setuptools subclasses used by Versioneer. - - If the package uses a different cmdclass (e.g. one from numpy), it - should be provide as an argument. - """ - if "versioneer" in sys.modules: - del sys.modules["versioneer"] - # this fixes the "python setup.py develop" case (also 'install' and - # 'easy_install .'), in which subdependencies of the main project are - # built (using setup.py bdist_egg) in the same python process. Assume - # a main project A and a dependency B, which use different versions - # of Versioneer. A's setup.py imports A's Versioneer, leaving it in - # sys.modules by the time B's setup.py is executed, causing B to run - # with the wrong versioneer. Setuptools wraps the sub-dep builds in a - # sandbox that restores sys.modules to it's pre-build state, so the - # parent is protected against the child's "import versioneer". By - # removing ourselves from sys.modules here, before the child build - # happens, we protect the child from the parent's versioneer too. - # Also see https://github.com/python-versioneer/python-versioneer/issues/52 - - cmds = {} if cmdclass is None else cmdclass.copy() - - # we add "version" to setuptools - from setuptools import Command - - class cmd_version(Command): - description = "report generated version string" - user_options: List[Tuple[str, str, str]] = [] - boolean_options: List[str] = [] - - def initialize_options(self) -> None: - pass - - def finalize_options(self) -> None: - pass - - def run(self) -> None: - vers = get_versions(verbose=True) - print("Version: %s" % vers["version"]) - print(" full-revisionid: %s" % vers.get("full-revisionid")) - print(" dirty: %s" % vers.get("dirty")) - print(" date: %s" % vers.get("date")) - if vers["error"]: - print(" error: %s" % vers["error"]) - - cmds["version"] = cmd_version - - # we override "build_py" in setuptools - # - # most invocation pathways end up running build_py: - # distutils/build -> build_py - # distutils/install -> distutils/build ->.. - # setuptools/bdist_wheel -> distutils/install ->.. - # setuptools/bdist_egg -> distutils/install_lib -> build_py - # setuptools/install -> bdist_egg ->.. - # setuptools/develop -> ? - # pip install: - # copies source tree to a tempdir before running egg_info/etc - # if .git isn't copied too, 'git describe' will fail - # then does setup.py bdist_wheel, or sometimes setup.py install - # setup.py egg_info -> ? - - # pip install -e . and setuptool/editable_wheel will invoke build_py - # but the build_py command is not expected to copy any files. - - # we override different "build_py" commands for both environments - if "build_py" in cmds: - _build_py: Any = cmds["build_py"] - else: - from setuptools.command.build_py import build_py as _build_py - - class cmd_build_py(_build_py): - def run(self) -> None: - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - _build_py.run(self) - if getattr(self, "editable_mode", False): - # During editable installs `.py` and data files are - # not copied to build_lib - return - # now locate _version.py in the new build/ directory and replace - # it with an updated value - if cfg.versionfile_build: - target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - cmds["build_py"] = cmd_build_py - - if "build_ext" in cmds: - _build_ext: Any = cmds["build_ext"] - else: - from setuptools.command.build_ext import build_ext as _build_ext - - class cmd_build_ext(_build_ext): - def run(self) -> None: - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - _build_ext.run(self) - if self.inplace: - # build_ext --inplace will only build extensions in - # build/lib<..> dir with no _version.py to write to. - # As in place builds will already have a _version.py - # in the module dir, we do not need to write one. - return - # now locate _version.py in the new build/ directory and replace - # it with an updated value - if not cfg.versionfile_build: - return - target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) - if not os.path.exists(target_versionfile): - print( - f"Warning: {target_versionfile} does not exist, skipping " - "version update. This can happen if you are running build_ext " - "without first running build_py." - ) - return - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - cmds["build_ext"] = cmd_build_ext - - if "cx_Freeze" in sys.modules: # cx_freeze enabled? - from cx_Freeze.dist import build_exe as _build_exe # type: ignore - - # nczeczulin reports that py2exe won't like the pep440-style string - # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. - # setup(console=[{ - # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION - # "product_version": versioneer.get_version(), - # ... - - class cmd_build_exe(_build_exe): - def run(self) -> None: - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - target_versionfile = cfg.versionfile_source - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - _build_exe.run(self) - os.unlink(target_versionfile) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - cmds["build_exe"] = cmd_build_exe - del cmds["build_py"] - - if "py2exe" in sys.modules: # py2exe enabled? - try: - from py2exe.setuptools_buildexe import py2exe as _py2exe # type: ignore - except ImportError: - from py2exe.distutils_buildexe import py2exe as _py2exe # type: ignore - - class cmd_py2exe(_py2exe): - def run(self) -> None: - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - target_versionfile = cfg.versionfile_source - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - _py2exe.run(self) - os.unlink(target_versionfile) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - cmds["py2exe"] = cmd_py2exe - - # sdist farms its file list building out to egg_info - if "egg_info" in cmds: - _egg_info: Any = cmds["egg_info"] - else: - from setuptools.command.egg_info import egg_info as _egg_info - - class cmd_egg_info(_egg_info): - def find_sources(self) -> None: - # egg_info.find_sources builds the manifest list and writes it - # in one shot - super().find_sources() - - # Modify the filelist and normalize it - root = get_root() - cfg = get_config_from_root(root) - self.filelist.append("versioneer.py") - if cfg.versionfile_source: - # There are rare cases where versionfile_source might not be - # included by default, so we must be explicit - self.filelist.append(cfg.versionfile_source) - self.filelist.sort() - self.filelist.remove_duplicates() - - # The write method is hidden in the manifest_maker instance that - # generated the filelist and was thrown away - # We will instead replicate their final normalization (to unicode, - # and POSIX-style paths) - from setuptools import unicode_utils - - normalized = [ - unicode_utils.filesys_decode(f).replace(os.sep, "/") - for f in self.filelist.files - ] - - manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") - with open(manifest_filename, "w") as fobj: - fobj.write("\n".join(normalized)) - - cmds["egg_info"] = cmd_egg_info - - # we override different "sdist" commands for both environments - if "sdist" in cmds: - _sdist: Any = cmds["sdist"] - else: - from setuptools.command.sdist import sdist as _sdist - - class cmd_sdist(_sdist): - def run(self) -> None: - versions = get_versions() - self._versioneer_generated_versions = versions - # unless we update this, the command will keep using the old - # version - self.distribution.metadata.version = versions["version"] - return _sdist.run(self) - - def make_release_tree(self, base_dir: str, files: List[str]) -> None: - root = get_root() - cfg = get_config_from_root(root) - _sdist.make_release_tree(self, base_dir, files) - # now locate _version.py in the new base_dir directory - # (remembering that it may be a hardlink) and replace it with an - # updated value - target_versionfile = os.path.join(base_dir, cfg.versionfile_source) - print("UPDATING %s" % target_versionfile) - write_to_version_file( - target_versionfile, self._versioneer_generated_versions - ) - - cmds["sdist"] = cmd_sdist - - return cmds - - -CONFIG_ERROR = """ -setup.cfg is missing the necessary Versioneer configuration. You need -a section like: - - [versioneer] - VCS = git - style = pep440 - versionfile_source = src/myproject/_version.py - versionfile_build = myproject/_version.py - tag_prefix = - parentdir_prefix = myproject- - -You will also need to edit your setup.py to use the results: - - import versioneer - setup(version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), ...) - -Please read the docstring in ./versioneer.py for configuration instructions, -edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. -""" - -SAMPLE_CONFIG = """ -# See the docstring in versioneer.py for instructions. Note that you must -# re-run 'versioneer.py setup' after changing this section, and commit the -# resulting files. - -[versioneer] -#VCS = git -#style = pep440 -#versionfile_source = -#versionfile_build = -#tag_prefix = -#parentdir_prefix = - -""" - -OLD_SNIPPET = """ -from ._version import get_versions -__version__ = get_versions()['version'] -del get_versions -""" - -INIT_PY_SNIPPET = """ -from . import {0} -__version__ = {0}.get_versions()['version'] -""" - - -def do_setup() -> int: - """Do main VCS-independent setup function for installing Versioneer.""" - root = get_root() - try: - cfg = get_config_from_root(root) - except (OSError, configparser.NoSectionError, configparser.NoOptionError) as e: - if isinstance(e, (OSError, configparser.NoSectionError)): - print("Adding sample versioneer config to setup.cfg", file=sys.stderr) - with open(os.path.join(root, "setup.cfg"), "a") as f: - f.write(SAMPLE_CONFIG) - print(CONFIG_ERROR, file=sys.stderr) - return 1 - - print(" creating %s" % cfg.versionfile_source) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") - maybe_ipy: Optional[str] = ipy - if os.path.exists(ipy): - try: - with open(ipy) as f: - old = f.read() - except OSError: - old = "" - module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] - snippet = INIT_PY_SNIPPET.format(module) - if OLD_SNIPPET in old: - print(" replacing boilerplate in %s" % ipy) - with open(ipy, "w") as f: - f.write(old.replace(OLD_SNIPPET, snippet)) - elif snippet not in old: - print(" appending to %s" % ipy) - with open(ipy, "a") as f: - f.write(snippet) - else: - print(" %s unmodified" % ipy) - else: - print(" %s doesn't exist, ok" % ipy) - maybe_ipy = None - - # Make VCS-specific changes. For git, this means creating/changing - # .gitattributes to mark _version.py for export-subst keyword - # substitution. - do_vcs_install(cfg.versionfile_source, maybe_ipy) - return 0 - - -def scan_setup_py() -> int: - """Validate the contents of setup.py against Versioneer's expectations.""" - found = set() - setters = False - errors = 0 - with open("setup.py") as f: - for line in f.readlines(): - if "import versioneer" in line: - found.add("import") - if "versioneer.get_cmdclass()" in line: - found.add("cmdclass") - if "versioneer.get_version()" in line: - found.add("get_version") - if "versioneer.VCS" in line: - setters = True - if "versioneer.versionfile_source" in line: - setters = True - if len(found) != 3: - print("") - print("Your setup.py appears to be missing some important items") - print("(but I might be wrong). Please make sure it has something") - print("roughly like the following:") - print("") - print(" import versioneer") - print(" setup( version=versioneer.get_version(),") - print(" cmdclass=versioneer.get_cmdclass(), ...)") - print("") - errors += 1 - if setters: - print("You should remove lines like 'versioneer.VCS = ' and") - print("'versioneer.versionfile_source = ' . This configuration") - print("now lives in setup.cfg, and should be removed from setup.py") - print("") - errors += 1 - return errors - - -def setup_command() -> NoReturn: - """Set up Versioneer and exit with appropriate error code.""" - errors = do_setup() - errors += scan_setup_py() - sys.exit(1 if errors else 0) - - -if __name__ == "__main__": - cmd = sys.argv[1] - if cmd == "setup": - setup_command() From 0fad1b66cfffc215b54b77c6a21e64c2b05b07a3 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 21 Oct 2025 22:08:26 -0700 Subject: [PATCH 179/299] only install repo2docker itself --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6d3b7db2d..d243a7c2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,8 @@ docker = "repo2docker.docker:DockerEngine" include-package-data = true [tool.setuptools.packages.find] -where = ["."] +where = [""] +include = ["repo2docker"] [tool.setuptools_scm] From 68799442c78a4d05931c1c945564fd1e3dc6bcb2 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 21 Oct 2025 22:14:33 -0700 Subject: [PATCH 180/299] invoke setuptools_scm to get version --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3e0b4cead..c905cd019 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,7 +85,7 @@ jobs: echo "REGISTRY=$REGISTRY" >> $GITHUB_ENV echo "Publishing to $REGISTRY" - # versioneer requires the full git history for non-tags + # git requires the full git history for non-tags - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -111,7 +111,8 @@ jobs: # also push jupyter/repo2docker:1.2.3-3.abcd1234 (replace + with -) - name: Get list of repo2docker docker tags run: | - VERSION=$(python3 -c 'import versioneer; print(versioneer.get_version().replace("+", "-"))') + pip install setuptools-scm + VERSION=$(python3 -m setuptools_scm) TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$VERSION" if [ "${{ github.ref }}" == "refs/heads/main" ]; then TAGS="$TAGS,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:main" From 0024f21ee5174db19d455d6b51689532f7d92c55 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 21 Oct 2025 22:14:33 -0700 Subject: [PATCH 181/299] invoke setuptools_scm to get version # Conflicts: # .github/workflows/release.yml --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c28365e5c..03d63e646 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,7 +85,7 @@ jobs: echo "REGISTRY=$REGISTRY" >> $GITHUB_ENV echo "Publishing to $REGISTRY" - # versioneer requires the full git history for non-tags + # git requires the full git history for non-tags - uses: actions/checkout@v5 with: fetch-depth: 0 @@ -112,7 +112,7 @@ jobs: - name: Get list of repo2docker docker tags run: | pip install setuptools-scm - VERSION=$(python3 -m setuptools_scm) + VERSION=$(python3 -m setuptools_scm | sed s@+@-@g) TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$VERSION" if [ "${{ github.ref }}" == "refs/heads/main" ]; then TAGS="$TAGS,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:main" From f82d0777b28cb709be2180e0cce3a2525690923b Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 22 Oct 2025 08:45:35 -0700 Subject: [PATCH 182/299] address review --- .gitignore | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 913074575..c3fc5c772 100644 --- a/.gitignore +++ b/.gitignore @@ -192,4 +192,5 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +# generated by setuptools_scm repo2docker/_version.py diff --git a/pyproject.toml b/pyproject.toml index d243a7c2b..876750115 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ [project.urls] Homepage = "https://repo2docker.readthedocs.io" Documentation = "https://repo2docker.readthedocs.io" -Funding = "https://jupyter.org/about" +Funding = "https://jupyter.org/about#donate" Source = "https://github.com/jupyterhub/repo2docker" Tracker = "https://github.com/jupyterhub/repo2docker/issues" From 850c1d90f7cddf1542d3f45cde07155bc83c01b8 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 22 Oct 2025 14:24:59 -0700 Subject: [PATCH 183/299] require Python 3.10 remove unneeded args to pre-commit flags, which should read from pyproject.toml --- .github/workflows/test.yml | 4 ++-- .pre-commit-config.yaml | 10 ---------- pyproject.toml | 6 ++++-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4645d8c43..f62facf04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -70,8 +70,8 @@ jobs: - ui include: # The earliest actions/setup-python versions depend on the runner. - - ubuntu_version: "22.04" - python_version: "3.9" + - ubuntu_version: "24.04" + python_version: "3.10" repo_type: venv steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a091aa1a7..4dde5d994 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,8 +14,6 @@ repos: rev: v3.20.0 hooks: - id: pyupgrade - args: - - --py38-plus # check-tmp is a Python based test script run in created environments # that can be Python 3.5, older than the Python version required to run # repo2docker. @@ -26,20 +24,12 @@ repos: rev: 25.9.0 hooks: - id: black - args: - - --target-version=py39 - - --target-version=py310 - - --target-version=py311 - - --target-version=py312 - - --target-version=py313 # Autoformat: Python code - repo: https://github.com/pycqa/isort rev: 6.1.0 hooks: - id: isort - args: - - --profile=black # Autoformat: markdown - repo: https://github.com/pre-commit/mirrors-prettier diff --git a/pyproject.toml b/pyproject.toml index 876750115..1f31d6210 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ "Topic :: Software Development", "Topic :: System :: Systems Administration", ] -requires-python = ">=3.9" +requires-python = ">=3.10" dependencies = [ "chardet", "docker!=5.0.0", @@ -64,6 +64,8 @@ include-package-data = true where = [""] include = ["repo2docker"] - [tool.setuptools_scm] write_to = "repo2docker/_version.py" + +[tool.isort] +profile = "black" From 924a54a9c9d3204b999c21d462983eb374859660 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 22 Oct 2025 22:01:58 -0700 Subject: [PATCH 184/299] update prettier pre-commit mirror --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4dde5d994..110e1f9c1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,8 +32,8 @@ repos: - id: isort # Autoformat: markdown - - repo: https://github.com/pre-commit/mirrors-prettier - rev: v4.0.0-alpha.8 + - repo: https://github.com/rbubley/mirrors-prettier + rev: v3.6.2 hooks: - id: prettier files: ".md" From 91ce0941fb37b1f761df5f93ee823d59641a2bfd Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 28 Oct 2025 13:15:05 -0700 Subject: [PATCH 185/299] mamba 2.3.3 should fix empty depends --- repo2docker/buildpacks/conda/install-base-env.bash | 2 +- tests/conda/py35-binder-dir/verify | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index 78f74a303..c3545200d 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,7 +5,7 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION="2.3.2" +export MAMBA_VERSION="2.3.3" export CONDA_VERSION="25.9.1" URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index 315384389..d20cbb03b 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -16,10 +16,10 @@ v = out.split()[1] assert v[:3] == "3.5", out out = sh(["micromamba", "--version"]) -assert out == "2.3.2", out +assert out == "2.3.3", out out = sh(["mamba", "--version"]) -assert out == "2.3.2", out +assert out == "2.3.3", out sh([kernel_python, "-c", "import numpy"]) From fb72937a805f3977e604689475370e0483df1928 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 28 Oct 2025 13:16:05 -0700 Subject: [PATCH 186/299] restore downgrade/verify test now that mamba is fixed --- tests/conda/downgrade/verify | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conda/downgrade/verify b/tests/conda/downgrade/verify index 4eead7dfa..ebe4c5bee 100755 --- a/tests/conda/downgrade/verify +++ b/tests/conda/downgrade/verify @@ -24,7 +24,7 @@ assert pkgs["xeus-cling"]["version"] == "0.6.0" # this may be brittle, but it's unlikely any of these old versions # of packages will be rebuilt # xeus-cling 0.6.0 pins xeus 0.20, which pins openssl 1.1.1, -# which in turn downgrades krb5 from >=1.21.3 to 1.17.2 +# which in turn downgrades Python from >=3.9.16 to 3.9.0 assert pkgs["openssl"]["version"].startswith("1.1.1"), pkgs["openssl"]["version"] -assert pkgs["krb5"]["version"] == "1.17.2", pkgs["krb5"]["version"] +assert pkgs["python"]["version"] == "3.9.0", pkgs["python"]["version"] From 8a0b11b848c623f6239de677608ef99215d2fff9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 05:01:24 +0000 Subject: [PATCH 187/299] Bump actions/upload-artifact from 4 to 5 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 03d63e646..7101bf6f0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: ls -l dist # ref: https://github.com/actions/upload-artifact#readme - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: repo2docker-${{ github.sha }} path: "dist/*" From e855800d4384f52bbf14e99e5a31718b59c9fed2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 21:11:33 +0000 Subject: [PATCH 188/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.20.0 → v3.21.0](https://github.com/asottile/pyupgrade/compare/v3.20.0...v3.21.0) - [github.com/pycqa/isort: 6.1.0 → 7.0.0](https://github.com/pycqa/isort/compare/6.1.0...7.0.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 110e1f9c1..88a5b1edf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: # Autoformat: Python code, syntax patterns are modernized - repo: https://github.com/asottile/pyupgrade - rev: v3.20.0 + rev: v3.21.0 hooks: - id: pyupgrade # check-tmp is a Python based test script run in created environments @@ -27,7 +27,7 @@ repos: # Autoformat: Python code - repo: https://github.com/pycqa/isort - rev: 6.1.0 + rev: 7.0.0 hooks: - id: isort From f87ca4badab3f32be48934de910ca56e84c42e77 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 4 Nov 2025 09:41:29 +0100 Subject: [PATCH 189/299] Add item to FAQ regarding rootless mode Closes https://github.com/jupyterhub/repo2docker/issues/1483 --- docs/source/faq.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/faq.md b/docs/source/faq.md index 43187b89b..f9c083099 100644 --- a/docs/source/faq.md +++ b/docs/source/faq.md @@ -5,6 +5,13 @@ A collection of frequently asked questions with answers. If you have a question and have found an answer, send a PR to add it here! +## Is rootless container runtime supported? + +To to mitigate potential vulnerabilities in the daemon and the container runtime, security experts recommend run Docker in [rootless mode](https://docs.docker.com/engine/security/rootless/). Rootless mode is supported by `repo2docker` but it has some limitations: + +- `repo2docker` does not allow the primary user in the image to be `root`. +- the `--editable` feature will not work because of permission issues. + ## Why is my repository failing to build with `ResolvePackageNotFound` ? If you used `conda env export` to generate your `environment.yml` it will generate a list of packages and versions of packages that is pinned to platform specific versions. From 4f9b799bfe57fc4a2c610064890612edb45010e9 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Sat, 16 Aug 2025 14:50:47 +0200 Subject: [PATCH 190/299] Start implementation of support for pyproject.yml Related to https://github.com/jupyterhub/repo2docker/issues/1427 --- repo2docker/buildpacks/pyproject/__init__.py | 125 +++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 repo2docker/buildpacks/pyproject/__init__.py diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py new file mode 100644 index 000000000..0c3e27929 --- /dev/null +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -0,0 +1,125 @@ +"""Buildpack for Git repositories with pyproject.toml + +Support to pyproject.toml was added to pip v10.0, +see https://pip.pypa.io/en/latest/reference/build-system/pyproject-toml/. +""" + +import os +import re +import tomllib +from functools import lru_cache + +from ..conda import CondaBuildPack + +VERSION_PAT = re.compile(r"\d+(\.\d+)*") + + +class PyprojectBuildPack(CondaBuildPack): + """Setup Python with pyproject.toml for use with a repository.""" + + @property + def python_version(self): + """ + Detect the Python version declared in a `pyproject.toml`. + Will return 'x.y' if version is found (e.g '3.6'), + or a Falsy empty string '' if not found. + """ + + if hasattr(self, "_python_version"): + return self._python_version + + pyproject_file = self.binder_path("pyproject.toml") + with open(pyproject_file, "rb") as _pyproject_file: + pyproject_toml = tomllib.load(_pyproject_file) + + if "project" in pyproject_toml: + if "requires-python" in pyproject_toml["project"]: + raw_version = pyproject_toml["project"]["requires-python"] + + match = VERSION_PAT.match(raw_version) + if match: + return match.group() + + return "" + + @lru_cache + def get_preassemble_script_files(self): + """Return files needed for preassembly""" + files = super().get_preassemble_script_files() + path = self.binder_path("pyproject.toml") + if os.path.exists(path): + files[path] = path + return files + + @lru_cache + def get_preassemble_scripts(self): + """scripts to run prior to staging the repo contents""" + scripts = super().get_preassemble_scripts() + # install pipenv to install dependencies within Pipfile.lock or Pipfile + if V(self.python_version) < V("3.6"): + # last pipenv version to support 2.7, 3.5 + pipenv_version = "2021.5.29" + else: + pipenv_version = "2022.1.8" + scripts.append( + ( + "${NB_USER}", + f"${{KERNEL_PYTHON_PREFIX}}/bin/pip install --no-cache-dir pipenv=={pipenv_version}", + ) + ) + return scripts + + @lru_cache + def get_assemble_scripts(self): + """Return series of build-steps specific to this repository.""" + # If we have pyproject.toml declare the + # use of Python 2, Python 2.7 will be made available in the *kernel* + # environment. The notebook servers environment on the other hand + # requires Python 3 but may require something additional installed in it + # still such as `nbgitpuller`. For this purpose, a "requirements3.txt" + # file will be used to install dependencies for the notebook servers + # environment, if Python 2 had been specified for the kernel + # environment. + assemble_scripts = super().get_assemble_scripts() + + if self.separate_kernel_env: + # using legacy Python (e.g. 2.7) as a kernel + + # requirements3.txt allows for packages to be installed to the + # notebook servers Python environment + nb_requirements_file = self.binder_path("requirements3.txt") + if os.path.exists(nb_requirements_file): + assemble_scripts.append( + ( + "${NB_USER}", + f'${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{nb_requirements_file}"', + ) + ) + + assemble_scripts.append( + ( + "${NB_USER}", + """(cd && \\ + PATH="${{KERNEL_PYTHON_PREFIX}}/bin:$PATH" \\ + pip install --no-cache-dir --editable {working_directory} + )""".format( + working_directory=working_directory, + ), + ) + ) + + return assemble_scripts + + def detect(self): + """Check if current repo should be built with the pyproject.toml buildpack.""" + # first make sure python is not explicitly unwanted + runtime_txt = self.binder_path("runtime.txt") + if os.path.exists(runtime_txt): + with open(runtime_txt) as f: + runtime = f.read().strip() + if not runtime.startswith("python-"): + return False + + pyproject_file = self.binder_path("pyproject.toml") + + return os.path.exists(pyproject_file) From 1ad4737f52c6ca70f74dcd553ccdda886ec44bd6 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 18 Aug 2025 10:38:18 +0200 Subject: [PATCH 191/299] Add builldpack for pyproject to list of buildpack Related to https://github.com/jupyterhub/repo2docker/issues/1427 --- repo2docker/app.py | 2 + repo2docker/buildpacks/__init__.py | 1 + repo2docker/buildpacks/pyproject/__init__.py | 68 +++++++++++++------- 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 7a70a470d..cdd0fadea 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -33,6 +33,7 @@ LegacyBinderDockerBuildPack, NixBuildPack, PipfileBuildPack, + PyprojectBuildPack, PythonBuildPack, RBuildPack, ) @@ -100,6 +101,7 @@ def _default_log_level(self): RBuildPack, CondaBuildPack, PipfileBuildPack, + PyprojectBuildPack, PythonBuildPack, ], config=True, diff --git a/repo2docker/buildpacks/__init__.py b/repo2docker/buildpacks/__init__.py index 7568000bd..21a512a81 100644 --- a/repo2docker/buildpacks/__init__.py +++ b/repo2docker/buildpacks/__init__.py @@ -5,5 +5,6 @@ from .legacy import LegacyBinderDockerBuildPack from .nix import NixBuildPack from .pipfile import PipfileBuildPack +from .pyproject import PyprojectBuildPack from .python import PythonBuildPack from .r import RBuildPack diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 0c3e27929..21eedfb7c 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -28,19 +28,58 @@ def python_version(self): if hasattr(self, "_python_version"): return self._python_version + try: + with open(self.binder_path("runtime.txt")) as f: + runtime = f.read().strip() + except FileNotFoundError: + runtime = "" + + if runtime.startswith("python-"): + runtime_python_version = runtime.split("-", 1)[1] + else: + # not a Python runtime (e.g. R, which subclasses this) + # use the default Python + runtime_python_version = self.major_pythons["3"] + self.log.warning( + f"Python version unspecified in runtime.txt, using current default Python version {runtime_python_version}. This will change in the future." + ) + + runtime_python_version_info = runtime_python_version.split(".") + if len(runtime_python_version_info) == 1: + runtime_python_version = self.major_pythons[runtime_python_version_info[0]] + runtime_python_version_info = runtime_python_version.split(".") + pyproject_file = self.binder_path("pyproject.toml") with open(pyproject_file, "rb") as _pyproject_file: pyproject_toml = tomllib.load(_pyproject_file) if "project" in pyproject_toml: if "requires-python" in pyproject_toml["project"]: - raw_version = pyproject_toml["project"]["requires-python"] + # This is the minumum version! + raw_pyproject_minimum_version = pyproject_toml["project"][ + "requires-python" + ] - match = VERSION_PAT.match(raw_version) + match = VERSION_PAT.match(raw_pyproject_minimum_version) if match: - return match.group() + pyproject_minimum_version = match.group() + pyproject_minimum_version_info = pyproject_minimum_version.split( + "." + ) - return "" + if ( + runtime_python_version_info[0] + < pyproject_minimum_version_info[0] + ) or ( + runtime_python_version_info[1] + < pyproject_minimum_version_info[1] + ): + raise RuntimeError( + "runtime.txt version not supported by pyproject.toml." + ) + + self._python_version = runtime_python_version + return self._python_version @lru_cache def get_preassemble_script_files(self): @@ -55,18 +94,6 @@ def get_preassemble_script_files(self): def get_preassemble_scripts(self): """scripts to run prior to staging the repo contents""" scripts = super().get_preassemble_scripts() - # install pipenv to install dependencies within Pipfile.lock or Pipfile - if V(self.python_version) < V("3.6"): - # last pipenv version to support 2.7, 3.5 - pipenv_version = "2021.5.29" - else: - pipenv_version = "2022.1.8" - scripts.append( - ( - "${NB_USER}", - f"${{KERNEL_PYTHON_PREFIX}}/bin/pip install --no-cache-dir pipenv=={pipenv_version}", - ) - ) return scripts @lru_cache @@ -99,12 +126,9 @@ def get_assemble_scripts(self): assemble_scripts.append( ( "${NB_USER}", - """(cd && \\ - PATH="${{KERNEL_PYTHON_PREFIX}}/bin:$PATH" \\ - pip install --no-cache-dir --editable {working_directory} - )""".format( - working_directory=working_directory, - ), + """PATH="${KERNEL_PYTHON_PREFIX}/bin:$PATH" \\ + pip install --no-cache-dir --editable . + """, ) ) From 9e5b8d917efa0222d871bf569893140f70ef6e69 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 19 Aug 2025 09:36:43 +0200 Subject: [PATCH 192/299] Avoid change PATH during bash command --- repo2docker/buildpacks/pyproject/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 21eedfb7c..a952c8af1 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -126,9 +126,7 @@ def get_assemble_scripts(self): assemble_scripts.append( ( "${NB_USER}", - """PATH="${KERNEL_PYTHON_PREFIX}/bin:$PATH" \\ - pip install --no-cache-dir --editable . - """, + "${KERNEL_PYTHON_PREFIX}/bin/pip install --no-cache-dir --editable .", ) ) From 411938ca19979438736266c13756da6d2a014827 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 19 Aug 2025 09:56:57 +0200 Subject: [PATCH 193/299] Change Python version used by ReadTheDocks because now repo2docker requires Python >= 3.11 given the requirement of tomllib. --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7bb04d170..c0e4658d6 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,7 +11,7 @@ sphinx: build: os: ubuntu-22.04 tools: - python: "3.10" + python: "3.11" python: install: From bb1b6d3bfdaaf1258dc8d8afda1773d985146866 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 16:54:27 +0200 Subject: [PATCH 194/299] Reduce code duplication in PyprojectBuildPack --- repo2docker/buildpacks/pyproject/__init__.py | 26 ++++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index a952c8af1..9de1bdf70 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -28,26 +28,17 @@ def python_version(self): if hasattr(self, "_python_version"): return self._python_version - try: - with open(self.binder_path("runtime.txt")) as f: - runtime = f.read().strip() - except FileNotFoundError: - runtime = "" - - if runtime.startswith("python-"): - runtime_python_version = runtime.split("-", 1)[1] + name, version, _ = self.runtime + + if name == "python": + runtime_python_version = version else: - # not a Python runtime (e.g. R, which subclasses this) - # use the default Python runtime_python_version = self.major_pythons["3"] self.log.warning( f"Python version unspecified in runtime.txt, using current default Python version {runtime_python_version}. This will change in the future." ) runtime_python_version_info = runtime_python_version.split(".") - if len(runtime_python_version_info) == 1: - runtime_python_version = self.major_pythons[runtime_python_version_info[0]] - runtime_python_version_info = runtime_python_version.split(".") pyproject_file = self.binder_path("pyproject.toml") with open(pyproject_file, "rb") as _pyproject_file: @@ -135,12 +126,9 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the pyproject.toml buildpack.""" # first make sure python is not explicitly unwanted - runtime_txt = self.binder_path("runtime.txt") - if os.path.exists(runtime_txt): - with open(runtime_txt) as f: - runtime = f.read().strip() - if not runtime.startswith("python-"): - return False + name, _, _ = self.runtime + if name != "python": + return False pyproject_file = self.binder_path("pyproject.toml") From fd67afff2e843ec6cb0f2094b09bb920bece26c5 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 09:36:10 +0200 Subject: [PATCH 195/299] Use tomli for Python < 3.11 --- repo2docker/buildpacks/pyproject/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 9de1bdf70..11db16f79 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -6,9 +6,13 @@ import os import re -import tomllib from functools import lru_cache +try: + import tomllib +except ImportError: + import tomli as tomllib + from ..conda import CondaBuildPack VERSION_PAT = re.compile(r"\d+(\.\d+)*") From 0e741692c5df97a54ac4f7e9c525f8e3c4962437 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 09:41:27 +0200 Subject: [PATCH 196/299] Check that pyproject.toml has required fields --- repo2docker/buildpacks/pyproject/__init__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 11db16f79..294d92501 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -135,5 +135,14 @@ def detect(self): return False pyproject_file = self.binder_path("pyproject.toml") + with open(pyproject_file, "rb") as _pyproject_file: + pyproject_toml = tomllib.load(_pyproject_file) + + if ( + ("project" in pyproject_toml) + and ("build-system" in pyproject_toml) + and ("requires" in pyproject_toml["build-system"]) + ): + return os.path.exists(pyproject_file) - return os.path.exists(pyproject_file) + return False From d1175b60665455aadf1b93678e844e3a1e42975e Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 09:52:45 +0200 Subject: [PATCH 197/299] Add one test for pyproject --- tests/pyproject/pyproject-toml/README.rst | 4 +++ .../pyproject/pyproject-toml/mwt/__init__.py | 0 tests/pyproject/pyproject-toml/pyproject.toml | 26 +++++++++++++++++++ tests/pyproject/pyproject-toml/verify | 5 ++++ 4 files changed, 35 insertions(+) create mode 100644 tests/pyproject/pyproject-toml/README.rst create mode 100644 tests/pyproject/pyproject-toml/mwt/__init__.py create mode 100644 tests/pyproject/pyproject-toml/pyproject.toml create mode 100755 tests/pyproject/pyproject-toml/verify diff --git a/tests/pyproject/pyproject-toml/README.rst b/tests/pyproject/pyproject-toml/README.rst new file mode 100644 index 000000000..86564f364 --- /dev/null +++ b/tests/pyproject/pyproject-toml/README.rst @@ -0,0 +1,4 @@ +Python - pyproject.toml +----------------------- + +``pyproject.toml`` should be used over ``setup.py``. diff --git a/tests/pyproject/pyproject-toml/mwt/__init__.py b/tests/pyproject/pyproject-toml/mwt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/pyproject/pyproject-toml/pyproject.toml b/tests/pyproject/pyproject-toml/pyproject.toml new file mode 100644 index 000000000..800af7eda --- /dev/null +++ b/tests/pyproject/pyproject-toml/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "mwt" +version = "1.0.0" +dependencies = [ + "numpy", +] +requires-python = ">=3.12" +authors = [ + {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"}, +] +maintainers = [ + {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"}, +] +description = "Test for repo2docker" +readme = "README.rst" +license = "MIT" + +[project.urls] +Homepage = "https://repo2docker.readthedocs.io/" +Documentation = "https://repo2docker.readthedocs.io/" +Repository = "https://github.com/jupyterhub/repo2docker.git" +"Bug Tracker" = "https://github.com/jupyterhub/repo2docker/issues" \ No newline at end of file diff --git a/tests/pyproject/pyproject-toml/verify b/tests/pyproject/pyproject-toml/verify new file mode 100755 index 000000000..4d7131e1e --- /dev/null +++ b/tests/pyproject/pyproject-toml/verify @@ -0,0 +1,5 @@ +#!/usr/bin/env python +try: + import mwt +except ImportError: + raise Exception("'mwt' shouldn't have been installed!") From 16f0884d1ede67e7ff76c9e1a295ed5ff558e5a8 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 10:00:28 +0200 Subject: [PATCH 198/299] Add documentation about pyproject.toml --- docs/source/configuration/development.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/source/configuration/development.md b/docs/source/configuration/development.md index a770f0cb7..8cd1c5e75 100644 --- a/docs/source/configuration/development.md +++ b/docs/source/configuration/development.md @@ -24,10 +24,22 @@ environment. Our [example `requirements.txt` file](https://github.com/binder-examples/requirements/blob/HEAD/requirements.txt) on GitHub shows a typical requirements file. +(pyproject)= + +## `pyproject.toml` - Install Python packages + +To install your reprository like a Python package, you may include a +`pyproject.toml` file. `repo2docker`install `pyproject.toml` files by running +`pip install -e .`. + (setup-py)= ## `setup.py` - Install Python packages +```{note} +We recommend to use `pyproject.toml` as it is the recommended way since 2020 when PEPs [621](https://peps.python.org/pep-0621/) and [631](https://peps.python.org/pep-0631/) were accepted. +``` + To install your repository like a Python package, you may include a `setup.py` file. `repo2docker` installs `setup.py` files by running `pip install -e .`. From e3e7e4c9757e0026453715d42a4141c491b5deba Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 15:48:34 +0200 Subject: [PATCH 199/299] Fix English typos --- docs/source/configuration/development.md | 4 ++-- repo2docker/buildpacks/pyproject/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/configuration/development.md b/docs/source/configuration/development.md index 8cd1c5e75..632bcd136 100644 --- a/docs/source/configuration/development.md +++ b/docs/source/configuration/development.md @@ -28,8 +28,8 @@ on GitHub shows a typical requirements file. ## `pyproject.toml` - Install Python packages -To install your reprository like a Python package, you may include a -`pyproject.toml` file. `repo2docker`install `pyproject.toml` files by running +To install your repository like a Python package, you may include a +`pyproject.toml` file. `repo2docker`installs `pyproject.toml` files by running `pip install -e .`. (setup-py)= diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 294d92501..814d5ed0e 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -1,6 +1,6 @@ """Buildpack for Git repositories with pyproject.toml -Support to pyproject.toml was added to pip v10.0, +Support for pyproject.toml was added to pip v10.0, see https://pip.pypa.io/en/latest/reference/build-system/pyproject-toml/. """ From 0cb709396fff7bec0c1fc115d93c933765298252 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 20 Oct 2025 16:17:07 +0200 Subject: [PATCH 200/299] Only read pyproject.toml if file exists --- repo2docker/buildpacks/pyproject/__init__.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py index 814d5ed0e..4b6376057 100644 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ b/repo2docker/buildpacks/pyproject/__init__.py @@ -135,14 +135,15 @@ def detect(self): return False pyproject_file = self.binder_path("pyproject.toml") - with open(pyproject_file, "rb") as _pyproject_file: - pyproject_toml = tomllib.load(_pyproject_file) - - if ( - ("project" in pyproject_toml) - and ("build-system" in pyproject_toml) - and ("requires" in pyproject_toml["build-system"]) - ): - return os.path.exists(pyproject_file) + if os.path.exists(pyproject_file): + with open(pyproject_file, "rb") as _pyproject_file: + pyproject_toml = tomllib.load(_pyproject_file) + + if ( + ("project" in pyproject_toml) + and ("build-system" in pyproject_toml) + and ("requires" in pyproject_toml["build-system"]) + ): + return os.path.exists(pyproject_file) return False From f9ff17527dbab36419df16b272324c5f1aef984b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 21 Oct 2025 13:38:51 +0200 Subject: [PATCH 201/299] Merge PyprojectBuildPack into PythonBuildPack --- repo2docker/app.py | 2 - repo2docker/buildpacks/__init__.py | 1 - repo2docker/buildpacks/pyproject/__init__.py | 149 ------------------ repo2docker/buildpacks/python/__init__.py | 66 +++++++- tests/pyproject/pyproject-toml/pyproject.toml | 2 +- 5 files changed, 60 insertions(+), 160 deletions(-) delete mode 100644 repo2docker/buildpacks/pyproject/__init__.py diff --git a/repo2docker/app.py b/repo2docker/app.py index cdd0fadea..7a70a470d 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -33,7 +33,6 @@ LegacyBinderDockerBuildPack, NixBuildPack, PipfileBuildPack, - PyprojectBuildPack, PythonBuildPack, RBuildPack, ) @@ -101,7 +100,6 @@ def _default_log_level(self): RBuildPack, CondaBuildPack, PipfileBuildPack, - PyprojectBuildPack, PythonBuildPack, ], config=True, diff --git a/repo2docker/buildpacks/__init__.py b/repo2docker/buildpacks/__init__.py index 21a512a81..7568000bd 100644 --- a/repo2docker/buildpacks/__init__.py +++ b/repo2docker/buildpacks/__init__.py @@ -5,6 +5,5 @@ from .legacy import LegacyBinderDockerBuildPack from .nix import NixBuildPack from .pipfile import PipfileBuildPack -from .pyproject import PyprojectBuildPack from .python import PythonBuildPack from .r import RBuildPack diff --git a/repo2docker/buildpacks/pyproject/__init__.py b/repo2docker/buildpacks/pyproject/__init__.py deleted file mode 100644 index 4b6376057..000000000 --- a/repo2docker/buildpacks/pyproject/__init__.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Buildpack for Git repositories with pyproject.toml - -Support for pyproject.toml was added to pip v10.0, -see https://pip.pypa.io/en/latest/reference/build-system/pyproject-toml/. -""" - -import os -import re -from functools import lru_cache - -try: - import tomllib -except ImportError: - import tomli as tomllib - -from ..conda import CondaBuildPack - -VERSION_PAT = re.compile(r"\d+(\.\d+)*") - - -class PyprojectBuildPack(CondaBuildPack): - """Setup Python with pyproject.toml for use with a repository.""" - - @property - def python_version(self): - """ - Detect the Python version declared in a `pyproject.toml`. - Will return 'x.y' if version is found (e.g '3.6'), - or a Falsy empty string '' if not found. - """ - - if hasattr(self, "_python_version"): - return self._python_version - - name, version, _ = self.runtime - - if name == "python": - runtime_python_version = version - else: - runtime_python_version = self.major_pythons["3"] - self.log.warning( - f"Python version unspecified in runtime.txt, using current default Python version {runtime_python_version}. This will change in the future." - ) - - runtime_python_version_info = runtime_python_version.split(".") - - pyproject_file = self.binder_path("pyproject.toml") - with open(pyproject_file, "rb") as _pyproject_file: - pyproject_toml = tomllib.load(_pyproject_file) - - if "project" in pyproject_toml: - if "requires-python" in pyproject_toml["project"]: - # This is the minumum version! - raw_pyproject_minimum_version = pyproject_toml["project"][ - "requires-python" - ] - - match = VERSION_PAT.match(raw_pyproject_minimum_version) - if match: - pyproject_minimum_version = match.group() - pyproject_minimum_version_info = pyproject_minimum_version.split( - "." - ) - - if ( - runtime_python_version_info[0] - < pyproject_minimum_version_info[0] - ) or ( - runtime_python_version_info[1] - < pyproject_minimum_version_info[1] - ): - raise RuntimeError( - "runtime.txt version not supported by pyproject.toml." - ) - - self._python_version = runtime_python_version - return self._python_version - - @lru_cache - def get_preassemble_script_files(self): - """Return files needed for preassembly""" - files = super().get_preassemble_script_files() - path = self.binder_path("pyproject.toml") - if os.path.exists(path): - files[path] = path - return files - - @lru_cache - def get_preassemble_scripts(self): - """scripts to run prior to staging the repo contents""" - scripts = super().get_preassemble_scripts() - return scripts - - @lru_cache - def get_assemble_scripts(self): - """Return series of build-steps specific to this repository.""" - # If we have pyproject.toml declare the - # use of Python 2, Python 2.7 will be made available in the *kernel* - # environment. The notebook servers environment on the other hand - # requires Python 3 but may require something additional installed in it - # still such as `nbgitpuller`. For this purpose, a "requirements3.txt" - # file will be used to install dependencies for the notebook servers - # environment, if Python 2 had been specified for the kernel - # environment. - assemble_scripts = super().get_assemble_scripts() - - if self.separate_kernel_env: - # using legacy Python (e.g. 2.7) as a kernel - - # requirements3.txt allows for packages to be installed to the - # notebook servers Python environment - nb_requirements_file = self.binder_path("requirements3.txt") - if os.path.exists(nb_requirements_file): - assemble_scripts.append( - ( - "${NB_USER}", - f'${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{nb_requirements_file}"', - ) - ) - - assemble_scripts.append( - ( - "${NB_USER}", - "${KERNEL_PYTHON_PREFIX}/bin/pip install --no-cache-dir --editable .", - ) - ) - - return assemble_scripts - - def detect(self): - """Check if current repo should be built with the pyproject.toml buildpack.""" - # first make sure python is not explicitly unwanted - name, _, _ = self.runtime - if name != "python": - return False - - pyproject_file = self.binder_path("pyproject.toml") - if os.path.exists(pyproject_file): - with open(pyproject_file, "rb") as _pyproject_file: - pyproject_toml = tomllib.load(_pyproject_file) - - if ( - ("project" in pyproject_toml) - and ("build-system" in pyproject_toml) - and ("requires" in pyproject_toml["build-system"]) - ): - return os.path.exists(pyproject_file) - - return False diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 6c9a6d6e0..d4ec0331a 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -1,8 +1,14 @@ """Generates Dockerfiles based on an input matrix based on Python.""" import os +import re from functools import lru_cache +try: + import tomllib +except ImportError: + import tomli as tomllib + from ...utils import is_local_pip_requirement, open_guess_encoding from ..conda import CondaBuildPack @@ -34,6 +40,35 @@ def python_version(self): # get major.minor py_version = ".".join(py_version_info[:2]) self._python_version = py_version + + pyproject_toml = "pyproject.toml" + if not self.binder_dir and os.path.exists(pyproject_toml): + with open(pyproject_toml, "rb") as _pyproject_file: + pyproject = tomllib.load(_pyproject_file) + + if "project" in pyproject: + if "requires-python" in pyproject["project"]: + # This is the minumum version! + raw_pyproject_minimum_version = pyproject["project"][ + "requires-python" + ] + + match = re.compile(r"\d+(\.\d+)*").match( + raw_pyproject_minimum_version + ) + if match: + pyproject_minimum_version = match.group() + pyproject_minimum_version_info = ( + pyproject_minimum_version.split(".") + ) + + if (py_version_info[0] < pyproject_minimum_version_info[0]) or ( + py_version_info[1] < pyproject_minimum_version_info[1] + ): + raise RuntimeError( + "runtime.txt version not supported by pyproject.toml." + ) + return self._python_version def _get_pip_scripts(self): @@ -78,9 +113,11 @@ def _should_preassemble_pip(self): If there are any local references, e.g. `-e .`, stage the whole repo prior to installation. """ - if not os.path.exists("binder") and os.path.exists("setup.py"): - # can't install from subset if we're using setup.py - return False + # can't install from subset + for _configuration_file in ("pyproject.toml", "setup.py"): + if not os.path.exists("binder") and os.path.exists(_configuration_file): + return False + for name in ("requirements.txt", "requirements3.txt"): requirements_txt = self.binder_path(name) if not os.path.exists(requirements_txt): @@ -119,26 +156,41 @@ def get_assemble_scripts(self): # and requirements3.txt (if it exists) # will be installed in the python 3 notebook server env. assemble_scripts = super().get_assemble_scripts() - setup_py = "setup.py" # KERNEL_PYTHON_PREFIX is the env with the kernel, # whether it's distinct from the notebook or the same. pip = "${KERNEL_PYTHON_PREFIX}/bin/pip" if not self._should_preassemble_pip: assemble_scripts.extend(self._get_pip_scripts()) - # setup.py exists *and* binder dir is not used - if not self.binder_dir and os.path.exists(setup_py): - assemble_scripts.append(("${NB_USER}", f"{pip} install --no-cache-dir .")) + for _configuration_file in ("pyproject.toml", "setup.py"): + if not self.binder_dir and os.path.exists(_configuration_file): + assemble_scripts.append( + ("${NB_USER}", f"{pip} install --no-cache-dir .") + ) + break + return assemble_scripts def detect(self): """Check if current repo should be built with the Python buildpack.""" requirements_txt = self.binder_path("requirements.txt") + pyproject_toml = "pyproject.toml" setup_py = "setup.py" name = self.runtime[0] if name: return name == "python" + if not self.binder_dir and os.path.exists(pyproject_toml): + with open(pyproject_toml, "rb") as _pyproject_file: + pyproject = tomllib.load(_pyproject_file) + + if ( + ("project" in pyproject) + and ("build-system" in pyproject) + and ("requires" in pyproject["build-system"]) + ): + return True + if not self.binder_dir and os.path.exists(setup_py): return True return os.path.exists(requirements_txt) diff --git a/tests/pyproject/pyproject-toml/pyproject.toml b/tests/pyproject/pyproject-toml/pyproject.toml index 800af7eda..530f83977 100644 --- a/tests/pyproject/pyproject-toml/pyproject.toml +++ b/tests/pyproject/pyproject-toml/pyproject.toml @@ -8,7 +8,7 @@ version = "1.0.0" dependencies = [ "numpy", ] -requires-python = ">=3.12" +requires-python = ">=3.10" authors = [ {name = "Project Jupyter Contributors", email = "jupyter@googlegroups.com"}, ] From 3f5029ed2a68edb3aaa89a84776e191a38a46365 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 3 Nov 2025 14:51:32 +0100 Subject: [PATCH 202/299] Add packaging as dependence --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 1f31d6210..beb52e3c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,7 @@ dependencies = [ "semver", "toml", "traitlets", + "packaging", ] [project.urls] From 355c1cd2775f1e7decd5a280a490ba9f99c78903 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 3 Nov 2025 15:38:44 +0100 Subject: [PATCH 203/299] Improve Python version detection in PythonBuildPack --- repo2docker/buildpacks/python/__init__.py | 50 ++++++++++------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index d4ec0331a..7070871c4 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -9,6 +9,9 @@ except ImportError: import tomli as tomllib +from packaging.specifiers import SpecifierSet, InvalidSpecifier +from packaging.version import Version + from ...utils import is_local_pip_requirement, open_guess_encoding from ..conda import CondaBuildPack @@ -23,8 +26,8 @@ def python_version(self): name, version, _ = self.runtime - if name != "python" or not version: - # Either not specified, or not a Python runtime (e.g. R, which subclasses this) + if name is not None and name != "python": + # Either not a Python runtime (e.g. R, which subclasses this) # use the default Python self._python_version = self.major_pythons["3"] self.log.warning( @@ -32,42 +35,31 @@ def python_version(self): ) return self._python_version - py_version_info = version.split(".") - py_version = "" - if len(py_version_info) == 1: - py_version = self.major_pythons[py_version_info[0]] + if name is None or version is None: + self._python_version = self.major_pythons["3"] + runtime_version = Version(self.major_pythons["3"]) + self.log.warning( + f"Python version unspecified, using current default Python version {self._python_version}. This will change in the future." + ) else: - # get major.minor - py_version = ".".join(py_version_info[:2]) - self._python_version = py_version + self._python_version = version + runtime_version = Version(version) pyproject_toml = "pyproject.toml" if not self.binder_dir and os.path.exists(pyproject_toml): with open(pyproject_toml, "rb") as _pyproject_file: pyproject = tomllib.load(_pyproject_file) - if "project" in pyproject: - if "requires-python" in pyproject["project"]: - # This is the minumum version! - raw_pyproject_minimum_version = pyproject["project"][ - "requires-python" - ] + if "project" in pyproject and "requires-python" in pyproject["project"]: + # This is the minumum version! + # https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#python-requires + pyproject_python_specifier = SpecifierSet(pyproject["project"]["requires-python"]) - match = re.compile(r"\d+(\.\d+)*").match( - raw_pyproject_minimum_version - ) - if match: - pyproject_minimum_version = match.group() - pyproject_minimum_version_info = ( - pyproject_minimum_version.split(".") - ) - if (py_version_info[0] < pyproject_minimum_version_info[0]) or ( - py_version_info[1] < pyproject_minimum_version_info[1] - ): - raise RuntimeError( - "runtime.txt version not supported by pyproject.toml." - ) + if runtime_version not in pyproject_python_specifier: + raise RuntimeError( + "runtime.txt version not supported by pyproject.toml." + ) return self._python_version From 6183e4f814c1254d0107720a44bf7da8bbcff45d Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 13 Nov 2025 09:45:48 +0100 Subject: [PATCH 204/299] Make sure that _python_version always include major and minor --- repo2docker/buildpacks/python/__init__.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 7070871c4..a62c96afc 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -9,7 +9,7 @@ except ImportError: import tomli as tomllib -from packaging.specifiers import SpecifierSet, InvalidSpecifier +from packaging.specifiers import InvalidSpecifier, SpecifierSet from packaging.version import Version from ...utils import is_local_pip_requirement, open_guess_encoding @@ -37,13 +37,16 @@ def python_version(self): if name is None or version is None: self._python_version = self.major_pythons["3"] - runtime_version = Version(self.major_pythons["3"]) self.log.warning( f"Python version unspecified, using current default Python version {self._python_version}. This will change in the future." ) else: - self._python_version = version - runtime_version = Version(version) + if len(Version(version).release) <= 1: + self._python_version = self.major_pythons[version] + else: + self._python_version = version + + runtime_version = Version(self._python_version) pyproject_toml = "pyproject.toml" if not self.binder_dir and os.path.exists(pyproject_toml): @@ -53,13 +56,14 @@ def python_version(self): if "project" in pyproject and "requires-python" in pyproject["project"]: # This is the minumum version! # https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#python-requires - pyproject_python_specifier = SpecifierSet(pyproject["project"]["requires-python"]) - + pyproject_python_specifier = SpecifierSet( + pyproject["project"]["requires-python"] + ) if runtime_version not in pyproject_python_specifier: - raise RuntimeError( - "runtime.txt version not supported by pyproject.toml." - ) + raise RuntimeError( + "runtime.txt version not supported by pyproject.toml." + ) return self._python_version From 29640d56f33c79467b8c8a25d1694a73e52cc476 Mon Sep 17 00:00:00 2001 From: sblack-usu Date: Tue, 18 Nov 2025 08:08:22 -0700 Subject: [PATCH 205/299] update hydroshare download urls update the tests for updated hydroshare download location --- repo2docker/contentproviders/hydroshare.py | 9 ++--- .../unit/contentproviders/test_hydroshare.py | 33 +++++++++++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/repo2docker/contentproviders/hydroshare.py b/repo2docker/contentproviders/hydroshare.py index 4104d97a6..6a20dfa66 100755 --- a/repo2docker/contentproviders/hydroshare.py +++ b/repo2docker/contentproviders/hydroshare.py @@ -1,4 +1,3 @@ -import json import os import shutil import time @@ -33,8 +32,10 @@ def detect(self, doi, ref=None, extra_args=None): "hostname": [ "https://www.hydroshare.org/resource/", "http://www.hydroshare.org/resource/", + "https://hydroshare.org/resource/", + "http://hydroshare.org/resource/", ], - "django_irods": "https://www.hydroshare.org/django_irods/download/bags/", + "django_s3": "https://www.hydroshare.org/django_s3/download/bags/", "version": "https://www.hydroshare.org/hsapi/resource/{}/scimeta/elements", } ] @@ -58,7 +59,7 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): resource_id = spec["resource"] host = spec["host"] - bag_url = f'{host["django_irods"]}{resource_id}' + bag_url = f'{host["django_s3"]}{resource_id}.zip' yield f"Downloading {bag_url}.\n" @@ -67,7 +68,7 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): total_wait_time = 0 while ( conn.status_code == 200 - and conn.headers["content-type"] != "application/zip" + and not conn.url.startswith(f"https://s3.hydroshare.org/bags/{resource_id}.zip") ): wait_time = 10 total_wait_time += wait_time diff --git a/tests/unit/contentproviders/test_hydroshare.py b/tests/unit/contentproviders/test_hydroshare.py index 41e234cd1..1f10aebf9 100755 --- a/tests/unit/contentproviders/test_hydroshare.py +++ b/tests/unit/contentproviders/test_hydroshare.py @@ -1,5 +1,4 @@ import os -import re from contextlib import contextmanager from tempfile import NamedTemporaryFile, TemporaryDirectory from unittest.mock import patch @@ -48,8 +47,10 @@ def test_detect_hydroshare(): "hostname": [ "https://www.hydroshare.org/resource/", "http://www.hydroshare.org/resource/", + "https://hydroshare.org/resource/", + "http://hydroshare.org/resource/", ], - "django_irods": "https://www.hydroshare.org/django_irods/download/bags/", + "django_s3": "https://www.hydroshare.org/django_s3/download/bags/", "version": "https://www.hydroshare.org/hsapi/resource/{}/scimeta/elements", }, "resource": "b8f6eae9d89241cf8b5904033460af61", @@ -58,7 +59,7 @@ def test_detect_hydroshare(): assert ( Hydroshare().detect( - "https://www.hydroshare.org/resource/b8f6eae9d89241cf8b5904033460af61" + "https://hydroshare.org/resource/b8f6eae9d89241cf8b5904033460af61" ) == expected ) @@ -83,7 +84,7 @@ def test_detect_hydroshare(): @contextmanager -def hydroshare_archive(prefix="b8f6eae9d89241cf8b5904033460af61/data/contents"): +def hydroshare_archive(prefix="123456789/data/contents"): with NamedTemporaryFile(suffix=".zip") as zfile: with ZipFile(zfile.name, mode="w") as zip: zip.writestr(f"{prefix}/some-file.txt", "some content") @@ -93,10 +94,9 @@ def hydroshare_archive(prefix="b8f6eae9d89241cf8b5904033460af61/data/contents"): class MockResponse: - def __init__(self, content_type, status_code): + def __init__(self, url, status_code): self.status_code = status_code - self.headers = dict() - self.headers["content-type"] = content_type + self.url = url def test_fetch_bag(): @@ -106,22 +106,25 @@ def test_fetch_bag(): Hydroshare, "urlopen", side_effect=[ - MockResponse("application/html", 200), - MockResponse("application/zip", 200), + MockResponse("https://www.hydroshare.org/django_s3/download/bags/123456789.zip", + 200), + MockResponse("https://s3.hydroshare.org/bags/123456789.zip", 200), ], ): with patch.object( Hydroshare, "_urlretrieve", side_effect=[(hydro_path, None)] ): hydro = Hydroshare() - hydro.resource_id = "b8f6eae9d89241cf8b5904033460af61" + hydro.resource_id = "123456789" spec = { "host": { "hostname": [ "https://www.hydroshare.org/resource/", "http://www.hydroshare.org/resource/", + "https://hydroshare.org/resource/", + "http://hydroshare.org/resource/", ], - "django_irods": "https://www.hydroshare.org/django_irods/download/bags/", + "django_s3": "https://www.hydroshare.org/django_s3/download/bags/", }, "resource": "123456789", } @@ -147,8 +150,10 @@ def test_fetch_bag_failure(): "hostname": [ "https://www.hydroshare.org/resource/", "http://www.hydroshare.org/resource/", + "https://hydroshare.org/resource/", + "http://hydroshare.org/resource/", ], - "django_irods": "https://www.hydroshare.org/django_irods/download/bags/", + "django_s3": "https://www.hydroshare.org/django_s3/download/bags/", }, "resource": "123456789", } @@ -173,8 +178,10 @@ def test_fetch_bag_timeout(): "hostname": [ "https://www.hydroshare.org/resource/", "http://www.hydroshare.org/resource/", + "https://hydroshare.org/resource/", + "http://hydroshare.org/resource/", ], - "django_irods": "https://www.hydroshare.org/django_irods/download/bags/", + "django_s3": "https://www.hydroshare.org/django_s3/download/bags/", }, "resource": "123456789", } From 55a24021b698c1c5e0a4e693950430ce96fb3e29 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 19:03:29 +0000 Subject: [PATCH 206/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/contentproviders/hydroshare.py | 5 ++--- tests/unit/contentproviders/test_hydroshare.py | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/repo2docker/contentproviders/hydroshare.py b/repo2docker/contentproviders/hydroshare.py index 6a20dfa66..c7f8e3e61 100755 --- a/repo2docker/contentproviders/hydroshare.py +++ b/repo2docker/contentproviders/hydroshare.py @@ -66,9 +66,8 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): # bag downloads are prepared on demand and may need some time conn = self.urlopen(bag_url) total_wait_time = 0 - while ( - conn.status_code == 200 - and not conn.url.startswith(f"https://s3.hydroshare.org/bags/{resource_id}.zip") + while conn.status_code == 200 and not conn.url.startswith( + f"https://s3.hydroshare.org/bags/{resource_id}.zip" ): wait_time = 10 total_wait_time += wait_time diff --git a/tests/unit/contentproviders/test_hydroshare.py b/tests/unit/contentproviders/test_hydroshare.py index 1f10aebf9..cc11346ac 100755 --- a/tests/unit/contentproviders/test_hydroshare.py +++ b/tests/unit/contentproviders/test_hydroshare.py @@ -106,8 +106,10 @@ def test_fetch_bag(): Hydroshare, "urlopen", side_effect=[ - MockResponse("https://www.hydroshare.org/django_s3/download/bags/123456789.zip", - 200), + MockResponse( + "https://www.hydroshare.org/django_s3/download/bags/123456789.zip", + 200, + ), MockResponse("https://s3.hydroshare.org/bags/123456789.zip", 200), ], ): From 250ab4c633f0e36992fc611e4773d563cd68384e Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 21 Nov 2025 09:42:54 +0100 Subject: [PATCH 207/299] Improve comments in Python buildpack Co-authored-by: Min RK --- repo2docker/buildpacks/python/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index a62c96afc..ca8289877 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -27,7 +27,7 @@ def python_version(self): name, version, _ = self.runtime if name is not None and name != "python": - # Either not a Python runtime (e.g. R, which subclasses this) + # Runtime specified, but not Python (e.g. R, which subclasses this) # use the default Python self._python_version = self.major_pythons["3"] self.log.warning( From b0d5c9ae8b3cbc1b2384d3d090373bb62f5b944a Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 21 Nov 2025 09:50:15 +0100 Subject: [PATCH 208/299] Add _is_python_package() to Python build package --- repo2docker/buildpacks/python/__init__.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index ca8289877..1df51f8c3 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -127,6 +127,20 @@ def _should_preassemble_pip(self): # allow assembly from subset return True + @lru_cache + def _is_python_package(self): + if self.binder_dir: + return False + if os.path.exists("setup.py"): + return True + if os.path.exists("pyproject.toml"): + with open("pyproject_toml", "rb") as _pyproject_file: + pyproject = tomllib.load(_pyproject_file) + + if ("project" in pyproject) and ("build-system" in pyproject): + return True + return False + @lru_cache def get_preassemble_script_files(self): assemble_files = super().get_preassemble_script_files() @@ -158,12 +172,8 @@ def get_assemble_scripts(self): if not self._should_preassemble_pip: assemble_scripts.extend(self._get_pip_scripts()) - for _configuration_file in ("pyproject.toml", "setup.py"): - if not self.binder_dir and os.path.exists(_configuration_file): - assemble_scripts.append( - ("${NB_USER}", f"{pip} install --no-cache-dir .") - ) - break + if self._is_python_package(): + assemble_scripts.append(("${NB_USER}", f"{pip} install --no-cache-dir .")) return assemble_scripts From 98aa00be8e3fef7cf590519b099d39ed5bc53fb5 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 24 Nov 2025 10:45:53 +0100 Subject: [PATCH 209/299] Simplify detect() for Python buildpack --- repo2docker/buildpacks/python/__init__.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 1df51f8c3..882922da2 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -30,6 +30,7 @@ def python_version(self): # Runtime specified, but not Python (e.g. R, which subclasses this) # use the default Python self._python_version = self.major_pythons["3"] + self._python_version_source = "default" self.log.warning( f"Python version unspecified, using current default Python version {self._python_version}. This will change in the future." ) @@ -37,14 +38,17 @@ def python_version(self): if name is None or version is None: self._python_version = self.major_pythons["3"] + self._python_version_source = "default" self.log.warning( f"Python version unspecified, using current default Python version {self._python_version}. This will change in the future." ) else: if len(Version(version).release) <= 1: self._python_version = self.major_pythons[version] + self._python_version_source = "default" else: self._python_version = version + self._python_version_source = "runtime" runtime_version = Version(self._python_version) @@ -180,23 +184,12 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Python buildpack.""" requirements_txt = self.binder_path("requirements.txt") - pyproject_toml = "pyproject.toml" - setup_py = "setup.py" name = self.runtime[0] if name: return name == "python" - if not self.binder_dir and os.path.exists(pyproject_toml): - with open(pyproject_toml, "rb") as _pyproject_file: - pyproject = tomllib.load(_pyproject_file) - if ( - ("project" in pyproject) - and ("build-system" in pyproject) - and ("requires" in pyproject["build-system"]) - ): - return True - - if not self.binder_dir and os.path.exists(setup_py): + if self._is_python_package(): return True + return os.path.exists(requirements_txt) From e1f8747a3eccce124800d65a946a3ad5e6dbe9c4 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 24 Nov 2025 10:47:58 +0100 Subject: [PATCH 210/299] Simplify _should_preassemble_pip() for Python buildpack --- repo2docker/buildpacks/python/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 882922da2..8e8786f1e 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -114,9 +114,8 @@ def _should_preassemble_pip(self): stage the whole repo prior to installation. """ # can't install from subset - for _configuration_file in ("pyproject.toml", "setup.py"): - if not os.path.exists("binder") and os.path.exists(_configuration_file): - return False + if self._is_python_package(): + return False for name in ("requirements.txt", "requirements3.txt"): requirements_txt = self.binder_path(name) From c9a40b4b2b77fc148dedb3f2b4d12f17ea2e067d Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 24 Nov 2025 11:45:52 +0100 Subject: [PATCH 211/299] Allow Python buildpack to select Python version that satisfies requires-python --- repo2docker/buildpacks/conda/freeze.py | 4 ++- .../conda/supported_python_version.py | 1 + repo2docker/buildpacks/python/__init__.py | 34 ++++++++++++++----- 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 repo2docker/buildpacks/conda/supported_python_version.py diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index 456ceb775..c4fb7bb19 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -17,6 +17,8 @@ from ruamel.yaml import YAML +from .supported_python_version import SUPPORTED_PYTHON_VERSION + UTC = timezone.utc HERE = pathlib.Path(os.path.dirname(os.path.abspath(__file__))) @@ -114,7 +116,7 @@ def set_python(py_env_file, py): "py", nargs="*", help="Python version(s) to update and freeze", - default=("3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"), + default=SUPPORTED_PYTHON_VERSION, ) parser.add_argument( "platform", diff --git a/repo2docker/buildpacks/conda/supported_python_version.py b/repo2docker/buildpacks/conda/supported_python_version.py new file mode 100644 index 000000000..0a07edf72 --- /dev/null +++ b/repo2docker/buildpacks/conda/supported_python_version.py @@ -0,0 +1 @@ +SUPPORTED_PYTHON_VERSION = ("3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14") diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 8e8786f1e..e2ad1e9d9 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -1,7 +1,6 @@ """Generates Dockerfiles based on an input matrix based on Python.""" import os -import re from functools import lru_cache try: @@ -9,11 +8,12 @@ except ImportError: import tomli as tomllib -from packaging.specifiers import InvalidSpecifier, SpecifierSet +from packaging.specifiers import SpecifierSet from packaging.version import Version from ...utils import is_local_pip_requirement, open_guess_encoding from ..conda import CondaBuildPack +from ..conda.supported_python_version import SUPPORTED_PYTHON_VERSION class PythonBuildPack(CondaBuildPack): @@ -39,9 +39,6 @@ def python_version(self): if name is None or version is None: self._python_version = self.major_pythons["3"] self._python_version_source = "default" - self.log.warning( - f"Python version unspecified, using current default Python version {self._python_version}. This will change in the future." - ) else: if len(Version(version).release) <= 1: self._python_version = self.major_pythons[version] @@ -52,6 +49,8 @@ def python_version(self): runtime_version = Version(self._python_version) + # pyproject.toml can be used by some tools for minimum version of Python + # even if the Git repository is not a Python package. pyproject_toml = "pyproject.toml" if not self.binder_dir and os.path.exists(pyproject_toml): with open(pyproject_toml, "rb") as _pyproject_file: @@ -65,9 +64,28 @@ def python_version(self): ) if runtime_version not in pyproject_python_specifier: - raise RuntimeError( - "runtime.txt version not supported by pyproject.toml." - ) + # repo2docker MUST honor the user decision in runtime.txt + if self._python_version_source == "runtime": + raise RuntimeError( + "runtime.txt version not supported by pyproject.toml." + ) + # repo2docker tries to find a new suitable version + else: + possible_python_versions = list( + pyproject_python_specifier.filter(SUPPORTED_PYTHON_VERSION) + ) + if possible_python_versions: + self._python_version = possible_python_versions[-1] + self._python_version_source = "fallback" + else: + raise RuntimeError( + "repo2docker does not support a Python version compatible with pyproject.toml." + ) + + if self._python_version_source in ["default", "fallback"]: + self.log.warning( + f"Python version unspecified, using Python version {self._python_version}. This will change in the future." + ) return self._python_version From f1aa3568eecfc37023c26e08014f9beaf56eca10 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Mon, 24 Nov 2025 16:22:48 +0200 Subject: [PATCH 212/299] Write logs to tmp location if there's no disk left --- repo2docker/buildpacks/repo2docker-entrypoint | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/repo2docker/buildpacks/repo2docker-entrypoint b/repo2docker/buildpacks/repo2docker-entrypoint index 0ac72778b..a9acbee7b 100755 --- a/repo2docker/buildpacks/repo2docker-entrypoint +++ b/repo2docker/buildpacks/repo2docker-entrypoint @@ -6,6 +6,7 @@ # - preserve signal handling of subprocess (kill -TERM and friends) # - tee output to a log file +import errno import fcntl import os import select @@ -30,21 +31,20 @@ def main(): # 2. current working directory: "." # 3. default temp directory for the OS (e.g. /tmp for linux) log_dirs = [".", tempfile.gettempdir()] - log_file = None + # list of valid log files, in order of preference + valid_log_files = [] if "REPO_DIR" in os.environ: log_dirs.insert(0, os.environ["REPO_DIR"]) for d in log_dirs: log_path = os.path.join(d, ".jupyter-server-log.txt") try: log_file = open(log_path, "ab") + valid_log_files.append(log_file) except Exception: continue - else: - # success - break - # raise Exception if log_file could not be set - if log_file is None: - raise Exception("Could not open '.jupyter-server-log.txt' log file " ) + # raise Exception if no log_file could be set + if not log_file: + raise Exception("Could not open '.jupyter-server-log.txt' log file") # build the command # like `exec "$@"` @@ -73,12 +73,28 @@ def main(): for signum in SIGNALS: signal.signal(signum, relay_signal) - # tee output from child to both our stdout and the log file + # tee output from child to both our stdout and the most preferred log file def tee(chunk): - """Tee output from child to both our stdout and the log file""" - for f in [sys.stdout.buffer, log_file]: - f.write(chunk) - f.flush() + """ + Tee output from child to both our stdout and the most preferred + log file + """ + valid_log_files.insert(0, sys.stdout.buffer) + for log_file_idx, f in enumerate(valid_log_files): + try: + f.write(chunk) + f.flush() + except OSError as e: + # if we cannot write to the most preferred log file because of + # lack of space, continue with the other options and don't + # error out + if e.errno == errno.ENOSPC: + continue + else: + # if this is the second location we're writing the logs too, + # break, as we've found our preferred log file + if log_file_idx > 0: + break # make stdout pipe non-blocking # this means child.stdout.read(nbytes) From 835e613385c4e1ee42e40fe481e6deced407c391 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Tue, 25 Nov 2025 12:31:59 +0200 Subject: [PATCH 213/299] Just stop writing the logs if we run out of space --- repo2docker/buildpacks/repo2docker-entrypoint | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/repo2docker/buildpacks/repo2docker-entrypoint b/repo2docker/buildpacks/repo2docker-entrypoint index a9acbee7b..0a3e39d75 100755 --- a/repo2docker/buildpacks/repo2docker-entrypoint +++ b/repo2docker/buildpacks/repo2docker-entrypoint @@ -31,20 +31,21 @@ def main(): # 2. current working directory: "." # 3. default temp directory for the OS (e.g. /tmp for linux) log_dirs = [".", tempfile.gettempdir()] - # list of valid log files, in order of preference - valid_log_files = [] + log_file = None if "REPO_DIR" in os.environ: log_dirs.insert(0, os.environ["REPO_DIR"]) for d in log_dirs: log_path = os.path.join(d, ".jupyter-server-log.txt") try: log_file = open(log_path, "ab") - valid_log_files.append(log_file) except Exception: continue - # raise Exception if no log_file could be set - if not log_file: - raise Exception("Could not open '.jupyter-server-log.txt' log file") + else: + # success + break + # raise Exception if log_file could not be set + if log_file is None: + raise Exception("Could not open '.jupyter-server-log.txt' log file " ) # build the command # like `exec "$@"` @@ -73,28 +74,23 @@ def main(): for signum in SIGNALS: signal.signal(signum, relay_signal) - # tee output from child to both our stdout and the most preferred log file + enospc = { + sys.stdout.buffer: False, + log_file: False + } + + # tee output from child to both our stdout and the log file def tee(chunk): - """ - Tee output from child to both our stdout and the most preferred - log file - """ - valid_log_files.insert(0, sys.stdout.buffer) - for log_file_idx, f in enumerate(valid_log_files): - try: - f.write(chunk) - f.flush() - except OSError as e: - # if we cannot write to the most preferred log file because of - # lack of space, continue with the other options and don't - # error out - if e.errno == errno.ENOSPC: - continue - else: - # if this is the second location we're writing the logs too, - # break, as we've found our preferred log file - if log_file_idx > 0: - break + """Tee output from child to the log file""" + for f in [sys.stdout.buffer, log_file]: + if not enospc[f]: + try: + f.write(chunk) + f.flush() + except OSError as e: + if e.errno == errno.ENOSPC: + enospc[f] = True + continue # make stdout pipe non-blocking # this means child.stdout.read(nbytes) From 1a571bd172e23fb782ea2c674fa5dcc5f9ac5a59 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Tue, 25 Nov 2025 12:50:21 +0200 Subject: [PATCH 214/299] Rename, add docstrings and close file --- repo2docker/buildpacks/repo2docker-entrypoint | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/repo2docker/buildpacks/repo2docker-entrypoint b/repo2docker/buildpacks/repo2docker-entrypoint index 0a3e39d75..d33e634bb 100755 --- a/repo2docker/buildpacks/repo2docker-entrypoint +++ b/repo2docker/buildpacks/repo2docker-entrypoint @@ -45,7 +45,7 @@ def main(): break # raise Exception if log_file could not be set if log_file is None: - raise Exception("Could not open '.jupyter-server-log.txt' log file " ) + raise Exception("Could not open '.jupyter-server-log.txt' log file") # build the command # like `exec "$@"` @@ -74,23 +74,27 @@ def main(): for signum in SIGNALS: signal.signal(signum, relay_signal) - enospc = { - sys.stdout.buffer: False, - log_file: False + # keep a record of the output streams that ran out space + writable = { + sys.stdout.buffer: True, + log_file: True } # tee output from child to both our stdout and the log file def tee(chunk): - """Tee output from child to the log file""" + """Tee output from child to both our stdout and the log file""" for f in [sys.stdout.buffer, log_file]: - if not enospc[f]: + if writable[f]: try: f.write(chunk) f.flush() except OSError as e: if e.errno == errno.ENOSPC: - enospc[f] = True + # mark the stream as not writable anymore + writable[f] = False continue + else: + raise # make stdout pipe non-blocking # this means child.stdout.read(nbytes) @@ -118,6 +122,8 @@ def main(): tee(chunk) chunk = child.stdout.read() + log_file.close() + # make our returncode match the child's returncode sys.exit(child.returncode) From 84145870cfc701e454b7a23aaec431fa6cde7652 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 05:23:22 +0000 Subject: [PATCH 215/299] Bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index cbaf04841..8cadb93d3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7101bf6f0..1bac8f282 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: build-n-publish: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.13" @@ -86,7 +86,7 @@ jobs: echo "Publishing to $REGISTRY" # git requires the full git history for non-tags - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f62facf04..0cc24a9e8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -75,7 +75,7 @@ jobs: repo_type: venv steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: From 996b0427acf40fc097ddcd459bc427ec59ac719a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:31:11 +0000 Subject: [PATCH 216/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.21.0 → v3.21.2](https://github.com/asottile/pyupgrade/compare/v3.21.0...v3.21.2) - [github.com/psf/black-pre-commit-mirror: 25.9.0 → 25.11.0](https://github.com/psf/black-pre-commit-mirror/compare/25.9.0...25.11.0) - [github.com/rbubley/mirrors-prettier: v3.6.2 → v3.7.3](https://github.com/rbubley/mirrors-prettier/compare/v3.6.2...v3.7.3) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 88a5b1edf..0d278b5d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: # Autoformat: Python code, syntax patterns are modernized - repo: https://github.com/asottile/pyupgrade - rev: v3.21.0 + rev: v3.21.2 hooks: - id: pyupgrade # check-tmp is a Python based test script run in created environments @@ -21,7 +21,7 @@ repos: # Autoformat: Python code - repo: https://github.com/psf/black-pre-commit-mirror - rev: 25.9.0 + rev: 25.11.0 hooks: - id: black @@ -33,7 +33,7 @@ repos: # Autoformat: markdown - repo: https://github.com/rbubley/mirrors-prettier - rev: v3.6.2 + rev: v3.7.3 hooks: - id: prettier files: ".md" From b2c5fb87d57adbdd762fcebfc952d0ebbb4d78fc Mon Sep 17 00:00:00 2001 From: Georgiana Date: Thu, 4 Dec 2025 14:31:25 +0200 Subject: [PATCH 217/299] Update link for creating a release --- RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index abc38f61f..f9a3eedde 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1 +1 @@ -See https://repo2docker.readthedocs.io/en/latest/contributing/tasks.html#creating-a-release +See https://repo2docker.readthedocs.io/en/latest/contribute/tasks/#creating-a-release From 9b287fb5e6391cbefb696a72a7b26e3042d4c633 Mon Sep 17 00:00:00 2001 From: Wes Turner <50891+westurner@users.noreply.github.com> Date: Wed, 15 Jan 2025 08:18:56 -0500 Subject: [PATCH 218/299] BUG: COPY --chmod=0755 /usr/local/bin/{python3-login,repo2docker-entrypoint} to support rootless podman Command this is building with (though repo2podman doesn't yet support volumes) ```sh repo2docker --engine=podman -E -P --debug -e NB_USER=jovyan -e NB_UID=1000 --user-name=jovyan . ``` --- repo2docker/buildpacks/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index 74bfa3311..309648cf3 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -187,8 +187,8 @@ # Add entrypoint ENV PYTHONUNBUFFERED=1 -COPY /python3-login /usr/local/bin/python3-login -COPY /repo2docker-entrypoint /usr/local/bin/repo2docker-entrypoint +COPY --chmod=0755 /python3-login /usr/local/bin/python3-login +COPY --chmod=0755 /repo2docker-entrypoint /usr/local/bin/repo2docker-entrypoint ENTRYPOINT ["/usr/local/bin/repo2docker-entrypoint"] # Specify the default command to run From 345a890366f609ccdd66b3c1d20f7857366996a0 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 8 Dec 2025 10:31:57 -0800 Subject: [PATCH 219/299] add redirects for PR 1433 avoid breaking links --- docs/source/conf.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index 03a2697a2..2105b87ac 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -138,4 +138,14 @@ rediraffe_branch = "main" rediraffe_redirects = { # "old-file": "new-folder/new-file-name", + "config_files.rst": "configuration/index.md", + "install.rst": "start.md", + "usage.rst": "use/index.md", + "contributing/buildpack.md": "contribute/buildpack.md", + "contributing/contentprovider.rst": "contribute/contentprovider.rst", + "contributing/contributing.md": "contribute/contributing.md", + "contributing/index.md": "contribute/index.md", + "contributing/roadmap.md": "contribute/roadmap.md", + "contributing/tasks.md": "contribute/tasks.md", + "getting-started/index.md": "use/index.md", } From 039df2bbfc5f165e80524f27acd9af735cb09100 Mon Sep 17 00:00:00 2001 From: Daksh Bajaj Date: Tue, 9 Dec 2025 00:32:14 +0530 Subject: [PATCH 220/299] Fix lint warnings in simple test Dockerfile --- tests/dockerfile/simple/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/dockerfile/simple/Dockerfile b/tests/dockerfile/simple/Dockerfile index 492446360..a3e44b5c5 100644 --- a/tests/dockerfile/simple/Dockerfile +++ b/tests/dockerfile/simple/Dockerfile @@ -2,11 +2,11 @@ FROM python:3.10 RUN pip install --no-cache notebook -CMD "/bin/sh" +CMD ["/bin/sh"] ADD sayhi.sh /usr/local/bin/sayhi.sh ADD verify verify ARG NB_UID -ENV HOME /tmp +ENV HOME=/tmp USER $NB_UID From f54386b0b40aacb4b699ee41e4e0bd45867b1098 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Tue, 9 Dec 2025 18:36:02 +0200 Subject: [PATCH 221/299] New release --- docs/source/changelog.md | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index c6d9b7b79..0673647c7 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -5,6 +5,78 @@ `RBuildPack.runtime` previously returned the contents of `runtime.txt` as a string. It has been replaced by `BuildPack.runtime` which returns a tuple `(name, version, date)`. +## 2025.12.09 + +([full changelog](https://github.com/jupyterhub/repo2docker/compare/6cf91e45d5b03f79e365cd82eda09d1178d03327...b796c5a6189f70cabc3c7be1d206b752c515fa2b)) + +## API and Breaking Changes + +- require Python 3.10 [#1481](https://github.com/jupyterhub/repo2docker/pull/1481) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics), [@rgaiacs](https://github.com/rgaiacs)) +- Support pyproject.toml for pip install in Python buildpack [#1444](https://github.com/jupyterhub/repo2docker/pull/1444) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- Add --vanilla to R call [#1432](https://github.com/jupyterhub/repo2docker/pull/1432) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics), [@consideRatio](https://github.com/consideRatio)) +- Change default R version from 4.2 to 4.4 [#1401](https://github.com/jupyterhub/repo2docker/pull/1401) ([@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) + +## Enhancements made + +- fetch dataverse installations at runtime [#1479](https://github.com/jupyterhub/repo2docker/pull/1479) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- Add Python 3.14 [#1475](https://github.com/jupyterhub/repo2docker/pull/1475) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk)) +- Bump mamba from 2.1.0 to 2.3.3, conda from 24.11.0 to 25.9.1 [#1465](https://github.com/jupyterhub/repo2docker/pull/1465) ([@weiji14](https://github.com/weiji14), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- add support for R 4.5.1 [#1460](https://github.com/jupyterhub/repo2docker/pull/1460) ([@shaneknapp](https://github.com/shaneknapp), [@yuvipanda](https://github.com/yuvipanda)) +- build: migrate from setup.py to pyproject.toml [#1458](https://github.com/jupyterhub/repo2docker/pull/1458) ([@lixiname](https://github.com/lixiname), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs)) +- Add check for docker buildx [#1457](https://github.com/jupyterhub/repo2docker/pull/1457) ([@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) +- Support pyproject.toml for pip install in Python buildpack [#1444](https://github.com/jupyterhub/repo2docker/pull/1444) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- COPY --chmod=0755 /usr/local/bin/{python3-login,repo2docker-entrypoint} for rootless podman [#1395](https://github.com/jupyterhub/repo2docker/pull/1395) ([@westurner](https://github.com/westurner), [@minrk](https://github.com/minrk)) + +## Bugs fixed + +- Don't error out if there's no disk space left when writing the logs [#1489](https://github.com/jupyterhub/repo2docker/pull/1489) ([@GeorgianaElena](https://github.com/GeorgianaElena), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) +- Fix the HydroShare download url [#1488](https://github.com/jupyterhub/repo2docker/pull/1488) ([@sblack-usu](https://github.com/sblack-usu), [@rgaiacs](https://github.com/rgaiacs)) +- Updating conda buildpacks for Python == 3.13 [#1476](https://github.com/jupyterhub/repo2docker/pull/1476) ([@rgaiacs](https://github.com/rgaiacs)) +- Always call `ContainerEngine.build()` when `push`ing [#1464](https://github.com/jupyterhub/repo2docker/pull/1464) ([@manics](https://github.com/manics), [@rgaiacs](https://github.com/rgaiacs)) +- Fail earlier when user try to install future version of R [#1456](https://github.com/jupyterhub/repo2docker/pull/1456) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- Replace --vanilla with --no-init-file [#1451](https://github.com/jupyterhub/repo2docker/pull/1451) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics)) + +## Maintenance and upkeep improvements + +- [pre-commit.ci] pre-commit autoupdate [#1491](https://github.com/jupyterhub/repo2docker/pull/1491) ([@minrk](https://github.com/minrk)) +- [pre-commit.ci] pre-commit autoupdate [#1484](https://github.com/jupyterhub/repo2docker/pull/1484) ([@minrk](https://github.com/minrk)) +- [pre-commit.ci] pre-commit autoupdate [#1473](https://github.com/jupyterhub/repo2docker/pull/1473) ([@minrk](https://github.com/minrk)) +- Delete gitpod config [#1472](https://github.com/jupyterhub/repo2docker/pull/1472) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk)) +- Add base environment for Python 3.13 [#1447](https://github.com/jupyterhub/repo2docker/pull/1447) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics)) +- Add note on root users and make postbuild actions more discoverable [#1436](https://github.com/jupyterhub/repo2docker/pull/1436) ([@choldgraf](https://github.com/choldgraf), [@yuvipanda](https://github.com/yuvipanda), [@chuckwondo](https://github.com/chuckwondo), [@rgaiacs](https://github.com/rgaiacs)) +- Move `runtime.txt` parsing into base class [#1428](https://github.com/jupyterhub/repo2docker/pull/1428) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs)) +- Stop using datetime.utcnow() to fix warning [#1406](https://github.com/jupyterhub/repo2docker/pull/1406) ([@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- [pre-commit.ci] pre-commit autoupdate [#1394](https://github.com/jupyterhub/repo2docker/pull/1394) ([@yuvipanda](https://github.com/yuvipanda)) + +## Documentation improvements + +- Update link for creating a release [#1492](https://github.com/jupyterhub/repo2docker/pull/1492) ([@GeorgianaElena](https://github.com/GeorgianaElena), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs)) +- Add item to FAQ regarding rootless mode [#1485](https://github.com/jupyterhub/repo2docker/pull/1485) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics)) +- Fix broken readme doc links [#1466](https://github.com/jupyterhub/repo2docker/pull/1466) ([@agitter](https://github.com/agitter), [@minrk](https://github.com/minrk)) +- Add missing 2025.08.0 release in changelog [#1462](https://github.com/jupyterhub/repo2docker/pull/1462) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics)) +- fix broken links in `CONTRIBUTING.md` [#1461](https://github.com/jupyterhub/repo2docker/pull/1461) ([@shaneknapp](https://github.com/shaneknapp), [@rgaiacs](https://github.com/rgaiacs)) +- Improve documentation index page [#1445](https://github.com/jupyterhub/repo2docker/pull/1445) ([@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) +- Minor improvements to documentation [#1442](https://github.com/jupyterhub/repo2docker/pull/1442) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) +- Avoid jupyter-repo2docker in the commad line [#1438](https://github.com/jupyterhub/repo2docker/pull/1438) ([@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) +- Simplify our release docs [#1434](https://github.com/jupyterhub/repo2docker/pull/1434) ([@choldgraf](https://github.com/choldgraf), [@yuvipanda](https://github.com/yuvipanda), [@minrk](https://github.com/minrk)) +- Revamp our documentation and refactor a bit [#1433](https://github.com/jupyterhub/repo2docker/pull/1433) ([@choldgraf](https://github.com/choldgraf), [@chuckwondo](https://github.com/chuckwondo), [@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda)) + +## Continuous integration improvements + +- Bump actions/checkout from 5 to 6 [#1490](https://github.com/jupyterhub/repo2docker/pull/1490) ([@manics](https://github.com/manics)) +- Bump actions/upload-artifact from 4 to 5 [#1482](https://github.com/jupyterhub/repo2docker/pull/1482) ([@manics](https://github.com/manics)) +- Bump actions/setup-python from 5 to 6 [#1470](https://github.com/jupyterhub/repo2docker/pull/1470) ([@consideRatio](https://github.com/consideRatio)) +- Bump actions/checkout from 4 to 5 [#1469](https://github.com/jupyterhub/repo2docker/pull/1469) ([@consideRatio](https://github.com/consideRatio)) + +## Contributors to this release + +The following people contributed discussions, new ideas, code and documentation contributions, and review. +See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports). + +([GitHub contributors page for this release](https://github.com/jupyterhub/repo2docker/graphs/contributors?from=2025-08-01&to=2025-12-09&type=c)) + +@agitter ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aagitter+updated%3A2025-08-01..2025-12-09&type=Issues)) | @choldgraf ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Acholdgraf+updated%3A2025-08-01..2025-12-09&type=Issues)) | @chuckwondo ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Achuckwondo+updated%3A2025-08-01..2025-12-09&type=Issues)) | @consideRatio ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AconsideRatio+updated%3A2025-08-01..2025-12-09&type=Issues)) | @GeorgianaElena ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AGeorgianaElena+updated%3A2025-08-01..2025-12-09&type=Issues)) | @lixiname ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Alixiname+updated%3A2025-08-01..2025-12-09&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Amanics+updated%3A2025-08-01..2025-12-09&type=Issues)) | @matthewfeickert ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Amatthewfeickert+updated%3A2025-08-01..2025-12-09&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aminrk+updated%3A2025-08-01..2025-12-09&type=Issues)) | @rgaiacs ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Argaiacs+updated%3A2025-08-01..2025-12-09&type=Issues)) | @sblack-usu ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Asblack-usu+updated%3A2025-08-01..2025-12-09&type=Issues)) | @shaneknapp ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ashaneknapp+updated%3A2025-08-01..2025-12-09&type=Issues)) | @weiji14 ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aweiji14+updated%3A2025-08-01..2025-12-09&type=Issues)) | @westurner ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Awesturner+updated%3A2025-08-01..2025-12-09&type=Issues)) | @yuvipanda ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ayuvipanda+updated%3A2025-08-01..2025-12-09&type=Issues)) + ## 2025.08.0 ([full changelog](https://github.com/jupyterhub/repo2docker/compare/4da768765372c602c06606cb79d21a398fcc2987...6cf91e45d5b03f79e365cd82eda09d1178d03327)) From 091a75ec2faed7ee89204302d082a00c1c30b872 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Tue, 9 Dec 2025 18:36:14 +0200 Subject: [PATCH 222/299] Update the release process --- docs/source/contribute/tasks.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/source/contribute/tasks.md b/docs/source/contribute/tasks.md index 7346c44c5..dc14ae255 100644 --- a/docs/source/contribute/tasks.md +++ b/docs/source/contribute/tasks.md @@ -119,13 +119,14 @@ and pushed to the repository. See [previous releases](https://github.com/jupyter To create a new release, follow these steps: +- Add the output of `github-activity` between now and last release, to the changelog and open a PR with this content + - E.g. the activity since the date of the last release: `github-activity jupyterhub/repo2docker -s 2025-08-01` - Go to the [GitHub repository](https://github.com/jupyterhub/repo2docker) - Click `Draft a new release` - Click `Tag` - Type in a new tag like `YYYY.MM.N` (where `N` is the release number this month, usually it is `0`) - Title: ` ` (E.g., `August 2025`) -- Body: Paste the output of `github-activity` since the date of the last release. - - E.g. `github-activity jupyterhub/repo2docker -s 2025-08-01 +- Body: Paste the `github-activity` output from the changelog - Click `Publish release` This will create a new release **and a new tag**. From 54fff4f3cdd8f02f0530a0a74f0442b2cbacd5c7 Mon Sep 17 00:00:00 2001 From: Georgiana Date: Wed, 10 Dec 2025 13:52:52 +0200 Subject: [PATCH 223/299] Fix version number Co-authored-by: Min RK --- docs/source/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index 0673647c7..09d0d323c 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -5,7 +5,7 @@ `RBuildPack.runtime` previously returned the contents of `runtime.txt` as a string. It has been replaced by `BuildPack.runtime` which returns a tuple `(name, version, date)`. -## 2025.12.09 +## 2025.12.0 ([full changelog](https://github.com/jupyterhub/repo2docker/compare/6cf91e45d5b03f79e365cd82eda09d1178d03327...b796c5a6189f70cabc3c7be1d206b752c515fa2b)) From b896b00ac6eaf4277e0ea65422e095953610c5e4 Mon Sep 17 00:00:00 2001 From: Georgiana Dolocan Date: Wed, 10 Dec 2025 14:08:59 +0200 Subject: [PATCH 224/299] Mark the PR as a breaking change --- docs/source/changelog.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/source/changelog.md b/docs/source/changelog.md index 09d0d323c..f6746915e 100644 --- a/docs/source/changelog.md +++ b/docs/source/changelog.md @@ -1,10 +1,5 @@ # Changelog -## Unreleased breaking changes - -`RBuildPack.runtime` previously returned the contents of `runtime.txt` as a string. -It has been replaced by `BuildPack.runtime` which returns a tuple `(name, version, date)`. - ## 2025.12.0 ([full changelog](https://github.com/jupyterhub/repo2docker/compare/6cf91e45d5b03f79e365cd82eda09d1178d03327...b796c5a6189f70cabc3c7be1d206b752c515fa2b)) @@ -15,6 +10,7 @@ It has been replaced by `BuildPack.runtime` which returns a tuple `(name, versio - Support pyproject.toml for pip install in Python buildpack [#1444](https://github.com/jupyterhub/repo2docker/pull/1444) ([@rgaiacs](https://github.com/rgaiacs), [@minrk](https://github.com/minrk), [@manics](https://github.com/manics), [@yuvipanda](https://github.com/yuvipanda)) - Add --vanilla to R call [#1432](https://github.com/jupyterhub/repo2docker/pull/1432) ([@rgaiacs](https://github.com/rgaiacs), [@manics](https://github.com/manics), [@consideRatio](https://github.com/consideRatio)) - Change default R version from 4.2 to 4.4 [#1401](https://github.com/jupyterhub/repo2docker/pull/1401) ([@rgaiacs](https://github.com/rgaiacs), [@yuvipanda](https://github.com/yuvipanda), [@manics](https://github.com/manics)) +- Move `runtime.txt` parsing into base class [#1428](https://github.com/jupyterhub/repo2docker/pull/1428) ([@manics](https://github.com/manics), [@minrk](https://github.com/minrk), [@rgaiacs](https://github.com/rgaiacs)) ## Enhancements made From 2ad48234f0119631bbf490a81c9d8fb1d79546ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jan 2026 05:01:25 +0000 Subject: [PATCH 225/299] Bump actions/upload-artifact from 5 to 6 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1bac8f282..e185299f4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: ls -l dist # ref: https://github.com/actions/upload-artifact#readme - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 with: name: repo2docker-${{ github.sha }} path: "dist/*" From 48969c270c66672e7050412bf0b7f35e41a6620f Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 5 Jan 2026 12:18:20 +0100 Subject: [PATCH 226/299] Fix typo in pyproject.toml file name Closes https://github.com/jupyterhub/repo2docker/issues/1498 --- repo2docker/buildpacks/python/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index e2ad1e9d9..e5db6f9b4 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -155,7 +155,7 @@ def _is_python_package(self): if os.path.exists("setup.py"): return True if os.path.exists("pyproject.toml"): - with open("pyproject_toml", "rb") as _pyproject_file: + with open("pyproject.toml", "rb") as _pyproject_file: pyproject = tomllib.load(_pyproject_file) if ("project" in pyproject) and ("build-system" in pyproject): From fb599ceefb6cf608f385ca753e9b5e1bab71893c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:09:29 +0000 Subject: [PATCH 227/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 25.11.0 → 25.12.0](https://github.com/psf/black-pre-commit-mirror/compare/25.11.0...25.12.0) - [github.com/rbubley/mirrors-prettier: v3.7.3 → v3.7.4](https://github.com/rbubley/mirrors-prettier/compare/v3.7.3...v3.7.4) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0d278b5d8..c632f7d19 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: # Autoformat: Python code - repo: https://github.com/psf/black-pre-commit-mirror - rev: 25.11.0 + rev: 25.12.0 hooks: - id: black @@ -33,7 +33,7 @@ repos: # Autoformat: markdown - repo: https://github.com/rbubley/mirrors-prettier - rev: v3.7.3 + rev: v3.7.4 hooks: - id: prettier files: ".md" From 4ae4be0195a18b8dbfd56cf413b03ca452a73c41 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 1 Oct 2025 14:55:29 +0200 Subject: [PATCH 228/299] Add support to DockerEngine --- repo2docker/docker.py | 46 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 984c074dd..f17421303 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -13,7 +13,7 @@ from pathlib import Path from iso8601 import parse_date -from traitlets import Dict, List, Unicode +from traitlets import Dict, List, Unicode, default import docker @@ -66,6 +66,35 @@ class DockerEngine(ContainerEngine): string_output = True + cli = Unicode( + "", + help=""" + The commandline for Docker. + """, + config=True, + ) + + @default("cli") + def _default_cli(self): + for cli in ["docker", "podman"]: + docker_version = subprocess.run([cli, "version"]) + if docker_version.returncode == 0: + docker_cli = cli + break + else: + raise RuntimeError("The docker or podman commandline client must be installed") + + # docker buildx is based in a plugin that might not be installed + # https://github.com/docker/buildx + # + # podman buildx command is an alias of podman build. + # Not all buildx build features are available in Podman. + docker_buildx_version = subprocess.run([docker_cli, "buildx", "version"]) + if docker_buildx_version.returncode: + raise RuntimeError("The docker buildx plugin must be installed") + + return docker_cli + extra_init_args = Dict( {}, help=""" @@ -105,16 +134,7 @@ def build( platform=None, **kwargs, ): - if not shutil.which("docker"): - raise RuntimeError("The docker commandline client must be installed") - - # docker buildx is based in a plugin that might not be installed - # https://github.com/docker/buildx - docker_buildx_version = subprocess.run(["docker", "buildx", "version"]) - if docker_buildx_version.returncode: - raise RuntimeError("The docker buildx plugin must be installed") - - args = ["docker", "buildx", "build", "--progress", "plain"] + args = [self.cli, "buildx", "build", "--progress", "plain"] if load: if push: raise ValueError( @@ -171,7 +191,7 @@ def inspect_image(self, image): Return image configuration if it exists, otherwise None """ proc = subprocess.run( - ["docker", "image", "inspect", image], capture_output=True + [self.cli, "image", "inspect", image], capture_output=True ) if proc.returncode != 0: @@ -200,7 +220,7 @@ def docker_login(self, username, password, registry): try: subprocess.run( [ - "docker", + self.cli, "login", "--username", username, From 31088858e092e2e1c43589dde523737c30df3f93 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 1 Oct 2025 12:43:30 +0200 Subject: [PATCH 229/299] Use "container" instead of Docker when possible in index.md --- docs/source/index.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index 831b88776..fae2308a0 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -1,15 +1,19 @@ # Welcome to `repo2docker`'s documentation +```{important} +Despite the name, `repo2docker` can be used by container technology other than [Docker](https://docs.docker.com/engine/), for example [Podman](https://podman.io/). +``` + `repo2docker` lets you **reproducibly build and run user environment container images for interactive computing and data workflows from source code repositories**. Optionally, the container image can be pushed to a Docker registry. Also, `repo2docker` is the tool used to build container images for [JupyterHub](https://jupyterhub.readthedocs.io/en/stable/) and the tool used by [BinderHub](https://binderhub.readthedocs.io) to build images on demand. ::::{grid} :::{grid-item-card} 🔧 Build reproducible data science environments from repositories -Build a reproducible data science environment as a Docker image and execute code interactively. Use many [configuration files](#config-files) to control language, tools, and setup instructions. +Build a reproducible data science environment as a container image and execute code interactively. Use many [configuration files](#config-files) to control language, tools, and setup instructions. ::: :::{grid-item-card} 🚀 Deploy environments in JupyterHub or Binder -Push environment images to a Docker registry for re-use in data science environment services like [JupyterHub](https://jupyterhub.readthedocs.io) or [a Binder instance](https://mybinder.org), or for other communities to build upon your base environment. +Push environment images to a container registry for re-use in data science environment services like [JupyterHub](https://jupyterhub.readthedocs.io) or [a Binder instance](https://mybinder.org), or for other communities to build upon your base environment. ::: :::{grid-item-card} ☁️ Host repositories in many providers Host repositories in: a Git server like [GitHub](https://github.com/) or [GitLab](https://gitlab.com/), an open science repository like [Zenodo](https://zenodo.org) or [Figshare](https://figshare.com), a hosted data platform like a [Dataverse installation](https://dataverse.org/), an archive like the @@ -19,7 +23,7 @@ Host repositories in: a Git server like [GitHub](https://github.com/) or [GitLab ## What is a user environment container image and why would I build one with `repo2docker`? -A **user environment container image** contains the entire software environment that a user may access from an interactive data science session. For example, it might contain many **programming languages**, **software for data analysis**, or even **content files and datasets** available to anybody that accesses that environment. Container images are built with [Docker](https://www.docker.com/), a standard open source tool for defining, building, and deploying images. +A **user environment container image** contains the entire software environment that a user may access from an interactive data science session. For example, it might contain many **programming languages**, **software for data analysis**, or even **content files and datasets** available to anybody that accesses that environment. Container images are built in accordance with the spectifications published by the [Open Container Initiative](https://opencontainers.org/). Many data science platforms and services like [JupyterHub](https://jupyterhub.readthedocs.io) and [Binder](https://mybinder.org) launch interactive data science sessions **with a user environment container image attached**, meaning that the user gains access to whatever is in the container image. In short, this allows somebody to define and build the user image one time, in a way that users can reproducibly re-use many times. @@ -43,9 +47,9 @@ repo2docker It performs these steps: 1. Inspects the repository for [configuration files](#config-files). These will be used to build the environment needed to run the repository. -2. Builds a Docker image with an environment specified in these [configuration files](#config-files). +2. Builds a container image with an environment specified in these [configuration files](#config-files). 3. Runs the image to let you explore the repository interactively via Jupyter notebooks, RStudio, or many other interfaces (this is optional). -4. Pushes the images to a Docker registry so that it may be accessed remotely (this is optional). +4. Pushes the images to a container registry so that it may be accessed remotely (this is optional). [swhid]: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html @@ -55,7 +59,7 @@ Please report [bugs](https://github.com/jupyterhub/repo2docker/issues), ## Get started with `repo2docker` -This tutorial walks you through setting up `repo2docker`, building your first environment image, and running it locally with Docker. +This tutorial walks you through setting up `repo2docker`, building your first environment image, and running it locally with a container engine. ```{toctree} :maxdepth: 2 From 45c3fb36c09bfcb629f14af264f01f9291c5ab1c Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 1 Oct 2025 13:46:20 +0200 Subject: [PATCH 230/299] Use "container" instead of Docker when possible in start.md and add note about DOCKER_HOST environment variable. --- docs/source/start.md | 63 ++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/docs/source/start.md b/docs/source/start.md index ef5fe7d22..de1d5bada 100644 --- a/docs/source/start.md +++ b/docs/source/start.md @@ -2,34 +2,39 @@ This tutorial guides you through installing `repo2docker` and building your first environment image. -(install)= +## Prerequisite -## Install `repo2docker` +### Python -`repo2docker` requires Python 3.6 or above on Linux and macOS. +`repo2docker` requires Python 3.6 or above. -:::{admonition} Windows support is experimental +### Container Engine -This [article about using Windows and the WSL](https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly) (Windows Subsystem for Linux or -Bash on Windows) provides additional information about Windows and Docker. -::: +`repo2docker` requires a container engine compatible with the specification published by the [Open Container Initiative](https://opencontainers.org/). -### Prerequisite: Install Docker +#### Docker -Install [Docker](https://www.docker.com), as it is required to build Docker images. -The [Community Edition](https://docs.docker.com/install/) is available for free. +```{important} +Only the [Docker Engine](https://docs.docker.com/engine/) is an open source. [Docker Desktop](https://docs.docker.com/get-started/get-docker/) requires a license. +``` -Recent versions of Docker are recommended. +Follow [Docker's official installation steps](https://docs.docker.com/get-started/get-docker/). -### Install `repo2docker` with `pip` +#### Podman -```{warning} -The name of the package on [PyPI](https://pypi.org/) is [`jupyter-repo2docker`](https://pypi.org/project/jupyter-repo2docker/) instead of `repo2docker`. -``` +Follow [Podman's official installation steps](https://podman.io/docs/installation). -We recommend installing `repo2docker` with the `pip` tool: +And configure the `DOCKER_HOST` environment variable following [Podman's official procedure](https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable#procedure). -``` +(install)= + +## Install `repo2docker` + +### Install `repo2docker` with `pip` + +It is recommend to install `repo2docker` with the `pip` tool: + +```bash python3 -m pip install jupyter-repo2docker ``` @@ -37,12 +42,24 @@ python3 -m pip install jupyter-repo2docker ## Build a repository with `repo2docker` -Now that you've installed Docker and `repo2docker`, we can build a repository. -To do so, follow these steps. +Now that you've installed a container engine and `repo2docker`, you can build a repository. +To do so, continue following this guide. + +### Start the container engine + +Ensure that the container engine is running. -### Start Docker +#### Docker -Follow the [instructions for starting Docker](https://docs.docker.com/engine/daemon/start/) to start a Docker process. +Follow the [offcial instructions for starting Docker](https://docs.docker.com/engine/daemon/start/). + +#### Podman + +Run + +```bash +podman info +``` ### Build an image from a URL @@ -55,7 +72,7 @@ jupyter-repo2docker https://github.com/binder-examples/requirements You'll see `repo2docker` take the following actions: 1. Inspect the repository for [configuration files](#config-files). It will detect the `requirements.txt` file in the repository. -2. Build a Docker image using the configuration files. In this case, the `requirements.txt` file will correspond to a Python environment. +2. Build a container image using the configuration files. In this case, the `requirements.txt` file will correspond to a Python environment. 3. Run the image to let you explore the repository interactively. Click the link provided and you'll be taken to an interactive Jupyter Notebook interface where you can run commands interactively inside the environment. @@ -63,4 +80,4 @@ Click the link provided and you'll be taken to an interactive Jupyter Notebook i ## Learn more This is a simple example building an environment image for your repository. -To learn more about the kinds of source repositories, environments, and use-cases that repo2docker supports, see [the `repo2docker` user guide](./use/index.md). +To learn more about the kinds of source repositories, environments, and use-cases that `repo2docker` supports, see [the `repo2docker` user guide](./use/index.md). From 5f17fed76a097115bffc25e221879ac6e3872392 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:06:28 +0000 Subject: [PATCH 231/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/docker.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index f17421303..3b08c269a 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -82,17 +82,19 @@ def _default_cli(self): docker_cli = cli break else: - raise RuntimeError("The docker or podman commandline client must be installed") + raise RuntimeError( + "The docker or podman commandline client must be installed" + ) # docker buildx is based in a plugin that might not be installed # https://github.com/docker/buildx - # + # # podman buildx command is an alias of podman build. # Not all buildx build features are available in Podman. docker_buildx_version = subprocess.run([docker_cli, "buildx", "version"]) if docker_buildx_version.returncode: raise RuntimeError("The docker buildx plugin must be installed") - + return docker_cli extra_init_args = Dict( From 606cc873417d36244dda28014cd3ef96f0cb3170 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 6 Oct 2025 13:47:24 +0200 Subject: [PATCH 232/299] Auto configure container_cli property based on DOCKER_HOST --- repo2docker/docker.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 3b08c269a..8a46c3f34 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -66,36 +66,35 @@ class DockerEngine(ContainerEngine): string_output = True - cli = Unicode( - "", - help=""" - The commandline for Docker. - """, - config=True, - ) + _container_cli = None - @default("cli") - def _default_cli(self): - for cli in ["docker", "podman"]: - docker_version = subprocess.run([cli, "version"]) - if docker_version.returncode == 0: - docker_cli = cli - break + @property + def container_cli(self): + if self._container_cli is not None: + return self._container_cli + + docker_host = os.getenv("DOCKER_HOST") + if docker_host is not None and docker_host.find("podman") != -1: + cli = "podman" else: - raise RuntimeError( - "The docker or podman commandline client must be installed" - ) + cli = "docker" + + docker_version = subprocess.run([cli, "version"]) + if docker_version.returncode: + raise RuntimeError(f"The {cli} commandline client must be installed") # docker buildx is based in a plugin that might not be installed # https://github.com/docker/buildx # # podman buildx command is an alias of podman build. # Not all buildx build features are available in Podman. - docker_buildx_version = subprocess.run([docker_cli, "buildx", "version"]) + docker_buildx_version = subprocess.run([cli, "buildx", "version"]) if docker_buildx_version.returncode: raise RuntimeError("The docker buildx plugin must be installed") - return docker_cli + self._container_cli = cli + + return self._container_cli extra_init_args = Dict( {}, @@ -136,7 +135,7 @@ def build( platform=None, **kwargs, ): - args = [self.cli, "buildx", "build", "--progress", "plain"] + args = [self.container_cli, "buildx", "build", "--progress", "plain"] if load: if push: raise ValueError( @@ -193,7 +192,7 @@ def inspect_image(self, image): Return image configuration if it exists, otherwise None """ proc = subprocess.run( - [self.cli, "image", "inspect", image], capture_output=True + [self.container_cli, "image", "inspect", image], capture_output=True ) if proc.returncode != 0: @@ -222,7 +221,7 @@ def docker_login(self, username, password, registry): try: subprocess.run( [ - self.cli, + self.container_cli, "login", "--username", username, From d4fc92d11ab3a733edb584fa5a16db78e97ef7e5 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 6 Oct 2025 13:51:07 +0200 Subject: [PATCH 233/299] Add podman as container cli for GitHub Actions --- .github/workflows/test.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0cc24a9e8..8d586873f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,6 +53,9 @@ jobs: matrix: ubuntu_version: ["24.04"] python_version: ["3.13"] + container_cli: + - docker + - podman repo_type: - base - conda @@ -104,6 +107,10 @@ jobs: - name: Run pytest run: | + if [ "${{ matrix.container_cli }}" = "podman" ] + then + export DOCKER_HOST=unix://$(podman info --format '{{.Host.RemoteSocket.Path}}') + fi pytest --verbose --color=yes --durations=10 --cov=repo2docker tests/${{ matrix.repo_type }} - uses: codecov/codecov-action@v5 From d1985fb51d83101e0ac05e3c6d5cdd73cdd94a12 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 6 Oct 2025 14:23:20 +0200 Subject: [PATCH 234/299] Select correct hostname for Podman --- repo2docker/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 7a70a470d..dfb66f94b 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -588,7 +588,7 @@ def start_container(self): client = self.get_engine() docker_host = os.environ.get("DOCKER_HOST") - if docker_host: + if docker_host and docker_host.find("podman") != -1: host_name = urlparse(docker_host).hostname else: host_name = "127.0.0.1" From 905fe0b3274cd84477a01a10db82f4ea1630ce53 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 17 Oct 2025 09:04:31 +0200 Subject: [PATCH 235/299] Add note about Podman service to documentation --- docs/source/start.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/source/start.md b/docs/source/start.md index de1d5bada..8e136c5e6 100644 --- a/docs/source/start.md +++ b/docs/source/start.md @@ -24,7 +24,14 @@ Follow [Docker's official installation steps](https://docs.docker.com/get-starte Follow [Podman's official installation steps](https://podman.io/docs/installation). -And configure the `DOCKER_HOST` environment variable following [Podman's official procedure](https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable#procedure). +After complete the installation of Podman, + +1. creates a [listening service for Podman](https://docs.podman.io/en/latest/markdown/podman-system-service.1.html) by running + + ```bash + systemctl --user start podman.socket + ``` +1. configure the `DOCKER_HOST` environment variable following [Podman's official procedure](https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable#procedure). You might want to configure the `DOCKER_HOST` environment variable to persist in your `~/.bashrc`. (install)= From 080f61b85bfc1fabb96b57d99716874831ddecde Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 17 Oct 2025 09:05:22 +0200 Subject: [PATCH 236/299] Enable Podman socket during test --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8d586873f..75b0d9fe2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -109,6 +109,7 @@ jobs: run: | if [ "${{ matrix.container_cli }}" = "podman" ] then + systemctl --user start podman.socket export DOCKER_HOST=unix://$(podman info --format '{{.Host.RemoteSocket.Path}}') fi pytest --verbose --color=yes --durations=10 --cov=repo2docker tests/${{ matrix.repo_type }} From 916d3c13cda79ffbd3bfe31a0d2e19578ac055ac Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 07:05:47 +0000 Subject: [PATCH 237/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/start.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/start.md b/docs/source/start.md index 8e136c5e6..0c07a9322 100644 --- a/docs/source/start.md +++ b/docs/source/start.md @@ -31,6 +31,7 @@ After complete the installation of Podman, ```bash systemctl --user start podman.socket ``` + 1. configure the `DOCKER_HOST` environment variable following [Podman's official procedure](https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable#procedure). You might want to configure the `DOCKER_HOST` environment variable to persist in your `~/.bashrc`. (install)= From b0ad00b09cbe8b8698a7a609270171883a2645a8 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 17 Oct 2025 13:50:32 +0200 Subject: [PATCH 238/299] Avoid infinite loop in test --- tests/unit/test_editable.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/unit/test_editable.py b/tests/unit/test_editable.py index de4d6261e..5105e6d2b 100644 --- a/tests/unit/test_editable.py +++ b/tests/unit/test_editable.py @@ -38,7 +38,11 @@ def test_editable_by_host(): container = app.start_container() # give the container a chance to start + waiting_container_counter = 0 while container.status != "running": + if waiting_container_counter >= 60: + assert container.status == "running" + waiting_container_counter = waiting_container_counter + 1 time.sleep(1) try: From f05f420056712ca802cac53ed47bd3fce9c4c38c Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 17 Oct 2025 14:43:20 +0200 Subject: [PATCH 239/299] Hide output of "docker version" test --- repo2docker/docker.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 8a46c3f34..ff8cc9ef0 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -79,7 +79,7 @@ def container_cli(self): else: cli = "docker" - docker_version = subprocess.run([cli, "version"]) + docker_version = subprocess.run([cli, "version"], stdout=subprocess.DEVNULL) if docker_version.returncode: raise RuntimeError(f"The {cli} commandline client must be installed") @@ -88,7 +88,9 @@ def container_cli(self): # # podman buildx command is an alias of podman build. # Not all buildx build features are available in Podman. - docker_buildx_version = subprocess.run([cli, "buildx", "version"]) + docker_buildx_version = subprocess.run( + [cli, "buildx", "version"], stdout=subprocess.DEVNULL + ) if docker_buildx_version.returncode: raise RuntimeError("The docker buildx plugin must be installed") From 8d748037afb31fcaec148e162de3de86b5f619f7 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 17 Oct 2025 15:49:10 +0200 Subject: [PATCH 240/299] Add WorkingDir to bridge the gap with Podman --- repo2docker/docker.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index ff8cc9ef0..a35e605a6 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -201,7 +201,15 @@ def inspect_image(self, image): return None config = json.loads(proc.stdout.decode())[0] - return Image(tags=config["RepoTags"], config=config["Config"]) + tags = config["RepoTags"] + oci_image_configuration = config["Config"] + + # WorkingDir is optional but docker always include it. + # https://github.com/containers/podman/discussions/27313 + if "WorkingDir" not in oci_image_configuration: + oci_image_configuration["WorkingDir"] = "" + + return Image(tags=config["RepoTags"], config=oci_image_configuration) @contextmanager def docker_login(self, username, password, registry): From 7ac468a151ae83b19b21c52eb3fb64f910fe5b22 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 30 Oct 2025 10:15:45 +0100 Subject: [PATCH 241/299] Fix tests/unit/test_app.py::test_extra_buildx_build_args --- tests/unit/test_app.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 04ec9086d..149cb4291 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -1,3 +1,4 @@ +import os from tempfile import TemporaryDirectory from unittest.mock import patch @@ -57,7 +58,11 @@ def test_extra_buildx_build_args(repo_with_content): args, kwargs = execute_cmd.call_args cmd = args[0] - assert cmd[:3] == ["docker", "buildx", "build"] + docker_host = os.environ.get("DOCKER_HOST") + if docker_host and docker_host.find("podman") != -1: + assert cmd[:3] == ["podman", "buildx", "build"] + else: + assert cmd[:3] == ["docker", "buildx", "build"] # make sure it's inserted before the end assert "--check" in cmd[:-1] From 3027e2c54a5edec3c21395b0b36ed171b46ab446 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 3 Nov 2025 16:21:31 +0100 Subject: [PATCH 242/299] Make DOCKER_HOST more robust --- repo2docker/app.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index dfb66f94b..7ae0dbd43 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -588,8 +588,12 @@ def start_container(self): client = self.get_engine() docker_host = os.environ.get("DOCKER_HOST") - if docker_host and docker_host.find("podman") != -1: - host_name = urlparse(docker_host).hostname + if docker_host: + docker_host_parsed = urlparse(docker_host) + if docker_host_parsed.scheme == "unix": + host_name = "127.0.0.1" + else: + host_name = docker_host_parsed.hostname else: host_name = "127.0.0.1" self.hostname = host_name From e1807c5089739b940951d7e78c011ea7d159fc57 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 3 Nov 2025 16:21:59 +0100 Subject: [PATCH 243/299] Prefer to use attribute over internal variable --- repo2docker/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index 7ae0dbd43..2f1959db6 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -625,7 +625,7 @@ def start_container(self): "notebook", "--ip=0.0.0.0", f"--port={container_port}", - f"--ServerApp.custom_display_url=http://{host_name}:{host_port}", + f"--ServerApp.custom_display_url=http://{self.hostname}:{self.port}", "--ServerApp.default_url=/lab", ] else: From 07808e63b0190d98e2faa070a76bcf220320d257 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 4 Nov 2025 09:24:19 +0100 Subject: [PATCH 244/299] Minor improve to docker.py wrap --- repo2docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index a35e605a6..80e822b07 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -209,7 +209,7 @@ def inspect_image(self, image): if "WorkingDir" not in oci_image_configuration: oci_image_configuration["WorkingDir"] = "" - return Image(tags=config["RepoTags"], config=oci_image_configuration) + return Image(tags=tags, config=oci_image_configuration) @contextmanager def docker_login(self, username, password, registry): From f29e7debf68699796abed8846fb2c15218ea0ca2 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 5 Nov 2025 11:10:27 +0100 Subject: [PATCH 245/299] Expose DOCKER_CLI from docker.py --- repo2docker/docker.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 80e822b07..ab4fe8cc2 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -20,6 +20,12 @@ from .engine import Container, ContainerEngine, Image from .utils import execute_cmd +DOCKER_HOST = os.getenv("DOCKER_HOST") +if DOCKER_HOST is not None and DOCKER_HOST.find("podman") != -1: + DOCKER_CLI = "podman" +else: + DOCKER_CLI = "docker" + class DockerContainer(Container): def __init__(self, container): @@ -73,11 +79,7 @@ def container_cli(self): if self._container_cli is not None: return self._container_cli - docker_host = os.getenv("DOCKER_HOST") - if docker_host is not None and docker_host.find("podman") != -1: - cli = "podman" - else: - cli = "docker" + cli = DOCKER_CLI docker_version = subprocess.run([cli, "version"], stdout=subprocess.DEVNULL) if docker_version.returncode: From f73d2676bb2ff93b219f3704df6e01862c18e669 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 5 Nov 2025 11:17:07 +0100 Subject: [PATCH 246/299] Mark some tests with @pytest.mark.skipif because Podman does not support bind mount. Related to https://github.com/jupyterhub/repo2docker/issues/1483 --- tests/unit/test_editable.py | 5 +++++ tests/unit/test_users.py | 4 ++++ tests/unit/test_volumes.py | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/tests/unit/test_editable.py b/tests/unit/test_editable.py index 5105e6d2b..d0d261755 100644 --- a/tests/unit/test_editable.py +++ b/tests/unit/test_editable.py @@ -3,11 +3,15 @@ import tempfile import time +import pytest + from repo2docker.__main__ import make_r2d +from repo2docker.docker import DOCKER_CLI DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "dockerfile", "editable") +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Podman does NOT support bind mount") def test_editable(run_repo2docker): """Run a local repository in edit mode. Verify a new file has been created afterwards""" @@ -28,6 +32,7 @@ def test_editable(run_repo2docker): os.remove(newfile) +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Podman does NOT support bind mount") def test_editable_by_host(): """Test whether a new file created by the host environment, is detected in the container""" diff --git a/tests/unit/test_users.py b/tests/unit/test_users.py index 89bee96f9..074ea4aaf 100644 --- a/tests/unit/test_users.py +++ b/tests/unit/test_users.py @@ -9,7 +9,10 @@ from getpass import getuser from unittest import mock +import pytest + from repo2docker import Repo2Docker +from repo2docker.docker import DOCKER_CLI def test_automatic_username_deduction(): @@ -22,6 +25,7 @@ def test_automatic_username_deduction(): assert r2d.user_name == expected +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Podman does NOT support bind mount") def test_user(): """ Validate user id and name setting diff --git a/tests/unit/test_volumes.py b/tests/unit/test_volumes.py index 9e108ec82..b9a550c41 100644 --- a/tests/unit/test_volumes.py +++ b/tests/unit/test_volumes.py @@ -8,7 +8,12 @@ import time from getpass import getuser +import pytest +from repo2docker.docker import DOCKER_CLI + + +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Podman does NOT support bind mount") def test_volume_abspath(): """ Validate that you can bind mount a volume onto an absolute dir & write to it @@ -39,6 +44,7 @@ def test_volume_abspath(): assert f.read() == ts +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Podman does NOT support bind mount") def test_volume_relpath(): """ Validate that you can bind mount a volume onto an relative path & write to it From ba52252ae822c292c086593cb64ac678bc810d43 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 5 Nov 2025 14:26:05 +0100 Subject: [PATCH 247/299] Skip registry test for Podman --- tests/norun/test_registry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/norun/test_registry.py b/tests/norun/test_registry.py index 2b332a8e0..9be543b54 100644 --- a/tests/norun/test_registry.py +++ b/tests/norun/test_registry.py @@ -14,6 +14,7 @@ import requests from repo2docker.__main__ import make_r2d +from repo2docker.docker import DOCKER_CLI from repo2docker.utils import get_free_port HERE = Path(__file__).parent @@ -140,6 +141,7 @@ def registry(host_ip): proc.wait() +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Test specific for Docker") def test_registry_explicit_creds(registry, dind): """ Test that we can push to registry when given explicit credentials @@ -202,6 +204,7 @@ def test_registry_explicit_creds(registry, dind): os.environ.update(old_environ) +@pytest.mark.skipif(DOCKER_CLI == "podman", reason="Test specific for Docker") def test_registry_no_explicit_creds(registry, dind): """ Test that we can push to registry *without* explicit credentials but reading from a DOCKER_CONFIG From 7063a1fbbf7c26e2677f447cfa73725b71e1fe38 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 13 Nov 2025 09:54:13 +0100 Subject: [PATCH 248/299] Fix English mistakes in documentation Thanks to @maniacs for the review. --- docs/source/start.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/start.md b/docs/source/start.md index 0c07a9322..d2742d540 100644 --- a/docs/source/start.md +++ b/docs/source/start.md @@ -15,7 +15,7 @@ This tutorial guides you through installing `repo2docker` and building your firs #### Docker ```{important} -Only the [Docker Engine](https://docs.docker.com/engine/) is an open source. [Docker Desktop](https://docs.docker.com/get-started/get-docker/) requires a license. +Only the [Docker Engine](https://docs.docker.com/engine/) is open source. [Docker Desktop](https://docs.docker.com/get-started/get-docker/) requires a license. ``` Follow [Docker's official installation steps](https://docs.docker.com/get-started/get-docker/). @@ -24,9 +24,9 @@ Follow [Docker's official installation steps](https://docs.docker.com/get-starte Follow [Podman's official installation steps](https://podman.io/docs/installation). -After complete the installation of Podman, +After completing the installation of Podman, -1. creates a [listening service for Podman](https://docs.podman.io/en/latest/markdown/podman-system-service.1.html) by running +1. create a [listening service for Podman](https://docs.podman.io/en/latest/markdown/podman-system-service.1.html) by running ```bash systemctl --user start podman.socket From 308ac22aa17e4dc81a76b944bf4ff85fa45b7baf Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 13 Nov 2025 11:04:09 +0100 Subject: [PATCH 249/299] Reduce the number of tests for Podman --- .github/workflows/test.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 75b0d9fe2..187795203 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -76,6 +76,27 @@ jobs: - ubuntu_version: "24.04" python_version: "3.10" repo_type: venv + exclude: + # Run all tests for both Docker and Podman is expensive. + # We only run the "smoke" test for Podman. + - container_cli: podman + repo_type: external + - container_cli: podman + repo_type: julia + - container_cli: podman + repo_type: nix + - container_cli: podman + repo_type: pipfile + - container_cli: podman + repo_type: r + - container_cli: podman + repo_type: venv + - container_cli: podman + repo_type: contentproviders + - container_cli: podman + repo_type: norun + - container_cli: podman + repo_type: ui steps: - uses: actions/checkout@v6 From 37d2612eb7c932132e72ebef0e7bf68e877b03f7 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 4 Dec 2025 09:56:05 +0100 Subject: [PATCH 250/299] Add comment explaining DOCKER_HOST --- repo2docker/docker.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index ab4fe8cc2..581b9c0fb 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -20,7 +20,16 @@ from .engine import Container, ContainerEngine, Image from .utils import execute_cmd +# The DOCKER_HOST environment variable is used by Docker to set a remote host. +# The same DOCKER_HOST environment variable is also used +# by the official Software Development Kit (SDK) and other libraries +# as a way to select the socket to communicate with. +# Because repo2docker uses the official Docker SDK, +# Podman users MUST configure the DOCKER_HOST environment variable. DOCKER_HOST = os.getenv("DOCKER_HOST") +# It is possible for a user to create a Podman socket +# that does not include the string "podman" +# but expect the string "podman" is good enough for repo2docker use case. if DOCKER_HOST is not None and DOCKER_HOST.find("podman") != -1: DOCKER_CLI = "podman" else: From fee0b11bec1ec930899ede4e39b29a931e1a6096 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 4 Dec 2025 10:11:20 +0100 Subject: [PATCH 251/299] Guard subprocess.run() with try block Co-authored-by: Min RK --- repo2docker/docker.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 581b9c0fb..8a522f95a 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -90,20 +90,38 @@ def container_cli(self): cli = DOCKER_CLI - docker_version = subprocess.run([cli, "version"], stdout=subprocess.DEVNULL) + cli_version_call = [cli, "version"] + try: + docker_version = subprocess.run( + cli_version_call, stdout=subprocess.DEVNULL, check=True + ) + except (subprocess.CalledProcessError, OSError) as e: + raise RuntimeError( + f"The {cli} commandline client must be installed: {e}" + ) from None + if docker_version.returncode: - raise RuntimeError(f"The {cli} commandline client must be installed") + raise RuntimeError( + f"'{" ".join(cli_version_call)}' failed and returned the code {docker_version.returncode}" + ) # docker buildx is based in a plugin that might not be installed # https://github.com/docker/buildx # # podman buildx command is an alias of podman build. # Not all buildx build features are available in Podman. - docker_buildx_version = subprocess.run( - [cli, "buildx", "version"], stdout=subprocess.DEVNULL - ) + cli_buildx_version_call = [cli, "buildx", "version"] + try: + docker_buildx_version = subprocess.run( + cli_buildx_version_call, stdout=subprocess.DEVNULL, check=True + ) + except (subprocess.CalledProcessError, OSError) as e: + raise RuntimeError(f"The buildx plugin must be installed: {e}") from None + if docker_buildx_version.returncode: - raise RuntimeError("The docker buildx plugin must be installed") + raise RuntimeError( + f"'{" ".join(cli_buildx_version_call)}' failed and returned the code {docker_buildx_version.returncode}" + ) self._container_cli = cli From 9259ca850671097d82738ea277450f12020e8982 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 4 Dec 2025 10:16:09 +0100 Subject: [PATCH 252/299] Re-write matrix strategy to use include Related to 422c0091e252b3f691b22bc3c7b1d03bee94a768 --- .github/workflows/test.yml | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 187795203..416011e59 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -55,7 +55,6 @@ jobs: python_version: ["3.13"] container_cli: - docker - - podman repo_type: - base - conda @@ -76,27 +75,16 @@ jobs: - ubuntu_version: "24.04" python_version: "3.10" repo_type: venv - exclude: # Run all tests for both Docker and Podman is expensive. # We only run the "smoke" test for Podman. - container_cli: podman - repo_type: external + repo_type: base - container_cli: podman - repo_type: julia + repo_type: conda - container_cli: podman - repo_type: nix + repo_type: dockerfile - container_cli: podman - repo_type: pipfile - - container_cli: podman - repo_type: r - - container_cli: podman - repo_type: venv - - container_cli: podman - repo_type: contentproviders - - container_cli: podman - repo_type: norun - - container_cli: podman - repo_type: ui + repo_type: unit steps: - uses: actions/checkout@v6 From 72701296b129f1bec3f99a19005c109ba3b592e5 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 5 Dec 2025 16:00:58 +0100 Subject: [PATCH 253/299] Remove if-block already cover in try-block --- repo2docker/docker.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 8a522f95a..c00cda7b7 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -100,11 +100,6 @@ def container_cli(self): f"The {cli} commandline client must be installed: {e}" ) from None - if docker_version.returncode: - raise RuntimeError( - f"'{" ".join(cli_version_call)}' failed and returned the code {docker_version.returncode}" - ) - # docker buildx is based in a plugin that might not be installed # https://github.com/docker/buildx # @@ -118,11 +113,6 @@ def container_cli(self): except (subprocess.CalledProcessError, OSError) as e: raise RuntimeError(f"The buildx plugin must be installed: {e}") from None - if docker_buildx_version.returncode: - raise RuntimeError( - f"'{" ".join(cli_buildx_version_call)}' failed and returned the code {docker_buildx_version.returncode}" - ) - self._container_cli = cli return self._container_cli From 7f6b65edac8777830f4f385368f57d25e5aa0528 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 8 Jan 2026 14:59:18 +0100 Subject: [PATCH 254/299] Fix include for GItHub Actions --- .github/workflows/test.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 416011e59..1ed525598 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -70,20 +70,31 @@ jobs: - norun # Playwright test - ui + # If the item to be include would overwrite a value, + # it must have all the fields! include: # The earliest actions/setup-python versions depend on the runner. - ubuntu_version: "24.04" python_version: "3.10" + container_cli: docker repo_type: venv # Run all tests for both Docker and Podman is expensive. # We only run the "smoke" test for Podman. - - container_cli: podman + - ubuntu_version: "24.04" + python_version: "3.13" + container_cli: podman repo_type: base - - container_cli: podman + - ubuntu_version: "24.04" + python_version: "3.13" + container_cli: podman repo_type: conda - - container_cli: podman + - ubuntu_version: "24.04" + python_version: "3.13" + container_cli: podman repo_type: dockerfile - - container_cli: podman + - ubuntu_version: "24.04" + python_version: "3.13" + container_cli: podman repo_type: unit steps: From 6baaf08aa18a984f9cebb78b7d694cc6b5854852 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 13 Jan 2026 15:37:04 +0100 Subject: [PATCH 255/299] Delete container and image after test --- tests/conftest.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index f64c85f1c..199be4f91 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,10 +27,13 @@ import requests import yaml +import docker + from repo2docker.__main__ import make_r2d TESTS_DIR = os.path.abspath(os.path.dirname(__file__)) +DOCKER_CLIENT = client = docker.from_env() def pytest_collect_file(parent, file_path): if file_path.name == "verify": @@ -90,6 +93,12 @@ def build_noop(): # stop the container container.stop() app.wait_for_container(container) + try: + container.remove() + except: + pass + DOCKER_CLIENT.images.remove(image=app.output_image_spec) + return test From f010e365cdb40b3dbe265fa882b31ff8f506e013 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:37:21 +0000 Subject: [PATCH 256/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/conftest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 199be4f91..b77bfcb05 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,13 +28,13 @@ import yaml import docker - from repo2docker.__main__ import make_r2d TESTS_DIR = os.path.abspath(os.path.dirname(__file__)) DOCKER_CLIENT = client = docker.from_env() + def pytest_collect_file(parent, file_path): if file_path.name == "verify": return LocalRepo.from_parent(parent, path=file_path) @@ -99,7 +99,6 @@ def build_noop(): pass DOCKER_CLIENT.images.remove(image=app.output_image_spec) - return test From 9032292d8e04193901c16acc82fb2e80b5bc2e11 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 14 Jan 2026 14:13:31 +0100 Subject: [PATCH 257/299] Disable test of conda for podman --- .github/workflows/test.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1ed525598..7f0afbf55 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -84,10 +84,12 @@ jobs: python_version: "3.13" container_cli: podman repo_type: base - - ubuntu_version: "24.04" - python_version: "3.13" - container_cli: podman - repo_type: conda + # We are observing "no space left on device" on GitHub Actions, + # https://github.com/jupyterhub/repo2docker/pull/1471#issuecomment-3744990787 + # - ubuntu_version: "24.04" + # python_version: "3.13" + # container_cli: podman + # repo_type: conda - ubuntu_version: "24.04" python_version: "3.13" container_cli: podman From 2d78af209802b8594b9b30dc958e2a1ce3eb3af2 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Mon, 27 Oct 2025 13:56:45 +0000 Subject: [PATCH 258/299] Handle existing NB_UID/NB_GID Closes https://github.com/jupyterhub/repo2docker/issues/1346 --- repo2docker/buildpacks/base.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index 74bfa3311..1f0a3b669 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -44,17 +44,30 @@ ENV USER=${NB_USER} \ HOME=/home/${NB_USER} -RUN groupadd \ - --gid ${NB_UID} \ - ${NB_USER} && \ - useradd \ +# Ubuntu 24.04 has a predefined uid/gid 1000, older Ubuntu versions don't +RUN if getent group ${NB_UID}; then \ + GROUP_1000="$(getent group ${NB_UID} | cut -d: -f1)"; \ + if [ "$GROUP_1000" != "$NB_USER" ]; then \ + groupmod --new-name ${NB_USER} "$GROUP_1000"; \ + fi; \ + else \ + groupadd --gid ${NB_UID} ${NB_USER}; \ + fi +RUN if id ${NB_UID}; then \ + USER_1000="$(id ${NB_UID} -un)"; \ + if [ "$USER_1000" != "$NB_USER" ]; then \ + usermod --home "/home/$NB_USER" --login "$NB_USER" --move-home "$USER_1000"; \ + fi; \ + else \ + useradd \ --comment "Default user" \ --create-home \ --gid ${NB_UID} \ --no-log-init \ --shell /bin/bash \ --uid ${NB_UID} \ - ${NB_USER} + ${NB_USER}; \ + fi # Base package installs are not super interesting to users, so hide their outputs # If install fails for some reason, errors will still be printed From b1243fc06d82183663fa66c8404a073449299eff Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 14 Jan 2026 10:06:09 -0800 Subject: [PATCH 259/299] add test for uid=1000 clobbering --- tests/base/general/README.md | 3 +++ tests/base/general/test-extra-args.yaml | 4 +++ tests/base/general/tests.py | 33 +++++++++++++++++++++++++ tests/base/general/verify | 7 ++++++ tests/base/node/README.md | 1 - tests/base/node/verify | 18 -------------- 6 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 tests/base/general/README.md create mode 100644 tests/base/general/test-extra-args.yaml create mode 100644 tests/base/general/tests.py create mode 100755 tests/base/general/verify delete mode 100644 tests/base/node/README.md delete mode 100755 tests/base/node/verify diff --git a/tests/base/general/README.md b/tests/base/general/README.md new file mode 100644 index 000000000..0ddd16903 --- /dev/null +++ b/tests/base/general/README.md @@ -0,0 +1,3 @@ +# General tests for the base env + +general tests about the OS, base environment, etc. diff --git a/tests/base/general/test-extra-args.yaml b/tests/base/general/test-extra-args.yaml new file mode 100644 index 000000000..0e704da26 --- /dev/null +++ b/tests/base/general/test-extra-args.yaml @@ -0,0 +1,4 @@ +# make sure we run as uid 1000, user jovyan +# not the default host uid and username, which vary +- --user-id=1000 +- --user-name=jovyan diff --git a/tests/base/general/tests.py b/tests/base/general/tests.py new file mode 100644 index 000000000..5b1f42764 --- /dev/null +++ b/tests/base/general/tests.py @@ -0,0 +1,33 @@ +# this file is not called test_whatever +# so that the outer test discovery doesn't pick it up + +import getpass +import os +import shutil +from pathlib import Path +from subprocess import check_output + + +def test_node(): + node = shutil.which("node") + assert node is not None + node_version = check_output(["node", "--version"], text=True) + assert "v20" in node_version + npm = shutil.which("npm") + # npm version isn't pinned + npm_version = check_output(["npm", "--version"], text=True) + + +def test_nb_user(): + assert os.getuid() == 1000 + assert os.getgid() == 1000 + user = getpass.getuser() + assert user == "jovyan" + home = Path.home() + assert home == Path("/home/jovyan") + assert home.exists() + assert home.owner() == user + with (home / "testfile").open("w") as f: + f.write("canwrite") + for p in home.rglob(): + assert p.owner() == user diff --git a/tests/base/general/verify b/tests/base/general/verify new file mode 100755 index 000000000..0ff935f39 --- /dev/null +++ b/tests/base/general/verify @@ -0,0 +1,7 @@ +#!/bin/sh + +set -ex + +# install pytest here because we want to invoke the Base BuildPack +pip install pytest +pytest -v --color=yes tests.py diff --git a/tests/base/node/README.md b/tests/base/node/README.md deleted file mode 100644 index 09007cc86..000000000 --- a/tests/base/node/README.md +++ /dev/null @@ -1 +0,0 @@ -Test that node 16 and npm 8 are installed and runnable. diff --git a/tests/base/node/verify b/tests/base/node/verify deleted file mode 100755 index 753215533..000000000 --- a/tests/base/node/verify +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -set -ex - -# check node system package and its version -which node -node --version -node --version | grep v20 - -# npm comes with the nodejs conda-forge package that we have pinned, but we -# don't have npm pinned. For example nodejs 18.13.0 brought npm 8.19.3, but -# nodejs 18.14.0 brought npm 9.3.1. -# -# Since we have no npm version pinning, we just test that some version is -# installed. -# -which npm -npm --version From 033b861d28f118fbc6d0b45d99b800b313396652 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 14 Jan 2026 10:06:20 -0800 Subject: [PATCH 260/299] update date for 24.04 --- docs/source/configuration/system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/configuration/system.md b/docs/source/configuration/system.md index 89bcc71d2..df7ef4040 100644 --- a/docs/source/configuration/system.md +++ b/docs/source/configuration/system.md @@ -11,7 +11,7 @@ If a `Dockerfile` is not used to change the Docker base image, the base image i ``` ```{versionchanged} -Base ubuntu image upgraded from 22.04 to 24.04 in October, 2025 +Base ubuntu image upgraded from 22.04 to 24.04 in January, 2026 ``` We use `apt.txt`, for example, to install LaTeX in our From 8f5aef59118163f8839aef5f7139acaabe248446 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 14 Jan 2026 10:11:23 -0800 Subject: [PATCH 261/299] fix base permission test --- tests/base/general/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/base/general/tests.py b/tests/base/general/tests.py index 5b1f42764..6dbfbfa5a 100644 --- a/tests/base/general/tests.py +++ b/tests/base/general/tests.py @@ -29,5 +29,5 @@ def test_nb_user(): assert home.owner() == user with (home / "testfile").open("w") as f: f.write("canwrite") - for p in home.rglob(): + for p in home.rglob("*"): assert p.owner() == user From 91d6ab5553fc3a15fd00aa8c4e49c4bd7d01169b Mon Sep 17 00:00:00 2001 From: Min RK Date: Thu, 15 Jan 2026 15:18:46 -0800 Subject: [PATCH 262/299] update date in one more place --- docs/source/howto/breaking_changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/howto/breaking_changes.md b/docs/source/howto/breaking_changes.md index a424807aa..1c58043f0 100644 --- a/docs/source/howto/breaking_changes.md +++ b/docs/source/howto/breaking_changes.md @@ -4,7 +4,7 @@ Repo2docker occasionally has to make breaking changes in how repositories are bu ## Upgrade of base image from Ubuntu 22.04 to 24.04 -The base image used by repo2docker was [upgraded from Ubuntu 22.04 to Ubuntu 24.04](https://github.com/jupyterhub/repo2docker/pull/1287) October 2025 (2025.10). +The base image used by repo2docker was [upgraded from Ubuntu 22.04 to Ubuntu 24.04](https://github.com/jupyterhub/repo2docker/pull/1287) Janyary 2026 (2026.1). This is unlikely to affect you unless you are using {ref}`apt.txt `. From c62e2500873bcd67209d902cb73f437316a434d8 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 16 Jan 2026 16:12:11 +0100 Subject: [PATCH 263/299] Add support to both .yml and .yaml Related to https://github.com/jupyterhub/repo2docker/issues/1373 --- repo2docker/buildpacks/conda/__init__.py | 56 ++++++++++++++---------- tests/conda/yaml/environment.yaml | 2 + tests/conda/yaml/verify | 4 ++ 3 files changed, 39 insertions(+), 23 deletions(-) create mode 100644 tests/conda/yaml/environment.yaml create mode 100755 tests/conda/yaml/verify diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index a04a305c3..843989b62 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -236,10 +236,13 @@ def environment_yaml(self): if self._environment_yaml is not None: return self._environment_yaml - environment_yml = self.binder_path("environment.yml") - if not os.path.exists(environment_yml): - self._environment_yaml = {} - return self._environment_yaml + for filename in ["environment.yml", "environment.yaml"]: + environment_yml = self.binder_path(filename) + if not os.path.exists(environment_yml): + self._environment_yaml = {} + return self._environment_yaml + else: + break with open(environment_yml) as f: env = YAML().load(f) @@ -249,7 +252,9 @@ def environment_yaml(self): # check if the env file provided a dict-like thing not a list or other data structure. if not isinstance(env, Mapping): raise TypeError( - "environment.yml should contain a dictionary. Got %r" % type(env) + "{} should contain a dictionary. Got {!r}".format( + environment_yml, type(env) + ) ) self._environment_yaml = env @@ -383,36 +388,41 @@ def get_preassemble_script_files(self): """ assemble_files = super().get_preassemble_script_files() if self._should_preassemble_env: - environment_yml = self.binder_path("environment.yml") - if os.path.exists(environment_yml): - assemble_files[environment_yml] = environment_yml + for filename in ["environment.yml", "environment.yaml"]: + environment_yml = self.binder_path(filename) + if os.path.exists(environment_yml): + assemble_files[environment_yml] = environment_yml + break return assemble_files @lru_cache def get_env_scripts(self): """Return series of build-steps specific to this source repository.""" scripts = [] - environment_yml = self.binder_path("environment.yml") env_prefix = ( "${KERNEL_PYTHON_PREFIX}" if self.separate_kernel_env else "${NB_PYTHON_PREFIX}" ) - if os.path.exists(environment_yml): - # TODO: when using micromamba, we call $MAMBA_EXE install -p ... - # whereas mamba/conda need `env update -p ...` when it's an env.yaml file - scripts.append( - ( - "${NB_USER}", - rf""" - TIMEFORMAT='time: %3R' \ - bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{environment_yml}" && \ - time ${{MAMBA_EXE}} clean --all -f -y && \ - ${{MAMBA_EXE}} list -p {env_prefix} \ - ' - """, + + for filename in ["environment.yml", "environment.yaml"]: + environment_yml = self.binder_path(filename) + if os.path.exists(environment_yml): + # TODO: when using micromamba, we call $MAMBA_EXE install -p ... + # whereas mamba/conda need `env update -p ...` when it's an env.yaml file + scripts.append( + ( + "${NB_USER}", + rf""" + TIMEFORMAT='time: %3R' \ + bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{environment_yml}" && \ + time ${{MAMBA_EXE}} clean --all -f -y && \ + ${{MAMBA_EXE}} list -p {env_prefix} \ + ' + """, + ) ) - ) + break if self.uses_r: if self.r_version: diff --git a/tests/conda/yaml/environment.yaml b/tests/conda/yaml/environment.yaml new file mode 100644 index 000000000..94af7b1e3 --- /dev/null +++ b/tests/conda/yaml/environment.yaml @@ -0,0 +1,2 @@ +dependencies: + - python=3.12 diff --git a/tests/conda/yaml/verify b/tests/conda/yaml/verify new file mode 100755 index 000000000..bc347d686 --- /dev/null +++ b/tests/conda/yaml/verify @@ -0,0 +1,4 @@ +#!/usr/bin/env python +import sys + +assert sys.version_info[:2] == (3, 12), sys.version From bbd38c86cc1df53468421aabd1cb9010973bb079 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 20 Jan 2026 11:35:53 +0100 Subject: [PATCH 264/299] Add self.environment_yaml_path to Conda buildpack Related to https://github.com/jupyterhub/repo2docker/issues/1373 --- repo2docker/buildpacks/conda/__init__.py | 70 +++++++++++++----------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index 843989b62..464197318 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -229,6 +229,21 @@ def get_build_script_files(self): files.update(super().get_build_script_files()) return files + _environment_yaml_path = None + + @property + def environment_yaml_path(self): + if self._environment_yaml_path is not None: + return self._environment_yaml_path + + for filename in ["environment.yml", "environment.yaml"]: + environment_yaml_path = self.binder_path(filename) + if not os.path.exists(environment_yaml_path): + self._environment_yaml_path = environment_yaml_path + break + + return self._environment_yaml + _environment_yaml = None @property @@ -236,15 +251,11 @@ def environment_yaml(self): if self._environment_yaml is not None: return self._environment_yaml - for filename in ["environment.yml", "environment.yaml"]: - environment_yml = self.binder_path(filename) - if not os.path.exists(environment_yml): - self._environment_yaml = {} - return self._environment_yaml - else: - break + if self.environment_yaml_path is None: + self._environment_yaml = {} + return self._environment_yaml - with open(environment_yml) as f: + with open(self.environment_yaml_path) as f: env = YAML().load(f) # check if the env file is empty, if so instantiate an empty dictionary. if env is None: @@ -253,7 +264,7 @@ def environment_yaml(self): if not isinstance(env, Mapping): raise TypeError( "{} should contain a dictionary. Got {!r}".format( - environment_yml, type(env) + self.environment_yaml_path, type(env) ) ) self._environment_yaml = env @@ -387,12 +398,8 @@ def get_preassemble_script_files(self): repo contents change """ assemble_files = super().get_preassemble_script_files() - if self._should_preassemble_env: - for filename in ["environment.yml", "environment.yaml"]: - environment_yml = self.binder_path(filename) - if os.path.exists(environment_yml): - assemble_files[environment_yml] = environment_yml - break + if self._should_preassemble_env and self.environment_yaml_path: + assemble_files[self.environment_yaml_path] = self.environment_yaml_path return assemble_files @lru_cache @@ -405,24 +412,21 @@ def get_env_scripts(self): else "${NB_PYTHON_PREFIX}" ) - for filename in ["environment.yml", "environment.yaml"]: - environment_yml = self.binder_path(filename) - if os.path.exists(environment_yml): - # TODO: when using micromamba, we call $MAMBA_EXE install -p ... - # whereas mamba/conda need `env update -p ...` when it's an env.yaml file - scripts.append( - ( - "${NB_USER}", - rf""" - TIMEFORMAT='time: %3R' \ - bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{environment_yml}" && \ - time ${{MAMBA_EXE}} clean --all -f -y && \ - ${{MAMBA_EXE}} list -p {env_prefix} \ - ' - """, - ) + if self.environment_yml: + # TODO: when using micromamba, we call $MAMBA_EXE install -p ... + # whereas mamba/conda need `env update -p ...` when it's an env.yaml file + scripts.append( + ( + "${NB_USER}", + rf""" + TIMEFORMAT='time: %3R' \ + bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{self.environment_yml}" && \ + time ${{MAMBA_EXE}} clean --all -f -y && \ + ${{MAMBA_EXE}} list -p {env_prefix} \ + ' + """, ) - break + ) if self.uses_r: if self.r_version: @@ -481,4 +485,4 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Conda BuildPack.""" - return os.path.exists(self.binder_path("environment.yml")) and super().detect() + return bool(self.environment_yaml_path) and super().detect() From d727bd720141c33e71986516ff67729e114fed46 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 20 Jan 2026 11:47:30 +0100 Subject: [PATCH 265/299] Fix rename from self.environment_yml to self.environment_yaml_path --- repo2docker/buildpacks/conda/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index 464197318..7e8702531 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -412,7 +412,7 @@ def get_env_scripts(self): else "${NB_PYTHON_PREFIX}" ) - if self.environment_yml: + if self.environment_yaml_path: # TODO: when using micromamba, we call $MAMBA_EXE install -p ... # whereas mamba/conda need `env update -p ...` when it's an env.yaml file scripts.append( @@ -420,7 +420,7 @@ def get_env_scripts(self): "${NB_USER}", rf""" TIMEFORMAT='time: %3R' \ - bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{self.environment_yml}" && \ + bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{self.environment_yaml_path}" && \ time ${{MAMBA_EXE}} clean --all -f -y && \ ${{MAMBA_EXE}} list -p {env_prefix} \ ' From 1f804713c63587ab7ee98fc2d2ea6795af87f6b8 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Wed, 21 Jan 2026 14:27:23 +0100 Subject: [PATCH 266/299] Fix logic in environment_yaml_path() --- repo2docker/buildpacks/conda/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index 7e8702531..b75cdeaab 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -238,7 +238,7 @@ def environment_yaml_path(self): for filename in ["environment.yml", "environment.yaml"]: environment_yaml_path = self.binder_path(filename) - if not os.path.exists(environment_yaml_path): + if os.path.exists(environment_yaml_path): self._environment_yaml_path = environment_yaml_path break From 0ef03d4873d26f754969bdd7a25170655f6b4a6a Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 22 Jan 2026 11:52:04 +0100 Subject: [PATCH 267/299] Fix typo --- repo2docker/buildpacks/conda/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index b75cdeaab..eaf2aa2bb 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -242,7 +242,9 @@ def environment_yaml_path(self): self._environment_yaml_path = environment_yaml_path break - return self._environment_yaml + # Because of backward compatibility, we return None + # instead of raise RuntimeError(). + return self._environment_yaml_path _environment_yaml = None From 1b45e59037224265a3c39279a3dc92fc16aee5ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 05:02:45 +0000 Subject: [PATCH 268/299] Bump actions/upload-artifact from 6 to 7 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e185299f4..74d11645f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: ls -l dist # ref: https://github.com/actions/upload-artifact#readme - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 with: name: repo2docker-${{ github.sha }} path: "dist/*" From 79228046afecf96fdaf5550e469d639fa4fc5337 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:43:52 +0000 Subject: [PATCH 269/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 25.12.0 → 26.1.0](https://github.com/psf/black-pre-commit-mirror/compare/25.12.0...26.1.0) - [github.com/pycqa/isort: 7.0.0 → 8.0.1](https://github.com/pycqa/isort/compare/7.0.0...8.0.1) - [github.com/rbubley/mirrors-prettier: v3.7.4 → v3.8.1](https://github.com/rbubley/mirrors-prettier/compare/v3.7.4...v3.8.1) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c632f7d19..c0e642e44 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,19 +21,19 @@ repos: # Autoformat: Python code - repo: https://github.com/psf/black-pre-commit-mirror - rev: 25.12.0 + rev: 26.1.0 hooks: - id: black # Autoformat: Python code - repo: https://github.com/pycqa/isort - rev: 7.0.0 + rev: 8.0.1 hooks: - id: isort # Autoformat: markdown - repo: https://github.com/rbubley/mirrors-prettier - rev: v3.7.4 + rev: v3.8.1 hooks: - id: prettier files: ".md" From 257e5cf360d912bac9e4a3115d2c93cda19d7af6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:19:19 +0000 Subject: [PATCH 270/299] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- repo2docker/buildpacks/base.py | 4 +--- repo2docker/buildpacks/julia/julia_project.py | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index 5a327190d..d6d0457ba 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -730,9 +730,7 @@ def get_preassemble_scripts(self): apt-get -qq purge && \ apt-get -qq clean && \ rm -rf /var/lib/apt/lists/* - """.format( - " ".join(sorted(extra_apt_packages)) - ), + """.format(" ".join(sorted(extra_apt_packages))), ) ) diff --git a/repo2docker/buildpacks/julia/julia_project.py b/repo2docker/buildpacks/julia/julia_project.py index 84153f194..76cc1cd39 100644 --- a/repo2docker/buildpacks/julia/julia_project.py +++ b/repo2docker/buildpacks/julia/julia_project.py @@ -178,9 +178,7 @@ def get_assemble_scripts(self): r""" JULIA_PROJECT="" julia -e "using Pkg; Pkg.add(\"IJulia\"); using IJulia; installkernel(\"Julia\", \"--project={project}\");" && \ julia --project={project} -e 'using Pkg; Pkg.instantiate(); Pkg.resolve(); Pkg.instantiate()' - """.format( - project=self.project_dir - ), + """.format(project=self.project_dir), ) ) return scripts From 7368b7ec4be8ae708eb0add38994cb58bc650d90 Mon Sep 17 00:00:00 2001 From: Chuck Daniels Date: Fri, 6 Mar 2026 12:51:30 -0500 Subject: [PATCH 271/299] Clarify where/how repo2docker locates config files --- docs/source/configuration/index.md | 8 ++++---- docs/source/use/repository.md | 12 +++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/source/configuration/index.md b/docs/source/configuration/index.md index ba4b69629..6734d9e27 100644 --- a/docs/source/configuration/index.md +++ b/docs/source/configuration/index.md @@ -2,10 +2,10 @@ # Configuration files supported by `repo2docker` -`repo2docker` looks for configuration files in the repository being built -to determine how to build it. In general, `repo2docker` uses the same -configuration files as other software installation tools, -rather than creating new custom configuration files. +`repo2docker` [looks for configuration files](#usage-config-file-location) in +the repository being built to determine how to build it. In general, +`repo2docker` uses the same configuration files as other software installation +tools, rather than creating new custom configuration files. :::{seealso} The [binder examples](https://github.com/binder-examples) organization on diff --git a/docs/source/use/repository.md b/docs/source/use/repository.md index 3206ccb6c..008d04658 100644 --- a/docs/source/use/repository.md +++ b/docs/source/use/repository.md @@ -6,11 +6,13 @@ `repo2docker` will look for configuration files in the following order: -- The root directory of the repository. - A folder named `binder/` or `.binder/` in the root of the repository. +- The root directory of the repository. - If one of these folders exists, only configuration files in that folder are considered, configuration in the root directory will be ignored. - Having both `binder/` and `.binder/` folders is not allowed. +If one of the folders `binder/` or `.binder/` exists, only configuration files +in that folder are considered, and configuration files in the root directory +will be ignored. Having both `binder/` and `.binder/` folders is not allowed, +and will result in an error. Check the complete list of [configuration files](#config-files) supported by `repo2docker` to see how to configure the build process. @@ -51,12 +53,12 @@ For [Mercurial](https://www.mercurial-scm.org) repositories, Mercurial and [hg-evolve](https://www.mercurial-scm.org/doc/evolution/) need to be installed. For example, on Debian based distributions, one can do: -``` +```bash sudo apt install mercurial $(hg debuginstall --template "{pythonexe}") -m pip install hg-evolve --user ``` -To install Mercurial on other systems, see [here](https://www.mercurial-scm.org/download). +Alternatively, see [how to install Mercurial on other systems](https://www.mercurial-scm.org/download). Note that for old Mercurial versions, you may need to specify a version for hg-evolve. For example, `hg-evolve==9.2` for hg 4.5 (which is installed with From b83446f2641682d47ad0279cf24d939d28a4f755 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 9 Mar 2026 10:55:43 -0700 Subject: [PATCH 272/299] pin chardet < 7 chardet 7 is a complete breaking rewrite, and not really chardet at all --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index beb52e3c3..450d82251 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ ] requires-python = ">=3.10" dependencies = [ - "chardet", + "chardet<7", "docker!=5.0.0", "entrypoints", "escapism", From 3f4296f692e8d1c0d76e22b781b970477dee5db1 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 9 Mar 2026 10:58:11 -0700 Subject: [PATCH 273/299] fix import of universaldetector import from public api, not implementation module --- repo2docker/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/utils.py b/repo2docker/utils.py index e71dcf94d..df6d040f0 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -97,7 +97,7 @@ def open_guess_encoding(path): Open a file in text mode, specifying its encoding, that we guess using chardet. """ - detector = chardet.universaldetector.UniversalDetector() + detector = chardet.UniversalDetector() with open(path, "rb") as f: for line in f.readlines(): detector.feed(line) From 847980b19b21292e44cd157577e6403c7b92508f Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 9 Mar 2026 11:10:59 -0700 Subject: [PATCH 274/299] actually, let's avoid chardet altogether --- pyproject.toml | 2 +- repo2docker/utils.py | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 450d82251..e6b63e4b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ ] requires-python = ">=3.10" dependencies = [ - "chardet<7", + "charset-normalizer", "docker!=5.0.0", "entrypoints", "escapism", diff --git a/repo2docker/utils.py b/repo2docker/utils.py index df6d040f0..d3f03aeec 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -9,7 +9,7 @@ from functools import partial from shutil import copy2, copystat -import chardet +import charset_normalizer from traitlets import Integer, TraitError @@ -95,21 +95,13 @@ def chdir(path): def open_guess_encoding(path): """ Open a file in text mode, specifying its encoding, - that we guess using chardet. + that we guess using charset_normalizer. """ - detector = chardet.UniversalDetector() with open(path, "rb") as f: - for line in f.readlines(): - detector.feed(line) - if detector.done: - break - detector.close() + detector = charset_normalizer.from_fp(f) - file = open(path, encoding=detector.result["encoding"]) - try: + with open(path, encoding=detector.best().encoding) as file: yield file - finally: - file.close() def validate_and_generate_port_mapping(port_mappings): From 2b6121a90017a68f0883ec1f3136463e227d9391 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 9 Mar 2026 13:48:07 -0700 Subject: [PATCH 275/299] freeze requirements in Dockerfile avoids silent breakage when rebuilding image --- .github/dependabot.yaml | 11 ++++++++-- Dockerfile | 2 +- pyproject.toml | 2 ++ requirements.in | 2 ++ requirements.txt | 48 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 requirements.in create mode 100644 requirements.txt diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index ec797f62c..879e8be3e 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -13,5 +13,12 @@ updates: labels: [ci] schedule: interval: monthly - time: "05:00" - timezone: Etc/UTC + # Update frozen requirements in repo2docker Dockerfile + - package-ecosystem: pip + directory: / + allow: + # need this to upgrade requirements.txt + # otherwise only direct dependencies in requirements.in will be updated + - dependency-type: all + schedule: + interval: monthly diff --git a/Dockerfile b/Dockerfile index bb92d164d..5e821e022 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN cd /tmp/src && git clean -xfd && git status RUN mkdir /tmp/wheelhouse \ && cd /tmp/wheelhouse \ && pip install wheel \ - && pip wheel --no-cache-dir /tmp/src \ + && pip wheel --no-cache-dir -r /tmp/src/requirements.txt \ && ls -l /tmp/wheelhouse FROM alpine:${ALPINE_VERSION} diff --git a/pyproject.toml b/pyproject.toml index e6b63e4b4..68cb9d7e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,8 @@ classifiers = [ "Topic :: System :: Systems Administration", ] requires-python = ">=3.10" +# after changing dependencies, run ./scripts/refreeze +# so that the Dockerfile reflects the changes dependencies = [ "charset-normalizer", "docker!=5.0.0", diff --git a/requirements.in b/requirements.in new file mode 100644 index 000000000..a0a961df6 --- /dev/null +++ b/requirements.in @@ -0,0 +1,2 @@ +# freeze current requirements, used in Dockerfile +. diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..940b9a800 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,48 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# ./scripts/refreeze +# +certifi==2026.2.25 + # via requests +charset-normalizer==3.4.5 + # via + # jupyter-repo2docker + # requests +docker==7.1.0 + # via jupyter-repo2docker +entrypoints==0.4 + # via jupyter-repo2docker +escapism==1.1.0 + # via jupyter-repo2docker +idna==3.11 + # via requests +iso8601==2.1.0 + # via jupyter-repo2docker +jinja2==3.1.6 + # via jupyter-repo2docker +jupyter-repo2docker @ file:///tmp/src + # via -r requirements.in +markupsafe==3.0.3 + # via jinja2 +packaging==26.0 + # via jupyter-repo2docker +python-json-logger==4.0.0 + # via jupyter-repo2docker +requests==2.32.5 + # via + # docker + # jupyter-repo2docker +ruamel-yaml==0.19.1 + # via jupyter-repo2docker +semver==3.0.4 + # via jupyter-repo2docker +toml==0.10.2 + # via jupyter-repo2docker +traitlets==5.14.3 + # via jupyter-repo2docker +urllib3==2.6.3 + # via + # docker + # requests From 7db6108f46802ce529d1bcb07fded6fe28d4aa2b Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 9 Mar 2026 11:10:36 -0700 Subject: [PATCH 276/299] allow default_buildpack=None to disable building when no env is detected --- repo2docker/app.py | 12 +++++++++--- repo2docker/buildpacks/conda/__init__.py | 2 +- tests/unit/test_app.py | 13 ++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/repo2docker/app.py b/repo2docker/app.py index cbef4d443..2eb2c16b3 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -765,9 +765,15 @@ def build(self): picked_buildpack = bp break else: - picked_buildpack = self.default_buildpack( - base_image=self.base_image - ) + if self.default_buildpack: + picked_buildpack = self.default_buildpack( + base_image=self.base_image + ) + else: + self.log.error( + "No environment specification found. See https://repo2docker.readthedocs.io/en/latest/configuration/ for supported files.\n" + ) + self.exit(1) picked_buildpack.platform = self.platform picked_buildpack.appendix = self.appendix diff --git a/repo2docker/buildpacks/conda/__init__.py b/repo2docker/buildpacks/conda/__init__.py index eaf2aa2bb..5932847f8 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -487,4 +487,4 @@ def get_assemble_scripts(self): def detect(self): """Check if current repo should be built with the Conda BuildPack.""" - return bool(self.environment_yaml_path) and super().detect() + return bool(self.environment_yaml_path) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 149cb4291..834a0ae94 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -3,11 +3,11 @@ from unittest.mock import patch import escapism +import pytest import docker from repo2docker.__main__ import make_r2d from repo2docker.app import Repo2Docker -from repo2docker.utils import chdir def test_image_name_remains_unchanged(): @@ -79,3 +79,14 @@ def test_run_kwargs(repo_with_content): args, kwargs = containers.run.call_args assert "somekey" in kwargs assert kwargs["somekey"] == "somevalue" + + +def test_no_default(tmp_path, capsys): + empty = tmp_path / "empty" + empty.mkdir() + argv = ["--Repo2Docker.default_buildpack=None", str(empty)] + app = make_r2d(argv) + with pytest.raises(SystemExit): + app.build() + captured = capsys.readouterr() + assert "No environment specification found" in captured.err From 89d0fb83928b4e0803f7e9982423ae81eba692a2 Mon Sep 17 00:00:00 2001 From: Min RK Date: Tue, 10 Mar 2026 09:02:06 -0700 Subject: [PATCH 277/299] add refreeze --- scripts/refreeze | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 scripts/refreeze diff --git a/scripts/refreeze b/scripts/refreeze new file mode 100755 index 000000000..eb2c57143 --- /dev/null +++ b/scripts/refreeze @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +""" +Run pip-compile in docker to generate requirements.txt + +Should only need running when requirements change in pyproject.toml, which is uncommon. +Dependabot should handle updating requirements.txt most of the time. +""" + +from pathlib import Path +from subprocess import run + +repo = Path(__file__).parents[1].resolve() + + +def get_alpine_version(): + """ + Get the alpine version from our dockerfile + + make sure we're running with the same version as the docker image. + """ + dockerfile = repo / "Dockerfile" + with dockerfile.open() as f: + for line in f: + if "ALPINE_VERSION" in line: + return line.partition("=")[2].strip() + raise ValueError(f"Couldn't find ALPINE_VERSION= in {dockerfile}") + + +def refreeze(): + """ + Run pip-compile in docker to generate requirements.txt + """ + + alpine_version = get_alpine_version() + run( + [ + "docker", + "run", + "--rm", + f"-v{repo}:/tmp/src", + "-w/tmp/src", + "-eCUSTOM_COMPILE_COMMAND=./scripts/refreeze", + f"alpine:{alpine_version}", + "sh", + "-c", + """ + apk add py3-pip git + python3 -m venv /tmp/venv + source /tmp/venv/bin/activate + pip install pip-tools + pip-compile + """, + ] + ) + + +if __name__ == "__main__": + refreeze() From 1f1d592578ede69abde866e509765fee7ba9a89b Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 13 Mar 2026 08:47:45 -0700 Subject: [PATCH 278/299] add dependencies label to dependabot prs Co-authored-by: Simon Li --- .github/dependabot.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 879e8be3e..cde6d6c34 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -20,5 +20,6 @@ updates: # need this to upgrade requirements.txt # otherwise only direct dependencies in requirements.in will be updated - dependency-type: all + labels: [dependencies] schedule: interval: monthly From 16a1261878b6b39888af9f93fc10b1733e705a8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 05:11:58 +0000 Subject: [PATCH 279/299] Bump codecov/codecov-action from 5 to 6 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v5...v6) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f0afbf55..51d48a941 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -136,4 +136,4 @@ jobs: fi pytest --verbose --color=yes --durations=10 --cov=repo2docker tests/${{ matrix.repo_type }} - - uses: codecov/codecov-action@v5 + - uses: codecov/codecov-action@v6 From 379cce0b26b61c06aa70a0749ab842c0629d496a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 05:12:03 +0000 Subject: [PATCH 280/299] Bump docker/build-push-action from 6 to 7 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6...v7) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8cadb93d3..8ffd7f1c7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -38,7 +38,7 @@ jobs: # https://github.com/docker/build-push-action - name: Build Docker image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . tags: jupyter/repo2docker:pr diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74d11645f..2eac5701d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -125,7 +125,7 @@ jobs: echo "TAGS=$TAGS" >> $GITHUB_ENV - name: Build and push repo2docker - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . platforms: linux/amd64,linux/arm64 From a9d2d52d0fc2b9a14fe50d9210affa955a4bde57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 05:12:12 +0000 Subject: [PATCH 281/299] Bump docker/setup-buildx-action from 3 to 4 Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74d11645f..85b54bd17 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -97,7 +97,7 @@ jobs: uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx (for multi-arch builds) - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 with: # Allows pushing to registry on localhost:5000 driver-opts: network=host From 1b33c1512866dc92e994b88e3d6344c639fd0ec0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 06:57:51 +0000 Subject: [PATCH 282/299] Bump docker/setup-qemu-action from 3 to 4 Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85b54bd17..7c499915c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -94,7 +94,7 @@ jobs: # https://github.com/docker/build-push-action/tree/v2.4.0#usage # https://github.com/docker/build-push-action/blob/v2.4.0/docs/advanced/multi-platform.md - name: Set up QEMU (for docker buildx) - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx (for multi-arch builds) uses: docker/setup-buildx-action@v4 From 7b64330d8f63cc5776e9ae110ff5a98a0399fc72 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 21:38:47 +0000 Subject: [PATCH 283/299] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 26.1.0 → 26.3.1](https://github.com/psf/black-pre-commit-mirror/compare/26.1.0...26.3.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c0e642e44..7d79b7a5c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: # Autoformat: Python code - repo: https://github.com/psf/black-pre-commit-mirror - rev: 26.1.0 + rev: 26.3.1 hooks: - id: black From a02ea007b0aecc831e38d06ed139e149ccf4ec3c Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 13:45:16 -0700 Subject: [PATCH 284/299] try to fix dependabot for Dockerfile - exclude repo2docker itself from requirements.txt because dependabot messes with paths - group dependabot PRs - apply safer cooldown default --- .github/dependabot.yaml | 13 +++++++++++++ Dockerfile | 2 +- requirements.txt | 5 +++-- scripts/refreeze | 4 +++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index cde6d6c34..34cab00ea 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -13,6 +13,13 @@ updates: labels: [ci] schedule: interval: monthly + cooldown: + default-days: 7 + groups: + actions: + patterns: + - "*" + # Update frozen requirements in repo2docker Dockerfile - package-ecosystem: pip directory: / @@ -21,5 +28,11 @@ updates: # otherwise only direct dependencies in requirements.in will be updated - dependency-type: all labels: [dependencies] + groups: + dockerfile: + patterns: + - "*" schedule: interval: monthly + cooldown: + default-days: 7 diff --git a/Dockerfile b/Dockerfile index 5e821e022..2c9b67cb4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN cd /tmp/src && git clean -xfd && git status RUN mkdir /tmp/wheelhouse \ && cd /tmp/wheelhouse \ && pip install wheel \ - && pip wheel --no-cache-dir -r /tmp/src/requirements.txt \ + && pip wheel --no-cache-dir -r /tmp/src/requirements.txt /tmp/src \ && ls -l /tmp/wheelhouse FROM alpine:${ALPINE_VERSION} diff --git a/requirements.txt b/requirements.txt index 940b9a800..6d843cb06 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,8 +22,6 @@ iso8601==2.1.0 # via jupyter-repo2docker jinja2==3.1.6 # via jupyter-repo2docker -jupyter-repo2docker @ file:///tmp/src - # via -r requirements.in markupsafe==3.0.3 # via jinja2 packaging==26.0 @@ -46,3 +44,6 @@ urllib3==2.6.3 # via # docker # requests + +# The following packages are considered to be unsafe in a requirements file: +# jupyter-repo2docker diff --git a/scripts/refreeze b/scripts/refreeze index eb2c57143..fc77f975e 100755 --- a/scripts/refreeze +++ b/scripts/refreeze @@ -32,6 +32,7 @@ def refreeze(): """ alpine_version = get_alpine_version() + run( [ "docker", @@ -48,7 +49,8 @@ def refreeze(): python3 -m venv /tmp/venv source /tmp/venv/bin/activate pip install pip-tools - pip-compile + # exclude repo2docker itself because dependabot messes it up + pip-compile --unsafe-package=jupyter-repo2docker """, ] ) From 9031649b3772886d0ee3f8a4ef820a29aaff8567 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 14:14:52 -0700 Subject: [PATCH 285/299] update shiny-proxy to 1.4 --- repo2docker/buildpacks/_r_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/_r_base.py b/repo2docker/buildpacks/_r_base.py index c4ff7e4be..f0d1607d4 100644 --- a/repo2docker/buildpacks/_r_base.py +++ b/repo2docker/buildpacks/_r_base.py @@ -12,7 +12,7 @@ def rstudio_base_scripts(r_version): # Shiny server (not the package!) seems to be the same version for all R versions shiny_server_url = "https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.22.1017-amd64.deb" - shiny_proxy_version = "1.3" + shiny_proxy_version = "1.4" shiny_sha256sum = "0fa40054f038de464a26f3f8c40180a072228454762b7a12ed50568b3256c236" # RStudio server has different builds based on wether OpenSSL 3 or 1.1 is available. From 5edd0912af52122a9315f84b2411f525dcbc68d8 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 14:29:08 -0700 Subject: [PATCH 286/299] fix figshare url regex software is a valid category this is fragile and other categories can also fail --- repo2docker/contentproviders/figshare.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/repo2docker/contentproviders/figshare.py b/repo2docker/contentproviders/figshare.py index 6c7b26c86..c2331b78a 100644 --- a/repo2docker/contentproviders/figshare.py +++ b/repo2docker/contentproviders/figshare.py @@ -41,7 +41,9 @@ def __init__(self): # We may need to add other item types in future, see # https://github.com/jupyterhub/repo2docker/pull/1001#issuecomment-760107436 # for a list - url_regex = re.compile(r"(.*)/articles/(code/|dataset/)?([^/]+)/(\d+)(/)?(\d+)?") + url_regex = re.compile( + r"(.*)/articles/(code/|dataset/|software/)?([^/]+)/(\d+)(/)?(\d+)?" + ) def detect(self, doi, ref=None, extra_args=None): """Trigger this provider for things that resolve to a Figshare article""" From 066b12c8c9a969169978535374eab4ea2edc65fb Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 16:15:35 -0700 Subject: [PATCH 287/299] R: install with pak devtools::install_local has been deprecated --- repo2docker/buildpacks/r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 4483300ac..d141ab58b 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -415,7 +415,7 @@ def get_assemble_scripts(self): assemble_scripts += [ ( "${NB_USER}", - 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "devtools::install_local(getwd())"', + 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::local_install()"', ) ] From 09cadb554c1ce8725318b750b2f5c18b176c1331 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 16:57:28 -0700 Subject: [PATCH 288/299] clear cache after pak install can't seem to _prevent_ writing cache --- repo2docker/buildpacks/r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index d141ab58b..6e26f2461 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -415,7 +415,7 @@ def get_assemble_scripts(self): assemble_scripts += [ ( "${NB_USER}", - 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::local_install()"', + 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::local_install()" && rm -rf $HOME/.cache/R', ) ] From 37e5fbdb96a952076617a3314bd8a4208300aee4 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 17:38:39 -0700 Subject: [PATCH 289/299] manually cleanup after pak it leaves files in /tmp/ and ~/.cache/R/pkgcache/ --- repo2docker/buildpacks/r.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 6e26f2461..192a7fe99 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -348,10 +348,10 @@ def get_build_scripts(self): ), ( "${NB_USER}", - # Install a pinned version of devtools, IRKernel and shiny + # Install a pinned version of pak, devtools, IRKernel and shiny rf""" export EXPANDED_CRAN_MIRROR_URL="$(. /etc/os-release && echo {cran_mirror_url} | envsubst)" && \ - R --no-save --no-restore --no-init-file --no-environ --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ + R --no-save --no-restore --no-init-file --no-environ --quiet -e "install.packages(c('pak', 'devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ R --no-save --no-restore --no-init-file --no-environ --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" """, ), @@ -415,7 +415,10 @@ def get_assemble_scripts(self): assemble_scripts += [ ( "${NB_USER}", - 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::local_install()" && rm -rf $HOME/.cache/R', + # pak doesn't seem to cleanup after itself. + # pak::cache_clean() doesn't empty the cache, + # it leaves files in /tmp/Rabc123.../ and ~/.cache/R/pkg/... + 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::install_local()"; rm -rf $HOME/.cache/R; rm -rf /tmp/R*', ) ] From 6882be5dc5ec72e12d173d8be63c55d699cd2845 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 20:22:52 -0700 Subject: [PATCH 290/299] remotes doesn't leave a mess pak doesn't work if caches are cleaned --- repo2docker/buildpacks/r.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 192a7fe99..b45a3b39d 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -348,10 +348,10 @@ def get_build_scripts(self): ), ( "${NB_USER}", - # Install a pinned version of pak, devtools, IRKernel and shiny + # Install a pinned version of remotes, devtools, IRKernel and shiny rf""" export EXPANDED_CRAN_MIRROR_URL="$(. /etc/os-release && echo {cran_mirror_url} | envsubst)" && \ - R --no-save --no-restore --no-init-file --no-environ --quiet -e "install.packages(c('pak', 'devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ + R --no-save --no-restore --no-init-file --no-environ --quiet -e "install.packages(c('remotes', 'devtools', 'IRkernel', 'shiny'), repos=Sys.getenv(\"EXPANDED_CRAN_MIRROR_URL\"))" && \ R --no-save --no-restore --no-init-file --no-environ --quiet -e "IRkernel::installspec(prefix=Sys.getenv(\"NB_PYTHON_PREFIX\"))" """, ), @@ -415,10 +415,7 @@ def get_assemble_scripts(self): assemble_scripts += [ ( "${NB_USER}", - # pak doesn't seem to cleanup after itself. - # pak::cache_clean() doesn't empty the cache, - # it leaves files in /tmp/Rabc123.../ and ~/.cache/R/pkg/... - 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "pak::install_local()"; rm -rf $HOME/.cache/R; rm -rf /tmp/R*', + 'R --no-save --no-restore --no-init-file --no-environ --quiet -e "remotes::install_local()"', ) ] From aa16a279b170f8eb26583f054754d254f0a5e9f7 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 20:25:58 -0700 Subject: [PATCH 291/299] upgrade in refreeze --- requirements.txt | 8 ++++---- scripts/refreeze | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6d843cb06..52ce53d6e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ # certifi==2026.2.25 # via requests -charset-normalizer==3.4.5 +charset-normalizer==3.4.7 # via # jupyter-repo2docker # requests @@ -24,11 +24,11 @@ jinja2==3.1.6 # via jupyter-repo2docker markupsafe==3.0.3 # via jinja2 -packaging==26.0 +packaging==26.1 # via jupyter-repo2docker -python-json-logger==4.0.0 +python-json-logger==4.1.0 # via jupyter-repo2docker -requests==2.32.5 +requests==2.33.1 # via # docker # jupyter-repo2docker diff --git a/scripts/refreeze b/scripts/refreeze index fc77f975e..157c0f4ac 100755 --- a/scripts/refreeze +++ b/scripts/refreeze @@ -50,7 +50,7 @@ def refreeze(): source /tmp/venv/bin/activate pip install pip-tools # exclude repo2docker itself because dependabot messes it up - pip-compile --unsafe-package=jupyter-repo2docker + pip-compile --upgrade --unsafe-package=jupyter-repo2docker """, ] ) From fcb562c0cac89bb566fbe6a8e5993dc5fb092f8f Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 22 Apr 2026 11:03:36 -0700 Subject: [PATCH 292/299] future-proof --no-allow-unsafe Co-authored-by: Simon Li --- scripts/refreeze | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/refreeze b/scripts/refreeze index 157c0f4ac..8edae5690 100755 --- a/scripts/refreeze +++ b/scripts/refreeze @@ -50,7 +50,7 @@ def refreeze(): source /tmp/venv/bin/activate pip install pip-tools # exclude repo2docker itself because dependabot messes it up - pip-compile --upgrade --unsafe-package=jupyter-repo2docker + pip-compile --upgrade --no-allow-unsafe --unsafe-package=jupyter-repo2docker """, ] ) From ca52d125573b66115f17c748a38df06d3e21e579 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 17 Apr 2026 11:43:35 -0700 Subject: [PATCH 293/299] missing newline in dataverse log and demote to debug --- repo2docker/contentproviders/dataverse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index 64852f088..35fc3a8ff 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -27,8 +27,8 @@ class Dataverse(DoiProvider): def load_hosts(self): if self.hosts is None: - self.log.info( - "Retrieving dataverse installations from %s", + self.log.debug( + "Retrieving dataverse installations from %s\n", self.dataverse_installations_url, ) r = requests.get(self.dataverse_installations_url) From c1dcc2b45831d8c2634a1b8a94aa01530d6861df Mon Sep 17 00:00:00 2001 From: yacchin1205 <968739+yacchin1205@users.noreply.github.com> Date: Wed, 28 Oct 2026 08:06:13 +0000 Subject: [PATCH 294/299] Freeze dependencies added by CS-repo2docker --- requirements.txt | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 52ce53d6e..c008b0ab7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,17 @@ # # ./scripts/refreeze # +aiofiles==25.1.0 + # via osfclient +anyio==4.14.2 + # via httpx +beautifulsoup4==4.15.0 + # via jupyter-repo2docker certifi==2026.2.25 - # via requests + # via + # httpcore + # httpx + # requests charset-normalizer==3.4.7 # via # jupyter-repo2docker @@ -16,16 +25,29 @@ entrypoints==0.4 # via jupyter-repo2docker escapism==1.1.0 # via jupyter-repo2docker +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via osfclient idna==3.11 - # via requests + # via + # anyio + # httpx + # requests iso8601==2.1.0 # via jupyter-repo2docker jinja2==3.1.6 # via jupyter-repo2docker markupsafe==3.0.3 # via jinja2 +osfclient @ git+https://github.com/RCOSDP/rdmclient.git@master + # via jupyter-repo2docker packaging==26.1 # via jupyter-repo2docker +python-dateutil==2.9.0.post0 + # via osfclient python-json-logger==4.1.0 # via jupyter-repo2docker requests==2.33.1 @@ -36,10 +58,24 @@ ruamel-yaml==0.19.1 # via jupyter-repo2docker semver==3.0.4 # via jupyter-repo2docker +six==1.17.0 + # via + # osfclient + # python-dateutil +soupsieve==2.8.4 + # via beautifulsoup4 toml==0.10.2 # via jupyter-repo2docker +tqdm==4.68.4 + # via osfclient traitlets==5.14.3 # via jupyter-repo2docker +typing-extensions==4.16.0 + # via + # anyio + # beautifulsoup4 +tzlocal==5.4.4 + # via osfclient urllib3==2.6.3 # via # docker From 07879335e2d107616b01a21e3f519b2fa895fe8c Mon Sep 17 00:00:00 2001 From: yacchin1205 <968739+yacchin1205@users.noreply.github.com> Date: Wed, 28 Oct 2026 08:23:29 +0000 Subject: [PATCH 295/299] Update frozen dependencies added by CS-repo2docker --- requirements.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index c008b0ab7..b2820f2eb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ # aiofiles==25.1.0 # via osfclient -anyio==4.14.2 +anyio==4.15.1 # via httpx beautifulsoup4==4.15.0 # via jupyter-repo2docker @@ -46,7 +46,7 @@ osfclient @ git+https://github.com/RCOSDP/rdmclient.git@master # via jupyter-repo2docker packaging==26.1 # via jupyter-repo2docker -python-dateutil==2.9.0.post0 +python-dateutil==3.0.0 # via osfclient python-json-logger==4.1.0 # via jupyter-repo2docker @@ -62,11 +62,11 @@ six==1.17.0 # via # osfclient # python-dateutil -soupsieve==2.8.4 +soupsieve==3.0.4 # via beautifulsoup4 toml==0.10.2 # via jupyter-repo2docker -tqdm==4.68.4 +tqdm==4.70.1 # via osfclient traitlets==5.14.3 # via jupyter-repo2docker @@ -74,7 +74,9 @@ typing-extensions==4.16.0 # via # anyio # beautifulsoup4 -tzlocal==5.4.4 +tzdata==2026.5 + # via python-dateutil +tzlocal==5.4.5 # via osfclient urllib3==2.6.3 # via From 0500021fe2a1436eeb35848731c3fd9a3136fc6a Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 21 Jul 2026 18:09:25 +0200 Subject: [PATCH 296/299] Fix dataverse test due to update in record by author (cherry picked from commit ad2bc8922015619c7913f2d8853259d24f5c4d47) --- tests/contentproviders/test_dataverse.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/contentproviders/test_dataverse.py b/tests/contentproviders/test_dataverse.py index 9ca25852f..bc3203062 100644 --- a/tests/contentproviders/test_dataverse.py +++ b/tests/contentproviders/test_dataverse.py @@ -74,12 +74,13 @@ def test_get_persistent_id(url, persistent_id, is_ambiguous): [ ( ( - "doi:10.7910/DVN/TJCLKP", + "https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/TJCLKP&version=5.0", "https://dataverse.harvard.edu/citation?persistentId=doi:10.7910/DVN/TJCLKP", + "doi:10.7910/DVN/TJCLKP", ), { - "data/primary/primary-data.zip": "a8f6fc3fc58f503cd48e23fa8b088694", - "data/2023-01-03.tsv": "6fd497bf13dab9a06fe737ebc22f1917", + "data/primary/primary-data.zip": "f24541c5f89a09bc6db2781220cbbe70", + "data/2026-06-24.tsv": "0165275ec1437dd2bcb1c6b4b56ef233", "code/language.py": "9d61582bcf497c83bbd1ed0eed3c772e", }, ), From f44b1d841dabe12b2ed8f1ea4596d1205b770a61 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Tue, 21 Jul 2026 18:30:06 +0200 Subject: [PATCH 297/299] Fix hydroshare test due to update in record by author (cherry picked from commit 9396a481baa51799963a716928bc114f0d398d0a) --- tests/unit/contentproviders/test_hydroshare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/contentproviders/test_hydroshare.py b/tests/unit/contentproviders/test_hydroshare.py index cc11346ac..1288010a7 100755 --- a/tests/unit/contentproviders/test_hydroshare.py +++ b/tests/unit/contentproviders/test_hydroshare.py @@ -37,7 +37,7 @@ def test_content_id(): hydro = Hydroshare() hydro.detect("10.4211/hs.b8f6eae9d89241cf8b5904033460af61") - assert hydro.content_id == "b8f6eae9d89241cf8b5904033460af61.v1585005408" + assert hydro.content_id == "b8f6eae9d89241cf8b5904033460af61.v1783452415" def test_detect_hydroshare(): @@ -54,7 +54,7 @@ def test_detect_hydroshare(): "version": "https://www.hydroshare.org/hsapi/resource/{}/scimeta/elements", }, "resource": "b8f6eae9d89241cf8b5904033460af61", - "version": "1585005408", + "version": "1783452415", } assert ( From f196d32e53737556d4680e7492f5949a859ab756 Mon Sep 17 00:00:00 2001 From: yacchin1205 <968739+yacchin1205@users.noreply.github.com> Date: Wed, 28 Oct 2026 09:44:25 +0000 Subject: [PATCH 298/299] Bump certifi --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b2820f2eb..1ee4ea202 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ anyio==4.15.1 # via httpx beautifulsoup4==4.15.0 # via jupyter-repo2docker -certifi==2026.2.25 +certifi==2026.10.23 # via # httpcore # httpx From 1667007b2879ca532542c08951d1578029edd909 Mon Sep 17 00:00:00 2001 From: yacchin1205 <968739+yacchin1205@users.noreply.github.com> Date: Wed, 28 Oct 2026 12:32:29 +0000 Subject: [PATCH 299/299] Support buildpack-deps:24.04 for MATLAB --- repo2docker/buildpacks/conda/matlab.py | 8 +-- tests/unit/test_matlab.py | 76 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 tests/unit/test_matlab.py diff --git a/repo2docker/buildpacks/conda/matlab.py b/repo2docker/buildpacks/conda/matlab.py index c1af63f04..716e059d2 100644 --- a/repo2docker/buildpacks/conda/matlab.py +++ b/repo2docker/buildpacks/conda/matlab.py @@ -3,6 +3,7 @@ UBUNTU_NAMES_FOR_BASE_IMAGES = { "buildpack-deps:jammy": "ubuntu22.04", + "buildpack-deps:24.04": "ubuntu24.04", } def matlab_requirements_scripts(release, base_image): @@ -55,12 +56,7 @@ def matlab_python_engine_installation_scripts(release, dest_dir): Based on https://github.com/mathworks-ref-arch/matlab-integration-for-jupyter/blob/a4ac9b9ce5c2880596c77670eddab93f7ef9d4fc/matlab/Dockerfile#L100-L108 """ - script = f"""export DEBIAN_FRONTEND=noninteractive && apt-get update \ - && apt-get install --no-install-recommends -y python3-distutils \ - && apt-get clean \ - && apt-get -y autoremove \ - && rm -rf /var/lib/apt/lists/* \ - && cd {dest_dir}/extern/engines/python \ + script = f"""cd {dest_dir}/extern/engines/python \ && python setup.py install || true""" return [("root", script)] diff --git a/tests/unit/test_matlab.py b/tests/unit/test_matlab.py new file mode 100644 index 000000000..7009f428b --- /dev/null +++ b/tests/unit/test_matlab.py @@ -0,0 +1,76 @@ +""" +Test MATLAB installation scripts +""" + +from unittest.mock import patch + +import pytest +from requests.models import Response + +from repo2docker.app import Repo2Docker +from repo2docker.buildpacks import CondaBuildPack +from repo2docker.buildpacks.conda.matlab import matlab_requirements_scripts + +DEPS_URL = "https://raw.githubusercontent.com/mathworks-ref-arch/container-images/main/matlab-deps/r2025b/{}/base-dependencies.txt" + + +def deps_response(): + r = Response() + r.status_code = 200 + r._content = b"# comment\nlibasound2t64\nlibxt6t64\n" + return r + + +@pytest.mark.parametrize( + "base_image, ubuntu_name", + [ + (Repo2Docker.base_image.default_value, "ubuntu24.04"), + ("docker.io/library/buildpack-deps:jammy", "ubuntu22.04"), + ], +) +def test_requirements_for_base_image(base_image, ubuntu_name): + with patch("requests.get", return_value=deps_response()) as get: + scripts = matlab_requirements_scripts("R2025b", base_image) + get.assert_called_once_with(DEPS_URL.format(ubuntu_name)) + [(user, script)] = scripts + assert user == "root" + assert "libasound2t64 libxt6t64" in script + assert "# comment" not in script + + +def test_unknown_base_image(): + with pytest.raises(ValueError): + matlab_requirements_scripts("R2025b", "buildpack-deps:focal") + + +def test_conda_assemble_scripts_with_mpm_yml(tmpdir): + tmpdir.chdir() + with open("environment.yml", "w") as f: + f.write("dependencies:\n - numpy\n") + with open("mpm.yml", "w") as f: + f.write("release: R2025b\nproducts:\n - Simulink\n") + + bp = CondaBuildPack(Repo2Docker.base_image.default_value) + with patch("requests.get", return_value=deps_response()) as get: + scripts = bp._get_assemble_scripts_for_matlab() + get.assert_called_once_with(DEPS_URL.format("ubuntu24.04")) + joined = "\n".join(script for _, script in scripts) + assert "--release=R2025b" in joined + assert "--products MATLAB Simulink" in joined + assert "python3-distutils" not in joined + assert "jupyter-matlab-proxy" in joined + assert bp._get_env_for_matlab() == [ + ("MW_CONTEXT_TAGS", "MATLAB_PROXY:JUPYTER:MPM:V1") + ] + + +def test_mpm_yml_requires_release(tmpdir): + tmpdir.chdir() + with open("environment.yml", "w") as f: + f.write("dependencies:\n - numpy\n") + with open("mpm.yml", "w") as f: + f.write("products:\n - Simulink\n") + + bp = CondaBuildPack(Repo2Docker.base_image.default_value) + with pytest.raises(ValueError): + bp._get_assemble_scripts_for_matlab()