diff --git a/.codecov.yml b/.codecov.yml index 8836913fb..72e51fd76 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -6,7 +6,7 @@ coverage: status: project: default: - target: auto + target: "0%" patch: default: - target: 20% + target: "0%" diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2171bd672..548df5785 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,23 +1,27 @@ --- name: Bug report about: Create a report to help us repair something that is currently broken -title: '' -labels: '' -assignees: '' - +title: "" +labels: "" +assignees: "" --- + ### Bug description + #### Expected behaviour + #### Actual behaviour + ### How to reproduce + 1. Go to '...' @@ -26,9 +30,9 @@ assignees: '' 4. See error ### Your personal set up - - - OS: [e.g. linux, OSX] - - Docker version: `docker version` - - repo2docker version `repo2docker --version` + +- OS: [e.g. linux, OSX] +- Docker version: `docker version` +- repo2docker version `repo2docker --version` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 833ba6e5f..a0bcd5a2f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,29 +1,29 @@ --- name: Feature request about: Suggest a new feature or a big change to repo2docker -title: '' -labels: 'needs: discussion' -assignees: '' - +title: "" +labels: "needs: discussion" +assignees: "" --- + ### Proposed change - + ### Alternative options - + ### Who would use this feature? - + ### How much effort will adding it take? - + ### Who can do this work? - + diff --git a/.github/ISSUE_TEMPLATE/support-question.md b/.github/ISSUE_TEMPLATE/support-question.md index bf10a69a4..e7b543e50 100644 --- a/.github/ISSUE_TEMPLATE/support-question.md +++ b/.github/ISSUE_TEMPLATE/support-question.md @@ -1,10 +1,9 @@ --- name: Support question about: Ask a question about using repo2docker -title: '' -labels: '' -assignees: '' - +title: "" +labels: "" +assignees: "" --- 🚨 Please do **not** open an issue for support questions. Instead please search for similar issues or post on http://discourse.jupyter.org/c/questions. 🚨 diff --git a/.github/dependabot.yml b/.github/dependabot.yaml similarity index 54% rename from .github/dependabot.yml rename to .github/dependabot.yaml index ac88b7c69..ec797f62c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yaml @@ -1,4 +1,4 @@ -# dependabot.yml reference: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +# dependabot.yaml reference: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file # # Notes: # - Status and logs from dependabot are provided at @@ -9,8 +9,9 @@ version: 2 updates: # Maintain dependencies in our GitHub Workflows - package-ecosystem: github-actions - directory: "/" # This should be / rather than .github/workflows + directory: / + labels: [ci] schedule: - interval: weekly + interval: monthly time: "05:00" - timezone: "Etc/UTC" + timezone: Etc/UTC diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 33b744735..c9d588590 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -11,6 +11,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/docker.yml" + - ".pre-commit-config.yaml" push: paths-ignore: - "docs/**" @@ -18,6 +19,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/docker.yml" + - ".pre-commit-config.yaml" branches-ignore: - "dependabot/**" - "pre-commit-ci-update-config" @@ -36,7 +38,7 @@ jobs: # https://github.com/docker/build-push-action - name: Build Docker image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . tags: jupyter/repo2docker:pr diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e5d5ba16f..3a1a4c9fc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/release.yml" + - ".pre-commit-config.yaml" push: paths-ignore: - "docs/**" @@ -18,6 +19,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/release.yml" + - ".pre-commit-config.yaml" branches-ignore: - "dependabot/**" - "pre-commit-ci-update-config" @@ -34,20 +36,28 @@ jobs: with: python-version: "3.9" - - name: Install dependencies + - name: install build requirements run: | - pip install -r dev-requirements.txt + pip install build pip freeze - - name: Build distribution archives + - name: build release run: | - python setup.py sdist bdist_wheel + python -m build --sdist --wheel . + ls -l dist + + # ref: https://github.com/actions/upload-artifact#readme + - uses: actions/upload-artifact@v3 + with: + name: repo2docker-${{ github.sha }} + path: "dist/*" + if-no-files-found: error # This step is only run when a new tag is pushed # all previous steps always run in order to exercise them - name: Publish distribution to PyPI if: startsWith(github.ref, 'refs/tags') - uses: pypa/gh-action-pypi-publish@v1.5.1 + uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_PASSWORD }} @@ -114,9 +124,9 @@ jobs: echo "TAGS=$TAGS" >> $GITHUB_ENV - name: Build and push repo2docker - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.TAGS }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4dfca1ce3..798f07723 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,6 +11,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/test.yml" + - ".pre-commit-config.yaml" push: paths-ignore: - "docs/**" @@ -18,6 +19,7 @@ on: - "**.rst" - ".github/workflows/*" - "!.github/workflows/test.yml" + - ".pre-commit-config.yaml" branches-ignore: - "dependabot/**" - "pre-commit-ci-update-config" @@ -39,38 +41,7 @@ env: GIT_AUTHOR_NAME: CI User jobs: - pre-commit: - runs-on: ubuntu-22.04 - - strategy: - fail-fast: false - matrix: - python_version: ["3.9"] - - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: "${{ matrix.python_version }}" - - # There will almost never be a cache hit on the cache key when this job is - # run, as it is the first of all jobs in this workflow. The subsequent - # jobs in this workflow can rely on this cache though. - - name: Save pip's install cache on job completion - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: "${{ github.run_id }}-${{ matrix.python_version }}" - - - name: Install dependencies - run: | - pip install -r dev-requirements.txt - pip freeze - - - run: pre-commit run --all-files - test: - needs: pre-commit runs-on: ubuntu-${{ matrix.ubuntu_version }} strategy: @@ -103,12 +74,6 @@ jobs: with: python-version: "${{ matrix.python_version }}" - - name: Restore pip's install cache from previous job - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: "${{ github.run_id }}-${{ matrix.python_version }}" - - name: Install dependencies run: | pip install -r dev-requirements.txt @@ -116,7 +81,7 @@ jobs: - name: Install repo2docker run: | - python setup.py bdist_wheel + python -m build --wheel . pip install dist/*.whl # add for mercurial tests @@ -128,6 +93,4 @@ jobs: run: | pytest --verbose --color=yes --durations=10 --cov=repo2docker tests/${{ matrix.repo_type }} - - name: Submit codecov report - run: | - codecov + - uses: codecov/codecov-action@v3 diff --git a/.gitignore b/.gitignore index 31b06b9a6..1f6672428 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,15 @@ +# Manually added parts to .gitignore +# ---------------------------------- +# .#* -dist -build *.tar.gz -*.egg-info *.py[co] -__pycache__ -MANIFEST .DS_Store -.cache -.pytest_cache -.coverage -htmlcov repo2docker/s2i ^bin/ -lib/ -lib64/ share/ include/ @@ -31,7 +23,171 @@ tests/dockerfile/legacy/root.frozen.yml generated/ test_file_text.txt - \.vscode/ tests/dockerfile_diff.sh + + +# Python .gitignore from https://github.com/github/gitignore/blob/HEAD/Python.gitignore +# ------------------------------------------------------------------------------------- +# +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# 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/ diff --git a/.gitpod.yml b/.gitpod.yml index f89636401..69e7aa86d 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,10 +1,12 @@ tasks: - init: | pip3 install sphinx-autobuild - pip3 install -r docs/doc-requirements.txt - pip3 install -e. + pip3 install -r dev-requirements.txt + pip3 install -r docs/requirements.txt + pip3 install -e . command: | - sphinx-autobuild docs/source/ docs/build/html/ + sphinx-autobuild docs/source/ docs/_build/html/ name: Sphinx preview + ports: -- port: 8000 + - port: 8000 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aaf7a3305..3040ce88e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,17 +9,21 @@ # - Register git hooks: pre-commit install --install-hooks # repos: - # # Autoformat: Python code, syntax patterns are modernized - # - repo: https://github.com/asottile/pyupgrade - # rev: v3.0.0 - # hooks: - # - id: pyupgrade - # args: - # - --py38-plus + # Autoformat: Python code, syntax patterns are modernized + - repo: https://github.com/asottile/pyupgrade + rev: v3.4.0 + hooks: + - id: pyupgrade + args: + - --py36-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. + exclude: check-tmp # Autoformat: Python code - repo: https://github.com/psf/black - rev: 22.10.0 + rev: 23.3.0 hooks: - id: black args: @@ -28,17 +32,23 @@ repos: - --target-version=py38 - --target-version=py39 - --target-version=py310 + - --target-version=py311 - # # Autoformat: Python code - # - repo: https://github.com/pycqa/isort - # rev: 5.10.1 - # hooks: - # - id: isort - # args: - # - --profile=black + # Autoformat: Python code + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: + - --profile=black + + # Autoformat: markdown + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.0-alpha.9-for-vscode + hooks: + - id: prettier + files: ".md" - # # Autoformat: markdown, yaml (but not helm templates) - # - repo: https://github.com/pre-commit/mirrors-prettier - # rev: v2.7.1 - # hooks: - # - id: prettier +# pre-commit.ci config reference: https://pre-commit.ci/#configuration +ci: + autoupdate_schedule: monthly diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..dde32e62f --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,19 @@ +# Configuration on how ReadTheDocs (RTD) builds our documentation +# ref: https://readthedocs.org/projects/repo2docker-service/ +# ref: https://docs.readthedocs.io/en/stable/config-file/v2.html +# +version: 2 + +sphinx: + configuration: docs/source/conf.py + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +python: + install: + - requirements: docs/requirements.txt + - method: pip + path: . diff --git a/CHANGES.rst b/CHANGES.rst index 8441ef9f4..5beccbf12 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1 +1 @@ -The ``repo2docker`` changelog has been moved. It can be viewed online at https://repo2docker.readthedocs.io/en/latest/changelog.html. In the ``repo2docker`` repository, the changelog is located at ``docs/source/changelog.rst``. +The ``repo2docker`` changelog has been moved. It can be viewed online at https://repo2docker.readthedocs.io/en/latest/changelog.html. In the ``repo2docker`` repository, the changelog is located at ``docs/source/changelog.md``. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f1a583d59..1dfc19576 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,19 +8,20 @@ The repo2docker developer documentation is all rendered on our documentation web If you're here, you're probably looking for the [Contributing to repo2docker development](https://repo2docker.readthedocs.io/en/latest/contributing/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). - * 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). - * These are tips and tricks to help make your contribution as smooth as possible for you and for the repo2docker maintenance team. + +- [Process for making a contribution](https://repo2docker.readthedocs.io/en/latest/contributing/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). + - 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) - * We use the roadmap to develop a shared understanding of the project's vision and direction amongst the community of users, contributors, and maintainers. +- [Our roadmap](https://repo2docker.readthedocs.io/en/latest/contributing/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. +- [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) - * Some notes on running tests, buildpack dependencies, creating a release, and keeping the pip files up to date. + - 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) + - Some notes on running tests, buildpack dependencies, creating a release, and keeping the pip files up to date. diff --git a/Dockerfile b/Dockerfile index 4edb501a5..0cffcd187 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,39 +1,29 @@ # syntax = docker/dockerfile:1.3 -ARG ALPINE_VERSION=3.17.0 -FROM alpine:${ALPINE_VERSION} AS builder - -RUN apk add --no-cache git python3 python3-dev py-pip build-base +ARG ALPINE_VERSION=3.17 +FROM alpine:${ALPINE_VERSION} -# set pip's cache directory using this environment variable, and use -# ARG instead of ENV to ensure its only set when the image is built -ARG PIP_CACHE_DIR=/tmp/pip-cache +RUN apk add --no-cache git python3 python3-dev py3-pip py3-setuptools build-base # build wheels in first image ADD . /tmp/src RUN cd /tmp/src && git clean -xfd && git status -RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ - mkdir /tmp/wheelhouse \ +RUN mkdir /tmp/wheelhouse \ && cd /tmp/wheelhouse \ && pip3 install wheel \ - && pip3 wheel /tmp/src \ + && pip3 wheel --no-cache-dir /tmp/src \ && ls -l /tmp/wheelhouse FROM alpine:${ALPINE_VERSION} # install python, git, bash, mercurial -RUN apk add --no-cache git git-lfs python3 py-pip bash docker mercurial +RUN apk add --no-cache git git-lfs python3 py3-pip py3-setuptools bash docker mercurial -# repeat ARG from above -ARG PIP_CACHE_DIR=/tmp/pip-cache +# install hg-evolve (Mercurial extensions) +RUN pip3 install hg-evolve --user --no-cache-dir # install repo2docker -# and hg-evolve (Mercurial extensions) -# mount /tmp/wheelhouse from build stage -# avoids extra layer when using COPY --from -RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ - --mount=type=cache,from=builder,source=/tmp/wheelhouse,target=/tmp/wheelhouse \ - pip3 install --ignore-installed --no-deps /tmp/wheelhouse/*.whl \ - && pip3 install hg-evolve \ +COPY --from=0 /tmp/wheelhouse /tmp/wheelhouse +RUN pip3 install --no-cache-dir --ignore-installed --no-deps /tmp/wheelhouse/*.whl \ && pip3 list # add git-credential helper diff --git a/README.md b/README.md index 84949e84f..01d60eebc 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ For more information, please visit --- ## Using repo2docker + ### Prerequisites 1. Docker to build & run the repositories. The [community edition](https://store.docker.com/search?type=edition&offering=community) @@ -83,21 +84,19 @@ something like: 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 +For more information on how to use `repo2docker`, see the [usage guide](http://repo2docker.readthedocs.io/en/latest/usage.html). - ## 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 +files that `repo2docker` can use, see the [complete list of configuration files](https://repo2docker.readthedocs.io/en/latest/config_files.html). The philosophy of repo2docker is inspired by [Heroku Build Packs](https://devcenter.heroku.com/articles/buildpacks). - ## Docker Image Repo2Docker can be run inside a Docker container if access to the Docker Daemon is provided, for example see [BinderHub](https://github.com/jupyterhub/binderhub). Docker images are [published to quay.io](https://quay.io/repository/jupyterhub/repo2docker?tab=tags). The old [Docker Hub image](https://hub.docker.com/r/jupyter/repo2docker) is no longer supported. diff --git a/dev-requirements.txt b/dev-requirements.txt index 57592762f..6553a6743 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,8 +1,7 @@ -codecov +build conda-lock pre-commit pytest-cov pytest>=4.6 pyyaml requests_mock -wheel diff --git a/docs/Makefile b/docs/Makefile index d82ce5f94..c1a96d05b 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,20 +1,38 @@ -# Minimal makefile for Sphinx documentation -# +# Makefile for Sphinx documentation generated by sphinx-quickstart +# ---------------------------------------------------------------------------- -# You can set these variables from the command line. -SPHINXOPTS = -W -SPHINXBUILD = python3 -msphinx -SPHINXPROJ = repo2docker +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build SOURCEDIR = source -BUILDDIR = build +BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +# "make mode" option. %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) + + +# Manually added commands +# ---------------------------------------------------------------------------- + +# For local development: +# - builds and rebuilds html on changes to source +# - starts a livereload enabled webserver and opens up a browser +devenv: + sphinx-autobuild -b html --open-browser "$(SOURCEDIR)" "$(BUILDDIR)/html" $(SPHINXOPTS) + +# For local development and CI: +# - verifies that links are valid +linkcheck: + $(SPHINXBUILD) -b linkcheck "$(SOURCEDIR)" "$(BUILDDIR)/linkcheck" $(SPHINXOPTS) + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." diff --git a/docs/doc-requirements.txt b/docs/doc-requirements.txt deleted file mode 100644 index e9ab5d3af..000000000 --- a/docs/doc-requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -sphinx==4.0.2 -sphinxcontrib-autoprogram==0.1.7 -pydata-sphinx-theme==0.6.3 -myst-parser==0.15.2 diff --git a/docs/make.bat b/docs/make.bat index e097ad9c1..b7a7c83c6 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -5,32 +5,51 @@ pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx + set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source -set BUILDDIR=build -set SPHINXPROJ=repo2docker +set BUILDDIR=_build if "%1" == "" goto help +if "%1" == "devenv" goto devenv +if "%1" == "linkcheck" goto linkcheck +goto default + +:default %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. + echo.The 'sphinx-build' command was not found. Open and read README.md! + exit /b 1 +) +%SPHINXBUILD% -M %1 "%SOURCEDIR%" "%BUILDDIR%" %SPHINXOPTS% +goto end + + +:help +%SPHINXBUILD% -M help "%SOURCEDIR%" "%BUILDDIR%" %SPHINXOPTS% +goto end + + +:devenv +sphinx-autobuild >NUL 2>NUL +if errorlevel 9009 ( echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ + echo.The 'sphinx-autobuild' command was not found. Open and read README.md! exit /b 1 ) +sphinx-autobuild -b html --open-browser "%SOURCEDIR%" "%BUILDDIR%/html" %SPHINXOPTS% +goto end + -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +:linkcheck +%SPHINXBUILD% -b linkcheck "%SOURCEDIR%" "%BUILDDIR%/linkcheck" %SPHINXOPTS% +echo. +echo.Link check complete; look for any errors in the above output +echo.or in "%BUILDDIR%/linkcheck/output.txt". goto end -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..5c38c561a --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,7 @@ +myst-parser>=0.18 +pydata-sphinx-theme>=0.11 +sphinx-autobuild +sphinx-copybutton +sphinxcontrib-autoprogram>=0.1.7 +sphinxext-opengraph +sphinxext-rediraffe diff --git a/docs/source/architecture.md b/docs/source/architecture.md index 153855188..0153c8ae4 100644 --- a/docs/source/architecture.md +++ b/docs/source/architecture.md @@ -4,6 +4,7 @@ This is a living document talking about the architecture of repo2docker from various perspectives. (buildpacks)= + ## Buildpacks The **buildpack** concept comes from [Heroku](https://devcenter.heroku.com/articles/buildpacks) @@ -57,7 +58,7 @@ and basic notebook packages (from `repo2docker/buildpacks/conda/environment.yml` 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 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. @@ -65,11 +66,11 @@ The `get_build_scripts` and `get_build_script_files` methods are primarily used 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: -1. You can *not* use the contents of repository in them, since this happens before the repository +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, since there's no `requirements.txt` inside the image at this point. This is an explicit design decision, to enable better layer caching. -2. You *may*, however, read the contents of the repository and modify the scripts emitted based +2. You _may_, however, read the contents of the repository and modify the scripts emitted based on that! For example, in `CondaBuildPack`, if there's Python 2 specified in `environment.yml`, a different kind of environment is set up. The reading of the `environment.yml` is performed in the BuildPack itself, and not in the scripts returned by `get_build_scripts`. This is fine. @@ -118,7 +119,7 @@ a path to a repository. This might be a local path or a URL. Upon being called, `repo2docker` will loop through all ContentProviders and perform the following commands: -* Run the `detect()` method on the repository path given to `repo2docker`. This +- Run the `detect()` method on the repository path given to `repo2docker`. This should return any value other than `None` if the path matches what the ContentProvider is looking for. @@ -126,12 +127,11 @@ commands: > checks whether the argument is a valid local path. If so, then `detect(` > returns a dictionary: `{'path': source}` which defines the path to the repository. > This path is used by `fetch()` to check that it matches the output directory. -* If `detect()` returns something other than `None`, run `fetch()` with the + +- If `detect()` returns something other than `None`, run `fetch()` with the returned value as its argument. This should result in the contents of the repository being placed locally to a folder. For more information on ContentProviders, take a look at [the ContentProvider base class](https://github.com/jupyterhub/repo2docker/blob/80b979f8580ddef184d2ba7d354e7a833cfa38a4/repo2docker/contentproviders/base.py#L16-L60) which has more explanation. - - diff --git a/docs/source/changelog.md b/docs/source/changelog.md new file mode 100644 index 000000000..772de23e9 --- /dev/null +++ b/docs/source/changelog.md @@ -0,0 +1,554 @@ +# Changelog + +## Version 2023.06.0 + +([full changelog](https://github.com/jupyterhub/repo2docker/compare/2022.10.0...2023.06.0)) + +### Breaking changes + +- JupyterHub version installed by default upgraded from 1.5 to 3.1.1 +- Microsoft [killed MRAN](https://techcommunity.microsoft.com/t5/azure-sql-blog/microsoft-r-application-network-retirement/ba-p/3707161), so all package snapshots now come from [Posit Package Manager](https://packagemanager.posit.co/client/). Snapshots from before 2018-12-07 are now no longer available, so you might have to update the snapshot date in your `runtime.txt`. + +### New features added + +- Support Python 3.11 and upgrade jupyterhub from 1.5.0 to 3.1.1 [#1239](https://github.com/jupyterhub/repo2docker/pull/1239) ([@minrk](https://github.com/minrk)) +- allow user to specify a single port with default command [#918](https://github.com/jupyterhub/repo2docker/pull/918) ([@minrk](https://github.com/minrk)) +- Let `FROM ` in the Dockerfile template be configurable [#909](https://github.com/jupyterhub/repo2docker/pull/909) ([@yuvipanda](https://github.com/yuvipanda)) + +### Enhancements made + +- Update to mamba 1.4.0 [#1256](https://github.com/jupyterhub/repo2docker/pull/1256) ([@SylvainCorlay](https://github.com/SylvainCorlay)) +- [MRG] download original file formats from Dataverse #1242 [#1253](https://github.com/jupyterhub/repo2docker/pull/1253) ([@pdurbin](https://github.com/pdurbin)) +- Add optional registry credentials to push() [#1245](https://github.com/jupyterhub/repo2docker/pull/1245) ([@manics](https://github.com/manics)) +- Add ARM64 support where possible [#1228](https://github.com/jupyterhub/repo2docker/pull/1228) ([@manics](https://github.com/manics)) +- Switch default python to 3.10 [#1219](https://github.com/jupyterhub/repo2docker/pull/1219) ([@yuvipanda](https://github.com/yuvipanda)) + +### Bugs fixed + +- Microsoft killed MRAN, stop relying on it [#1285](https://github.com/jupyterhub/repo2docker/pull/1285) ([@minrk](https://github.com/minrk)) +- Update the location of R packagemanager [#1273](https://github.com/jupyterhub/repo2docker/pull/1273) ([@Xarthisius](https://github.com/Xarthisius)) +- missing `f` in julia fetch error f-string [#1264](https://github.com/jupyterhub/repo2docker/pull/1264) ([@minrk](https://github.com/minrk)) +- avoid duplicate log statements by memoizing getters [#1248](https://github.com/jupyterhub/repo2docker/pull/1248) ([@minrk](https://github.com/minrk)) +- Add Conda env library path to RStudio configuration [#1237](https://github.com/jupyterhub/repo2docker/pull/1237) ([@TimStewartJ](https://github.com/TimStewartJ)) +- Create Julia projects based on binder/Project.toml when found [#1216](https://github.com/jupyterhub/repo2docker/pull/1216) ([@frankier](https://github.com/frankier)) +- Allow REPO_DIR to be a non-existing folder by creating it and providing the user with permissions [#976](https://github.com/jupyterhub/repo2docker/pull/976) ([@bollwyvl](https://github.com/bollwyvl)) + +### Maintenance and upkeep improvements + +- Microsoft killed MRAN, stop relying on it [#1285](https://github.com/jupyterhub/repo2docker/pull/1285) ([@minrk](https://github.com/minrk)) +- Relax pins to major versions and refreeze, introduce explicit jupyter_server v1 pin [#1283](https://github.com/jupyterhub/repo2docker/pull/1283) ([@consideRatio](https://github.com/consideRatio)) +- fix github link templates [#1276](https://github.com/jupyterhub/repo2docker/pull/1276) ([@minrk](https://github.com/minrk)) +- dependabot: monthly updates of github actions [#1262](https://github.com/jupyterhub/repo2docker/pull/1262) ([@consideRatio](https://github.com/consideRatio)) +- Remove deprecated nteract_on_jupyter [#1259](https://github.com/jupyterhub/repo2docker/pull/1259) ([@yuvipanda](https://github.com/yuvipanda)) +- disable codecov failures [#1251](https://github.com/jupyterhub/repo2docker/pull/1251) ([@minrk](https://github.com/minrk)) +- Support Python 3.11 and upgrade jupyterhub from 1.5.0 to 3.1.1 [#1239](https://github.com/jupyterhub/repo2docker/pull/1239) ([@minrk](https://github.com/minrk)) +- 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)) +- 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)) +- pre-commit: add pyupgrade, isort, and prettier for .md files [#1202](https://github.com/jupyterhub/repo2docker/pull/1202) ([@consideRatio](https://github.com/consideRatio)) +- Create wheels with the build package, stop calling setup.py directly [#1199](https://github.com/jupyterhub/repo2docker/pull/1199) ([@consideRatio](https://github.com/consideRatio)) +- Add check-tmp step to local repo tests [#1126](https://github.com/jupyterhub/repo2docker/pull/1126) ([@minrk](https://github.com/minrk)) +- Set default, type, and help method for engine in argparse [#1073](https://github.com/jupyterhub/repo2docker/pull/1073) ([@jgarte](https://github.com/jgarte)) + +### Documentation improvements + +- Fix links to jupyterlab-demo postBuild file [#1282](https://github.com/jupyterhub/repo2docker/pull/1282) ([@fcollonval](https://github.com/fcollonval)) +- Recreate changelog as markdown [#1281](https://github.com/jupyterhub/repo2docker/pull/1281) ([@yuvipanda](https://github.com/yuvipanda)) +- fix github link templates [#1276](https://github.com/jupyterhub/repo2docker/pull/1276) ([@minrk](https://github.com/minrk)) +- update docs for default and supported Python versions [#1250](https://github.com/jupyterhub/repo2docker/pull/1250) ([@minrk](https://github.com/minrk)) +- docs: add devenv, linkcheck, and refresh misc config etc [#1197](https://github.com/jupyterhub/repo2docker/pull/1197) ([@consideRatio](https://github.com/consideRatio)) + +### Other merged PRs + +- build(deps): bump pypa/gh-action-pypi-publish from 1.8.5 to (edit) release/v1 [#1279](https://github.com/jupyterhub/repo2docker/pull/1279) ([@dependabot](https://github.com/dependabot)) +- [pre-commit.ci] pre-commit autoupdate [#1270](https://github.com/jupyterhub/repo2docker/pull/1270) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- build(deps): bump pypa/gh-action-pypi-publish from 1.8.4 to 1.8.5 [#1263](https://github.com/jupyterhub/repo2docker/pull/1263) ([@dependabot](https://github.com/dependabot)) +- [pre-commit.ci] pre-commit autoupdate [#1261](https://github.com/jupyterhub/repo2docker/pull/1261) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- build(deps): bump pypa/gh-action-pypi-publish from 1.8.3 to 1.8.4 [#1260](https://github.com/jupyterhub/repo2docker/pull/1260) ([@dependabot](https://github.com/dependabot)) +- build(deps): bump pypa/gh-action-pypi-publish from 1.6.4 to 1.8.3 [#1257](https://github.com/jupyterhub/repo2docker/pull/1257) ([@dependabot](https://github.com/dependabot)) +- [pre-commit.ci] pre-commit autoupdate [#1252](https://github.com/jupyterhub/repo2docker/pull/1252) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- Ensure `BuildPack.python_version` is specified [#1249](https://github.com/jupyterhub/repo2docker/pull/1249) ([@minrk](https://github.com/minrk)) +- Update install-nix.bash [#1244](https://github.com/jupyterhub/repo2docker/pull/1244) ([@robertodr](https://github.com/robertodr)) +- build(deps): bump docker/build-push-action from 3 to 4 [#1241](https://github.com/jupyterhub/repo2docker/pull/1241) ([@dependabot](https://github.com/dependabot)) +- Update to `jupyter-resource-usage==0.7.0` [#1236](https://github.com/jupyterhub/repo2docker/pull/1236) ([@jtpio](https://github.com/jtpio)) +- Also install dev requirements on Gitpod [#1235](https://github.com/jupyterhub/repo2docker/pull/1235) ([@jtpio](https://github.com/jtpio)) +- Bump to Node 18 [#1234](https://github.com/jupyterhub/repo2docker/pull/1234) ([@jtpio](https://github.com/jtpio)) +- [pre-commit.ci] pre-commit autoupdate [#1229](https://github.com/jupyterhub/repo2docker/pull/1229) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- Quick-fix for Docker image build [#1227](https://github.com/jupyterhub/repo2docker/pull/1227) ([@manics](https://github.com/manics)) +- Fix tests/external/reproductions.repos.yaml [#1226](https://github.com/jupyterhub/repo2docker/pull/1226) ([@manics](https://github.com/manics)) +- Fix typo [#1224](https://github.com/jupyterhub/repo2docker/pull/1224) ([@fkohrt](https://github.com/fkohrt)) +- build(deps): bump pypa/gh-action-pypi-publish from 1.5.1 to 1.6.4 [#1223](https://github.com/jupyterhub/repo2docker/pull/1223) ([@dependabot](https://github.com/dependabot)) +- [pre-commit.ci] pre-commit autoupdate [#1222](https://github.com/jupyterhub/repo2docker/pull/1222) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- ci: cleanup no longer used test logic related to memlimit [#1218](https://github.com/jupyterhub/repo2docker/pull/1218) ([@consideRatio](https://github.com/consideRatio)) +- [pre-commit.ci] pre-commit autoupdate [#1217](https://github.com/jupyterhub/repo2docker/pull/1217) ([@pre-commit-ci](https://github.com/pre-commit-ci)) +- ci: use non-deprecated codecov uploader [#1209](https://github.com/jupyterhub/repo2docker/pull/1209) ([@consideRatio](https://github.com/consideRatio)) +- ci: stop running pre-commit in gha, rely on pre-commit.ci [#1200](https://github.com/jupyterhub/repo2docker/pull/1200) ([@consideRatio](https://github.com/consideRatio)) +- Initial changelog for 2022.10.0 [#1194](https://github.com/jupyterhub/repo2docker/pull/1194) ([@manics](https://github.com/manics)) + +### Contributors to this release + +([GitHub contributors page for this release](https://github.com/jupyterhub/repo2docker/graphs/contributors?from=2022-10-18&to=2023-06-13&type=c)) + +[@AliMirlou](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AAliMirlou+updated%3A2022-10-18..2023-06-13&type=Issues) | [@betatim](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Abetatim+updated%3A2022-10-18..2023-06-13&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Abollwyvl+updated%3A2022-10-18..2023-06-13&type=Issues) | [@choldgraf](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Acholdgraf+updated%3A2022-10-18..2023-06-13&type=Issues) | [@consideRatio](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AconsideRatio+updated%3A2022-10-18..2023-06-13&type=Issues) | [@craig-willis](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Acraig-willis+updated%3A2022-10-18..2023-06-13&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Adependabot+updated%3A2022-10-18..2023-06-13&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Afcollonval+updated%3A2022-10-18..2023-06-13&type=Issues) | [@fkohrt](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Afkohrt+updated%3A2022-10-18..2023-06-13&type=Issues) | [@frankier](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Afrankier+updated%3A2022-10-18..2023-06-13&type=Issues) | [@jgarte](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ajgarte+updated%3A2022-10-18..2023-06-13&type=Issues) | [@jhamman](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ajhamman+updated%3A2022-10-18..2023-06-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ajtpio+updated%3A2022-10-18..2023-06-13&type=Issues) | [@manics](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Amanics+updated%3A2022-10-18..2023-06-13&type=Issues) | [@meeseeksmachine](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ameeseeksmachine+updated%3A2022-10-18..2023-06-13&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Aminrk+updated%3A2022-10-18..2023-06-13&type=Issues) | [@nuest](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Anuest+updated%3A2022-10-18..2023-06-13&type=Issues) | [@pdurbin](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Apdurbin+updated%3A2022-10-18..2023-06-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Apre-commit-ci+updated%3A2022-10-18..2023-06-13&type=Issues) | [@robertodr](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Arobertodr+updated%3A2022-10-18..2023-06-13&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3ASylvainCorlay+updated%3A2022-10-18..2023-06-13&type=Issues) | [@TimStewartJ](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3ATimStewartJ+updated%3A2022-10-18..2023-06-13&type=Issues) | [@trybik](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Atrybik+updated%3A2022-10-18..2023-06-13&type=Issues) | [@welcome](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Awelcome+updated%3A2022-10-18..2023-06-13&type=Issues) | [@westurner](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Awesturner+updated%3A2022-10-18..2023-06-13&type=Issues) | [@Xarthisius](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3AXarthisius+updated%3A2022-10-18..2023-06-13&type=Issues) | [@yamaton](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ayamaton+updated%3A2022-10-18..2023-06-13&type=Issues) | [@yuvipanda](https://github.com/search?q=repo%3Ajupyterhub%2Frepo2docker+involves%3Ayuvipanda+updated%3A2022-10-18..2023-06-13&type=Issues) + +## Version 2022.10.0 + +[Full changelog](https://github.com/jupyterhub/repo2docker/compare/2022.02.0...2022.10.0) + +### New features + +- Update Jupyter dependencies {pr}`1193` by {user}`jtpio` +- add Python 3.10 base environment {pr}`1175` by {user}`minrk` +- Bump default R version to 4.2 from 4.1, and let R 3.4 go from 3.4.0 to 3.4.4 {pr}`1165` by {user}`yuvipanda` +- Support pulling from zenodo sandbox too {pr}`1169` by {user}`yuvipanda` +- Add MPDL Dataverse {pr}`1167` by {user}`wilhelmfrank` +- Add JPL Dataverse {pr}`1163` by {user}`foobarbecue` +- upgrade RStudio Server to v2022.02.1 {pr}`1148` by {user}`aplamada` +- Pass build_args to `render()` during `--no-build` for consistency with regular builds {pr}`1135` by {user}`yoogottamk` + +### Documentation improvements + +- Update 'how to get R' section {pr}`1147` by {user}`yuvipanda` +- Post release fixes {pr}`1133` by {user}`manics` + +### API changes + +### Bug fixes + +- consistent log handling when not using JSON loggers {pr}`1177` by {user}`minrk` +- Fix Read-Only filesystem permission issue for log file {pr}`1156` by {user}`timeu` +- handle permission issue writing .jupyter-server-log.txt in REPO_DIR {pr}`1151` by {user}`pymonger` +- handle r version being unspecified in environment.yml {pr}`1141` by {user}`minrk` + +### Other merged PRs + +- Remove conda buildpacks pin of r-irkernel to 1.2 {pr}`1191` by {user}`consideRatio` +- ci: refactor julia/r/conda tests - now ~25 min instead of ~50 min {pr}`1188` by {user}`consideRatio` +- ci: general refresh of github workflows, update gha versions and let dependabot do it, etc. {pr}`1186` by {user}`consideRatio` +- Use enum to standardise `phase` {pr}`1185` by {user}`manics` +- fail on unsupported Python {pr}`1184` by {user}`minrk` +- mount wheels from build stage instead of copying them {pr}`1182` by {user}`minrk` +- get CI working again {pr}`1178` by {user}`minrk` +- explicitly build linux/amd64 images {pr}`1176` by {user}`minrk` +- Freeze.py update {pr}`1173` by {user}`manics` +- Bump version of nodejs {pr}`1172` by {user}`yuvipanda` +- Update mamba {pr}`1171` by {user}`SylvainCorlay` +- ci: switch to using a 2fa enabled accounts pypi api-token {pr}`1166` by {user}`consideRatio` +- Get R from RStudio provided apt packages (.deb files) {pr}`1161` by {user}`yuvipanda` +- Shallow clone HEAD {pr}`1160` by {user}`daradib` +- Update black version {pr}`1150` by {user}`yuvipanda` +- Update base notebook packages {pr}`1149` by {user}`yuvipanda` +- Update Dockerfile to current Alpine (ALPINE_VERSION=3.15.0) {pr}`1136` by {user}`holzman` +- update Python in some dockerfile tests {pr}`1130` by {user}`minrk` + +## Version 2022.02.0 + +[Full changelog](https://github.com/jupyterhub/repo2docker/compare/2021.08.0...2022.02.0) + +### New features + +- Update ipywidgets jupyter-offlinenotebook jupyterlab {pr}`1127` by {user}`manics` +- Allow passing in extra args to Docker initialization {pr}`1124` by {user}`yuvipanda` +- Allow passing in traitlets via commandline {pr}`1123` by {user}`yuvipanda` +- Bump default R version to 4.1 {pr}`1107` by {user}`yuvipanda` +- Update jupyterlab 3.2.5 jupyter-resource-usage 0.6.1 {pr}`1105` by {user}`manics` +- Get binary R packages from packagemanager.rstudio.com {pr}`1104` by {user}`yuvipanda` +- Support R 4.1 {pr}`1102` by {user}`yuvipanda` +- Add command line option to pass extra build args {pr}`1100` by {user}`TimoRoth` +- Set labels when building image from Dockerfile {pr}`1097` by {user}`TimoRoth` +- jupyterlab 3.1.17 {pr}`1092` by {user}`minrk` +- Bump JupyterLab to 3.1.11 {pr}`1081` by {user}`choldgraf` +- Bootstrap base env with micromamba {pr}`1062` by {user}`wolfv` +- Default UI to JupyterLab {pr}`1035` by {user}`SylvainCorlay` + +### API changes + +### Bug fixes + +### Other merged PRs + +- Put micromamba in /usr/local/bin and use mamba for installs {pr}`1128` by {user}`minrk` +- Remove deprecated calls to distutils {pr}`1122` by {user}`minrk` +- Delete /tmp/downloaded_packages after running install.R {pr}`1119` by {user}`yuvipanda` +- Use a smaller R library in our tests {pr}`1118` by {user}`yuvipanda` +- Only get R itself (r-base-core) from apt, not CRAN packages {pr}`1117` by {user}`minrk` +- set USER root after each directive block {pr}`1115` by {user}`minrk` +- Say 'apt repository' rather than PPA {pr}`1111` by {user}`yuvipanda` +- add tests for R conda {pr}`1108` by {user}`aplamada` +- Add help message to freeze.py {pr}`1106` by {user}`manics` +- Quieter R builds {pr}`1103` by {user}`yuvipanda` +- update user_interface doc to reflect that lab is default {pr}`1085` by {user}`minrk` +- Updates to dev docs + Recommonmark -> MyST Parser {pr}`1082` by {user}`choldgraf` +- Fix Docker build (again) {pr}`1078` by {user}`manics` +- \[mrg\] \_\_init\_\_.py: r_version: fixed description {pr}`1074` by {user}`magnush0lm` +- Typo fix in utils docstring {pr}`1072` by {user}`jgarte` +- Rename requirements.py-3.5.txt to requirements.py-3.5.pip {pr}`1061` by {user}`manics` +- Remove nodesource' nodejs {pr}`847` by {user}`yuvipanda` + +## Version 2021.08.0 + +[Full changelog](https://github.com/jupyterhub/repo2docker/compare/2021.03.0...2021.08.0) + +The repo2docker container image has moved to [quay.io/jupyterhub/repo2docker](https://quay.io/repository/jupyterhub/repo2docker?tab=tags) + +### New features + +- always unpack a single zenodo zip {pr}`1043` by {user}`akhmerov` +- Refreeze with conda-lock {pr}`1024` by {user}`minrk` +- Refine buffered output debugging {pr}`1016` by {user}`minrk` +- reimplement entrypoint in Python {pr}`1014` by {user}`minrk` +- Fetch available Julia versions from hosted json {pr}`994` by {user}`tomyun` +- Define an interface for Container engines {pr}`848` by {user}`manics` + +### API changes + +### Bug fixes + +- 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` +- 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` +- 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` +- Remove CircleCI docs build {pr}`1053` by {user}`yuvipanda` +- Pin doc requirements to avoid CI breakages {pr}`1052` by {user}`manics` +- Stop using deprecated add_stylesheet in sphinx {pr}`1050` by {user}`yuvipanda` +- Add study participation notice to readme {pr}`1046` by {user}`sgibson91` +- Bump urllib3 from 1.26.4 to 1.26.5 {pr}`1045` by {user}`dependabot` +- State newly used installation command {pr}`1040` by {user}`fkohrt` +- Bump pyyaml from 5.1.1 to 5.4 {pr}`1029` by {user}`dependabot` +- Set default Julia version to 1.6 {pr}`1028` by {user}`tomyun` +- Fix logo URL in README {pr}`1027` by {user}`betatim` + +## Version 2021.03.0 + +[Full changelog](https://github.com/jupyterhub/repo2docker/compare/2021.01.0...2021.03.0) + +### New features + +- freeze with mamba, add 3.9 {pr}`1017` by {user}`minrk` +- Add GH workflow to push releases to PYPi and introduce CalVer {pr}`1004` by {user}`betatim` +- Add entrypoint script which automatically propagates \*\_PROXY env vars… {pr}`1003` (\[@g-braeunlich\]()) +- Update to JupyterLab 3.0 {pr}`996` by {user}`jtpio` +- Fetch available Julia versions from hosted json {pr}`994` by {user}`tomyun` +- Add a contentprovider for Software Heritage persistent ID (SWHID) {pr}`988` by {user}`douardda` +- Stream jupyter server logs to a file {pr}`987` by {user}`betatim` +- add 4.0, 4.0.2 to list of supported R versions {pr}`960` by {user}`minrk` + +### API changes + +### Bug fixes + +- fix dataverse regression introduced in last release {pr}`1011` by {user}`MridulS` +- buildpacks.r: dont use apt-key directly to respect \*\_proxy env vars {pr}`1019` (\[@g-braeunlich\]()) + +### Other merged PRs + +- Cleanup install_requires including duplicates {pr}`1020` by {user}`manics` +- 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` + +## Version 2021.01.0 + +[Full changelog](https://github.com/jupyterhub/repo2docker/compare/0.11.0...2021.01.0) + +### New features + +- Replace urllib by requests in contentproviders {pr}`993` by {user}`douardda` +- Use mambaforge instead of miniforge {pr}`992` by {user}`SylvainCorlay` +- buildpacks/nix: 2.3 -> 2.3.9 {pr}`991` by {user}`FRidh` +- Drop support for stencila {pr}`985` by {user}`minrk` +- Add Julia 1.5.3 support {pr}`984` by {user}`tomyun` +- Update to node 14 {pr}`983` by {user}`jtpio` +- Mamba 0.6.1 {pr}`979` by {user}`minrk` +- Ensure REPO_DIR owned by NB_USER {pr}`975` by {user}`tomyun` +- Add Julia 1.5.2 support {pr}`965` by {user}`tomyun` +- Mamba number three {pr}`962` by {user}`SylvainCorlay` +- Add a Mercurial contentprovider {pr}`950` by {user}`paugier` +- Add Julia 1.5.1 support {pr}`949` by {user}`tomyun` +- Handle requirements.txt with `--pre` lines {pr}`943` by {user}`betatim` +- Add Julia 1.5.0 support {pr}`938` by {user}`tomyun` +- Update JupyterLab to 2.2.0 {pr}`933` by {user}`manics` +- Bump nix version to 2.3 {pr}`915` by {user}`jboynyc` +- Add nbresuse==0.3.3 (full freeze.py) {pr}`904` by {user}`manics` +- Add Julia 1.4.2 support {pr}`899` by {user}`davidanthoff` +- Bump version of irkernel for R 4.0 {pr}`892` by {user}`betatim` +- 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` +- 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` +- If looking for latest MRAN URL try earlier snapshots too {pr}`851` by {user}`manics` +- Add jupyter-offlinenotebook extension {pr}`845` by {user}`betatim` + +### API changes + +- Bump Python requirement to 3.6 from 3.5 {pr}`951` by {user}`betatim` + +### Bug fixes + +- buildpacks/nix: disable sandboxing (bugfix) {pr}`990` by {user}`FRidh` +- avoid deprecated import of collections.abc {pr}`924` by {user}`minrk` +- Add missing “:” for R code {pr}`900` by {user}`adamhsparks` +- Fix RShiny proxy {pr}`893` by {user}`betatim` +- Work around a Julia bug {pr}`879` by {user}`davidanthoff` +- Fix typo {pr}`862` by {user}`jtpio` + +### Other merged PRs + +- Fix figshare test {pr}`1001` by {user}`manics` +- Weekly test of master to check for external failures {pr}`998` by {user}`manics` +- Remove reference to `master` branch from CLI doc {pr}`977` by {user}`betatim` +- add chown to COPY commands to reduce layer count {pr}`969` by {user}`bollwyvl` +- set TIMEFORMAT for timed bash conda commands {pr}`966` by {user}`manics` +- Disable jupyterlab extension build minimize {pr}`963` by {user}`manics` +- Bump Black version to 20.8b1 and use --target-version=py36 {pr}`955` by {user}`paugier` +- Add workflow to build Docker image {pr}`954` by {user}`manics` +- Crosslink 'Configuring your repository' with usage {pr}`952` by {user}`manics` +- Add `www-frame-origin=same` to /etc/rstudio/rserver.conf {pr}`944` (\[@rkevin-arch\]()) +- GitHub Actions {pr}`942` by {user}`minrk` +- stop running tests on travis {pr}`940` by {user}`minrk` +- update repo URLs for jupyterhub/repo2docker {pr}`939` by {user}`minrk` +- Upgrade custom test infrastructure for pytest 6.0.0 {pr}`936` by {user}`betatim` +- validate_image_name: mention lowercase, fix formatting {pr}`934` by {user}`manics` +- Update snapshot date for simple R test {pr}`930` by {user}`betatim` +- little improvement for testing binder_dir {pr}`928` by {user}`bitnik` +- update docs for config dirs {pr}`927` by {user}`bitnik` +- doc: runtime.txt installs python x.y (& concise rewording) {pr}`914` by {user}`mdeff` +- doc: environment.yml installs a conda env, not only python {pr}`913` by {user}`mdeff` +- Make the memory limit test simpler {pr}`912` by {user}`betatim` +- Add gitpod.io config for docs {pr}`908` by {user}`betatim` +- fix repo2docker logo in Sphinx docs {pr}`906` by {user}`trallard` +- Update Dockerfile to add Docker {pr}`896` by {user}`hamelsmu` +- Document test failure workarounds {pr}`890` by {user}`hwine` +- Workaround Docker issue impacting some tests on macOS {pr}`882` by {user}`hwine` +- \[docs\] fix grammatical error in section title {pr}`872` by {user}`jameslamb` +- Fix long form args requirements {pr}`866` by {user}`betatim` +- Adopt new Sphinx theme name {pr}`864` by {user}`xhochy` +- Document loose conda export with --from-history {pr}`863` by {user}`xhochy` +- utils.execute_cmd flush buffer if no EOL {pr}`850` by {user}`manics` +- Update black 19.10b0, target Python 3.5 {pr}`849` by {user}`manics` +- docs: postBuild warn about shell script errors being ignored {pr}`844` by {user}`manics` +- Update changelog for 0.11.0 {pr}`842` by {user}`betatim` + +## Version 0.11.0 + +Release date: 2020-02-05 + +### New features + +- Add support for Figshare in {pr}`788` by {user}`nuest`. +- Add support for Dataverse in {pr}`739` by {user}`Xarthisius`. +- Add support for configuring the version of R installed in {pr}`772` by + {user}`betatim`. +- Add support for Julia 1.2.0 in {pr}`768` by {user}`davidanthoff`. +- Add support for Julia 1.3.0 and 1.0.5 in {pr}`822` by {user}`davidanthoff`. +- Add support for Julia 1.3.1 in {pr}`831` by {user}`davidanthoff`. +- Update Miniconda to 4.7.10 in {pr}`769` by {user}`davidrpugh`. +- Update IRKernel to 1.0.2 in {pr}`770` by {user}`GeorgianaElena`. +- Update RStudio to 1.2 in {pr}`803` by {user}`pablobernabeu`. +- Switch to "pandas" sphinx theme for documentation in {pr}`816` by {user}`choldgraf`. +- Add content provider documentation in {pr}`824` by {user}`choldgraf`. +- Remove legacy buildpack in {pr}`829` by {user}`betatim`. +- Add support for automatic RStudio install when using R packages via conda + in {pr}`838` by {user}`xhochy`. +- Add support for Python 3.8 in {pr}`840` by {user}`minrk`. +- Add Hydroshare as content provider in {pr}`800` by {user}`sblack-usu`. +- Update to Jupyter Notebook 6 and Lab 1.2 in {pr}`839` by {user}`minrk`. + +### Bug fixes + +- Fix for submodule check out in {pr}`809` by {user}`davidbrochart`. +- Handle `requirements.txt` files with different encodings in {pr}`771` + by {user}`GeorgianaElena`. +- Update to nteract-on-jupyter 2.1.3 in {pr}`2.1.3 by :user:`betatim`. +- Use `useradd --no-log-init` to fix exhausting disk space in {pr}`804` by + {user}`manics.` +- Add help text for commandline arguments in {pr}`517` by {user}`yuvipanda`. +- Fix submodule checkout in {pr}`809` by {user}`davidbrochart`. + +## Version 0.10.0 + +Release date: 2019-08-07 + +### New features + +- Increased minimum Python version supported for running `repo2docker` itself + to Python 3.5 in {pr}`684` by {user}`betatim`. +- Support for `Pipfile` and `Pipfile.lock` implemented in {pr}`649` by + {user}`consideratio`. +- Use only conda packages for our base environments in {pr}`728` by + {user}`scottyhq`. +- Fast rebuilds when repo dependencies haven't changed by {user}`minrk` and + {user}`betatim` in {pr}`743`, {pr}`752`, {pr}`718` and {pr}`716`. +- Add support for Zenodo in {pr}`693` by {user}`betatim`. +- Add support for general Invenio repositories in {pr}`704` by {user}`tmorrell`. +- Add support for julia 1.0.4 and 1.1.1 in {pr}`710` by {user}`davidanthoff`. +- Bump Conda from 4.6.14 to 4.7.5 in {pr}`719` by {user}`davidrpugh`. + +### API changes + +### Bug fixes + +- Prevent building the image as root if --user-id and --user-name are not specified + in {pr}`676` by {user}`Xarthisius`. +- Add bash to Dockerfile to fix usage of private repos with git-crendential-env in + {pr}`738` by {user}`eexwhyzee`. +- Fix memory limit enforcement in {pr}`677` by {user}`betatim`. + +## Version 0.9.0 + +Release date: 2019-05-05 + +### New features + +- Support for julia `Project.toml`, `JuliaProject.toml` and `Manifest.toml` files in {pr}`595` by + {user}`davidanthoff` +- Set JULIA_PROJECT globally, so that every julia instance starts with the + julia environment activated in {pr}`612` by {user}`davidanthoff`. +- Update Miniconda version to 4.6.14 and Conda version to 4.6.14 in {pr}`637` by + {user}`jhamman` +- Install notebook into `notebook` env instead of `root`. + Activate conda environments and shell integration via ENTRYPOINT + in {pr}`651` by {user}`minrk` +- Support for `.binder` directory in addition to `binder` directory for location of + configuration files, in {pr}`653` by {user}`jhamman`. +- Updated contributor guide and issue templates for bugs, feature requests, + and support questions in {pr}`654` and {pr}`655` by {user}`KirstieJane` and + {user}`betatim`. +- Create a page naming and describing the "Reproducible Execution + Environment Specification" (the specification used by repo2docker) + in {pr}`662` by {user}`choldgraf`. + +### API changes + +### Bug fixes + +- Install IJulia kernel into \$\{NB_PYTHON_PREFIX}/share/jupyter in {pr}`622` by + {user}`davidanthoff`. +- Ensure git submodules are updated and initilized correctly in {pr}`639` by + {user}`djhoese`. +- Use archive.debian.org as source for the debian jessie based legacy + buildpack in {pr}`633` by {user}`betatim`. +- Update to version 5.7.6 of the `notebook` package used in all environments + in {pr}`628` by {user}`betatim`. +- Update to version 5.7.8 of the `notebook` package and version 2.0.12 of + `nteract-on-jupyter` in {pr}`650` by {user}`betatim`. +- Switch to newer version of jupyter-server-proxy to fix websocket handling + in {pr}`646` by {user}`betatim`. +- Update to pip version 19.0.3 in {pr}`647` by {user}`betatim`. +- Ensure ENTRYPOINT is an absolute path in {pr}`657` by {user}`yuvipanda`. +- Fix handling of `--build-memory-limit` values without a postfix in {pr}`652` + by {user}`betatim`. + +## Version 0.8.0 + +Release date: 2019-02-21 + +### New features + +- 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 + container. {pr}`568` by user:`choldgraf`. +- Increased test coverage to ~87% by {user}`betatim` and {user}`yuvipanda`. +- Documentation improvements and additions by {user}`lheagy`, {user}`choldgraf`. +- Remove f-strings from code base, repo2docker is compatible with Python 3.4+ + again by {user}`jrbourbeau` in {pr}`520`. +- Local caching of previously built repostories to speed up launch times + by {user}`betatim` in {pr}`511`. +- Make destination of repository content in the container image configurable + on the CLI via `--target-repo-dir`. By {user}`yuvipanda` in {pr}`507`. +- Expose CPU limit settings for building and running containers. By + {user}`GladysNalvarte` in {pr}`579`. +- Make Python 3.7 the default version. By {user}`yuvipanda` and {user}`minrk` in + {pr}`539`. + +### API changes + +### Bug fixes + +- In some cases the version of conda installed in images was not pinned and got + upgraded by user actions. Fixed in {pr}`576` by {user}`minrk`. +- Fix an error related to checking if debug output was enabled or not: + {pr}`575` by {user}`yuvipanda`. +- Update nteract frontend to version 2.0.0 by {user}`yuvipanda` in {pr}`571`. +- 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`. +- 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 + {user}`yuvipanda` in {pr}`555`. +- Update to Jupyter notebook 5.7.4 {pr}`519` by {user}`minrk`. + +## Version 0.7.0 + +Release date: 2018-12-12 + +### New features + +- Build from sub-directory: build the image based on a sub-directory of a + repository {pr}`413` by {user}`dsludwig`. +- Editable mode: allows editing a local repository from a live container + {pr}`421` by {user}`evertrol`. +- Change log added {pr}`426` by {user}`evertrol`. +- Documentation: improved the documentation for contributors {pr}`453` by + {user}`choldgraf`. +- Buildpack: added support for the nix package manager {pr}`407` by + {user}`costrouc`. +- Log a 'success' message when push is complete {pr}`482` by + {user}`yuvipanda`. +- Allow specifying images to reuse cache from {pr}`478` by + {user}`yuvipanda`. +- Add JupyterHub back to base environment {pr}`476` by {user}`yuvipanda`. +- Repo2docker has a logo! by {user}`agahkarakuzu` and {user}`blairhudson`. +- Improve support for Stencila, including identifying stencila runtime from + document context {pr}`457` by {user}`nuest`. + +### API changes + +- Add content provider abstraction {pr}`421` by {user}`betatim`. + +### Bug fixes + +- Update to Jupyter notebook 5.7 {pr}`475` by {user}`betatim` and {user}`minrk`. + +## Version 0.6 + +Released 2018-09-09 + +## Version 0.5 + +Released 2018-02-07 + +## Version 0.4.1 + +Released 2018-09-06 + +## Version 0.2 + +Released 2018-05-25 + +## Version 0.1.1 + +Released 2017-04-19 + +## Version 0.1 + +Released 2017-04-14 diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst deleted file mode 100644 index b34506d1e..000000000 --- a/docs/source/changelog.rst +++ /dev/null @@ -1,523 +0,0 @@ -========= -Changelog -========= - -Version 2022.10.0 -================= - -`Full changelog `_ - -New features ------------- - -- Update Jupyter dependencies :pr:`1193` by :user:`jtpio` -- add Python 3.10 base environment :pr:`1175` by :user:`minrk` -- Bump default R version to 4.2 from 4.1, and let R 3.4 go from 3.4.0 to 3.4.4 :pr:`1165` by :user:`yuvipanda` -- Support pulling from zenodo sandbox too :pr:`1169` by :user:`yuvipanda` -- Add MPDL Dataverse :pr:`1167` by :user:`wilhelmfrank` -- Add JPL Dataverse :pr:`1163` by :user:`foobarbecue` -- upgrade RStudio Server to v2022.02.1 :pr:`1148` by :user:`aplamada` -- Pass build_args to `render()` during `--no-build` for consistency with regular builds :pr:`1135` by :user:`yoogottamk` - -Documentation improvements --------------------------- - -- Update 'how to get R' section :pr:`1147` by :user:`yuvipanda` -- Post release fixes :pr:`1133` by :user:`manics` - -API changes ------------ - -Bug fixes ---------- -- consistent log handling when not using JSON loggers :pr:`1177` by :user:`minrk` -- Fix Read-Only filesystem permission issue for log file :pr:`1156` by :user:`timeu` -- handle permission issue writing .jupyter-server-log.txt in REPO_DIR :pr:`1151` by :user:`pymonger` -- handle r version being unspecified in environment.yml :pr:`1141` by :user:`minrk` - -Other merged PRs ----------------- - -- Remove conda buildpacks pin of r-irkernel to 1.2 :pr:`1191` by :user:`consideRatio` -- ci: refactor julia/r/conda tests - now ~25 min instead of ~50 min :pr:`1188` by :user:`consideRatio` -- ci: general refresh of github workflows, update gha versions and let dependabot do it, etc. :pr:`1186` by :user:`consideRatio` -- Use enum to standardise `phase` :pr:`1185` by :user:`manics` -- fail on unsupported Python :pr:`1184` by :user:`minrk` -- mount wheels from build stage instead of copying them :pr:`1182` by :user:`minrk` -- get CI working again :pr:`1178` by :user:`minrk` -- explicitly build linux/amd64 images :pr:`1176` by :user:`minrk` -- Freeze.py update :pr:`1173` by :user:`manics` -- Bump version of nodejs :pr:`1172` by :user:`yuvipanda` -- Update mamba :pr:`1171` by :user:`SylvainCorlay` -- ci: switch to using a 2fa enabled accounts pypi api-token :pr:`1166` by :user:`consideRatio` -- Get R from RStudio provided apt packages (.deb files) :pr:`1161` by :user:`yuvipanda` -- Shallow clone HEAD :pr:`1160` by :user:`daradib` -- Update black version :pr:`1150` by :user:`yuvipanda` -- Update base notebook packages :pr:`1149` by :user:`yuvipanda` -- Update Dockerfile to current Alpine (ALPINE_VERSION=3.15.0) :pr:`1136` by :user:`holzman` -- update Python in some dockerfile tests :pr:`1130` by :user:`minrk` - - -Version 2022.02.0 -================= - -`Full changelog `_ - -New features ------------- - -- Update ipywidgets jupyter-offlinenotebook jupyterlab :pr:`1127` by :user:`manics` -- Allow passing in extra args to Docker initialization :pr:`1124` by :user:`yuvipanda` -- Allow passing in traitlets via commandline :pr:`1123` by :user:`yuvipanda` -- Bump default R version to 4.1 :pr:`1107` by :user:`yuvipanda` -- Update jupyterlab 3.2.5 jupyter-resource-usage 0.6.1 :pr:`1105` by :user:`manics` -- Get binary R packages from packagemanager.rstudio.com :pr:`1104` by :user:`yuvipanda` -- Support R 4.1 :pr:`1102` by :user:`yuvipanda` -- Add command line option to pass extra build args :pr:`1100` by :user:`TimoRoth` -- Set labels when building image from Dockerfile :pr:`1097` by :user:`TimoRoth` -- jupyterlab 3.1.17 :pr:`1092` by :user:`minrk` -- Bump JupyterLab to 3.1.11 :pr:`1081` by :user:`choldgraf` -- Bootstrap base env with micromamba :pr:`1062` by :user:`wolfv ` -- Default UI to JupyterLab :pr:`1035` by :user:`SylvainCorlay` - -API changes ------------ - -Bug fixes ---------- - -Other merged PRs ----------------- - -- Put micromamba in /usr/local/bin and use mamba for installs :pr:`1128` by :user:`minrk` -- Remove deprecated calls to distutils :pr:`1122` by :user:`minrk` -- Delete /tmp/downloaded_packages after running install.R :pr:`1119` by :user:`yuvipanda` -- Use a smaller R library in our tests :pr:`1118` by :user:`yuvipanda` -- Only get R itself (r-base-core) from apt, not CRAN packages :pr:`1117` by :user:`minrk` -- set USER root after each directive block :pr:`1115` by :user:`minrk` -- Say 'apt repository' rather than PPA :pr:`1111` by :user:`yuvipanda` -- add tests for R conda :pr:`1108` by :user:`aplamada` -- Add help message to freeze.py :pr:`1106` by :user:`manics` -- Quieter R builds :pr:`1103` by :user:`yuvipanda` -- update user_interface doc to reflect that lab is default :pr:`1085` by :user:`minrk` -- Updates to dev docs + Recommonmark -> MyST Parser :pr:`1082` by :user:`choldgraf` -- Fix Docker build (again) :pr:`1078` by :user:`manics` -- [mrg] __init__.py: r_version: fixed description :pr:`1074` by :user:`magnush0lm` -- Typo fix in utils docstring :pr:`1072` by :user:`jgarte` -- Rename requirements.py-3.5.txt to requirements.py-3.5.pip :pr:`1061` by :user:`manics` -- Remove nodesource' nodejs :pr:`847` by :user:`yuvipanda` - - -Version 2021.08.0 -================= - -`Full changelog `_ - -The repo2docker container image has moved to `quay.io/jupyterhub/repo2docker `_ - -New features ------------- - -- always unpack a single zenodo zip :pr:`1043` by :user:`akhmerov` -- Refreeze with conda-lock :pr:`1024` by :user:`minrk` -- Refine buffered output debugging :pr:`1016` by :user:`minrk` -- reimplement entrypoint in Python :pr:`1014` by :user:`minrk` -- Fetch available Julia versions from hosted json :pr:`994` by :user:`tomyun` -- Define an interface for Container engines :pr:`848` by :user:`manics` - -API changes ------------ - -Bug fixes ---------- - -- 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` -- 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` -- 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` -- Remove CircleCI docs build :pr:`1053` by :user:`yuvipanda` -- Pin doc requirements to avoid CI breakages :pr:`1052` by :user:`manics` -- Stop using deprecated add_stylesheet in sphinx :pr:`1050` by :user:`yuvipanda` -- Add study participation notice to readme :pr:`1046` by :user:`sgibson91` -- Bump urllib3 from 1.26.4 to 1.26.5 :pr:`1045` by :user:`dependabot` -- State newly used installation command :pr:`1040` by :user:`fkohrt` -- Bump pyyaml from 5.1.1 to 5.4 :pr:`1029` by :user:`dependabot` -- Set default Julia version to 1.6 :pr:`1028` by :user:`tomyun` -- Fix logo URL in README :pr:`1027` by :user:`betatim` - - -Version 2021.03.0 -================= - -`Full changelog `_ - -New features ------------- - -- freeze with mamba, add 3.9 :pr:`1017` by :user:`minrk` -- Add GH workflow to push releases to PYPi and introduce CalVer :pr:`1004` by :user:`betatim` -- Add entrypoint script which automatically propagates *_PROXY env vars… :pr:`1003` ([@g-braeunlich](https://github.com/g-braeunlich)) -- Update to JupyterLab 3.0 :pr:`996` by :user:`jtpio` -- Fetch available Julia versions from hosted json :pr:`994` by :user:`tomyun` -- Add a contentprovider for Software Heritage persistent ID (SWHID) :pr:`988` by :user:`douardda` -- Stream jupyter server logs to a file :pr:`987` by :user:`betatim` -- add 4.0, 4.0.2 to list of supported R versions :pr:`960` by :user:`minrk` - -API changes ------------ - -Bug fixes ---------- - -- fix dataverse regression introduced in last release :pr:`1011` by :user:`MridulS` -- buildpacks.r: dont use apt-key directly to respect *_proxy env vars :pr:`1019` ([@g-braeunlich](https://github.com/g-braeunlich)) - -Other merged PRs ----------------- - -- Cleanup install_requires including duplicates :pr:`1020` by :user:`manics` -- 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` - - -Version 2021.01.0 -================= - -`Full changelog `_ - -New features ------------- - -- Replace urllib by requests in contentproviders :pr:`993` by :user:`douardda` -- Use mambaforge instead of miniforge :pr:`992` by :user:`SylvainCorlay` -- buildpacks/nix: 2.3 -> 2.3.9 :pr:`991` by :user:`FRidh` -- Drop support for stencila :pr:`985` by :user:`minrk` -- Add Julia 1.5.3 support :pr:`984` by :user:`tomyun` -- Update to node 14 :pr:`983` by :user:`jtpio` -- Mamba 0.6.1 :pr:`979` by :user:`minrk` -- Ensure REPO_DIR owned by NB_USER :pr:`975` by :user:`tomyun` -- Add Julia 1.5.2 support :pr:`965` by :user:`tomyun` -- Mamba number three :pr:`962` by :user:`SylvainCorlay` -- Add a Mercurial contentprovider :pr:`950` by :user:`paugier` -- Add Julia 1.5.1 support :pr:`949` by :user:`tomyun` -- Handle requirements.txt with `--pre` lines :pr:`943` by :user:`betatim` -- Add Julia 1.5.0 support :pr:`938` by :user:`tomyun` -- Update JupyterLab to 2.2.0 :pr:`933` by :user:`manics` -- Bump nix version to 2.3 :pr:`915` by :user:`jboynyc` -- Add nbresuse==0.3.3 (full freeze.py) :pr:`904` by :user:`manics` -- Add Julia 1.4.2 support :pr:`899` by :user:`davidanthoff` -- Bump version of irkernel for R 4.0 :pr:`892` by :user:`betatim` -- 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` -- 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` -- If looking for latest MRAN URL try earlier snapshots too :pr:`851` by :user:`manics` -- Add jupyter-offlinenotebook extension :pr:`845` by :user:`betatim` - -API changes ------------ - -- Bump Python requirement to 3.6 from 3.5 :pr:`951` by :user:`betatim` - -Bug fixes ---------- - -- buildpacks/nix: disable sandboxing (bugfix) :pr:`990` by :user:`FRidh` -- avoid deprecated import of collections.abc :pr:`924` by :user:`minrk` -- Add missing “:” for R code :pr:`900` by :user:`adamhsparks` -- Fix RShiny proxy :pr:`893` by :user:`betatim` -- Work around a Julia bug :pr:`879` by :user:`davidanthoff` -- Fix typo :pr:`862` by :user:`jtpio` - -Other merged PRs ----------------- - -- Fix figshare test :pr:`1001` by :user:`manics` -- Weekly test of master to check for external failures :pr:`998` by :user:`manics` -- Remove reference to `master` branch from CLI doc :pr:`977` by :user:`betatim` -- add chown to COPY commands to reduce layer count :pr:`969` by :user:`bollwyvl` -- set TIMEFORMAT for timed bash conda commands :pr:`966` by :user:`manics` -- Disable jupyterlab extension build minimize :pr:`963` by :user:`manics` -- Bump Black version to 20.8b1 and use --target-version=py36 :pr:`955` by :user:`paugier` -- Add workflow to build Docker image :pr:`954` by :user:`manics` -- Crosslink 'Configuring your repository' with usage :pr:`952` by :user:`manics` -- Add `www-frame-origin=same` to /etc/rstudio/rserver.conf :pr:`944` ([@rkevin-arch](https://github.com/rkevin-arch)) -- GitHub Actions :pr:`942` by :user:`minrk` -- stop running tests on travis :pr:`940` by :user:`minrk` -- update repo URLs for jupyterhub/repo2docker :pr:`939` by :user:`minrk` -- Upgrade custom test infrastructure for pytest 6.0.0 :pr:`936` by :user:`betatim` -- validate_image_name: mention lowercase, fix formatting :pr:`934` by :user:`manics` -- Update snapshot date for simple R test :pr:`930` by :user:`betatim` -- little improvement for testing binder_dir :pr:`928` by :user:`bitnik` -- update docs for config dirs :pr:`927` by :user:`bitnik` -- doc: runtime.txt installs python x.y (& concise rewording) :pr:`914` by :user:`mdeff` -- doc: environment.yml installs a conda env, not only python :pr:`913` by :user:`mdeff` -- Make the memory limit test simpler :pr:`912` by :user:`betatim` -- Add gitpod.io config for docs :pr:`908` by :user:`betatim` -- fix repo2docker logo in Sphinx docs :pr:`906` by :user:`trallard` -- Update Dockerfile to add Docker :pr:`896` by :user:`hamelsmu` -- Document test failure workarounds :pr:`890` by :user:`hwine` -- Workaround Docker issue impacting some tests on macOS :pr:`882` by :user:`hwine` -- [docs] fix grammatical error in section title :pr:`872` by :user:`jameslamb` -- Fix long form args requirements :pr:`866` by :user:`betatim` -- Adopt new Sphinx theme name :pr:`864` by :user:`xhochy` -- Document loose conda export with --from-history :pr:`863` by :user:`xhochy` -- utils.execute_cmd flush buffer if no EOL :pr:`850` by :user:`manics` -- Update black 19.10b0, target Python 3.5 :pr:`849` by :user:`manics` -- docs: postBuild warn about shell script errors being ignored :pr:`844` by :user:`manics` -- Update changelog for 0.11.0 :pr:`842` by :user:`betatim` - - -Version 0.11.0 -============== - -Release date: 2020-02-05 - -New features ------------- -- Add support for Figshare in :pr:`788` by :user:`nuest`. -- Add support for Dataverse in :pr:`739` by :user:`Xarthisius`. -- Add support for configuring the version of R installed in :pr:`772` by - :user:`betatim`. -- Add support for Julia 1.2.0 in :pr:`768` by :user:`davidanthoff`. -- Add support for Julia 1.3.0 and 1.0.5 in :pr:`822` by :user:`davidanthoff`. -- Add support for Julia 1.3.1 in :pr:`831` by :user:`davidanthoff`. -- Update Miniconda to 4.7.10 in :pr:`769` by :user:`davidrpugh`. -- Update IRKernel to 1.0.2 in :pr:`770` by :user:`GeorgianaElena`. -- Update RStudio to 1.2 in :pr:`803` by :user:`pablobernabeu`. -- Switch to "pandas" sphinx theme for documentation in :pr:`816` by :user:`choldgraf`. -- Add content provider documentation in :pr:`824` by :user:`choldgraf`. -- Remove legacy buildpack in :pr:`829` by :user:`betatim`. -- Add support for automatic RStudio install when using R packages via conda - in :pr:`838` by :user:`xhochy`. -- Add support for Python 3.8 in :pr:`840` by :user:`minrk`. -- Add Hydroshare as content provider in :pr:`800` by :user:`sblack-usu`. -- Update to Jupyter Notebook 6 and Lab 1.2 in :pr:`839` by :user:`minrk`. - - -Bug fixes ---------- -- Fix for submodule check out in :pr:`809` by :user:`davidbrochart`. -- Handle `requirements.txt` files with different encodings in :pr:`771` - by :user:`GeorgianaElena`. -- Update to nteract-on-jupyter 2.1.3 in :pr:`2.1.3 by :user:`betatim`. -- Use `useradd --no-log-init` to fix exhausting disk space in :pr:`804` by - :user:`manics.` -- Add help text for commandline arguments in :pr:`517` by :user:`yuvipanda`. -- Fix submodule checkout in :pr:`809` by :user:`davidbrochart`. - - -Version 0.10.0 -============== - -Release date: 2019-08-07 - -New features ------------- -- Increased minimum Python version supported for running `repo2docker` itself - to Python 3.5 in :pr:`684` by :user:`betatim`. -- Support for `Pipfile` and `Pipfile.lock` implemented in :pr:`649` by - :user:`consideratio`. -- Use only conda packages for our base environments in :pr:`728` by - :user:`scottyhq`. -- Fast rebuilds when repo dependencies haven't changed by :user:`minrk` and - :user:`betatim` in :pr:`743`, :pr:`752`, :pr:`718` and :pr:`716`. -- Add support for Zenodo in :pr:`693` by :user:`betatim`. -- Add support for general Invenio repositories in :pr:`704` by :user:`tmorrell`. -- Add support for julia 1.0.4 and 1.1.1 in :pr:`710` by :user:`davidanthoff`. -- Bump Conda from 4.6.14 to 4.7.5 in :pr:`719` by :user:`davidrpugh`. - - -API changes ------------ - -Bug fixes ---------- -- Prevent building the image as root if --user-id and --user-name are not specified - in :pr:`676` by :user:`Xarthisius`. -- Add bash to Dockerfile to fix usage of private repos with git-crendential-env in - :pr:`738` by :user:`eexwhyzee`. -- Fix memory limit enforcement in :pr:`677` by :user:`betatim`. - - -Version 0.9.0 -============= - -Release date: 2019-05-05 - -New features ------------- -- Support for julia `Project.toml`, `JuliaProject.toml` and `Manifest.toml` files in :pr:`595` by - :user:`davidanthoff` -- Set JULIA_PROJECT globally, so that every julia instance starts with the - julia environment activated in :pr:`612` by :user:`davidanthoff`. -- Update Miniconda version to 4.6.14 and Conda version to 4.6.14 in :pr:`637` by - :user:`jhamman` -- Install notebook into `notebook` env instead of `root`. - Activate conda environments and shell integration via ENTRYPOINT - in :pr:`651` by :user:`minrk` -- Support for `.binder` directory in addition to `binder` directory for location of - configuration files, in :pr:`653` by :user:`jhamman`. -- Updated contributor guide and issue templates for bugs, feature requests, - and support questions in :pr:`654` and :pr:`655` by :user:`KirstieJane` and - :user:`betatim`. -- Create a page naming and describing the "Reproducible Execution - Environment Specification" (the specification used by repo2docker) - in :pr:`662` by :user:`choldgraf`. - -API changes ------------ - -Bug fixes ---------- -- Install IJulia kernel into ${NB_PYTHON_PREFIX}/share/jupyter in :pr:`622` by - :user:`davidanthoff`. -- Ensure git submodules are updated and initilized correctly in :pr:`639` by - :user:`djhoese`. -- Use archive.debian.org as source for the debian jessie based legacy - buildpack in :pr:`633` by :user:`betatim`. -- Update to version 5.7.6 of the `notebook` package used in all environments - in :pr:`628` by :user:`betatim`. -- Update to version 5.7.8 of the `notebook` package and version 2.0.12 of - `nteract-on-jupyter` in :pr:`650` by :user:`betatim`. -- Switch to newer version of jupyter-server-proxy to fix websocket handling - in :pr:`646` by :user:`betatim`. -- Update to pip version 19.0.3 in :pr:`647` by :user:`betatim`. -- Ensure ENTRYPOINT is an absolute path in :pr:`657` by :user:`yuvipanda`. -- Fix handling of `--build-memory-limit` values without a postfix in :pr:`652` - by :user:`betatim`. - - -Version 0.8.0 -============= - -Release date: 2019-02-21 - -New features ------------- -- 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 - container. :pr:`568` by user:`choldgraf`. -- Increased test coverage to ~87% by :user:`betatim` and :user:`yuvipanda`. -- Documentation improvements and additions by :user:`lheagy`, :user:`choldgraf`. -- Remove f-strings from code base, repo2docker is compatible with Python 3.4+ - again by :user:`jrbourbeau` in :pr:`520`. -- Local caching of previously built repostories to speed up launch times - by :user:`betatim` in :pr:`511`. -- Make destination of repository content in the container image configurable - on the CLI via ``--target-repo-dir``. By :user:`yuvipanda` in :pr:`507`. -- Expose CPU limit settings for building and running containers. By - :user:`GladysNalvarte` in :pr:`579`. -- Make Python 3.7 the default version. By :user:`yuvipanda` and :user:`minrk` in - :pr:`539`. - -API changes ------------ - -Bug fixes ---------- -- In some cases the version of conda installed in images was not pinned and got - upgraded by user actions. Fixed in :pr:`576` by :user:`minrk`. -- Fix an error related to checking if debug output was enabled or not: - :pr:`575` by :user:`yuvipanda`. -- Update nteract frontend to version 2.0.0 by :user:`yuvipanda` in :pr:`571`. -- 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`. -- 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 - :user:`yuvipanda` in :pr:`555`. -- Update to Jupyter notebook 5.7.4 :pr:`519` by :user:`minrk`. - - -Version 0.7.0 -============= - -Release date: 2018-12-12 - -New features ------------- - -- Build from sub-directory: build the image based on a sub-directory of a - repository :pr:`413` by :user:`dsludwig`. -- Editable mode: allows editing a local repository from a live container - :pr:`421` by :user:`evertrol`. -- Change log added :pr:`426` by :user:`evertrol`. -- Documentation: improved the documentation for contributors :pr:`453` by - :user:`choldgraf`. -- Buildpack: added support for the nix package manager :pr:`407` by - :user:`costrouc`. -- Log a 'success' message when push is complete :pr:`482` by - :user:`yuvipanda`. -- Allow specifying images to reuse cache from :pr:`478` by - :user:`yuvipanda`. -- Add JupyterHub back to base environment :pr:`476` by :user:`yuvipanda`. -- Repo2docker has a logo! by :user:`agahkarakuzu` and :user:`blairhudson`. -- Improve support for Stencila, including identifying stencila runtime from - document context :pr:`457` by :user:`nuest`. - - -API changes ------------ - -- Add content provider abstraction :pr:`421` by :user:`betatim`. - - -Bug fixes ---------- - -- Update to Jupyter notebook 5.7 :pr:`475` by :user:`betatim` and :user:`minrk`. - - - -Version 0.6 -=========== - -Released 2018-09-09 - - -Version 0.5 -=========== - -Released 2018-02-07 - - -Version 0.4.1 -============= - -Released 2018-09-06 - - -Version 0.2 -=========== - -Released 2018-05-25 - - -Version 0.1.1 -============= - -Released 2017-04-19 - - -Version 0.1 -=========== - -Released 2017-04-14 diff --git a/docs/source/conf.py b/docs/source/conf.py index f9ea70a92..2dcb08615 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,38 +1,50 @@ -# -- General configuration ------------------------------------------------ +# Configuration file for Sphinx to build our documentation to HTML. +# +# Configuration reference: https://www.sphinx-doc.org/en/master/usage/configuration.html +# +import datetime -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ["sphinx.ext.extlinks", "sphinxcontrib.autoprogram", "myst_parser"] +# -- Project information ----------------------------------------------------- +# ref: https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information +# +project = "repo2docker" +copyright = f"{datetime.date.today().year}, Project Jupyter Contributors" +author = "Project Jupyter Contributors" -extlinks = { - "issue": ("https://github.com/jupyterhub/repo2docker/issues/%s", "Issue #"), - "pr": ("https://github.com/jupyterhub/repo2docker/pull/%s", "PR #"), - "user": ("https://github.com/%s", "@"), -} -# Add any paths that contain templates here, relative to this directory. +# -- General Sphinx configuration --------------------------------------------------- +# ref: https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration +# +extensions = [ + "myst_parser", + "sphinx_copybutton", + "sphinx.ext.extlinks", + "sphinxcontrib.autoprogram", + "sphinxext.opengraph", + "sphinxext.rediraffe", +] +root_doc = "index" +source_suffix = [".md", ".rst"] +default_role = "literal" +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] templates_path = ["_templates"] +extlinks = { + "issue": ("https://github.com/jupyterhub/repo2docker/issues/%s", "Issue #%s"), + "pr": ("https://github.com/jupyterhub/repo2docker/pull/%s", "PR #%s"), + "user": ("https://github.com/%s", "@%s"), +} -def setup(app): - app.add_css_file("custom.css") # may also be a URL - - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: +# -- General MyST configuration ----------------------------------------------------- +# ref: https://myst-parser.readthedocs.io/en/latest/configuration.html # -# source_suffix = ['.rst', '.md'] -source_suffix = [".rst", ".md"] - -# The root toctree document. -root_doc = master_doc = "index" +myst_enable_extensions = [ + "colon_fence", +] -# General information about the project. -project = "repo2docker" -copyright = "2019, Project Jupyter" -author = "Project Jupyter" +# -- Referenceable variables -------------------------------------------------- +# # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. @@ -48,137 +60,69 @@ def setup(app): default_python = CondaBuildPack.major_pythons["3"] -rst_prolog = """ +rst_prolog = f""" .. |default_python| replace:: **Python {default_python}** .. |default_python_version| replace:: {default_python} -""".format( - default_python=default_python -) - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - -# MyST configuration - -myst_enable_extensions = [ - "colon_fence", -] +""" -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. +# -- Options for HTML output ------------------------------------------------- +# ref: https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output # -html_theme = "pydata_sphinx_theme" html_logo = "_static/images/logo.png" html_favicon = "_static/images/favicon.ico" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] -html_sidebars = {} +html_css_files = ["custom.css"] -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = "repo2dockerdoc" - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', +# 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", +} +html_context = { + "github_user": "jupyterhub", + "github_repo": "repo2docker", + "github_version": "main", + "doc_path": "docs/source", } -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "repo2docker.tex", - "repo2docker Documentation", - "Project Jupyter", - "manual", - ) -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "repo2docker", "repo2docker Documentation", [author], 1)] - - -# -- Options for Texinfo output ------------------------------------------- -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "repo2docker", - "repo2docker Documentation", - author, - "repo2docker", - "One line description of project.", - "Miscellaneous", - ) +# -- Options for linkcheck builder ------------------------------------------- +# ref: https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-the-linkcheck-builder +# +linkcheck_ignore = [ + r"(.*)github\.com(.*)#", # javascript based anchors + r"(.*)/#%21(.*)/(.*)", # /#!forum/jupyter - encoded anchor edge case + r"https://github.com/[^/]*$", # too many github usernames / searches in changelog + "https://github.com/jupyterhub/repo2docker/pull/", # too many PRs in changelog + "https://github.com/jupyterhub/repo2docker/compare/", # too many comparisons in changelog +] +linkcheck_anchors_ignore = [ + "/#!", + "/#%21", ] -# -- Options for Epub output ---------------------------------------------- +# -- Options for the opengraph extension ------------------------------------- +# ref: https://github.com/wpilibsuite/sphinxext-opengraph#options +# +# This extension help others provide better thumbnails and link descriptions +# when they link to this documentation from other websites, such as +# https://discourse.jupyter.org. +# +# ogp_site_url is set automatically by RTD +ogp_image = "_static/images/logo.png" +ogp_use_first_image = True -# Bibliographic Dublin Core info. -epub_title = project -epub_author = author -epub_publisher = author -epub_copyright = copyright -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. +# -- Options for the rediraffe extension ------------------------------------- +# ref: https://github.com/wpilibsuite/sphinxext-rediraffe#readme # -# epub_identifier = '' - -# A unique identification for the text. +# This extensions help us relocated content without breaking links. If a +# document is moved internally, we should configure a redirect like below. # -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ["search.html"] +rediraffe_branch = "main" +rediraffe_redirects = { + # "old-file": "new-folder/new-file-name", +} diff --git a/docs/source/config_files.rst b/docs/source/config_files.rst index fe7470970..eabbdb56b 100644 --- a/docs/source/config_files.rst +++ b/docs/source/config_files.rst @@ -43,8 +43,8 @@ specified in your ``environment.yml``. 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`` supports all versions of Python, -though ``repo2docker`` support is best with Python 3.7, 3.6, 3.5 and 2.7. +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 @@ -118,7 +118,7 @@ with ``REQUIRE`` and ``environment.yml``, visit ================================================ This is used to install R libraries pinned to a specific snapshot on -`MRAN `_. +`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 `_. @@ -162,8 +162,8 @@ Note that by default the build will not be stopped if an error occurs inside a s 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 `_. +It uses a ``postBuild`` file in a folder called ``.binder`` to `prepare +their demo for binder `_. .. _start: @@ -207,7 +207,7 @@ For these cases, we have a special file, ``runtime.txt``. 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 `MRAN `_. +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 `_. diff --git a/docs/source/contributing/contributing.md b/docs/source/contributing/contributing.md index 96859a6b1..8e26bcda2 100644 --- a/docs/source/contributing/contributing.md +++ b/docs/source/contributing/contributing.md @@ -2,33 +2,33 @@ Thank you for thinking about contributing to repo2docker! This is an open source project that is developed and maintained entirely by volunteers. -*Your contribution* is integral to the future of the project. +_Your contribution_ is integral to the future of the project. THANK YOU! ## Types of contribution There are many ways to contribute to repo2docker: -* **Update the documentation.** +- **Update the documentation.** If you're reading a page or docstring and it doesn't make sense (or doesn't exist!), please let us know by opening a bug report. It's even more amazing if you can give us a suggested change. -* **Fix bugs or add requested features.** +- **Fix bugs or add requested features.** Have a look through the [issue tracker](https://github.com/jupyterhub/repo2docker/issues) and see if there are any tagged as ["help wanted"](https://github.com/jupyterhub/repo2docker/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22). As the label suggests, we'd love your help! -* **Report a bug.** +- **Report a bug.** If repo2docker isn't doing what you thought it would do then open a [bug report](https://github.com/jupyterhub/repo2docker/issues/new?template=bug_report.md). That issue template will ask you a few questions described in more detail below. -* **Suggest a new feature.** +- **Suggest a new feature.** We know that there are lots of ways to extend repo2docker! If you're interested in adding a feature then please open a [feature request](https://github.com/jupyterhub/repo2docker/issues/new?template=feature_request.md). That issue template will ask you a few questions described in detail below. -* **Review someone's Pull Request.** +- **Review someone's Pull Request.** Whenever somebody proposes changes to the repo2docker codebase, the community reviews the changes, and provides feedback, edits, and suggestions. Check out the [open pull requests](https://github.com/jupyterhub/repo2docker/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc) and provide feedback that helps improve the PR and get it merged. Please keep your feedback positive and constructive! -* **Tell people about repo2docker.** +- **Tell people about repo2docker.** As we said above, repo2docker is built by and for its community. If you know anyone who would like to use repo2docker, please tell them about the project! You could give a talk about it, or run a demonstration. @@ -42,56 +42,59 @@ This outlines the process for getting changes to the repo2docker project merged. 1. Identify the correct issue template: [bug report](https://github.com/jupyterhub/repo2docker/issues/new?template=bug_report.md) or [feature request](https://github.com/jupyterhub/repo2docker/issues/new?template=feature_request.md). - **Bug reports** ([examples](https://github.com/jupyterhub/repo2docker/issues?q=is%3Aissue+is%3Aopen+label%3Abug), [new issue](https://github.com/jupyterhub/repo2docker/issues/new?template=bug_report.md)) will ask you for a description of the problem, the expected behaviour, the actual behaviour, how to reproduce the problem, and your personal set up. - Bugs can include problems with the documentation, or code not running as expected. + **Bug reports** ([examples](https://github.com/jupyterhub/repo2docker/issues?q=is%3Aissue+is%3Aopen+label%3Abug), [new issue](https://github.com/jupyterhub/repo2docker/issues/new?template=bug_report.md)) will ask you for a description of the problem, the expected behaviour, the actual behaviour, how to reproduce the problem, and your personal set up. + Bugs can include problems with the documentation, or code not running as expected. - It is really important that you make it easy for the maintainers to reproduce the problem you're having. - This guide on creating a [minimal, complete and verifiable example](https://stackoverflow.com/help/mcve) is a great place to start. + It is really important that you make it easy for the maintainers to reproduce the problem you're having. + This guide on creating a [minimal, complete and verifiable example](https://stackoverflow.com/help/mcve) is a great place to start. - **Feature requests** ([examples](https://github.com/jupyterhub/repo2docker/labels/needs%3A%20discussion), [new issue](https://github.com/jupyterhub/repo2docker/issues/new?template=feature_request.md)) will ask you for the proposed change, any alternatives that you have considered, a description of who would use this feature, and a best-guess of how much work it will take and what skills are required to accomplish. + **Feature requests** ([examples](https://github.com/jupyterhub/repo2docker/labels/needs%3A%20discussion), [new issue](https://github.com/jupyterhub/repo2docker/issues/new?template=feature_request.md)) will ask you for the proposed change, any alternatives that you have considered, a description of who would use this feature, and a best-guess of how much work it will take and what skills are required to accomplish. - Very easy feature requests might be updates to the documentation to clarify steps for new users. - Harder feature requests may be to add new functionality to the project and will need more in depth discussion about who can complete and maintain the work. + Very easy feature requests might be updates to the documentation to clarify steps for new users. + Harder feature requests may be to add new functionality to the project and will need more in depth discussion about who can complete and maintain the work. - Feature requests are a great opportunity for you to advocate for the use case you're suggesting. - They help others understand how much effort it would be to integrate the work,and - if you're successful at convincing them that this effort is worth it - make it more likely that they to choose to work on it with you. + Feature requests are a great opportunity for you to advocate for the use case you're suggesting. + They help others understand how much effort it would be to integrate the work,and - if you're successful at convincing them that this effort is worth it - make it more likely that they to choose to work on it with you. 2. Open an issue. - Getting consensus with the community is a great way to save time later. + Getting consensus with the community is a great way to save time later. 3. Make edits in [your fork](https://help.github.com/en/articles/fork-a-repo) of the [repo2docker repository](https://github.com/jupyterhub/repo2docker). 4. Make a [pull request](https://help.github.com/en/articles/about-pull-requests). -Read the [next section](#guidelines-to-getting-a-pull-request-merged) for guidelines for both reviewers and contributors on merging a PR. -6. Wait for a community member to merge your changes. - Remember that **someone else must merge your pull request**. - That goes for new contributors and long term maintainers alike. - Because `main` is continuously deployed to mybinder.org it is essential - that `main` is always in a deployable state. -7. (optional) Deploy a new version of repo2docker to mybinder.org by [following these steps](http://mybinder-sre.readthedocs.io/en/latest/deployment/how.html) + Read the [next section](guidelines-to-getting-a-pull-request-merged) for guidelines for both reviewers and contributors on merging a PR. +5. Wait for a community member to merge your changes. + Remember that **someone else must merge your pull request**. + That goes for new contributors and long term maintainers alike. + Because `main` is continuously deployed to mybinder.org it is essential + that `main` is always in a deployable state. +6. (optional) Deploy a new version of repo2docker to mybinder.org by [following these steps](http://mybinder-sre.readthedocs.io/en/latest/deployment/how.html) + +(guidelines-to-getting-a-pull-request-merged)= ## Guidelines to getting a Pull Request merged These are not hard rules to be enforced by 🚓 but they are suggestions written by the repo2docker maintainers to help complete your contribution as smoothly as possible for both you and for them. -* **Create a PR as early as possible**, marking it with `[WIP]` while you work on it. +- **Create a PR as early as possible**, marking it with `[WIP]` while you work on it. This avoids duplicated work, lets you get high level feedback on functionality or API changes, and/or helps find collaborators to work with you. -* **Keep your PR focused.** +- **Keep your PR focused.** The best PRs solve one problem. If you end up changing multiple things, please open separate PRs for the different conceptual changes. -* **Add tests to your code.** +- **Add tests to your code.** PRs will not be merged if Travis is failing. -* **Apply [PEP8](https://www.python.org/dev/peps/pep-0008/)** as much as possible, but not too much. +- **Apply [PEP8](https://www.python.org/dev/peps/pep-0008/)** as much as possible, but not too much. If in doubt, ask. -* **Use merge commits** instead of merge-by-squashing/-rebasing. +- **Use merge commits** instead of merge-by-squashing/-rebasing. This makes it easier to find all changes since the last deployment `git log --merges --pretty=format:"%h %<(10,trunc)%an %<(15)%ar %s" ..` and your PR easier to review. -* **Make it clear when your PR is ready for review.** +- **Make it clear when your PR is ready for review.** Prefix the title of your pull request (PR) with `[MRG]` if the contribution is complete and should be subjected to a detailed review. -* **Use commit messages to describe _why_ you are proposing the changes you are proposing.** -* **Try to not rush changes** (the definition of rush depends on how big your changes are). +- **Use commit messages to describe _why_ you are proposing the changes you are proposing.** +- **Try to not rush changes** (the definition of rush depends on how big your changes are). Remember that everyone in the repo2docker team is a volunteer and we can not (nor would we want to) control their time or interests. Wait patiently for a reviewer to merge the PR. (Remember that **someone else** must merge your PR, even if you have the admin rights to do so.) (contributing:local-dev)= + ## Setting up for Local Development To develop & test repo2docker locally, you need: @@ -126,7 +129,7 @@ python3 -m venv . source bin/activate pip3 install -e . pip3 install -r dev-requirements.txt -pip3 install -r docs/doc-requirements.txt +pip3 install -r docs/requirements.txt pip3 install black ``` @@ -147,7 +150,6 @@ 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 If you do not already have [Docker](https://www.docker.com/), you should be able @@ -184,13 +186,12 @@ Then you are good to go! ## Building the documentation locally -If you only changed the documentation, you can also build the documentation locally using `sphinx` . +You can build and inspect the result of documentation changes locally. ```bash -pip install -r docs/doc-requirements.txt +pip install -e . +pip install -r docs/requirements.txt cd docs/ -make html +make devenv ``` - -Then open the file `docs/build/html/index.html` in your browser. diff --git a/docs/source/contributing/roadmap.md b/docs/source/contributing/roadmap.md index 0a620cadc..4148a7a79 100644 --- a/docs/source/contributing/roadmap.md +++ b/docs/source/contributing/roadmap.md @@ -7,6 +7,7 @@ The goal is to communicate priorities and upcoming release plans. It is not a aimed at limiting contributions to what is listed here. ## Using the roadmap + ### Sharing Feedback on the Roadmap All of the community is encouraged to provide feedback as well as share new @@ -16,24 +17,22 @@ After submitting the issue, others from the community will probably respond with questions or comments they have to clarify the issue. The maintainers will help identify what a good next step is for the issue. - ### What do we mean by "next step"? When submitting an issue, think about what "next step" category best describes your issue: -* **now**, concrete/actionable step that is ready for someone to start work on. -These might be items that have a link to an issue or more abstract like -"decrease typos and dead links in the documentation" -* **soon**, less concrete/actionable step that is going to happen soon, -discussions around the topic are coming close to an end at which point it can -move into the "now" category -* **later**, abstract ideas or tasks, need a lot of discussion or -experimentation to shape the idea so that it can be executed. Can also -contain concrete/actionable steps that have been postponed on purpose -(these are steps that could be in "now" but the decision was taken to work on -them later) - +- **now**, concrete/actionable step that is ready for someone to start work on. + These might be items that have a link to an issue or more abstract like + "decrease typos and dead links in the documentation" +- **soon**, less concrete/actionable step that is going to happen soon, + discussions around the topic are coming close to an end at which point it can + move into the "now" category +- **later**, abstract ideas or tasks, need a lot of discussion or + experimentation to shape the idea so that it can be executed. Can also + contain concrete/actionable steps that have been postponed on purpose + (these are steps that could be in "now" but the decision was taken to work on + them later) ### Reviewing and Updating the Roadmap @@ -48,22 +47,21 @@ For those please create a The roadmap should give the reader an idea of what is happening next, what needs input and discussion before it can happen and what has been postponed. - ## The roadmap proper + ### Project vision Repo2docker is a dependable tool used by humans that reduces the complexity of creating the environment in which a piece of software can be executed. - ### Now The "Now" items are being actively worked on by the project: -* reduce documentation typos and syntax errors -* increase test coverage to 80% (see https://codecov.io/gh/jupyterhub/repo2docker/tree/main/repo2docker for low coverage files) -* mounting repository contents in locations that is not `/home/jovyan` -* investigate options for pinning repo2docker versions ([#490](https://github.com/jupyterhub/repo2docker/issues/490)) +- reduce documentation typos and syntax errors +- increase test coverage to 80% (see https://codecov.io/gh/jupyterhub/repo2docker/tree/main/repo2docker for low coverage files) +- mounting repository contents in locations that is not `/home/jovyan` +- investigate options for pinning repo2docker versions ([#490](https://github.com/jupyterhub/repo2docker/issues/490)) ### Soon @@ -71,15 +69,16 @@ The "Soon" items are being discussed/a plan of action is being made. Once an item reaches the point of an actionable plan and person who wants to work on it, the item will be moved to the "Now" section. Typically, these will be moved at a future review of the roadmap. -* create the contributor highway, define the route from newcomer to project lead -* add Julia Manifest support (https://docs.julialang.org/en/v1/stdlib/Pkg/index.html, [#486](https://github.com/jupyterhub/repo2docker/issues/486)) -* support different base images/build pack stacks ([#487](https://github.com/jupyterhub/repo2docker/issues/487)) +- create the contributor highway, define the route from newcomer to project lead +- add Julia Manifest support (https://docs.julialang.org/en/v1/stdlib/Pkg/index.html, [#486](https://github.com/jupyterhub/repo2docker/issues/486)) +- support different base images/build pack stacks ([#487](https://github.com/jupyterhub/repo2docker/issues/487)) ### Later The "Later" items are things that are at the back of the project's mind. At this time there is no active plan for an item. The project would like to find the resources and time to discuss and then execute these ideas. -* support execution on a remote host (with more resources than available locally) via the command-line -* add support for using ZIP files as the repo (`repo2docker https://example.com/an-archive.zip`) + +- support execution on a remote host (with more resources than available locally) via the command-line +- add support for using ZIP files as the repo (`repo2docker https://example.com/an-archive.zip`) diff --git a/docs/source/contributing/tasks.md b/docs/source/contributing/tasks.md index b6602e0d0..30be8c662 100644 --- a/docs/source/contributing/tasks.md +++ b/docs/source/contributing/tasks.md @@ -32,17 +32,18 @@ py.test -s tests/ To skip the tests related to Mercurial repositories (to avoid to install Mercurial and hg-evolve), one can use the environment variable -``REPO2DOCKER_SKIP_HG_TESTS``. +`REPO2DOCKER_SKIP_HG_TESTS`. ### Troubleshooting Tests 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. + + - 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. - - If your test failure messages include "`No space left on device: '/home/...`", this step should address the problem. + - If your test failure messages include "`No space left on device: '/home/...`", this step should address the problem. ## Update and Freeze BuildPack Dependencies @@ -51,35 +52,36 @@ dependencies that are installed by default for several buildpacks. For both the `conda` and `virtualenv` (`pip`) base environments in the **Conda BuildPack** and **Python BuildPack**, we install specific pinned versions of all dependencies. We explicitly list the dependencies -we want, then *freeze* them at commit time to explicitly list all the +we want, then _freeze_ them at commit time to explicitly list all the transitive dependencies at current versions. This way, we know that all dependencies will have the exact same version installed at all times. To update one of the dependencies shared across all `repo2docker` builds, you must follow these steps (with more detailed information in the sections below): -1. Bump the version numbers of the dependencies you want to update in the `conda` environment ([link](tasks:conda-dependencies)) +1. Bump the version numbers of the dependencies you want to update in the `conda` environment ([link](tasks:conda-dependencies)) 2. Make a pull request with your changes ([link](https://github.com/jupyterhub/repo2docker/blob/HEAD/CONTRIBUTING.md#make-a-pull-request)) See the subsections below for more detailed instructions. (tasks:conda-dependencies)= + ### Conda dependencies 1. There are two files related to conda dependencies. Edit as needed. - - `repo2docker/buildpacks/conda/environment.yml` + - `repo2docker/buildpacks/conda/environment.yml` - Contains list of packages to install in Python3 conda environments, - which are the default. **This is where all Notebook versions & - notebook extensions (such as JupyterLab / nteract) go**. + Contains list of packages to install in Python3 conda environments, + which are the default. **This is where all Notebook versions & + notebook extensions (such as JupyterLab) go**. - - `repo2docker/buildpacks/conda/environment.py-2.7.yml` + - `repo2docker/buildpacks/conda/environment.py-2.7.yml` - Contains list of packages to install in Python2 conda environments, which - can be specifically requested by users. **This only needs `IPyKernel` - and kernel related libraries**. Notebook / Notebook Extension need - not be installed here. + Contains list of packages to install in Python2 conda environments, which + can be specifically requested by users. **This only needs `IPyKernel` + and kernel related libraries**. Notebook / Notebook Extension need + not be installed here. 2. Once you edit either of these files to add a new package / bump version on an existing package, you should then run: @@ -147,26 +149,13 @@ Once this has completed, make sure that the new version has been updated. 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" +- 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! - -## Keeping the Pipfile and requirements files up to date - -We now have both a `dev-requirements.txt` and a `Pifile` for repo2docker, as -such it is important to keep these in sync/up-to-date. - -Both files use `pip identifiers` so if you are updating for example the Sphinx version -in the `doc-requirements.txt` (currently `Sphinx = ">=1.4,!=1.5.4"`) you can use the -same syntax to update the Pipfile and viceversa. - -At the moment this has to be done manually so please make sure to update both -files accordingly. - # Uncommon tasks ## Compare generated Dockerfiles between repo2docker versions diff --git a/docs/source/design.md b/docs/source/design.md index e70835637..7f6536941 100644 --- a/docs/source/design.md +++ b/docs/source/design.md @@ -7,8 +7,7 @@ The philosophy for the repo2docker buildpacks includes: - using common configuration files for familiar installation and packaging tools - allowing configuration files to be combined to compose more complex setups - specifying default locations for configuration files -(in the repository's root, `binder` or `.binder` directory) - + (in the repository's root, `binder` or `.binder` directory) When designing `repo2docker` and adding to it in the future, the developers are influenced by two primary use cases. @@ -79,7 +78,7 @@ is a highly recommended quick read. Although other projects, like [s2i](https://github.com/openshift/source-to-image), exist to convert source to Docker images, `repo2docker` provides the additional functionality to support -*composable* environments. We want to easily have an image with +_composable_ environments. We want to easily have an image with Python3+Julia+R-3.2 environments, rather than just one single language environment. While generally one language environment per container works well, in many scientific / datascience computing environments you need multiple diff --git a/docs/source/faq.rst b/docs/source/faq.rst index 50e35276a..ce442d04e 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -22,6 +22,10 @@ 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 @@ -35,9 +39,18 @@ 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. -I Python 2.7 is specified, a separate environment for the kernel will be -installed with Python 2. The notebook server will run in the default Python 3.7 -environment. +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 ~~~~~ diff --git a/docs/source/howto/base_image.md b/docs/source/howto/base_image.md new file mode 100644 index 000000000..6fa8f5173 --- /dev/null +++ b/docs/source/howto/base_image.md @@ -0,0 +1,33 @@ +# Change the base image used by Docker + +You may change the base image used in the `Dockerfile` that creates images by repo2docker. +This is equivalent to changing the `FROM ` in the Dockerfile. + +To do so, use the `base_image` traitlet when invoking `repo2docker`. +Note that this is not configurable by individual repositories, it is configured when you invoke the `repo2docker` command. + +```{note} +By default repo2docker builds on top of the `buildpack-deps:bionic` base image, an Ubuntu-based image. +``` + +## Requirements for your base image + +`repo2docker` will only work if a specific set of packages exists in the base image. +Only images that match the following criteria are supported: + +- Ubuntu based distributions (minimum `18.04`) +- Contains a set of base packages installed with [the `buildpack-deps` image family](https://hub.docker.com/_/buildpack-deps). + +Other images _may_ work, but are not officially supported. + +## This will affect reproducibility 🚨 + +Changing the base image may have an impact on the reproducibility of repositories that are built. +There are **no guarantees that repositories will behave the same way as other repo2docker builds if you change the base image**. +For example these are two scenarios that would make your repositories non-reproducible: + +- **Your base image is different from `Ubuntu:bionic`.** + If you change the base image in a way that is different from repo2docker's default (the Ubuntu `bionic` image), then repositories that **you** build with repo2docker may be significantly different from those that **other** instances of repo2docker build (e.g., those from [`mybinder.org`](https://mybinder.org)). +- **Your base image changes over time.** + If you choose a base image that changes its composition over time (e.g., an image provided by some other community), then it may cause repositories build with your base image to change in unpredictable ways. + We recommend choosing a base image that you know to be stable and trustworthy. diff --git a/docs/source/howto/index.rst b/docs/source/howto/index.rst index c7ee34a3c..426837edd 100644 --- a/docs/source/howto/index.rst +++ b/docs/source/howto/index.rst @@ -15,3 +15,4 @@ Select from the pages listed below to get started. lab_workspaces jupyterhub_images deploy + base_image diff --git a/docs/source/howto/languages.rst b/docs/source/howto/languages.rst index abf76e0a1..af51a6fdf 100644 --- a/docs/source/howto/languages.rst +++ b/docs/source/howto/languages.rst @@ -65,17 +65,14 @@ to install libraries from on the given date. You can install more R packages fro by adding a :ref:`install.R` file to your repo. RStudio and IRKernel are installed by default for all R versions. -If you request R 4.1 or later, or specify a snapshot date newer than -``2022-01-01``, `packagemanager.rstudio.com `_ +`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.rstudio.com `_ to find +`packagemanager.posit.co `_ to find a list. -For older R versions with an older snapshot date, `MRAN `_ -is used as source of packages. This purely provides source packages, and you should -migrate away from this if possible. +repo2docker stopped using the Microsoft mirror MRAN for older R versions after its shutdown in July, 2023. Julia diff --git a/docs/source/howto/user_interface.rst b/docs/source/howto/user_interface.rst index efee01dc6..588c270c4 100644 --- a/docs/source/howto/user_interface.rst +++ b/docs/source/howto/user_interface.rst @@ -46,37 +46,6 @@ And you can switch back to JupyterLab by replacing ``/tree/`` with ``/lab/``: http(s):///lab/ - -nteract -======= - -`nteract is a notebook interface `_ built with React. -It is similar to a more feature-filled version of the traditional -Jupyter Notebook interface. - -nteract comes pre-installed in any session that has been built from -a Python repository. - -You can launch nteract from within a user -session by replacing ``/tree`` with ``/nteract`` at the end of a notebook -server's URL like so: - -.. code-block:: none - - http(s):///nteract - -For example, the following Binder URL will open the -`pyTudes repository `_ -and begin an nteract session in the ``ipynb`` folder: - -https://mybinder.org/v2/gh/norvig/pytudes/HEAD?urlpath=nteract/tree/ipynb - -The ``/tree/ipynb`` above is how nteract directs you to a specific file -or folder. - -To learn more about nteract, visit `the nteract website `_. - - RStudio ======= @@ -97,7 +66,7 @@ http://mybinder.org/v2/gh/binder-examples/r/HEAD?urlpath=rstudio Shiny ===== -`Shiny lets you create interactive visualizaions with R `_. +`Shiny lets you create interactive visualizations with R `_. Shiny is automatically enabled if a configuration file for R is detected (i.e. an R version specified in ``runtime.txt``). If this is detected, Shiny will be accessible by appending diff --git a/readthedocs.yml b/readthedocs.yml deleted file mode 100644 index 4fae81d64..000000000 --- a/readthedocs.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: repo2docker -type: sphinx -python: - version: 3 - setup_py_install: true -requirements_file: docs/doc-requirements.txt diff --git a/repo2docker/__main__.py b/repo2docker/__main__.py index c95d53c68..4bf666c47 100644 --- a/repo2docker/__main__.py +++ b/repo2docker/__main__.py @@ -1,14 +1,15 @@ import argparse -import sys -import os import logging +import os +import sys + +from . import __version__ from .app import Repo2Docker from .engine import BuildError, ImageLoadError -from . import __version__ from .utils import ( - validate_and_generate_port_mapping, - is_valid_docker_image_name, R2dState, + is_valid_docker_image_name, + validate_and_generate_port_mapping, ) @@ -52,7 +53,7 @@ def __call__(self, parser, namespace, values, option_string=None): # key pass using current value, or don't pass if "=" not in values: try: - value_to_append = "{}={}".format(values, os.environ[values]) + value_to_append = f"{values}={os.environ[values]}" except KeyError: # no local def, so don't pass return @@ -92,7 +93,7 @@ def get_argparser(): argparser.add_argument( "--json-logs", - default=False, + default=None, action="store_true", help="Emit JSON logs instead of human readable logs", ) @@ -107,12 +108,13 @@ def get_argparser(): argparser.add_argument( "--image-name", - help=("Name of image to be built. If unspecified will be " "autogenerated"), + help="Name of image to be built. If unspecified will be autogenerated", type=validate_image_name, ) argparser.add_argument( "--ref", + default=None, help=( "Reference to build instead of default reference. For example" " branch name or commit for a Git repository." @@ -125,10 +127,16 @@ def get_argparser(): "--no-build", dest="build", action="store_false", - help=( - "Do not actually build the image. Useful in conjunction " "with --debug." - ), + help="Do not actually build the image. Useful in conjunction with --debug.", + ) + + argparser.add_argument( + "--build", + dest="build", + action="store_true", + help="Build the image (default)", ) + argparser.set_defaults(build=None) argparser.add_argument( "--build-memory-limit", @@ -148,6 +156,14 @@ def get_argparser(): help="Do not run container after it has been built", ) + argparser.add_argument( + "--run", + dest="run", + action="store_true", + help="Run container after it has been built (default).", + ) + argparser.set_defaults(run=None) + argparser.add_argument( "--publish", "-p", @@ -163,6 +179,7 @@ def get_argparser(): "--publish-all", "-P", dest="all_ports", + default=None, action="store_true", help="Publish all exposed ports to random host ports.", ) @@ -173,6 +190,13 @@ def get_argparser(): action="store_false", help="Don't clean up remote checkouts after we are done", ) + argparser.add_argument( + "--clean", + dest="clean", + action="store_true", + help="Clean up remote checkouts after we are done (default).", + ) + argparser.set_defaults(clean=None) argparser.add_argument( "--push", @@ -180,6 +204,13 @@ def get_argparser(): action="store_true", help="Push docker image to repository", ) + argparser.add_argument( + "--no-push", + dest="push", + action="store_false", + help="Don't push docker image to repository (default).", + ) + argparser.set_defaults(push=None) argparser.add_argument( "--volume", @@ -244,7 +275,12 @@ def get_argparser(): "--cache-from", action="append", default=[], help=Repo2Docker.cache_from.help ) - argparser.add_argument("--engine", help="Name of the container engine") + argparser.add_argument( + "--engine", + type=str, + default="docker", + help=Repo2Docker.engine.help, + ) argparser.add_argument( "--template", @@ -261,6 +297,7 @@ def get_argparser(): return argparser +# Note: only used by sphinx-autoprogram argparser = get_argparser() @@ -285,12 +322,18 @@ def make_r2d(argv=None): args, traitlet_args = argparser.parse_known_args(argv) r2d = Repo2Docker() - r2d.parse_command_line(traitlet_args) if args.debug: r2d.log_level = logging.DEBUG + # load CLI after config file, for correct priority r2d.load_config_file(args.config) + r2d.parse_command_line(traitlet_args) + + if args.debug: + # re-apply debug in case log_level was also set via config + r2d.log_level = logging.DEBUG + if args.appendix: r2d.appendix = args.appendix @@ -305,8 +348,14 @@ def make_r2d(argv=None): if args.entrypoint_file: r2d.entrypoint_file = args.entrypoint_file + # repo is a required arg, and should never come from config: + if "repo" in r2d.config.Repo2Docker: + r2d.log.warning( + f"Ignoring Repo2Docker.repo={r2d.repo!r} configuration, using {args.repo!r} from CLI." + ) r2d.repo = args.repo - r2d.ref = args.ref + if args.ref is not None: + r2d.ref = args.ref if args.template: if os.path.isfile(args.template): @@ -329,29 +378,30 @@ def make_r2d(argv=None): r2d.volumes[os.path.abspath(args.repo)] = "." else: r2d.log.error( - 'Cannot mount "{}" in editable mode ' - "as it is not a directory".format(args.repo), + f'Cannot mount "{args.repo}" in editable mode ' + "as it is not a directory", extra=dict(phase=R2dState.FAILED), ) sys.exit(1) if args.image_name: r2d.output_image_spec = args.image_name - else: - # we will pick a name after fetching the repository - r2d.output_image_spec = "" - r2d.json_logs = args.json_logs + if args.json_logs is not None: + r2d.json_logs = args.json_logs - r2d.dry_run = not args.build + if args.build is not None: + r2d.dry_run = not args.build if r2d.dry_run: # Can't push nor run if we aren't building args.run = False args.push = False - r2d.run = args.run - r2d.push = args.push + if args.run is not None: + r2d.run = args.run + if args.push is not None: + r2d.push = args.push # check against r2d.run and not args.run as r2d.run is false on # --no-build. Also r2d.volumes and not args.volumes since --editable @@ -365,29 +415,33 @@ def make_r2d(argv=None): src, dest = v.split(":") r2d.volumes[src] = dest - r2d.run_cmd = args.cmd + if args.cmd: + r2d.run_cmd = args.cmd if args.all_ports and not r2d.run: - print( - "To publish user defined port mappings, the container must " "also be run" - ) + print("To publish user-defined port mappings, the container must also be run") sys.exit(1) if args.ports and not r2d.run: - print( - "To publish user defined port mappings, the container must " "also be run" - ) + print("To publish user-defined port mappings, the container must also be run") sys.exit(1) - if args.ports and not r2d.run_cmd: + if args.ports and len(args.ports) > 1 and not r2d.run_cmd: print( - "To publish user defined port mapping, user must specify " - "the command to run in the container" + "To publish user-defined port mapping, " + "you must specify the command to run in the container" ) sys.exit(1) - r2d.ports = validate_and_generate_port_mapping(args.ports) - r2d.all_ports = args.all_ports + if args.ports: + # override or update, if also defined in config file? + if r2d.ports: + r2d.log.warning( + f"Ignoring port configuration from config (ports={r2d.ports}), overridden by CLI" + ) + r2d.ports = validate_and_generate_port_mapping(args.ports) + if args.all_ports is not None: + r2d.all_ports = args.all_ports if args.user_id: r2d.user_id = args.user_id @@ -425,13 +479,11 @@ def make_r2d(argv=None): if args.engine: r2d.engine = args.engine - r2d.environment = args.environment + if args.environment: + # extend any environment config from a config file + r2d.environment.extend(args.environment) - # if the source exists locally we don't want to delete it at the end - # FIXME: Find a better way to figure out if repo is 'local'. Push this into ContentProvider? - if os.path.exists(args.repo): - r2d.cleanup_checkout = False - else: + elif args.clean is not None: r2d.cleanup_checkout = args.clean if args.target_repo_dir: diff --git a/repo2docker/_version.py b/repo2docker/_version.py index 442840369..017b26612 100644 --- a/repo2docker/_version.py +++ b/repo2docker/_version.py @@ -84,7 +84,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= stderr=(subprocess.PIPE if hide_stderr else None), ) break - except EnvironmentError: + except OSError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue @@ -94,7 +94,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= return None, None else: if verbose: - print("unable to find command, tried %s" % (commands,)) + print(f"unable to find command, tried {commands}") return None, None stdout = p.communicate()[0].strip() if sys.version_info[0] >= 3: @@ -147,7 +147,7 @@ def git_get_keywords(versionfile_abs): # _version.py. keywords = {} try: - f = open(versionfile_abs, "r") + f = open(versionfile_abs) for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) @@ -162,7 +162,7 @@ def git_get_keywords(versionfile_abs): if mo: keywords["date"] = mo.group(1) f.close() - except EnvironmentError: + except OSError: pass return keywords @@ -186,11 +186,11 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = set([r.strip() for r in refnames.strip("()").split(",")]) + 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 = set([r[len(TAG) :] for r in refs if r.startswith(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 @@ -199,7 +199,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): # 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 = set([r for r in refs if re.search(r"\d", r)]) + tags = {r for r in refs if re.search(r"\d", r)} if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: @@ -293,7 +293,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? - pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out + pieces["error"] = f"unable to parse git-describe output: '{describe_out}'" return pieces # tag @@ -302,10 +302,9 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): 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, - ) + pieces[ + "error" + ] = f"tag '{full_tag}' doesn't start with prefix '{tag_prefix}'" return pieces pieces["closest-tag"] = full_tag[len(tag_prefix) :] diff --git a/repo2docker/app.py b/repo2docker/app.py index 9b9082633..0050caa39 100755 --- a/repo2docker/app.py +++ b/repo2docker/app.py @@ -7,24 +7,24 @@ python -m repo2docker https://github.com/you/your-repo """ +import getpass import json -import sys import logging import os -import entrypoints -import getpass import shutil +import sys import tempfile import time +import warnings from urllib.parse import urlparse +import entrypoints import escapism from pythonjsonlogger import jsonlogger - -from traitlets import Any, Dict, Int, List, Unicode, Bool, default +from traitlets import Any, Bool, Dict, Int, List, Unicode, default, observe from traitlets.config import Application -from . import __version__ +from . import __version__, contentproviders from .buildpacks import ( CondaBuildPack, DockerBuildPack, @@ -36,9 +36,8 @@ PythonBuildPack, RBuildPack, ) -from . import contentproviders from .engine import BuildError, ContainerEngineException, ImageLoadError -from .utils import ByteSpecification, chdir, R2dState +from .utils import ByteSpecification, R2dState, chdir, get_platform class Repo2Docker(Application): @@ -252,6 +251,27 @@ def _user_name_default(self): config=True, ) + platform = Unicode( + config=True, + help=""" + Platform to build for, linux/amd64 (recommended) or linux/arm64 (experimental). + """, + ) + + @default("platform") + def _platform_default(self): + """ + Default platform + """ + p = get_platform() + if p == "linux/arm64": + warnings.warn( + "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." + ) + return p + extra_build_args = Dict( {}, help=""" @@ -306,7 +326,7 @@ def _user_name_default(self): ) cleanup_checkout = Bool( - False, + True, help=""" Delete source repository after building is done. @@ -315,6 +335,12 @@ def _user_name_default(self): config=True, ) + @default("cleanup_checkout") + def _defaut_cleanup_checkout(self): + # if the source exists locally we don't want to delete it at the end + # FIXME: Find a better way to figure out if repo is 'local'. Push this into ContentProvider? + return not os.path.exists(self.repo) + output_image_spec = Unicode( "", help=""" @@ -334,7 +360,7 @@ def _user_name_default(self): ) run = Bool( - False, + True, help=""" Run docker image after building """, @@ -351,6 +377,12 @@ def _user_name_default(self): config=True, ) + @observe("dry_run") + def _dry_run_changed(self, change): + if change.new: + # dry_run forces run and push to be False + self.push = self.run = False + # FIXME: Refactor classes to separate build & run steps run_cmd = List( [], @@ -415,6 +447,21 @@ def _user_name_default(self): """, ) + base_image = Unicode( + "docker.io/library/buildpack-deps:bionic", + config=True, + help=""" + Base image to use when building docker images. + + Only images that match the following criteria are supported: + - Ubuntu based distributions, minimum 18.04 + - Contains set of base packages installed with the buildpack-deps + image family: https://hub.docker.com/_/buildpack-deps + + Other images *may* work, but are not officially supported. + """, + ) + template = Unicode( "", help=""" @@ -441,9 +488,7 @@ def get_engine(self): entry = engines[self.engine] except KeyError: raise ContainerEngineException( - "Container engine '{}' not found. Available engines: {}".format( - self.engine, ",".join(engines.keys()) - ) + f"Container engine '{self.engine}' not found. Available engines: {','.join(engines.keys())}" ) engine_class = entry.load() return engine_class(parent=self) @@ -463,16 +508,11 @@ def fetch(self, url, ref, checkout_path): spec = cp.detect(url, ref=ref) if spec is not None: picked_content_provider = cp - self.log.info( - "Picked {cp} content " - "provider.\n".format(cp=cp.__class__.__name__) - ) + self.log.info(f"Picked {cp.__class__.__name__} content provider.\n") break if picked_content_provider is None: - self.log.error( - "No matching content provider found for " "{url}.".format(url=url) - ) + self.log.error(f"No matching content provider found for {url}.") swh_token = self.config.get("swh_token", self.swh_token) if swh_token and isinstance(picked_content_provider, contentproviders.Swhid): @@ -504,8 +544,7 @@ def json_excepthook(self, etype, evalue, traceback): Avoids non-JSON output on errors when using --json-logs """ self.log.error( - "Error during build: %s", - evalue, + f"Error during build: {evalue}", exc_info=(etype, evalue, traceback), extra=dict(phase=R2dState.FAILED), ) @@ -584,7 +623,7 @@ def push_image(self): ) last_emit_time = time.time() self.log.info( - "Successfully pushed {}".format(self.output_image_spec), + f"Successfully pushed {self.output_image_spec}", extra=dict(phase=R2dState.PUSHING), ) @@ -611,31 +650,38 @@ def start_container(self): self.hostname = host_name if not self.run_cmd: - port = str(self._get_free_port()) - self.port = port + if len(self.ports) == 1: + # single port mapping specified + # retrieve container and host port from dict + # {'8888/tcp': ('hostname', 'port')} + # or + # {'8888/tcp': 'port'} + container_port_proto, host_port = next(iter(self.ports.items())) + if isinstance(host_port, tuple): + # (hostname, port) tuple or string port + host_name, host_port = host_port + self.hostname = host_name + host_port = int(host_port) + 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()) + self.ports = {f"{container_port}/tcp": host_port} + self.port = host_port # To use the option --NotebookApp.custom_display_url # make sure the base-notebook image is updated: # docker pull jupyter/base-notebook run_cmd = [ "jupyter", "notebook", - "--ip", - "0.0.0.0", - "--port", - port, - "--NotebookApp.custom_display_url=http://{}:{}".format(host_name, port), + "--ip=0.0.0.0", + f"--port={container_port}", + f"--NotebookApp.custom_display_url=http://{host_name}:{host_port}", "--NotebookApp.default_url=/lab", ] - ports = {"%s/tcp" % port: port} else: # run_cmd given by user, if port is also given then pass it on run_cmd = self.run_cmd - if self.ports: - ports = self.ports - else: - ports = {} - # store ports on self so they can be retrieved in tests - self.ports = ports container_volumes = {} if self.volumes: @@ -650,7 +696,7 @@ def start_container(self): run_kwargs = dict( publish_all_ports=self.all_ports, - ports=ports, + ports=self.ports, command=run_cmd, volumes=container_volumes, environment=self.environment, @@ -737,7 +783,7 @@ def build(self): try: docker_client = self.get_engine() except ContainerEngineException as e: - self.log.error("\nContainer engine initialization error: %s\n", e) + self.log.error(f"\nContainer engine initialization error: {e}\n") self.exit(1) # If the source to be executed is a directory, continue using the @@ -746,6 +792,8 @@ def build(self): # making a copy of it as it might contain large files that would be # expensive to copy. if os.path.isdir(self.repo): + # never cleanup when we are working in a local repo + self.cleanup_checkout = False checkout_path = self.repo else: if self.git_workdir is None: @@ -758,8 +806,7 @@ def build(self): if self.find_image(): self.log.info( - "Reusing existing image ({}), not " - "building.".format(self.output_image_spec) + f"Reusing existing image ({self.output_image_spec}), not building." ) # no need to build, so skip to the end by `return`ing here # this will still execute the finally clause and let's us @@ -770,21 +817,23 @@ def build(self): checkout_path = os.path.join(checkout_path, self.subdir) if not os.path.isdir(checkout_path): self.log.error( - "Subdirectory %s does not exist", - self.subdir, + f"Subdirectory {self.subdir} does not exist", extra=dict(phase=R2dState.FAILED), ) - raise FileNotFoundError("Could not find {}".format(checkout_path)) + raise FileNotFoundError(f"Could not find {checkout_path}") with chdir(checkout_path): for BP in self.buildpacks: - bp = BP() + bp = BP(base_image=self.base_image) if bp.detect(): picked_buildpack = bp break else: - picked_buildpack = self.default_buildpack() + picked_buildpack = self.default_buildpack( + base_image=self.base_image + ) + picked_buildpack.platform = self.platform picked_buildpack.appendix = self.appendix if self.template: picked_buildpack.template = self.template @@ -819,8 +868,7 @@ def build(self): ) self.log.info( - "Using %s builder\n", - bp.__class__.__name__, + f"Using {bp.__class__.__name__} builder\n", extra=dict(phase=R2dState.BUILDING), ) @@ -831,6 +879,7 @@ def build(self): build_args, self.cache_from, self.extra_build_kwargs, + platform=self.platform, ): if docker_client.string_output: self.log.info(l, extra=dict(phase=R2dState.BUILDING)) @@ -854,6 +903,7 @@ def build(self): finally: # Cleanup checkout if necessary + # never cleanup when checking out a local repo if self.cleanup_checkout: shutil.rmtree(checkout_path, ignore_errors=True) diff --git a/repo2docker/buildpacks/__init__.py b/repo2docker/buildpacks/__init__.py index 10fe89a4e..7568000bd 100644 --- a/repo2docker/buildpacks/__init__.py +++ b/repo2docker/buildpacks/__init__.py @@ -1,10 +1,9 @@ -from .base import BuildPack, BaseImage -from .python import PythonBuildPack -from .pipfile import PipfileBuildPack +from .base import BaseImage, BuildPack from .conda import CondaBuildPack -from .julia import JuliaProjectTomlBuildPack -from .julia import JuliaRequireBuildPack from .docker import DockerBuildPack +from .julia import JuliaProjectTomlBuildPack, JuliaRequireBuildPack from .legacy import LegacyBinderDockerBuildPack -from .r import RBuildPack from .nix import NixBuildPack +from .pipfile import PipfileBuildPack +from .python import PythonBuildPack +from .r import RBuildPack diff --git a/repo2docker/buildpacks/_r_base.py b/repo2docker/buildpacks/_r_base.py index 09ec90d64..772b2d80c 100644 --- a/repo2docker/buildpacks/_r_base.py +++ b/repo2docker/buildpacks/_r_base.py @@ -14,9 +14,19 @@ def rstudio_base_scripts(r_version): shiny_proxy_version = "1.1" shiny_sha256sum = "80f1e48f6c824be7ef9c843bb7911d4981ac7e8a963e0eff823936a8b28476ee" - rstudio_url = "https://download2.rstudio.org/server/bionic/amd64/rstudio-server-2022.02.1-461-amd64.deb" - rstudio_sha256sum = ( - "239e8d93e103872e7c6d827113d88871965f82ffb0397f5638025100520d8a54" + # 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) + # 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_sha256sum = ( + "a5aa2202786f9017a6de368a410488ea2e4fc6c739f78998977af214df0d6288" + ) + + rstudio_openssl1_url = "https://download2.rstudio.org/server/bionic/amd64/rstudio-server-2022.12.0-353-amd64.deb" + rstudio_openssl1_sha256sum = ( + "bb88e37328c304881e60d6205d7dac145525a5c2aaaf9da26f1cb625b7d47e6e" ) rsession_proxy_version = "2.0.1" @@ -26,35 +36,34 @@ def rstudio_base_scripts(r_version): # we should have --no-install-recommends on all our apt-get install commands, # but here it's important because these recommend r-base, # which will upgrade the installed version of R, undoing our pinned version - r""" - curl --silent --location --fail {rstudio_url} > /tmp/rstudio.deb && \ + rf""" + apt-get update > /dev/null && \ + if apt-cache search libssl3 > /dev/null; then \ + RSTUDIO_URL="{rstudio_openssl3_url}" ;\ + RSTUDIO_HASH="{rstudio_openssl3_sha256sum}" ;\ + else \ + RSTUDIO_URL="{rstudio_openssl1_url}" ;\ + RSTUDIO_HASH="{rstudio_openssl1_sha256sum}" ;\ + fi && \ + curl --silent --location --fail ${{RSTUDIO_URL}} > /tmp/rstudio.deb && \ curl --silent --location --fail {shiny_server_url} > /tmp/shiny.deb && \ - echo '{rstudio_sha256sum} /tmp/rstudio.deb' | sha256sum -c - && \ + echo "${{RSTUDIO_HASH}} /tmp/rstudio.deb" | sha256sum -c - && \ echo '{shiny_sha256sum} /tmp/shiny.deb' | sha256sum -c - && \ - apt-get update > /dev/null && \ apt install -y --no-install-recommends /tmp/rstudio.deb /tmp/shiny.deb && \ - rm /tmp/rstudio.deb && \ + rm /tmp/*.deb && \ apt-get -qq purge && \ apt-get -qq clean && \ rm -rf /var/lib/apt/lists/* - """.format( - rstudio_url=rstudio_url, - rstudio_sha256sum=rstudio_sha256sum, - shiny_server_url=shiny_server_url, - shiny_sha256sum=shiny_sha256sum, - ), + """, ), ( "${NB_USER}", # Install jupyter-rsession-proxy - r""" + rf""" pip install --no-cache \ jupyter-rsession-proxy=={rsession_proxy_version} \ jupyter-shiny-proxy=={shiny_proxy_version} - """.format( - rsession_proxy_version=rsession_proxy_version, - shiny_proxy_version=shiny_proxy_version, - ), + """, ), ( # Not all of these locations are configurable; so we make sure diff --git a/repo2docker/buildpacks/base.py b/repo2docker/buildpacks/base.py index 18da49f41..4de53ffea 100644 --- a/repo2docker/buildpacks/base.py +++ b/repo2docker/buildpacks/base.py @@ -1,18 +1,20 @@ -import textwrap -import jinja2 -import tarfile +import hashlib import io +import logging import os import re -import logging import string import sys -import hashlib +import tarfile +import textwrap +from functools import lru_cache + import escapism +import jinja2 # Only use syntax features supported by Docker 17.09 TEMPLATE = r"""# syntax=docker/dockerfile:experimental -FROM buildpack-deps:bionic +FROM {{base_image}} # Avoid prompts from apt ENV DEBIAN_FRONTEND=noninteractive @@ -27,18 +29,18 @@ RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen -ENV LC_ALL en_US.UTF-8 -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 \ + LANGUAGE=en_US.UTF-8 # Use bash as default shell, rather than sh -ENV SHELL /bin/bash +ENV SHELL=/bin/bash # Set up user ARG NB_USER ARG NB_UID -ENV USER ${NB_USER} -ENV HOME /home/${NB_USER} +ENV USER=${NB_USER} \ + HOME=/home/${NB_USER} RUN groupadd \ --gid ${NB_UID} \ @@ -88,13 +90,13 @@ {% if build_env -%} # Environment variables required for build {% for item in build_env -%} -ENV {{item[0]}} {{item[1]}} +ENV {{item[0]}}={{item[1]}} {% endfor -%} {% endif -%} {% if path -%} # Special case PATH -ENV PATH {{ ':'.join(path) }}:${PATH} +ENV PATH={{ ':'.join(path) }}:${PATH} {% endif -%} {% if build_script_files -%} @@ -112,7 +114,12 @@ # Allow target path repo is cloned to be configurable ARG REPO_DIR=${HOME} -ENV REPO_DIR ${REPO_DIR} +ENV REPO_DIR=${REPO_DIR} +# Create a folder and grant the user permissions if it doesn't exist +RUN if [ ! -d "${REPO_DIR}" ]; then \ + /usr/bin/install -o ${NB_USER} -g ${NB_USER} -d "${REPO_DIR}"; \ + fi + WORKDIR ${REPO_DIR} RUN chown ${NB_USER}:${NB_USER} ${REPO_DIR} @@ -124,12 +131,12 @@ # # The XDG standard suggests ~/.local/bin as the path for local user-specific # installs. See https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html -ENV PATH ${HOME}/.local/bin:${REPO_DIR}/.local/bin:${PATH} +ENV PATH=${HOME}/.local/bin:${REPO_DIR}/.local/bin:${PATH} {% if env -%} # The rest of the environment {% for item in env -%} -ENV {{item[0]}} {{item[1]}} +ENV {{item[0]}}={{item[1]}} {% endfor -%} {% endif -%} @@ -151,7 +158,7 @@ USER root # Copy stuff. -COPY --chown={{ user }}:{{ user }} src/ ${REPO_DIR} +COPY --chown={{ user }}:{{ user }} src/ ${REPO_DIR}/ # Run assemble scripts! These will actually turn the specification # in the repository into an image. @@ -180,7 +187,7 @@ # Add start script {% if start_script is not none -%} RUN chmod +x "{{ start_script }}" -ENV R2D_ENTRYPOINT "{{ start_script }}" +ENV R2D_ENTRYPOINT="{{ start_script }}" {% endif -%} # Add entrypoint @@ -212,7 +219,6 @@ class BuildPack: Specifically used for creating Dockerfiles for use with repo2docker only. Things that are kept constant: - - base image - some environment variables (such as locale) - user creation & ownership of home directory - working directory @@ -222,9 +228,13 @@ class BuildPack: """ - def __init__(self): + def __init__(self, base_image): + """ + base_image specifies the base image to use when building docker images + """ self.log = logging.getLogger("repo2docker") self.appendix = "" + self.base_image = base_image self.entrypoint_file = ENTRYPOINT_FILE self.template = TEMPLATE self.labels = {} @@ -233,7 +243,9 @@ def __init__(self): "Windows environment detected. Note that Windows " "support is experimental in repo2docker." ) + self.platform = "" + @lru_cache() def get_packages(self): """ List of packages that are installed in this BuildPack. @@ -243,6 +255,7 @@ def get_packages(self): """ return set() + @lru_cache() def get_base_packages(self): """ Base set of apt packages that are installed for all images. @@ -257,8 +270,11 @@ def get_base_packages(self): # Utils! "less", "unzip", + # Gives us envsubst + "gettext-base", } + @lru_cache() def get_build_env(self): """ Ordered list of environment variables to be set for this image. @@ -274,6 +290,7 @@ def get_build_env(self): """ return [] + @lru_cache() def get_env(self): """ Ordered list of environment variables to be set for this image. @@ -288,6 +305,7 @@ def get_env(self): """ return [] + @lru_cache() def get_path(self): """ Ordered list of file system paths to look for executables in. @@ -297,12 +315,14 @@ def get_path(self): """ return [] + @lru_cache() def get_labels(self): """ Docker labels to set on the built image. """ return self.labels + @lru_cache() def get_build_script_files(self): """ Dict of files to be copied to the container image for use in building. @@ -331,6 +351,7 @@ def _check_stencila(self): f"Found a stencila manifest.xml at {root}. Stencila is no longer supported." ) + @lru_cache() def get_build_scripts(self): """ Ordered list of shell script snippets to build the base image. @@ -352,6 +373,7 @@ def get_build_scripts(self): return [] + @lru_cache() def get_preassemble_script_files(self): """ Dict of files to be copied to the container image for use in preassembly. @@ -365,6 +387,7 @@ def get_preassemble_script_files(self): """ return {} + @lru_cache() def get_preassemble_scripts(self): """ Ordered list of shell snippets to build an image for this repository. @@ -381,6 +404,7 @@ def get_preassemble_scripts(self): """ return [] + @lru_cache() def get_assemble_scripts(self): """ Ordered list of shell script snippets to build the repo into the image. @@ -407,6 +431,7 @@ def get_assemble_scripts(self): """ return [] + @lru_cache() def get_post_build_scripts(self): """ An ordered list of executable scripts to execute after build. @@ -419,6 +444,7 @@ def get_post_build_scripts(self): """ return [] + @lru_cache() def get_start_script(self): """ The path to a script to be executed at container start up. @@ -471,7 +497,7 @@ def render(self, build_args=None): last_user = "root" for user, script in self.get_build_scripts(): if last_user != user: - build_script_directives.append("USER {}".format(user)) + build_script_directives.append(f"USER {user}") last_user = user build_script_directives.append( "RUN {}".format(textwrap.dedent(script.strip("\n"))) @@ -481,7 +507,7 @@ def render(self, build_args=None): last_user = "root" for user, script in self.get_assemble_scripts(): if last_user != user: - assemble_script_directives.append("USER {}".format(user)) + assemble_script_directives.append(f"USER {user}") last_user = user assemble_script_directives.append( "RUN {}".format(textwrap.dedent(script.strip("\n"))) @@ -491,7 +517,7 @@ def render(self, build_args=None): last_user = "root" for user, script in self.get_preassemble_scripts(): if last_user != user: - preassemble_script_directives.append("USER {}".format(user)) + preassemble_script_directives.append(f"USER {user}") last_user = user preassemble_script_directives.append( "RUN {}".format(textwrap.dedent(script.strip("\n"))) @@ -529,6 +555,7 @@ def render(self, build_args=None): appendix=self.appendix, # For docker 17.09 `COPY --chown`, 19.03 would allow using $NBUSER user=build_args.get("NB_UID", DEFAULT_NB_UID), + base_image=self.base_image, ) @staticmethod @@ -568,6 +595,7 @@ def build( build_args, cache_from, extra_build_kwargs, + platform=None, ): tarf = io.BytesIO() tar = tarfile.open(fileobj=tarf, mode="w") @@ -604,8 +632,8 @@ def _filter_tar(tar): # buildpacks/docker.py where it is duplicated if not isinstance(memory_limit, int): raise ValueError( - "The memory limit has to be specified as an" - "integer but is '{}'".format(type(memory_limit)) + "The memory limit has to be specified as an " + f"integer but is '{type(memory_limit)}'" ) limits = {} if memory_limit: @@ -622,21 +650,23 @@ def _filter_tar(tar): buildargs=build_args, container_limits=limits, cache_from=cache_from, + platform=platform, ) build_kwargs.update(extra_build_kwargs) - for line in client.build(**build_kwargs): - yield line + yield from client.build(**build_kwargs) class BaseImage(BuildPack): + @lru_cache() def get_build_env(self): """Return env directives required for build""" return [ ("APP_BASE", "/srv"), ] + @lru_cache() def get_env(self): """Return env directives to be set after build""" return [] @@ -644,6 +674,7 @@ def get_env(self): def detect(self): return True + @lru_cache() def get_preassemble_scripts(self): scripts = [] try: @@ -658,8 +689,7 @@ def get_preassemble_scripts(self): # FIXME: Add support for specifying version numbers if not re.match(r"^[a-z0-9.+-]+", package): raise ValueError( - "Found invalid package name {} in " - "apt.txt".format(package) + f"Found invalid package name {package} in apt.txt" ) extra_apt_packages.append(package) @@ -684,16 +714,19 @@ def get_preassemble_scripts(self): return scripts + @lru_cache() def get_assemble_scripts(self): """Return directives to run after the entire repository has been added to the image""" return [] + @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() 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 4408ad8ed..aed5de6f6 100644 --- a/repo2docker/buildpacks/conda/__init__.py +++ b/repo2docker/buildpacks/conda/__init__.py @@ -1,13 +1,16 @@ """BuildPack for conda environments""" import os import re +import warnings from collections.abc import Mapping +from functools import lru_cache from ruamel.yaml import YAML -from ..base import BaseImage -from .._r_base import rstudio_base_scripts +from ...semver import parse_version as V from ...utils import is_local_pip_requirement +from .._r_base import rstudio_base_scripts +from ..base import BaseImage # pattern for parsing conda dependency line PYTHON_REGEX = re.compile(r"python\s*=+\s*([\d\.]*)") @@ -35,6 +38,15 @@ class CondaBuildPack(BaseImage): # extra pip requirements.txt for the notebook env _nb_requirements_file = "" + def _conda_platform(self): + """Return the conda platform name for the current platform""" + if self.platform == "linux/amd64": + return "linux-64" + if self.platform == "linux/arm64": + return "linux-aarch64" + raise ValueError(f"Unknown platform {self.platform}") + + @lru_cache() def get_build_env(self): """Return environment variables to be set. @@ -59,6 +71,7 @@ def get_build_env(self): # this exe should be used for installs after bootstrap with micromamba # switch this to /usr/local/bin/micromamba to use it for all installs ("MAMBA_EXE", "${CONDA_DIR}/bin/mamba"), + ("CONDA_PLATFORM", self._conda_platform()), ] if self._nb_requirements_file: env.append(("NB_REQUIREMENTS_FILE", self._nb_requirements_file)) @@ -77,11 +90,13 @@ def get_build_env(self): env.append(("KERNEL_PYTHON_PREFIX", "${NB_PYTHON_PREFIX}")) return env + @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() def get_path(self): """Return paths (including conda environment path) to be added to the PATH environment variable. @@ -89,13 +104,14 @@ def get_path(self): """ path = super().get_path() path.insert(0, "${CONDA_DIR}/bin") - if self.py2: + if self.separate_kernel_env: path.insert(0, "${KERNEL_PYTHON_PREFIX}/bin") path.insert(0, "${NB_PYTHON_PREFIX}/bin") # This is at the end of $PATH, for backwards compat reasons path.append("${NPM_DIR}/bin") return path + @lru_cache() def get_build_scripts(self): """ Return series of build-steps common to all Python 3 repositories. @@ -111,7 +127,6 @@ def get_build_scripts(self): - a frozen base set of requirements, including: - support for Jupyter widgets - support for JupyterLab - - support for nteract """ return super().get_build_scripts() + [ @@ -132,8 +147,9 @@ def get_build_scripts(self): ), ] - major_pythons = {"2": "2.7", "3": "3.7"} + major_pythons = {"2": "2.7", "3": "3.10"} + @lru_cache() def get_build_script_files(self): """ Dict of files to be copied to the container image for use in building. @@ -154,36 +170,54 @@ def get_build_script_files(self): "conda/activate-conda.sh": "/etc/profile.d/activate-conda.sh", } py_version = self.python_version + if not py_version or len(py_version.split(".")) != 2: + raise ValueError( + f"{self.__class__.__name__}.python_version must always be specified as 'x.y', e.g. '3.10', got {py_version}." + ) self.log.info(f"Building conda environment for python={py_version}\n") # Select the frozen base environment based on Python version. # avoids expensive and possibly conflicting upgrades when changing # major Python versions during upgrade. - # If no version is specified or no matching X.Y version is found, - # the default base environment is used. - frozen_name = "environment.lock" - pip_frozen_name = "requirements.txt" - if py_version: - if self.python_version == "2.7": - # python 2 goes in a different env + conda_platform = self._conda_platform() + + if self.separate_kernel_env: + # setup kernel environment (separate from server) + # server runs with default env + server_py_version = self.major_pythons["3"] + self.log.warning( + f"User-requested packages for legacy Python version {py_version} will be installed in a separate kernel environment in $KERNEL_PYTHON_PREFIX.\n" + f"Jupyter Server will run with {server_py_version} in $NB_PYTHON_PREFIX.\n" + ) + lockfile_name = f"environment.py-{py_version}-{conda_platform}.lock" + if not os.path.exists(os.path.join(HERE, lockfile_name)): + raise ValueError( + f"Python version {py_version} on {conda_platform} is not supported!" + ) + files[ + f"conda/{lockfile_name}" + ] = self._kernel_environment_file = "/tmp/env/kernel-environment.lock" + + requirements_file_name = f"requirements.py-{py_version}.pip" + if os.path.exists(os.path.join(HERE, requirements_file_name)): files[ - "conda/environment.py-2.7.lock" - ] = self._kernel_environment_file = "/tmp/env/kernel-environment.lock" - # additional pip requirements for kernel env - if os.path.exists(os.path.join(HERE, "requirements.py-2.7.txt")): - files[ - "conda/requirements.py-2.7.txt" - ] = ( - self._kernel_requirements_file - ) = "/tmp/env/kernel-requirements.txt" - else: - py_frozen_name = f"environment.py-{py_version}.lock" - if os.path.exists(os.path.join(HERE, py_frozen_name)): - frozen_name = py_frozen_name - pip_frozen_name = f"requirements.py-{py_version}.pip" - else: - raise ValueError(f"Python version {py_version} is not supported!") + f"conda/{requirements_file_name}" + ] = self._kernel_requirements_file = "/tmp/env/kernel-requirements.txt" + else: + # server and kernel are the same + server_py_version = py_version + + # setup the server Python environment + conda_frozen_name = f"environment.py-{server_py_version}-{conda_platform}.lock" + pip_frozen_name = f"requirements.py-{server_py_version}.pip" + + if not os.path.exists(os.path.join(HERE, conda_frozen_name)): + # no env, not supported + raise ValueError( + f"Python version {server_py_version} on {conda_platform} is not supported!" + ) + files[ - "conda/" + frozen_name + "conda/" + conda_frozen_name ] = self._nb_environment_file = "/tmp/env/environment.lock" # add requirements.txt, if present @@ -243,8 +277,9 @@ def _should_preassemble_env(self): def python_version(self): """Detect the Python version for a given `environment.yml` - Will return 'x.y' if version is found (e.g '3.6'), - or a Falsy empty string '' if not found. + Will always return an `x.y` version. + If no version is found, the default Python version is used, + via self.major_pythons['3']. Version information below the minor level is dropped. """ @@ -262,13 +297,17 @@ def python_version(self): # extract major.minor if py_version: - if len(py_version) == 1: - self._python_version = self.major_pythons.get(py_version[0]) + py_version_info = py_version.split(".") + if len(py_version_info) == 1: + self._python_version = self.major_pythons[py_version_info[0]] else: # return major.minor - self._python_version = ".".join(py_version.split(".")[:2]) + self._python_version = ".".join(py_version_info[:2]) else: - self._python_version = "" + self._python_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." + ) return self._python_version @@ -315,8 +354,27 @@ def uses_r(self): @property def py2(self): """Am I building a Python 2 kernel environment?""" + warnings.warn( + "CondaBuildPack.py2 is deprecated in 2023.2. Use CondaBuildPack.separate_kernel_env.", + DeprecationWarning, + stacklevel=2, + ) return self.python_version and self.python_version.split(".")[0] == "2" + # Python versions _older_ than this get a separate kernel env + kernel_env_cutoff_version = "3.7" + + @property + def separate_kernel_env(self): + """Whether the kernel should be installed into a separate env from the server + + Applies to older versions of Python that aren't kept up-to-date + """ + return self.python_version and V(self.python_version) < V( + self.kernel_env_cutoff_version + ) + + @lru_cache() def get_preassemble_script_files(self): """preassembly only requires environment.yml @@ -330,26 +388,29 @@ def get_preassemble_script_files(self): assemble_files[environment_yml] = environment_yml 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.py2 else "${NB_PYTHON_PREFIX}" + 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}", - r""" + rf""" TIMEFORMAT='time: %3R' \ - bash -c 'time ${{MAMBA_EXE}} env update -p {0} --file "{1}" && \ + bash -c 'time ${{MAMBA_EXE}} env update -p {env_prefix} --file "{environment_yml}" && \ time ${{MAMBA_EXE}} clean --all -f -y && \ - ${{MAMBA_EXE}} list -p {0} \ + ${{MAMBA_EXE}} list -p {env_prefix} \ ' - """.format( - env_prefix, environment_yml - ), + """, ) ) @@ -361,46 +422,47 @@ def get_env_scripts(self): scripts.append( ( "${NB_USER}", - r""" - ${{MAMBA_EXE}} install -p {0} r-base{1} r-irkernel r-devtools -y && \ + rf""" + ${{MAMBA_EXE}} install -p {env_prefix} r-base{r_pin} r-irkernel r-devtools -y && \ ${{MAMBA_EXE}} clean --all -f -y && \ - ${{MAMBA_EXE}} list -p {0} - """.format( - env_prefix, r_pin - ), + ${{MAMBA_EXE}} list -p {env_prefix} + """, ) ) + if self.platform != "linux/amd64": + raise RuntimeError( + f"RStudio is only available for linux/amd64 ({self.platform})" + ) scripts += rstudio_base_scripts(self.r_version) scripts += [ ( "root", - r""" + rf""" echo auth-none=1 >> /etc/rstudio/rserver.conf && \ echo auth-minimum-user-id=0 >> /etc/rstudio/rserver.conf && \ - echo "rsession-which-r={0}/bin/R" >> /etc/rstudio/rserver.conf && \ + echo "rsession-which-r={env_prefix}/bin/R" >> /etc/rstudio/rserver.conf && \ + echo "rsession-ld-library-path={env_prefix}/lib" >> /etc/rstudio/rserver.conf && \ echo www-frame-origin=same >> /etc/rstudio/rserver.conf - """.format( - env_prefix - ), + """, ), ( "${NB_USER}", # Register the jupyter kernel - r""" - R --quiet -e "IRkernel::installspec(prefix='{0}')" - """.format( - env_prefix - ), + rf""" + R --quiet -e "IRkernel::installspec(prefix='{env_prefix}')" + """, ), ] return scripts + @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() def get_assemble_scripts(self): scripts = super().get_assemble_scripts() if not self._should_preassemble_env: diff --git a/repo2docker/buildpacks/conda/environment.lock b/repo2docker/buildpacks/conda/environment.lock deleted file mode 100644 index a1fe2ebbb..000000000 --- a/repo2docker/buildpacks/conda/environment.lock +++ /dev/null @@ -1,150 +0,0 @@ -# AUTO GENERATED FROM environment.py-3.7.yml, DO NOT MANUALLY MODIFY -# Frozen on 2022-10-13 14:39:03 UTC -# Generated by conda-lock. -# platform: linux-64 -# input_hash: f39cf3a86cdaeb58bee45974ccbdaf3fb51ad41f0bb6f3caf9340c5aad0dfa3b -@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-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-ha770c72_0.tar.bz2#f17322ae18898607521b3fa90df84235 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab -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-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -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/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -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/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 -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/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_4.tar.bz2#995cc7813221edbc25a3db15357599a0 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-16.17.1-h96d913c_0.tar.bz2#fcbc226cf8fe316f6a31bb031eeb975b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 -https://conda.anaconda.org/conda-forge/linux-64/python-3.7.12-hb7a2778_100_cpython.tar.bz2#2d94b3e6a9fdaf83f6955d008c8011a7 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -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/flit-core-3.7.1-pyhd8ed1ab_0.tar.bz2#f93822cba5c20161560661988a88f2c0 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.3-pyhd8ed1ab_0.tar.bz2#395233d17d26296e12354344a8c4673b -https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b -https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 -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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 -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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.14.1-pyhd8ed1ab_0.tar.bz2#b7fa7d86530b8de805268e48988eb483 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.5.0-pyhd8ed1ab_0.tar.bz2#69d30a4c1dfc083548b380d0ba261ea4 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 -https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-2_cp37m.tar.bz2#afff88bf9a7048da740c70aeb8cdbb82 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.4-pyhd8ed1ab_0.tar.bz2#fc0dcaf9761d042fb8ac9128ce03fddb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae -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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.4.0-pyhd8ed1ab_0.tar.bz2#ad0d721e61d0679d78902597b338a33b -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.4.1-pyhd8ed1ab_0.tar.bz2#f3b20ec2c97bad7104679b1d62eb7a11 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.3-pyhd8ed1ab_0.tar.bz2#e9a70e82e24a455386e4f2321b0ab18e -https://conda.anaconda.org/conda-forge/noarch/zipp-3.9.0-pyhd8ed1ab_0.tar.bz2#6f3fd8c9e0ab504010fb4216d5919c24 -https://conda.anaconda.org/conda-forge/noarch/anyio-3.6.1-pyhd8ed1ab_1.tar.bz2#d65ef75084f8adbadb696dfd91148e79 -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py37h43b0acd_0.tar.bz2#6c1ca1eafc80bf7b77b416cfa47f1747 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py37hd23a5d3_0.tar.bz2#004724940367fa84ec1d0732c8b27c18 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py37hd23a5d3_0.tar.bz2#426c53c95df106039da865c0095e2a65 -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py37h89c1867_0.tar.bz2#71107630527e4bd82932952351231efe -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.0-pyhd8ed1ab_0.tar.bz2#eb521efe7f5550de7573bc1629b74a05 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.1-pyhd8ed1ab_2.tar.bz2#0e613217e78777045199372a2b0d5bd2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py37h89c1867_0.tar.bz2#6d184401b7a49bbebbfedc96bc7add1c -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py37h540881e_1.tar.bz2#a9123517674ab0589d955a5adbf58573 -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py37h540881e_0.tar.bz2#0d82327667a5ac77a8a9a0039fcf427c -https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.45.1-py37haaec8a5_2.tar.bz2#c1e22dad62e777e71ad7d73aeda9ecd3 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py37h540881e_1.tar.bz2#8e25160800dafbc2a24c0aaa99a981ef -https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_5.tar.bz2#8c4b0563f96363ee99f1ab864616ac63 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py37h0c0c2a8_0.tar.bz2#732c98a38c84984262940c868793ebb4 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.6-py37h540881e_1.tar.bz2#f3c703ac09e7810d6c9baec89e901fb5 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.1.1-pyhd8ed1ab_0.tar.bz2#5d280406501e79dc7aa9c9ac31d25a80 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py37h540881e_0.tar.bz2#2f0863ba6b29d1d2872b064dd697a492 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py37h540881e_2.tar.bz2#ff22fac37e988bed992b1f437e05906a -https://conda.anaconda.org/conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h540881e_1004.tar.bz2#2703cec0c296bad200deecfe132db0fa -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py37h38fbfac_0.tar.bz2#483a28d832f9e514d48cb26b6e67f29f -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.16.0-pyhd8ed1ab_0.tar.bz2#f39774717a77d98673ea29d28a586a84 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.2-pyhd8ed1ab_0.tar.bz2#8861f3816cd0e94029b539459d46a26c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 -https://conda.anaconda.org/conda-forge/noarch/mako-1.2.3-pyhd8ed1ab_0.tar.bz2#f19bdf719a181766edd09cbc08616868 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py37h540881e_1.tar.bz2#6232de79d3fe4aaa00f5f34d3da55c2a -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.41-py37h540881e_0.tar.bz2#dddd13b27ae2e927a76227b227417f5a -https://conda.anaconda.org/conda-forge/noarch/terminado-0.16.0-pyh41d4057_0.tar.bz2#e9a841f6e782edd1104211dbf8f4cfa9 -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee -https://conda.anaconda.org/conda-forge/noarch/alembic-1.8.1-pyhd8ed1ab_0.tar.bz2#bdde76f5d65a9374d07aa3dfa27571e0 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e -https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.7.0-pyhd8ed1ab_0.tar.bz2#f8439ce65664bec6d348346590ed57f0 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.1-pyhd8ed1ab_0.tar.bz2#0059a49c6f1410aab3c3b5572feb1a41 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.31-pyha770c72_0.tar.bz2#94fee21afe199936bc361608e537cd11 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e -https://conda.anaconda.org/conda-forge/linux-64/ipython-7.33.0-py37h89c1867_0.tar.bz2#e4841787deb237aad17b2d44a2d32c23 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.0-pyh210e3f2_0.tar.bz2#6a07cee9d25338f0b638576f6b476bf7 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.2.1-pyhd8ed1ab_0.tar.bz2#d74acbae5ea45838dec52f2ef7ce205b -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.21.0-pyhd8ed1ab_0.tar.bz2#81f31b184703349ea7280c49ca4b5b4e -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.5.0-py37h89c1867_1.tar.bz2#378c6f588fec669ce34ba77d60be2e50 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.2.1-pyhd8ed1ab_0.tar.bz2#e9e621cf9915b7d21befcec195274377 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.15.2-pyhd8ed1ab_0.tar.bz2#9672ffc62b53259a88bf1880a39bd774 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.2.1-pyhd8ed1ab_0.tar.bz2#8e12f153954596420bab7cdeeabb3f15 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.1.0-pyhd8ed1ab_0.tar.bz2#3a8e2c7dcc674f2cb0784f1faba57055 -https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.4.6-pyhd8ed1ab_0.tar.bz2#892f2bf64c1493356b848d31beab2e7d -https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-singleuser-1.5.0-py37h89c1867_1.tar.bz2#eb216c4866e66ddebfd0685c2ecd1702 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 -https://conda.anaconda.org/conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a diff --git a/repo2docker/buildpacks/conda/environment.py-2.7.lock b/repo2docker/buildpacks/conda/environment.py-2.7-linux-64.lock similarity index 100% rename from repo2docker/buildpacks/conda/environment.py-2.7.lock rename to repo2docker/buildpacks/conda/environment.py-2.7-linux-64.lock diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock new file mode 100644 index 000000000..8b535800e --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-64.lock @@ -0,0 +1,167 @@ +# AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:35:19 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 5e20d8617672faf1f048550dc6ffdcf6288c12f1faf23a9051314056a752d9f3 +@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-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +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-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +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/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-h32600fe_2.conda#326f46f36d15c44cff5f81d505cb717f +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.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-18.15.0-h4abf6b9_1.conda#2aabafd88f6876a57c45c00598715ac4 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.11-he550d4f_0_cpython.conda#7439c9d24378a82b73a7a53868dacdf1 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.7-py310heca2aa9_0.conda#8ffb020d2b722c962f0b4f06a304f533 +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-2.0.2-py310hc6cd4ac_1.conda#934c4eb3214284125eff6dd665e9568a +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py310h1fa729e_0.conda#b0f0a014fc04012c05f39df15fe270ce +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.19.3-py310h1fa729e_0.conda#f732bec05ecc2e302a868d971ae484e0 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.0-py310h5bbb5d0_0.conda#58017b4bb8fec6088a8b9ae44744ce4b +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/ruamel.yaml.clib-0.2.7-py310h1fa729e_1.conda#2f9b517412af46255cef5e53a22c264e +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py310h2372a71_0.conda#1c510e74c87dc9b8fe1f7f9e8dbcef96 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-64/y-py-0.5.9-py310h4426083_0.conda#0b3145258baa17d4405c3800a308da99 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py310h2372a71_0.conda#41e89112e1ec653fb3e62240d06a0e61 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310h5764c6d_3.tar.bz2#12f70cd23e4ea88f913dba50b0f0aba0 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py310h75e40e8_0.conda#bd5501a8ae0df5ef36b9ed03035ebe3a +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.15-py310h2372a71_0.conda#90322c707f2ad4eebb8438408b1ffa4e +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.0-py310hff52083_0.conda#49428e10aae69baa6b34cb7e275f1ae9 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock new file mode 100644 index 000000000..6b4ac0872 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.10-linux-aarch64.lock @@ -0,0 +1,166 @@ +# AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:35:28 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: 7a3b6ccd5cc4c46c5c27bc51fac5e59c8c8b8aaa9b4d195de4726cb671e6bce0 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2023.5.7-hcefe29a_0.conda#331e624442b88d96bc05a7f2d38c61a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.1.0-h2b4548d_0.conda#eb95b60cbf85783b0fdd3fab2d8c320f +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.1.0-h452befe_0.conda#572f5798bb3d4cc79650f0ca3149aeaa +https://conda.anaconda.org/conda-forge/linux-aarch64/pandoc-2.19.2-h8af1aa0_2.conda#210300d4fbbc7935c22d0e5281665dd4 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-3_cp310.conda#7f4f00b03d3a7c4d4b8b987e5da461a9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +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-ng-13.1.0-h2b4548d_0.conda#02619409d02932e28d694144b509597d +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-hf897c2e_4.tar.bz2#2d787570a729e273a4e75775ddf3348a +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-72.1-hcf00150_0.conda#cd394213b2f8c9c9060a293a8508fe84 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.0.9-h4e544f5_8.tar.bz2#3cedc3935cfaa2a5303daa25fb12cb1d +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.0-hf897c2e_0.tar.bz2#36fdbc05c9d9145ece86f5a63c3f352e +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/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.44.2-h4e544f5_0.tar.bz2#58b9dbd5d4bd100e278c3d7e1976f566 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h4e544f5_4.tar.bz2#88596b6277fe6d39f046983aae6044db +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4-h2e1726e_0.conda#40beaf447150c2760affc591c7509595 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.1.1-h31becfc_1.conda#a8e811c3390d93e5db0cef68e52f349f +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/libbrotlidec-1.0.9-h4e544f5_8.tar.bz2#319956380b383ec9f6a46d585599c028 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.0.9-h4e544f5_8.tar.bz2#56a0a025208af24e2b43b2bbeee79802 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.42.0-h194ca79_0.conda#5fc895d5063af554f24a7eb69faff054 +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.12-hd8af866_0.tar.bz2#7894e82ff743bd96c76585ddebe28e2a +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.4-h01db608_1.tar.bz2#dd56c9ce3f1f689a5e71941830349279 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h4e544f5_4.tar.bz2#dc8395f4a79bb0b13ca7d855c72482d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2#0980429a0148a53edd0f1f207ec28a39 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-18.15.0-hcab9400_1.conda#6eb6bbe830779c71d36a0b595acd439b +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.11-ha43d526_0_cpython.conda#fbbabb7b3b0fc5707f653e821498d00a +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2#259d82bd990ba225508389509634b157 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.6.7-py310hbc44c02_0.conda#c1165f6a0ddad580f0c5918e67208cfa +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-2.0.2-py310hbb3657e_1.conda#54eb2c5caa2aa39c9f9b9f8bdf2a4821 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.3-py310h7c1f4a2_0.conda#283f7bdd35380e2f693f444e0526ce22 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.5-py310hb89b984_0.conda#ba62561457cdef7e44ae5a0a359953c7 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-aarch64/pyrsistent-0.19.3-py310h734f5e8_0.conda#07d93aae0c8d3dedb892b67c9f534587 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0-py310h761cc84_5.tar.bz2#5aa98f4974dd17d4b8f146beefb4ab87 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-25.1.0-py310hdaec954_0.conda#37f5e8257ef09c4ee68417e3623dfcf7 +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/ruamel.yaml.clib-0.2.7-py310hb89b984_1.conda#89972c78c36ed3261c22bde7c012be03 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py310h7c1f4a2_0.conda#5d98596b1c2d64287e279c3d9c76d98d +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-aarch64/y-py-0.5.9-py310hf87a4cc_0.conda#5ae43d6a9a31426a8c50d4cdcd4a0cda +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py310hf0c4615_3.conda#a2bedcb1d205485ea32fe5d2bd6fd970 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py310hb299538_0.conda#6e814256f6910bc00e2b4e4e93947547 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py310h761cc84_3.tar.bz2#bba0e5198226ac75f17857b43483d054 +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-41.0.1-py310h34e2850_0.conda#25677f2d4f406d68696049841f05308f +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.15-py310h7c1f4a2_0.conda#5c94ab2b95e8dcbd3ceac6ac2c9e23c1 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.3.0-py310h4c7bcd0_0.conda#8275cc06efed4e909337d539de2e4251 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.10.lock b/repo2docker/buildpacks/conda/environment.py-3.10.lock deleted file mode 100644 index ff64a34a6..000000000 --- a/repo2docker/buildpacks/conda/environment.py-3.10.lock +++ /dev/null @@ -1,156 +0,0 @@ -# AUTO GENERATED FROM environment.py-3.10.yml, DO NOT MANUALLY MODIFY -# Frozen on 2022-10-13 14:39:58 UTC -# Generated by conda-lock. -# platform: linux-64 -# input_hash: 64c9dcb0ab6e1e70f0b3695ec95ddb9d269f1442f5172e7995f643aee3e9226b -@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-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-ha770c72_0.tar.bz2#f17322ae18898607521b3fa90df84235 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2022e-h191b570_0.tar.bz2#b6bd89cf71494c41a181cac13cc5a8ea -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab -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-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -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/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -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/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 -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/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_4.tar.bz2#995cc7813221edbc25a3db15357599a0 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-16.17.1-h96d913c_0.tar.bz2#fcbc226cf8fe316f6a31bb031eeb975b -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.6-h582c2e5_0_cpython.tar.bz2#6f009f92084e84884d1dff862b85eb00 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -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/executing-1.1.1-pyhd8ed1ab_0.tar.bz2#1ed759c44597c5e189625017f5875cbc -https://conda.anaconda.org/conda-forge/noarch/flit-core-3.7.1-pyhd8ed1ab_0.tar.bz2#f93822cba5c20161560661988a88f2c0 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.3-pyhd8ed1ab_0.tar.bz2#395233d17d26296e12354344a8c4673b -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 -https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b -https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 -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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 -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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.14.1-pyhd8ed1ab_0.tar.bz2#b7fa7d86530b8de805268e48988eb483 -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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.5.0-pyhd8ed1ab_0.tar.bz2#69d30a4c1dfc083548b380d0ba261ea4 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -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.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 -https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-2_cp310.tar.bz2#9e7160cd0d865e98f6803f1fe15c8b61 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.4-pyhd8ed1ab_0.tar.bz2#fc0dcaf9761d042fb8ac9128ce03fddb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae -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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.4.0-pyhd8ed1ab_0.tar.bz2#ad0d721e61d0679d78902597b338a33b -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.4.1-pyhd8ed1ab_0.tar.bz2#f3b20ec2c97bad7104679b1d62eb7a11 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.3-pyhd8ed1ab_0.tar.bz2#e9a70e82e24a455386e4f2321b0ab18e -https://conda.anaconda.org/conda-forge/noarch/zipp-3.9.0-pyhd8ed1ab_0.tar.bz2#6f3fd8c9e0ab504010fb4216d5919c24 -https://conda.anaconda.org/conda-forge/noarch/anyio-3.6.1-pyhd8ed1ab_1.tar.bz2#d65ef75084f8adbadb696dfd91148e79 -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.0.8-pyhd8ed1ab_0.tar.bz2#4d725d10caaad25d9c31bfb263044fb4 -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_0.tar.bz2#3e4b55b02998782f8ca9ceaaa4f5ada9 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py310hd8f1fbe_0.tar.bz2#c1f8fb014e5713c1d23c69568a8665ad -https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py310hd8f1fbe_0.tar.bz2#bc56f6568390e1195052feb713a6dc2c -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py310hff52083_0.tar.bz2#8ea386e64531f1ecf4a5765181579e7e -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.0-pyhd8ed1ab_0.tar.bz2#eb521efe7f5550de7573bc1629b74a05 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.1-pyhd8ed1ab_2.tar.bz2#0e613217e78777045199372a2b0d5bd2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py310hff52083_0.tar.bz2#e7c04d9bc3f51cc42fa4ba6c70bb3de1 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py310h5764c6d_1.tar.bz2#ec5a727504409ad1380fc2a84f83d002 -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py310h5764c6d_0.tar.bz2#6ac13c26fe4f9d8d6b38657664c37fd3 -https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.45.1-py310h2aed498_2.tar.bz2#0182d747e0dc35a8f925ebc14eec34c5 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py310h5764c6d_1.tar.bz2#d6bf97f14e0cc9d2024cf66b11bb79b8 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py310h330234f_0.tar.bz2#f0c811d312b017e6d9168a6c56c23e9b -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.6-py310h5764c6d_1.tar.bz2#d1041635380788549a925fc30cd5815c -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.1.1-pyhd8ed1ab_0.tar.bz2#5d280406501e79dc7aa9c9ac31d25a80 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py310h5764c6d_0.tar.bz2#c42dcb37acd84b3ca197f03f57ef927d -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310h5764c6d_2.tar.bz2#59ccbc3a344dcf7e2f73e401e205dd7d -https://conda.anaconda.org/conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_1004.tar.bz2#6499bb11b7feffb63b26847fc9181319 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py310h597c629_0.tar.bz2#06d8c591a75ff4ff52e6742bb4d7192f -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.16.0-pyhd8ed1ab_0.tar.bz2#f39774717a77d98673ea29d28a586a84 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.2-pyhd8ed1ab_0.tar.bz2#8861f3816cd0e94029b539459d46a26c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 -https://conda.anaconda.org/conda-forge/noarch/mako-1.2.3-pyhd8ed1ab_0.tar.bz2#f19bdf719a181766edd09cbc08616868 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py310h5764c6d_1.tar.bz2#4fbfd9a04f43ab4e8c5304a5426f45ad -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.41-py310h5764c6d_0.tar.bz2#f644ecd9b5a88c4e4a06fcb6190fbe01 -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.5.1-pyhd8ed1ab_0.tar.bz2#3282a2d79f5f4d25469d71bc851771e3 -https://conda.anaconda.org/conda-forge/noarch/terminado-0.16.0-pyh41d4057_0.tar.bz2#e9a841f6e782edd1104211dbf8f4cfa9 -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee -https://conda.anaconda.org/conda-forge/noarch/alembic-1.8.1-pyhd8ed1ab_0.tar.bz2#bdde76f5d65a9374d07aa3dfa27571e0 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e -https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.7.0-pyhd8ed1ab_0.tar.bz2#f8439ce65664bec6d348346590ed57f0 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.1-pyhd8ed1ab_0.tar.bz2#0059a49c6f1410aab3c3b5572feb1a41 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.31-pyha770c72_0.tar.bz2#94fee21afe199936bc361608e537cd11 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.5.0-pyh41d4057_1.tar.bz2#83600908360af344d9324c3409e0dfea -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.0-pyh210e3f2_0.tar.bz2#6a07cee9d25338f0b638576f6b476bf7 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.2.1-pyhd8ed1ab_0.tar.bz2#d74acbae5ea45838dec52f2ef7ce205b -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.21.0-pyhd8ed1ab_0.tar.bz2#81f31b184703349ea7280c49ca4b5b4e -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.5.0-py310hff52083_1.tar.bz2#3d2e9d7f52b0274fd4f9d608cfb750a5 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.2.1-pyhd8ed1ab_0.tar.bz2#e9e621cf9915b7d21befcec195274377 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.15.2-pyhd8ed1ab_0.tar.bz2#9672ffc62b53259a88bf1880a39bd774 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.2.1-pyhd8ed1ab_0.tar.bz2#8e12f153954596420bab7cdeeabb3f15 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.1.0-pyhd8ed1ab_0.tar.bz2#3a8e2c7dcc674f2cb0784f1faba57055 -https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.4.6-pyhd8ed1ab_0.tar.bz2#892f2bf64c1493356b848d31beab2e7d -https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-singleuser-1.5.0-py310hff52083_1.tar.bz2#1d878f40d50406b5aa51348b3e65525b -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 -https://conda.anaconda.org/conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a diff --git a/repo2docker/buildpacks/conda/environment.py-3.10.yml b/repo2docker/buildpacks/conda/environment.py-3.10.yml index ea3788b29..92e8496f5 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.10.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.10.yml @@ -1,15 +1,15 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2022-10-13 14:39:39 UTC +# Generated on 2023-06-08 09:35:19 UTC channels: - conda-forge dependencies: - python=3.10.* -- nodejs=16 +- nodejs=18 - pip -- ipywidgets==8.0.2 -- jupyter-offlinenotebook==0.2.2 -- jupyter-resource-usage==0.6.3 -- jupyterlab==3.4.8 -- jupyterhub-singleuser==1.5.0 -- notebook==6.4.12 -- nteract_on_jupyter==2.1.3 +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab +- notebook==6.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock new file mode 100644 index 000000000..0f9849e4a --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-64.lock @@ -0,0 +1,168 @@ +# AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:35:47 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 3896c7e12b9461937f193ac022a4426948268f5b348da74e57eeacea703149a4 +@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-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +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-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +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/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-h32600fe_2.conda#326f46f36d15c44cff5f81d505cb717f +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.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-18.15.0-h4abf6b9_1.conda#2aabafd88f6876a57c45c00598715ac4 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.3-h2755cc3_0_cpython.conda#37005ea5f68df6a8a381b70cf4d4a160 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.7-py311hcafe171_0.conda#f4c810ad9d791c8df5ad900ed74b085b +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-2.0.2-py311hb755f60_1.conda#82f9885f18cc7ba9bca6687ac97f1d65 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h2582759_0.conda#a90f8e278c1cd7064b2713e6b7db87e6 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.19.3-py311h2582759_0.conda#e53876b66dcc4ba8a0afa63cd8502ac3 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.0-py311h75c88c4_0.conda#db94a7a9e865fbfde8c023b6e8958bb2 +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/ruamel.yaml.clib-0.2.7-py311h2582759_1.conda#5e997292429a22ad50c11af0a2cb0f08 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py311h459d7ec_0.conda#12b1c374ee90a1aa11ea921858394dc8 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-64/y-py-0.5.9-py311hfe55011_0.conda#216fb67bd1016b05fe33672bd71937a8 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py311h459d7ec_0.conda#f0fc1409f49257fe5ec2d86d0595d9bc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311hd4cff14_3.tar.bz2#5159e874f65ac382773d2b534a1d7b80 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py311h63ff55d_0.conda#69ad01f66b8efff535d341ba5b283c2c +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.15-py311h459d7ec_0.conda#d2199e4c33e24003103845ab9b07469e +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.0-py311h38be061_0.conda#1dd43a18a75d59206019e2a2a28555e5 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock new file mode 100644 index 000000000..7ed265399 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.11-linux-aarch64.lock @@ -0,0 +1,167 @@ +# AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:35:56 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: 48b1543f7aa5619e6fc9b3cea40f39ad6fe0baea0b0cf99f59a22fb075fba4e2 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2023.5.7-hcefe29a_0.conda#331e624442b88d96bc05a7f2d38c61a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.1.0-h2b4548d_0.conda#eb95b60cbf85783b0fdd3fab2d8c320f +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.1.0-h452befe_0.conda#572f5798bb3d4cc79650f0ca3149aeaa +https://conda.anaconda.org/conda-forge/linux-aarch64/pandoc-2.19.2-h8af1aa0_2.conda#210300d4fbbc7935c22d0e5281665dd4 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-3_cp311.conda#8472344eebff39064edd3177a9cfda6d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +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-ng-13.1.0-h2b4548d_0.conda#02619409d02932e28d694144b509597d +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-hf897c2e_4.tar.bz2#2d787570a729e273a4e75775ddf3348a +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-72.1-hcf00150_0.conda#cd394213b2f8c9c9060a293a8508fe84 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.0.9-h4e544f5_8.tar.bz2#3cedc3935cfaa2a5303daa25fb12cb1d +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.5.0-hd600fc2_1.conda#6cd3d0a28437b3845c260f9d71d434d7 +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.0-hf897c2e_0.tar.bz2#36fdbc05c9d9145ece86f5a63c3f352e +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/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.44.2-h4e544f5_0.tar.bz2#58b9dbd5d4bd100e278c3d7e1976f566 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h4e544f5_4.tar.bz2#88596b6277fe6d39f046983aae6044db +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4-h2e1726e_0.conda#40beaf447150c2760affc591c7509595 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.1.1-h31becfc_1.conda#a8e811c3390d93e5db0cef68e52f349f +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/libbrotlidec-1.0.9-h4e544f5_8.tar.bz2#319956380b383ec9f6a46d585599c028 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.0.9-h4e544f5_8.tar.bz2#56a0a025208af24e2b43b2bbeee79802 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.42.0-h194ca79_0.conda#5fc895d5063af554f24a7eb69faff054 +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.12-hd8af866_0.tar.bz2#7894e82ff743bd96c76585ddebe28e2a +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.4-h01db608_1.tar.bz2#dd56c9ce3f1f689a5e71941830349279 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h4e544f5_4.tar.bz2#dc8395f4a79bb0b13ca7d855c72482d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2#0980429a0148a53edd0f1f207ec28a39 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-18.15.0-hcab9400_1.conda#6eb6bbe830779c71d36a0b595acd439b +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.3-h07235ee_0_cpython.conda#c674dc74adf86554b366331c6a882e68 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2#259d82bd990ba225508389509634b157 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.6.7-py311hbb176d9_0.conda#945763141cc252878117632518feb67d +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-2.0.2-py311h8715677_1.conda#79088a28c99bf144b959641fcef485ba +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.3-py311hc8f2f60_0.conda#4872ce256a0e8442c07aa6866ae82642 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.5-py311h1d6c08a_0.conda#da8c6a23ee0f5bf04dc65fab9ba522b3 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-aarch64/pyrsistent-0.19.3-py311h9f62e77_0.conda#800167816e8cf506a6b1ca4e1a7a4cea +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0-py311hdfa8b44_5.tar.bz2#6c09aa2855de7bcabd35f2f46e5a2b4f +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-25.1.0-py311hc83961d_0.conda#32e5fc117cde1fa0ef70f1f24e485b63 +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/ruamel.yaml.clib-0.2.7-py311h1d6c08a_1.conda#ab27bf4e2dc92321211cd2977220a3f0 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py311hc8f2f60_0.conda#354264dc495010935608b98d8da5c461 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-aarch64/y-py-0.5.9-py311h76a8765_0.conda#777ffa85e78c0c96a8692413b429c0a4 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py311h2e7898d_3.conda#b42014f8b60fa9f246931da970d9547b +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py311hcd402e7_0.conda#34c050532ef52e45f92c79907644fbcc +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py311hdfa8b44_3.tar.bz2#f47425a556037cca1335fc253fd39c03 +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-41.0.1-py311hd42d77a_0.conda#c893e800b4530e416a84fa6c22b506d8 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.15-py311hc8f2f60_0.conda#5f0e6d9fc6a99008f7bed47bd7a9855b +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.3.0-py311hec3470c_0.conda#147e72f92aaaae8b342cb31a1286197f +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.11.lock b/repo2docker/buildpacks/conda/environment.py-3.11.lock new file mode 100644 index 000000000..9e7cbfbfe --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.11.lock @@ -0,0 +1,150 @@ +# AUTO GENERATED FROM environment.py-3.11.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-01-02 15:31:26 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 3ceb4508af8a0d0e080c5ad14c3ac306d00b4f32584072dd36dc8886b013bd41 +@EXPLICIT +https://conda.anaconda.org/t//conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/t//conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 +https://conda.anaconda.org/t//conda-forge/linux-64/ld_impl_linux-64-2.39-hcc3a1bd_1.conda#737be0d34c22d24432049ab7a3214de4 +https://conda.anaconda.org/t//conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 +https://conda.anaconda.org/t//conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/t//conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 +https://conda.anaconda.org/t//conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 +https://conda.anaconda.org/t//conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/t//conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 +https://conda.anaconda.org/t//conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/t//conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed +https://conda.anaconda.org/t//conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/t//conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/t//conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/t//conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/t//conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/t//conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/t//conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 +https://conda.anaconda.org/t//conda-forge/linux-64/openssl-3.0.7-h0b41bf4_1.conda#7adaac6ff98219bcb99b45e408b80f4e +https://conda.anaconda.org/t//conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/t//conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f +https://conda.anaconda.org/t//conda-forge/linux-64/pandoc-2.19.2-h32600fe_1.tar.bz2#35a82883468c85ac8bf41f083c1933cf +https://conda.anaconda.org/t//conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/t//conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/t//conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/t//conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/t//conda-forge/linux-64/nodejs-16.17.1-h8839609_0.tar.bz2#1a19c5a76422549640a6824d6db189cf +https://conda.anaconda.org/t//conda-forge/linux-64/python-3.11.0-ha86cf86_0_cpython.tar.bz2#531b2b97ce96cc95a587bdf7c74e31c0 +https://conda.anaconda.org/t//conda-forge/noarch/_ipython_minor_entry_point-8.7.0-h0c17e10_0.conda#8a63fb4d63db7b245ecf3c6f907935ff +https://conda.anaconda.org/t//conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/t//conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 +https://conda.anaconda.org/t//conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/t//conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/t//conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 +https://conda.anaconda.org/t//conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 +https://conda.anaconda.org/t//conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/t//conda-forge/linux-64/debugpy-1.6.4-py311ha362b79_0.conda#7cfc802c1a673662f49cdb76de669b39 +https://conda.anaconda.org/t//conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/t//conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/t//conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d +https://conda.anaconda.org/t//conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/t//conda-forge/noarch/flit-core-3.8.0-pyhd8ed1ab_0.tar.bz2#6d5e56de2e65da7aa35fd10131226efa +https://conda.anaconda.org/t//conda-forge/linux-64/greenlet-2.0.1-py311ha362b79_0.tar.bz2#7adf8b182f4fd2cd313349bce924afdd +https://conda.anaconda.org/t//conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/t//conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/t//conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/t//conda-forge/noarch/jupyterlab_widgets-3.0.5-pyhd8ed1ab_0.conda#953a312b272f37d39fe9d09f46734622 +https://conda.anaconda.org/t//conda-forge/linux-64/markupsafe-2.1.1-py311hd4cff14_2.tar.bz2#6b0d96114b4a841630ef7d0dff10d4e8 +https://conda.anaconda.org/t//conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a +https://conda.anaconda.org/t//conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/t//conda-forge/noarch/packaging-22.0-pyhd8ed1ab_0.conda#0e8e1bd93998978fc3125522266d12db +https://conda.anaconda.org/t//conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +https://conda.anaconda.org/t//conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/t//conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +https://conda.anaconda.org/t//conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/t//conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/t//conda-forge/noarch/prometheus_client-0.15.0-pyhd8ed1ab_0.tar.bz2#b260ed41427dbbe70537b3030c643b2e +https://conda.anaconda.org/t//conda-forge/linux-64/psutil-5.9.4-py311hd4cff14_0.tar.bz2#6fbda857a56adb4140bed339fbe0b801 +https://conda.anaconda.org/t//conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/t//conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/t//conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/t//conda-forge/noarch/pyjwt-2.6.0-pyhd8ed1ab_0.tar.bz2#56d08bbebf5b3719ca2b1688fcfd98a4 +https://conda.anaconda.org/t//conda-forge/linux-64/pyrsistent-0.19.2-py311hd4cff14_0.tar.bz2#e6808d85cbd28e4fb2d61294627fa1b1 +https://conda.anaconda.org/t//conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/t//conda-forge/noarch/python-fastjsonschema-2.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 +https://conda.anaconda.org/t//conda-forge/noarch/python-json-logger-2.0.4-pyhd8ed1ab_0.conda#6d1f4215f123c18aed06fb4104bcb11a +https://conda.anaconda.org/t//conda-forge/noarch/pytz-2022.7-pyhd8ed1ab_0.conda#c8d7e34ca76d6ecc03b84bedfd99d689 +https://conda.anaconda.org/t//conda-forge/linux-64/pyzmq-24.0.1-py311ha4b6469_1.tar.bz2#7d57a4cdfa05e444ed955b0319b97eed +https://conda.anaconda.org/t//conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h2582759_1.conda#5e997292429a22ad50c11af0a2cb0f08 +https://conda.anaconda.org/t//conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c +https://conda.anaconda.org/t//conda-forge/noarch/setuptools-65.6.3-pyhd8ed1ab_0.conda#9600fc9524d3f821e6a6d58c52f5bf5a +https://conda.anaconda.org/t//conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/t//conda-forge/noarch/sniffio-1.3.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/t//conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +https://conda.anaconda.org/t//conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/t//conda-forge/linux-64/tornado-6.2-py311hd4cff14_1.tar.bz2#4d86cd6dbdc1185f4e72d974f1f1f852 +https://conda.anaconda.org/t//conda-forge/noarch/traitlets-5.8.0-pyhd8ed1ab_0.conda#75fa7ac3992a41e6a06102594bbf67d0 +https://conda.anaconda.org/t//conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a +https://conda.anaconda.org/t//conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/t//conda-forge/noarch/websocket-client-1.4.2-pyhd8ed1ab_0.tar.bz2#5309fca1777cfdd2d7ab582edb8cc41a +https://conda.anaconda.org/t//conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 +https://conda.anaconda.org/t//conda-forge/noarch/widgetsnbextension-4.0.5-pyhd8ed1ab_0.conda#2af53b3894fb9bdbb3679c0d31028b1b +https://conda.anaconda.org/t//conda-forge/noarch/zipp-3.11.0-pyhd8ed1ab_0.conda#09b5b885341697137879a4f039a9e5a1 +https://conda.anaconda.org/t//conda-forge/noarch/anyio-3.6.2-pyhd8ed1ab_0.tar.bz2#8ada050fa88f26916fc1e76e368a49fd +https://conda.anaconda.org/t//conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/t//conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2#2ea70fde8d581ba9425a761609eed6ba +https://conda.anaconda.org/t//conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/t//conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d +https://conda.anaconda.org/t//conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 +https://conda.anaconda.org/t//conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce +https://conda.anaconda.org/t//conda-forge/noarch/comm-0.1.2-pyhd8ed1ab_0.conda#3c78af4752bb1600ebe5e83ef4588eaa +https://conda.anaconda.org/t//conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda#691644becbcdca9f73243450b1c63e62 +https://conda.anaconda.org/t//conda-forge/noarch/importlib_resources-5.10.1-pyhd8ed1ab_1.conda#5b48ca365913b08b819884bc21d4fb56 +https://conda.anaconda.org/t//conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/t//conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/t//conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/t//conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/t//conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d +https://conda.anaconda.org/t//conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed +https://conda.anaconda.org/t//conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/t//conda-forge/linux-64/ruamel.yaml-0.17.21-py311hd4cff14_2.tar.bz2#1e3fa73ad16d9c64e8e3421861a49ec0 +https://conda.anaconda.org/t//conda-forge/linux-64/sqlalchemy-1.4.45-py311h2582759_0.conda#c8452b47661df1285d72803934abc594 +https://conda.anaconda.org/t//conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/t//conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/t//conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2#be969210b61b897775a0de63cd9e9026 +https://conda.anaconda.org/t//conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311hd4cff14_3.tar.bz2#5159e874f65ac382773d2b534a1d7b80 +https://conda.anaconda.org/t//conda-forge/linux-64/brotlipy-0.7.0-py311hd4cff14_1005.tar.bz2#9bdac7084ecfc08338bae1b976535724 +https://conda.anaconda.org/t//conda-forge/linux-64/cryptography-38.0.4-py311h42a1071_0.conda#34c95722eb879d7a9ee0546671084b2d +https://conda.anaconda.org/t//conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/t//conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/t//conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/t//conda-forge/noarch/platformdirs-2.6.2-pyhd8ed1ab_0.conda#0b4cc3f8181b0d8446eb5387d7848a54 +https://conda.anaconda.org/t//conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/t//conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee +https://conda.anaconda.org/t//conda-forge/noarch/alembic-1.9.1-pyhd8ed1ab_0.conda#5519188d282629ce4fef73eb87285cbe +https://conda.anaconda.org/t//conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/t//conda-forge/linux-64/jupyter_core-5.1.1-py311h38be061_0.conda#7a8cea41b480b295e083a39076342ca1 +https://conda.anaconda.org/t//conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/t//conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/t//conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda#4d79ec192e0bfd530a254006d123b9a6 +https://conda.anaconda.org/t//conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/t//conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/t//conda-forge/noarch/ipython-8.7.0-pyh41d4057_0.conda#adc2f96edf35423c091dba93b642573a +https://conda.anaconda.org/t//conda-forge/noarch/jupyter_client-7.4.8-pyhd8ed1ab_0.conda#bd4951aa5fbf3336a249e25c90f50333 +https://conda.anaconda.org/t//conda-forge/noarch/nbformat-5.7.1-pyhd8ed1ab_0.conda#facb42913140f1a399a5ebb65b30915e +https://conda.anaconda.org/t//conda-forge/noarch/urllib3-1.26.13-pyhd8ed1ab_0.conda#3078ef2359efd6ecadbc7e085c5e0592 +https://conda.anaconda.org/t//conda-forge/noarch/ipykernel-6.19.4-pyh210e3f2_0.conda#65372b6dd819e2c36345cf91eeb4ff06 +https://conda.anaconda.org/t//conda-forge/noarch/nbclient-0.7.2-pyhd8ed1ab_0.conda#6c7b0d75b66a220274bb5a28c23197f2 +https://conda.anaconda.org/t//conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 +https://conda.anaconda.org/t//conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 +https://conda.anaconda.org/t//conda-forge/noarch/jupyterhub-base-3.1.0-pyh2a2186d_0.conda#ca96c2cd4d1aaa98d9098d775e5012cb +https://conda.anaconda.org/t//conda-forge/noarch/nbconvert-core-7.2.7-pyhd8ed1ab_0.conda#dce063b1f5d6193646fc2ac43f88b77f +https://conda.anaconda.org/t//conda-forge/noarch/jupyter_server-1.23.4-pyhd8ed1ab_0.conda#35b7e9267926e864cc70ce137e6588ca +https://conda.anaconda.org/t//conda-forge/noarch/nbconvert-pandoc-7.2.7-pyhd8ed1ab_0.conda#7d48776bb3fdfa6447267c413a480ccd +https://conda.anaconda.org/t//conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e +https://conda.anaconda.org/t//conda-forge/noarch/jupyterlab_server-2.17.0-pyhd8ed1ab_0.conda#68364b266a989bb9829943bfd33187d8 +https://conda.anaconda.org/t//conda-forge/noarch/nbconvert-7.2.7-pyhd8ed1ab_0.conda#b019fe41e6f6b88e0557532514f39cff +https://conda.anaconda.org/t//conda-forge/noarch/notebook-shim-0.2.2-pyhd8ed1ab_0.tar.bz2#40be846cd4e78672a40e43db9dae753c +https://conda.anaconda.org/t//conda-forge/noarch/nbclassic-0.4.8-pyhd8ed1ab_0.tar.bz2#f4f150f83ed90a1b833e6081bbf38257 +https://conda.anaconda.org/t//conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad +https://conda.anaconda.org/t//conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/t//conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 +https://conda.anaconda.org/t//conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a +https://conda.anaconda.org/t//conda-forge/noarch/jupyterhub-singleuser-3.1.0-pyh2a2186d_0.conda#7607cbc55a1bc12bc9c78ce827c7bb8e diff --git a/repo2docker/buildpacks/conda/environment.py-3.11.yml b/repo2docker/buildpacks/conda/environment.py-3.11.yml new file mode 100644 index 000000000..c537c8a49 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.11.yml @@ -0,0 +1,15 @@ +# AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY +# Generated on 2023-06-08 09:35:47 UTC +channels: +- conda-forge +dependencies: +- python=3.11.* +- nodejs=18 +- pip +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab +- notebook==6.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/environment.py-3.5.lock b/repo2docker/buildpacks/conda/environment.py-3.5-linux-64.lock similarity index 100% rename from repo2docker/buildpacks/conda/environment.py-3.5.lock rename to repo2docker/buildpacks/conda/environment.py-3.5-linux-64.lock diff --git a/repo2docker/buildpacks/conda/environment.py-3.6.lock b/repo2docker/buildpacks/conda/environment.py-3.6-linux-64.lock similarity index 100% rename from repo2docker/buildpacks/conda/environment.py-3.6.lock rename to repo2docker/buildpacks/conda/environment.py-3.6-linux-64.lock diff --git a/repo2docker/buildpacks/conda/environment.py-3.7-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.7-linux-64.lock new file mode 100644 index 000000000..8bbd0c7d3 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.7-linux-64.lock @@ -0,0 +1,158 @@ +# AUTO GENERATED FROM environment.py-3.7.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:33:53 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 2339ad954e3f369212967cce974e168db8116914593597b2d8fe8742b677dd60 +@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-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-3_cp37m.conda#46277e9cf1ecd46926a31cea47079009 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +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-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +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/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-h32600fe_2.conda#326f46f36d15c44cff5f81d505cb717f +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.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-18.15.0-h4abf6b9_1.conda#2aabafd88f6876a57c45c00598715ac4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/linux-64/python-3.7.12-hf930737_100_cpython.tar.bz2#416558a6f46b7a1fa8db7d0e98aff56a +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py37hd23a5d3_0.tar.bz2#004724940367fa84ec1d0732c8b27c18 +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py37hd23a5d3_0.tar.bz2#426c53c95df106039da865c0095e2a65 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py37h540881e_1.tar.bz2#a9123517674ab0589d955a5adbf58573 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.3-py37h540881e_0.tar.bz2#0c813ad118e926df328bf74899a48047 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py37h540881e_1.tar.bz2#8e25160800dafbc2a24c0aaa99a981ef +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_5.tar.bz2#8c4b0563f96363ee99f1ab864616ac63 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py37h540881e_4.tar.bz2#f231119f9790da6da6bd93b250b7e42e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py37h0c0c2a8_0.tar.bz2#732c98a38c84984262940c868793ebb4 +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/ruamel.yaml.clib-0.2.6-py37h540881e_1.tar.bz2#f3c703ac09e7810d6c9baec89e901fb5 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.2-py37h540881e_0.tar.bz2#2f0863ba6b29d1d2872b064dd697a492 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-64/y-py-0.5.4-py37hbd0741f_0.tar.bz2#ecadea26afe1035c2be1f159fdd22b4c +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py37h43b0acd_1.tar.bz2#5111b64bdfdd72d85086ec49c952fe0d +https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py37h89c1867_0.tar.bz2#71107630527e4bd82932952351231efe +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py37h89c1867_0.tar.bz2#6d184401b7a49bbebbfedc96bc7add1c +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.21-py37h540881e_1.tar.bz2#6232de79d3fe4aaa00f5f34d3da55c2a +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py37h540881e_2.tar.bz2#ff22fac37e988bed992b1f437e05906a +https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py37h5994e8b_1.tar.bz2#5a8bb0074be9d20d456957f92b72beed +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-4.11.4-hd8ed1ab_0.tar.bz2#9a1925fdb91c81437b8012e48ede6851 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.9-pyhd8ed1ab_0.conda#5cbf9a31a19d4ef9103adb7d71fd45fd +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.42-py37h540881e_0.tar.bz2#921bb310665fba1ed0f64f3287fda6d4 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.8.0-pyhd8ed1ab_0.conda#1ca43103a08456b19222d93fd9d119ac +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/linux-64/ipython-7.33.0-py37h89c1867_0.tar.bz2#e4841787deb237aad17b2d44a2d32c23 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.2-pyh210e3f2_0.tar.bz2#6b0f40821b784cac8a33d0c5eb7602c0 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.4-pyhd8ed1ab_0.conda#35b7e9267926e864cc70ce137e6588ca +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.7-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.7-linux-aarch64.lock new file mode 100644 index 000000000..08d5163e2 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.7-linux-aarch64.lock @@ -0,0 +1,144 @@ +# AUTO GENERATED FROM environment.py-3.7.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:34:02 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: a344452f1ae959b6cf61c51c2c65067263e4ed577245b01f5a38446d1ecda96f +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2023.5.7-hcefe29a_0.conda#331e624442b88d96bc05a7f2d38c61a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.1.0-h2b4548d_0.conda#eb95b60cbf85783b0fdd3fab2d8c320f +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.1.0-h452befe_0.conda#572f5798bb3d4cc79650f0ca3149aeaa +https://conda.anaconda.org/conda-forge/linux-aarch64/pandoc-2.19.2-h8af1aa0_2.conda#210300d4fbbc7935c22d0e5281665dd4 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.7-3_cp37m.conda#bef2bd84eb7ce6d6349b1a9de3a361f0 +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-ng-13.1.0-h2b4548d_0.conda#02619409d02932e28d694144b509597d +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-72.1-hcf00150_0.conda#cd394213b2f8c9c9060a293a8508fe84 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.0.9-h4e544f5_8.tar.bz2#3cedc3935cfaa2a5303daa25fb12cb1d +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.0-hf897c2e_0.tar.bz2#36fdbc05c9d9145ece86f5a63c3f352e +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/libuv-1.44.2-h4e544f5_0.tar.bz2#58b9dbd5d4bd100e278c3d7e1976f566 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h4e544f5_4.tar.bz2#88596b6277fe6d39f046983aae6044db +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4-h2e1726e_0.conda#40beaf447150c2760affc591c7509595 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.1.1-h31becfc_1.conda#a8e811c3390d93e5db0cef68e52f349f +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/libbrotlidec-1.0.9-h4e544f5_8.tar.bz2#319956380b383ec9f6a46d585599c028 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.0.9-h4e544f5_8.tar.bz2#56a0a025208af24e2b43b2bbeee79802 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.42.0-h194ca79_0.conda#5fc895d5063af554f24a7eb69faff054 +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.12-hd8af866_0.tar.bz2#7894e82ff743bd96c76585ddebe28e2a +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.4-h01db608_1.tar.bz2#dd56c9ce3f1f689a5e71941830349279 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h4e544f5_4.tar.bz2#dc8395f4a79bb0b13ca7d855c72482d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2#0980429a0148a53edd0f1f207ec28a39 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-18.15.0-hcab9400_1.conda#6eb6bbe830779c71d36a0b595acd439b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.42.0-h3b3482f_0.conda#61af86f0bb846ad0900fa8dadf15045b +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2#259d82bd990ba225508389509634b157 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.7.12-h47f6e27_100_cpython.tar.bz2#d7b2c7500aa702c992c285854bef95a7 +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.6.3-py37hb20f0a7_0.tar.bz2#7ab6a7bf4ff4be82cc461e64e53f0afa +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-1.1.3-py37hb20f0a7_0.tar.bz2#733269b6446567b6eedfa846ddd752b9 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.1-py37heeccf27_1.tar.bz2#8dfd7c3bbc19e52706265c8986411b7f +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.3-py37h795501a_0.tar.bz2#4fd90f8ee043a535f1effd3b2260d46c +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-aarch64/pyrsistent-0.18.1-py37heeccf27_1.tar.bz2#604a4c0f1fa79c503cc56d85b0e4af30 +https://conda.anaconda.org/conda-forge/linux-aarch64/pysocks-1.7.1-py37hd9ded2f_5.tar.bz2#83a3d8c5b531c55e9241adc3d4e23373 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-24.0.1-py37h7cb28e0_0.tar.bz2#97e6c8c18201d08a2eb5f87ce28cb55e +https://conda.anaconda.org/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.6-py37h795501a_1.tar.bz2#65038418d32470b70045205dd1bd7579 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.2-py37heeccf27_0.tar.bz2#e87e4ac6adb1b6564b5910ddb967401b +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py37h828e148_1.tar.bz2#50a7437124b0618862af25f390dc259f +https://conda.anaconda.org/conda-forge/linux-aarch64/importlib-metadata-4.11.4-py37hd9ded2f_0.tar.bz2#0f8204faf4756a6f66a609a51992dec0 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-4.11.1-py37hfd236b0_0.tar.bz2#7d39f788ccc3fb1cc4f099122cb6a9ca +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/linux-aarch64/ruamel.yaml-0.17.21-py37h795501a_1.tar.bz2#4305d41999e35a9df06ecfa6de115bb2 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py37h795501a_2.tar.bz2#5459021da3ad7999d88a32dc52e2b03f +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-38.0.2-py37h1c39eab_1.tar.bz2#329fe90bd5b7d02ef4d589c641115877 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.9-pyhd8ed1ab_0.conda#5cbf9a31a19d4ef9103adb7d71fd45fd +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-1.4.42-py37heeccf27_0.tar.bz2#153e4f63748586a2e7af033e39e398cd +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.8.0-pyhd8ed1ab_0.conda#1ca43103a08456b19222d93fd9d119ac +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/linux-aarch64/ipython-7.33.0-py37hd9ded2f_0.tar.bz2#9926f80d249c9e4b8c0bb4315cae9caa +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.2-pyh210e3f2_0.tar.bz2#6b0f40821b784cac8a33d0c5eb7602c0 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.4-pyhd8ed1ab_0.conda#35b7e9267926e864cc70ce137e6588ca +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.5.3-pyhd8ed1ab_0.conda#69f71bc3d176b3ad3d9564a32bd049b8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.7.lock b/repo2docker/buildpacks/conda/environment.py-3.7.lock deleted file mode 100644 index a1fe2ebbb..000000000 --- a/repo2docker/buildpacks/conda/environment.py-3.7.lock +++ /dev/null @@ -1,150 +0,0 @@ -# AUTO GENERATED FROM environment.py-3.7.yml, DO NOT MANUALLY MODIFY -# Frozen on 2022-10-13 14:39:03 UTC -# Generated by conda-lock. -# platform: linux-64 -# input_hash: f39cf3a86cdaeb58bee45974ccbdaf3fb51ad41f0bb6f3caf9340c5aad0dfa3b -@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-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-ha770c72_0.tar.bz2#f17322ae18898607521b3fa90df84235 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab -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-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -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/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -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/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 -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/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_4.tar.bz2#995cc7813221edbc25a3db15357599a0 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-16.17.1-h96d913c_0.tar.bz2#fcbc226cf8fe316f6a31bb031eeb975b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 -https://conda.anaconda.org/conda-forge/linux-64/python-3.7.12-hb7a2778_100_cpython.tar.bz2#2d94b3e6a9fdaf83f6955d008c8011a7 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -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/flit-core-3.7.1-pyhd8ed1ab_0.tar.bz2#f93822cba5c20161560661988a88f2c0 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.3-pyhd8ed1ab_0.tar.bz2#395233d17d26296e12354344a8c4673b -https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b -https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 -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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 -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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.14.1-pyhd8ed1ab_0.tar.bz2#b7fa7d86530b8de805268e48988eb483 -https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.5.0-pyhd8ed1ab_0.tar.bz2#69d30a4c1dfc083548b380d0ba261ea4 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 -https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-2_cp37m.tar.bz2#afff88bf9a7048da740c70aeb8cdbb82 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.4-pyhd8ed1ab_0.tar.bz2#fc0dcaf9761d042fb8ac9128ce03fddb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae -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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.4.0-pyhd8ed1ab_0.tar.bz2#ad0d721e61d0679d78902597b338a33b -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.4.1-pyhd8ed1ab_0.tar.bz2#f3b20ec2c97bad7104679b1d62eb7a11 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.3-pyhd8ed1ab_0.tar.bz2#e9a70e82e24a455386e4f2321b0ab18e -https://conda.anaconda.org/conda-forge/noarch/zipp-3.9.0-pyhd8ed1ab_0.tar.bz2#6f3fd8c9e0ab504010fb4216d5919c24 -https://conda.anaconda.org/conda-forge/noarch/anyio-3.6.1-pyhd8ed1ab_1.tar.bz2#d65ef75084f8adbadb696dfd91148e79 -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py37h43b0acd_0.tar.bz2#6c1ca1eafc80bf7b77b416cfa47f1747 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py37hd23a5d3_0.tar.bz2#004724940367fa84ec1d0732c8b27c18 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py37hd23a5d3_0.tar.bz2#426c53c95df106039da865c0095e2a65 -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py37h89c1867_0.tar.bz2#71107630527e4bd82932952351231efe -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.0-pyhd8ed1ab_0.tar.bz2#eb521efe7f5550de7573bc1629b74a05 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.1-pyhd8ed1ab_2.tar.bz2#0e613217e78777045199372a2b0d5bd2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py37h89c1867_0.tar.bz2#6d184401b7a49bbebbfedc96bc7add1c -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py37h540881e_1.tar.bz2#a9123517674ab0589d955a5adbf58573 -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py37h540881e_0.tar.bz2#0d82327667a5ac77a8a9a0039fcf427c -https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.45.1-py37haaec8a5_2.tar.bz2#c1e22dad62e777e71ad7d73aeda9ecd3 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py37h540881e_1.tar.bz2#8e25160800dafbc2a24c0aaa99a981ef -https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_5.tar.bz2#8c4b0563f96363ee99f1ab864616ac63 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py37h0c0c2a8_0.tar.bz2#732c98a38c84984262940c868793ebb4 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.6-py37h540881e_1.tar.bz2#f3c703ac09e7810d6c9baec89e901fb5 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.1.1-pyhd8ed1ab_0.tar.bz2#5d280406501e79dc7aa9c9ac31d25a80 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py37h540881e_0.tar.bz2#2f0863ba6b29d1d2872b064dd697a492 -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py37h540881e_2.tar.bz2#ff22fac37e988bed992b1f437e05906a -https://conda.anaconda.org/conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h540881e_1004.tar.bz2#2703cec0c296bad200deecfe132db0fa -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py37h38fbfac_0.tar.bz2#483a28d832f9e514d48cb26b6e67f29f -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.16.0-pyhd8ed1ab_0.tar.bz2#f39774717a77d98673ea29d28a586a84 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.2-pyhd8ed1ab_0.tar.bz2#8861f3816cd0e94029b539459d46a26c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 -https://conda.anaconda.org/conda-forge/noarch/mako-1.2.3-pyhd8ed1ab_0.tar.bz2#f19bdf719a181766edd09cbc08616868 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py37h540881e_1.tar.bz2#6232de79d3fe4aaa00f5f34d3da55c2a -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.41-py37h540881e_0.tar.bz2#dddd13b27ae2e927a76227b227417f5a -https://conda.anaconda.org/conda-forge/noarch/terminado-0.16.0-pyh41d4057_0.tar.bz2#e9a841f6e782edd1104211dbf8f4cfa9 -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee -https://conda.anaconda.org/conda-forge/noarch/alembic-1.8.1-pyhd8ed1ab_0.tar.bz2#bdde76f5d65a9374d07aa3dfa27571e0 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e -https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.7.0-pyhd8ed1ab_0.tar.bz2#f8439ce65664bec6d348346590ed57f0 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.1-pyhd8ed1ab_0.tar.bz2#0059a49c6f1410aab3c3b5572feb1a41 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.31-pyha770c72_0.tar.bz2#94fee21afe199936bc361608e537cd11 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e -https://conda.anaconda.org/conda-forge/linux-64/ipython-7.33.0-py37h89c1867_0.tar.bz2#e4841787deb237aad17b2d44a2d32c23 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.0-pyh210e3f2_0.tar.bz2#6a07cee9d25338f0b638576f6b476bf7 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.2.1-pyhd8ed1ab_0.tar.bz2#d74acbae5ea45838dec52f2ef7ce205b -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.21.0-pyhd8ed1ab_0.tar.bz2#81f31b184703349ea7280c49ca4b5b4e -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.5.0-py37h89c1867_1.tar.bz2#378c6f588fec669ce34ba77d60be2e50 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.2.1-pyhd8ed1ab_0.tar.bz2#e9e621cf9915b7d21befcec195274377 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.15.2-pyhd8ed1ab_0.tar.bz2#9672ffc62b53259a88bf1880a39bd774 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.2.1-pyhd8ed1ab_0.tar.bz2#8e12f153954596420bab7cdeeabb3f15 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.1.0-pyhd8ed1ab_0.tar.bz2#3a8e2c7dcc674f2cb0784f1faba57055 -https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.4.6-pyhd8ed1ab_0.tar.bz2#892f2bf64c1493356b848d31beab2e7d -https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-singleuser-1.5.0-py37h89c1867_1.tar.bz2#eb216c4866e66ddebfd0685c2ecd1702 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 -https://conda.anaconda.org/conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a diff --git a/repo2docker/buildpacks/conda/environment.py-3.7.yml b/repo2docker/buildpacks/conda/environment.py-3.7.yml index bd80774ef..5d38fb0f5 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.7.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.7.yml @@ -1,15 +1,15 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2022-10-13 14:38:39 UTC +# Generated on 2023-06-08 09:33:53 UTC channels: - conda-forge dependencies: - python=3.7.* -- nodejs=16 +- nodejs=18 - pip -- ipywidgets==8.0.2 -- jupyter-offlinenotebook==0.2.2 -- jupyter-resource-usage==0.6.3 -- jupyterlab==3.4.8 -- jupyterhub-singleuser==1.5.0 -- notebook==6.4.12 -- nteract_on_jupyter==2.1.3 +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab +- notebook==6.* # 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 new file mode 100644 index 000000000..dc83687b1 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-64.lock @@ -0,0 +1,166 @@ +# AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:34:21 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 36ddbee99d9fd787926a944b240a11b032e89e3c46dc4666bc9f0a4cff2f385c +@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-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +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-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +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/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-h32600fe_2.conda#326f46f36d15c44cff5f81d505cb717f +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.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-18.15.0-h4abf6b9_1.conda#2aabafd88f6876a57c45c00598715ac4 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.7-py38h8dc9893_0.conda#e3c2cc835cf3223d585d1d25d56fd3de +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-2.0.2-py38h17151c0_1.conda#4e886d9b2de5428558b5bdb605c94283 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py38h01eb140_0.conda#17d2a5314adf0f25220eeebb312d00a4 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py38h1de0b5d_0.conda#92e899e7b0ed27c793014d1fa54f9b7b +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.19.3-py38h1de0b5d_0.conda#a33157288d499397a2a56da4d724948d +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.0-py38h509eb50_0.conda#33872b6650886eba869408b76c96994c +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/ruamel.yaml.clib-0.2.7-py38h1de0b5d_1.conda#9afa2fc3c51cc4e7d1589c38e4e00d5c +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py38h01eb140_0.conda#3db869202b0e523d606d13e81ca79ab6 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-64/y-py-0.5.9-py38h9fda977_0.conda#18517ed6c99222252a7409b9e128015c +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py38h01eb140_0.conda#aa614283cae1c213b2cafd22870dc503 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py38h0a891b7_3.tar.bz2#efcaa056d265a3138d2038a4b6b68791 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py38hcdda232_0.conda#8dc6f3a9342a870c3c927927e86aa4ad +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.15-py38h01eb140_0.conda#d0f74915469f5c4daa88f10c4f285f8e +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.0-py38h578d9bd_0.conda#d75b783a348cf33c6d3d75480300fecd +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh41d4057_0.conda#acebfd89278ecac2a67b60b657e00d5c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock new file mode 100644 index 000000000..29cf899b4 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.8-linux-aarch64.lock @@ -0,0 +1,165 @@ +# AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:34:32 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: bb8e2c652ed0692214e36534ac1aca1721beb437a821806ce3796ced5c45ab54 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2023.5.7-hcefe29a_0.conda#331e624442b88d96bc05a7f2d38c61a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.1.0-h2b4548d_0.conda#eb95b60cbf85783b0fdd3fab2d8c320f +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.1.0-h452befe_0.conda#572f5798bb3d4cc79650f0ca3149aeaa +https://conda.anaconda.org/conda-forge/linux-aarch64/pandoc-2.19.2-h8af1aa0_2.conda#210300d4fbbc7935c22d0e5281665dd4 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.8-3_cp38.conda#61d5220a1049944310bea1c189a31088 +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-ng-13.1.0-h2b4548d_0.conda#02619409d02932e28d694144b509597d +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-hf897c2e_4.tar.bz2#2d787570a729e273a4e75775ddf3348a +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-72.1-hcf00150_0.conda#cd394213b2f8c9c9060a293a8508fe84 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.0.9-h4e544f5_8.tar.bz2#3cedc3935cfaa2a5303daa25fb12cb1d +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.0-hf897c2e_0.tar.bz2#36fdbc05c9d9145ece86f5a63c3f352e +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/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.44.2-h4e544f5_0.tar.bz2#58b9dbd5d4bd100e278c3d7e1976f566 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h4e544f5_4.tar.bz2#88596b6277fe6d39f046983aae6044db +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4-h2e1726e_0.conda#40beaf447150c2760affc591c7509595 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.1.1-h31becfc_1.conda#a8e811c3390d93e5db0cef68e52f349f +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/libbrotlidec-1.0.9-h4e544f5_8.tar.bz2#319956380b383ec9f6a46d585599c028 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.0.9-h4e544f5_8.tar.bz2#56a0a025208af24e2b43b2bbeee79802 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.42.0-h194ca79_0.conda#5fc895d5063af554f24a7eb69faff054 +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.12-hd8af866_0.tar.bz2#7894e82ff743bd96c76585ddebe28e2a +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.4-h01db608_1.tar.bz2#dd56c9ce3f1f689a5e71941830349279 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h4e544f5_4.tar.bz2#dc8395f4a79bb0b13ca7d855c72482d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2#0980429a0148a53edd0f1f207ec28a39 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-18.15.0-hcab9400_1.conda#6eb6bbe830779c71d36a0b595acd439b +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.8.15-ha43d526_1_cpython.conda#3f7a9731db09e23ef13e37e73886b666 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2#259d82bd990ba225508389509634b157 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.6.7-py38h31bd7b8_0.conda#bb801f8807f418fae4d82cdb2c660bf8 +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-2.0.2-py38hb83fbf6_1.conda#0ea35ccde6a0056c9c1b9a2d99aec1b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.3-py38hea3b116_0.conda#39f64bab8c1eedec920c0053b3ba8987 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.5-py38hda48048_0.conda#92de755f28f9efd397ecc3a796e0aa71 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-aarch64/pyrsistent-0.19.3-py38hd5eba46_0.conda#b60f143a897b82a1a54b25e030502217 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0-py38hdacc76a_5.tar.bz2#243d2518e51e40dc66fde2dd85a8459d +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-25.1.0-py38h6a3a231_0.conda#37d1dabbc3b712bd8e4a2c61dde58370 +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/ruamel.yaml.clib-0.2.7-py38hda48048_1.conda#0c48b738ee78083aab440dc39c967828 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py38hea3b116_0.conda#7640e1f8d8b8b4213011af9e5203e1f5 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-aarch64/y-py-0.5.9-py38hb6b4038_0.conda#85d8f2099743288cefc070127b58270e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py38h6989fa8_3.conda#4c419b6bb1c2b9db5733c693b5b5f6c3 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py38h9579f32_0.conda#039b5f7ab2a8ead8512061cc06e362cb +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py38hdacc76a_3.tar.bz2#064e83c4f397cf342681eeac12e85b8b +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-41.0.1-py38h72e9872_0.conda#fd1a5cb7829e728576bc53360dc55a42 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.15-py38hea3b116_0.conda#76e0e1b06968f423c3ad7fd0eb84481f +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.3.0-py38he3eb160_0.conda#56e532ee05b0355e9156f1baf8d6780c +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh41d4057_0.conda#acebfd89278ecac2a67b60b657e00d5c +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.8.lock b/repo2docker/buildpacks/conda/environment.py-3.8.lock deleted file mode 100644 index 764ec11a5..000000000 --- a/repo2docker/buildpacks/conda/environment.py-3.8.lock +++ /dev/null @@ -1,156 +0,0 @@ -# AUTO GENERATED FROM environment.py-3.8.yml, DO NOT MANUALLY MODIFY -# Frozen on 2022-10-13 14:39:21 UTC -# Generated by conda-lock. -# platform: linux-64 -# input_hash: e67091c1a370df5b722565831d5e32ce5255b1c0c7faeeed6baa7d7ee7694693 -@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-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-ha770c72_0.tar.bz2#f17322ae18898607521b3fa90df84235 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab -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-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -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/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -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/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 -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/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_4.tar.bz2#995cc7813221edbc25a3db15357599a0 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-16.17.1-h96d913c_0.tar.bz2#fcbc226cf8fe316f6a31bb031eeb975b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.13-h582c2e5_0_cpython.tar.bz2#8ec74710472994e2411a8020fa8589ce -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -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/executing-1.1.1-pyhd8ed1ab_0.tar.bz2#1ed759c44597c5e189625017f5875cbc -https://conda.anaconda.org/conda-forge/noarch/flit-core-3.7.1-pyhd8ed1ab_0.tar.bz2#f93822cba5c20161560661988a88f2c0 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.3-pyhd8ed1ab_0.tar.bz2#395233d17d26296e12354344a8c4673b -https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b -https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 -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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 -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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.14.1-pyhd8ed1ab_0.tar.bz2#b7fa7d86530b8de805268e48988eb483 -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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.5.0-pyhd8ed1ab_0.tar.bz2#69d30a4c1dfc083548b380d0ba261ea4 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -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.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 -https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bfbb29d517281e78ac53e48d21e6e860 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.4-pyhd8ed1ab_0.tar.bz2#fc0dcaf9761d042fb8ac9128ce03fddb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae -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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.4.0-pyhd8ed1ab_0.tar.bz2#ad0d721e61d0679d78902597b338a33b -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.4.1-pyhd8ed1ab_0.tar.bz2#f3b20ec2c97bad7104679b1d62eb7a11 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.3-pyhd8ed1ab_0.tar.bz2#e9a70e82e24a455386e4f2321b0ab18e -https://conda.anaconda.org/conda-forge/noarch/zipp-3.9.0-pyhd8ed1ab_0.tar.bz2#6f3fd8c9e0ab504010fb4216d5919c24 -https://conda.anaconda.org/conda-forge/noarch/anyio-3.6.1-pyhd8ed1ab_1.tar.bz2#d65ef75084f8adbadb696dfd91148e79 -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.0.8-pyhd8ed1ab_0.tar.bz2#4d725d10caaad25d9c31bfb263044fb4 -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_0.tar.bz2#a970d201055ec06a75db83bf25447eb2 -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py38hfa26641_0.tar.bz2#8e3144a12fd70d5e934e61707c10f2ad -https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py38hfa26641_0.tar.bz2#8e26dc2e5373f11296728e261a989fd1 -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py38h578d9bd_0.tar.bz2#037225c33a50e99c5d4f86fac90f6de8 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.0-pyhd8ed1ab_0.tar.bz2#eb521efe7f5550de7573bc1629b74a05 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.1-pyhd8ed1ab_2.tar.bz2#0e613217e78777045199372a2b0d5bd2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py38h578d9bd_0.tar.bz2#511c895f39abab82d42e9c9cf263a739 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_1.tar.bz2#20d003ad5f584e212c299f64cac46c05 -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py38h0a891b7_0.tar.bz2#907a39b6d7443f770ed755885694f864 -https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.45.1-py38h61f0cdf_2.tar.bz2#7c40ae78d455cb9c4d6f55835b6ebdeb -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py38h0a891b7_1.tar.bz2#baf653aaed8aa675798cbf810c01434e -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py38hfc09fa9_0.tar.bz2#46f74a0d7a5052e08ada24deb88ad84f -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.6-py38h0a891b7_1.tar.bz2#4f77d8717d97fae6ec979f03db7e50ff -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.1.1-pyhd8ed1ab_0.tar.bz2#5d280406501e79dc7aa9c9ac31d25a80 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py38h0a891b7_0.tar.bz2#acd276486a0067bee3098590f0952a0f -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py38h0a891b7_2.tar.bz2#3f70d2e8952ab07d096f0a7cb8e3f44e -https://conda.anaconda.org/conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1004.tar.bz2#9fcaaca218dcfeb8da806d4fd4824aa0 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py38h2b5fc30_0.tar.bz2#a5c0d016625dd551e14b9ab6c91f0a9d -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.16.0-pyhd8ed1ab_0.tar.bz2#f39774717a77d98673ea29d28a586a84 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.2-pyhd8ed1ab_0.tar.bz2#8861f3816cd0e94029b539459d46a26c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 -https://conda.anaconda.org/conda-forge/noarch/mako-1.2.3-pyhd8ed1ab_0.tar.bz2#f19bdf719a181766edd09cbc08616868 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py38h0a891b7_1.tar.bz2#26c00a763b8bb1b608ac899d3aadab62 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.41-py38h0a891b7_0.tar.bz2#da419f203784dc09cc8807e8401432be -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.5.1-pyhd8ed1ab_0.tar.bz2#3282a2d79f5f4d25469d71bc851771e3 -https://conda.anaconda.org/conda-forge/noarch/terminado-0.16.0-pyh41d4057_0.tar.bz2#e9a841f6e782edd1104211dbf8f4cfa9 -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee -https://conda.anaconda.org/conda-forge/noarch/alembic-1.8.1-pyhd8ed1ab_0.tar.bz2#bdde76f5d65a9374d07aa3dfa27571e0 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e -https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.7.0-pyhd8ed1ab_0.tar.bz2#f8439ce65664bec6d348346590ed57f0 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.1-pyhd8ed1ab_0.tar.bz2#0059a49c6f1410aab3c3b5572feb1a41 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.31-pyha770c72_0.tar.bz2#94fee21afe199936bc361608e537cd11 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.5.0-pyh41d4057_1.tar.bz2#83600908360af344d9324c3409e0dfea -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.0-pyh210e3f2_0.tar.bz2#6a07cee9d25338f0b638576f6b476bf7 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.2.1-pyhd8ed1ab_0.tar.bz2#d74acbae5ea45838dec52f2ef7ce205b -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.21.0-pyhd8ed1ab_0.tar.bz2#81f31b184703349ea7280c49ca4b5b4e -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.5.0-py38h578d9bd_1.tar.bz2#daf91bc5e7a13be85ebb50c6461d382b -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.2.1-pyhd8ed1ab_0.tar.bz2#e9e621cf9915b7d21befcec195274377 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.15.2-pyhd8ed1ab_0.tar.bz2#9672ffc62b53259a88bf1880a39bd774 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.2.1-pyhd8ed1ab_0.tar.bz2#8e12f153954596420bab7cdeeabb3f15 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.1.0-pyhd8ed1ab_0.tar.bz2#3a8e2c7dcc674f2cb0784f1faba57055 -https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.4.6-pyhd8ed1ab_0.tar.bz2#892f2bf64c1493356b848d31beab2e7d -https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-singleuser-1.5.0-py38h578d9bd_1.tar.bz2#36caba36d83f16ea0eb21d0e02033a7e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 -https://conda.anaconda.org/conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a diff --git a/repo2docker/buildpacks/conda/environment.py-3.8.yml b/repo2docker/buildpacks/conda/environment.py-3.8.yml index 5a4e68c18..31cee331f 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.8.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.8.yml @@ -1,15 +1,15 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2022-10-13 14:39:03 UTC +# Generated on 2023-06-08 09:34:21 UTC channels: - conda-forge dependencies: - python=3.8.* -- nodejs=16 +- nodejs=18 - pip -- ipywidgets==8.0.2 -- jupyter-offlinenotebook==0.2.2 -- jupyter-resource-usage==0.6.3 -- jupyterlab==3.4.8 -- jupyterhub-singleuser==1.5.0 -- notebook==6.4.12 -- nteract_on_jupyter==2.1.3 +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab +- notebook==6.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock new file mode 100644 index 000000000..1e774e42c --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-64.lock @@ -0,0 +1,167 @@ +# AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:34:51 UTC +# Generated by conda-lock. +# platform: linux-64 +# input_hash: a8b01e6cf54b5f11b1fb28a14c88acae0339819976b3ee55dd4504f09b37ab3c +@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-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +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-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +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/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-h32600fe_2.conda#326f46f36d15c44cff5f81d505cb717f +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.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-18.15.0-h4abf6b9_1.conda#2aabafd88f6876a57c45c00598715ac4 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda#95c9b7c96a7fd7342e0c9d0a917b8f78 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.7-py39h227be39_0.conda#4d8b831c8707058f27d355882c6dd198 +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-2.0.2-py39h3d6467e_1.conda#bcc2596fee9dccce15c6ae3d475ea013 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py39h72bdee0_0.conda#1d54d3a75c3192ab7655d9c3d16809f1 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.19.3-py39h72bdee0_0.conda#659013ef00dcd1751bfd26d894f73857 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.0-py39hb257651_0.conda#9009fbea0e0992dcbdd2312e70c44c09 +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/ruamel.yaml.clib-0.2.7-py39h72bdee0_1.conda#d9da3b1d13895666f4cc2559d37b8de4 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py39hd1e30aa_0.conda#da334eecb1ea2248e28294c49e6f6d89 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-64/y-py-0.5.9-py39h50f1755_0.conda#f9225a09f5cb046cfdecd2a54448d4c0 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py39hd1e30aa_0.conda#bb9509b491be59807c5c935516b223f2 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py39hb9d737c_3.tar.bz2#4df2495b3be6785029856ab326b949ea +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py39hd4f0224_0.conda#977858e1c3a33c7f3770c50691ce751b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.15-py39hd1e30aa_0.conda#62cb91b2ed1b8c72553b98a1f338ab3e +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.0-py39hf3d152e_0.conda#09aafa6fee56aab97695c6a70194f5e5 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock new file mode 100644 index 000000000..c5539fd75 --- /dev/null +++ b/repo2docker/buildpacks/conda/environment.py-3.9-linux-aarch64.lock @@ -0,0 +1,166 @@ +# AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY +# Frozen on 2023-06-08 09:35:00 UTC +# Generated by conda-lock. +# platform: linux-aarch64 +# input_hash: 7776980368d35916510034e08f7d5868055577a97e292abd8c7ccdf63b8ac824 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2023.5.7-hcefe29a_0.conda#331e624442b88d96bc05a7f2d38c61a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.1.0-h2b4548d_0.conda#eb95b60cbf85783b0fdd3fab2d8c320f +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.1.0-h452befe_0.conda#572f5798bb3d4cc79650f0ca3149aeaa +https://conda.anaconda.org/conda-forge/linux-aarch64/pandoc-2.19.2-h8af1aa0_2.conda#210300d4fbbc7935c22d0e5281665dd4 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-3_cp39.conda#b6f330b045cf3425945d536a6b5cd240 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +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-ng-13.1.0-h2b4548d_0.conda#02619409d02932e28d694144b509597d +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-hf897c2e_4.tar.bz2#2d787570a729e273a4e75775ddf3348a +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-72.1-hcf00150_0.conda#cd394213b2f8c9c9060a293a8508fe84 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.0.9-h4e544f5_8.tar.bz2#3cedc3935cfaa2a5303daa25fb12cb1d +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.0-hf897c2e_0.tar.bz2#36fdbc05c9d9145ece86f5a63c3f352e +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/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 +https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.44.2-h4e544f5_0.tar.bz2#58b9dbd5d4bd100e278c3d7e1976f566 +https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h4e544f5_4.tar.bz2#88596b6277fe6d39f046983aae6044db +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4-h2e1726e_0.conda#40beaf447150c2760affc591c7509595 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.1.1-h31becfc_1.conda#a8e811c3390d93e5db0cef68e52f349f +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/libbrotlidec-1.0.9-h4e544f5_8.tar.bz2#319956380b383ec9f6a46d585599c028 +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.0.9-h4e544f5_8.tar.bz2#56a0a025208af24e2b43b2bbeee79802 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.42.0-h194ca79_0.conda#5fc895d5063af554f24a7eb69faff054 +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.12-hd8af866_0.tar.bz2#7894e82ff743bd96c76585ddebe28e2a +https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.4-h01db608_1.tar.bz2#dd56c9ce3f1f689a5e71941830349279 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h4e544f5_4.tar.bz2#dc8395f4a79bb0b13ca7d855c72482d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2#0980429a0148a53edd0f1f207ec28a39 +https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-18.15.0-hcab9400_1.conda#6eb6bbe830779c71d36a0b595acd439b +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.16-hb363c5e_0_cpython.conda#0a7ef29549eaef817898062eeeefebd3 +https://conda.anaconda.org/conda-forge/noarch/aiofiles-22.1.0-pyhd8ed1ab_0.tar.bz2#a88c206fdb78e34adb1c4081f5f838dd +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/blinker-1.6.2-pyhd8ed1ab_0.conda#2fb79ec81bad9492b6d59a06b3b647a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2#259d82bd990ba225508389509634b157 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.6.7-py39hdcdd789_0.conda#2c833d8e6a19eafab4e915ede45a4a5f +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.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-2.0.2-py39h387a81e_1.conda#2e1247ed9652e0594abebc18fb4a72af +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.3-py39h7cc1d5f_0.conda#e6a9321ec38016e996e93c819e9d3457 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.5-py39h24fc6b6_0.conda#83a7e124676f5ad31e6160a46061e5e4 +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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.7.0-pyhd8ed1ab_0.conda#99e28be5a278e2319834d7dc99e7bfdd +https://conda.anaconda.org/conda-forge/linux-aarch64/pyrsistent-0.19.3-py39h599bc27_0.conda#eb78b6cdfa3798686407980ff17bc4e1 +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.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +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-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0-py39h0fd3b05_5.tar.bz2#eca87d250ba72da233121a1cc75582cc +https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-25.1.0-py39h7ea2324_0.conda#4c4f4805f749902ac817ef2119d91986 +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/ruamel.yaml.clib-0.2.7-py39h24fc6b6_1.conda#ad937086fe2828084067e5967a4000a4 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +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.3.2-py39h7cc1d5f_0.conda#2c853c8bb419699667c452a01f69749f +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.2-pyhd8ed1ab_0.conda#bfe7e7cd1476092f51efbcde15dfb110 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/linux-aarch64/y-py-0.5.9-py39h1efe9e1_0.conda#806142b2ca4bb7cc3eda216f2d8cb223 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py39hb26bf21_3.conda#dee0362c4fde8edce396183fd6390d6e +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +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/ruamel.yaml-0.17.31-py39h898b7ef_0.conda#d61eed47dfc03c6e51c04d3f9440d72e +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.19.0-pyhd8ed1ab_0.conda#c60a47f9f29057417165a8af579396a8 +https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py39h0fd3b05_3.tar.bz2#d453ec54a76ffaeed6e325961face742 +https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-41.0.1-py39hea2e5f7_0.conda#c42335353d8a302362a44f448b6cc4a5 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/mako-1.2.4-pyhd8ed1ab_0.tar.bz2#0d072f0edc017b6318dbab701e053f94 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.1-pyhd8ed1ab_0.conda#e2be672aece1f060adf7154f76531a35 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.15-py39h7cc1d5f_0.conda#6ed86d2a2e94c3673efcb3de74c5779e +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.11.1-pyhd8ed1ab_0.conda#6a55e123397b42b79c48b31d1b7a91b8 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.3.0-py39h4420490_0.conda#67b269d3b66a048986a891ba98959cec +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyter_ydoc-0.2.4-pyhd8ed1ab_0.conda#be5d4633c1cc40343ed417153a184006 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2#8f882b197fd9c4941a787926baea4868 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/ypy-websocket-0.8.2-pyhd8ed1ab_0.conda#5ee5ad3af20138020065985de57f0711 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.14.0-pyh41d4057_0.conda#0a0b0d8177c4a209017b356439292db8 +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-base-3.1.1-pyh2a2186d_0.conda#78fc5dfd4577a7ba172fa65eb64b6afb +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.23.6-pyhd8ed1ab_0.conda#5016f7c6845a6efd270fcee63af9a2a0 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.4.0-pyhd8ed1ab_0.conda#127c702e1b1eff595be82bc6a78cfce0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.7.1-pyhd8ed1ab_0.conda#62ed54dc748d19d0cf056a3f90cc8f12 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_fileid-0.9.0-pyhd8ed1ab_0.conda#a12525b037a703d7f4512da737d700e6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.4.0-pyhd8ed1ab_0.conda#a86727968b41c20dd3d73b91632e77dc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_ydoc-0.8.0-pyhd8ed1ab_0.conda#780280d42fbcb2eaf654a6ba7a3e5bb5 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-1.0.0-pyhb4ecaf3_1.conda#a0be31e9bd84d6eae87cdbf74c56b90b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.5.4-pyha770c72_0.conda#ec4ce3ce0a55ce21b6f5b86049b97af9 +https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.6.4-pyhd8ed1ab_0.conda#e66d4a6e36fcc92fe266932bf85fd35a +https://conda.anaconda.org/conda-forge/noarch/jupyterhub-singleuser-3.1.1-pyh2a2186d_0.conda#6d0a3394efe9ff7c0ad1ed03a6ca3720 diff --git a/repo2docker/buildpacks/conda/environment.py-3.9.lock b/repo2docker/buildpacks/conda/environment.py-3.9.lock deleted file mode 100644 index 263d528f8..000000000 --- a/repo2docker/buildpacks/conda/environment.py-3.9.lock +++ /dev/null @@ -1,157 +0,0 @@ -# AUTO GENERATED FROM environment.py-3.9.yml, DO NOT MANUALLY MODIFY -# Frozen on 2022-10-13 14:39:39 UTC -# Generated by conda-lock. -# platform: linux-64 -# input_hash: f0b7020f912d4c25c1482bcd0774212f9f4f041ec6eaea0b34676693729dcaf0 -@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-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.19.2-ha770c72_0.tar.bz2#f17322ae18898607521b3fa90df84235 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2022e-h191b570_0.tar.bz2#b6bd89cf71494c41a181cac13cc5a8ea -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab -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-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -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/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -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.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -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/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d -https://conda.anaconda.org/conda-forge/linux-64/libuv-1.44.2-h166bdaf_0.tar.bz2#e5cb4fe581a18ca2185a016eb848fc00 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 -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/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_4.tar.bz2#995cc7813221edbc25a3db15357599a0 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 -https://conda.anaconda.org/conda-forge/linux-64/nodejs-16.17.1-h96d913c_0.tar.bz2#fcbc226cf8fe316f6a31bb031eeb975b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.13-h9a8a25e_0_cpython.tar.bz2#69bc307cc4d7396c5fccb26bbcc9c379 -https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/noarch/blinker-1.5-pyhd8ed1ab_0.tar.bz2#f473c4e32d8180733ba5594d122cb637 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -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/executing-1.1.1-pyhd8ed1ab_0.tar.bz2#1ed759c44597c5e189625017f5875cbc -https://conda.anaconda.org/conda-forge/noarch/flit-core-3.7.1-pyhd8ed1ab_0.tar.bz2#f93822cba5c20161560661988a88f2c0 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 -https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.3-pyhd8ed1ab_0.tar.bz2#395233d17d26296e12354344a8c4673b -https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.4-pyhd8ed1ab_0.tar.bz2#78e0a90393b79b378b8ff6d32893d58a -https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b -https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 -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.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 -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_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f -https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.14.1-pyhd8ed1ab_0.tar.bz2#b7fa7d86530b8de805268e48988eb483 -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.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.5.0-pyhd8ed1ab_0.tar.bz2#69d30a4c1dfc083548b380d0ba261ea4 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -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.16.2-pyhd8ed1ab_0.tar.bz2#5fe4b6002f505336734ce92961b3e6a0 -https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-2_cp39.tar.bz2#39adde4247484de2bb4000122fdcf665 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.4-pyhd8ed1ab_0.tar.bz2#fc0dcaf9761d042fb8ac9128ce03fddb -https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.0-pyhd8ed1ab_0.tar.bz2#edab14119efe85c3bf131ad747e9005c -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae -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.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.4.0-pyhd8ed1ab_0.tar.bz2#ad0d721e61d0679d78902597b338a33b -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 -https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.4.1-pyhd8ed1ab_0.tar.bz2#f3b20ec2c97bad7104679b1d62eb7a11 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.3-pyhd8ed1ab_0.tar.bz2#e9a70e82e24a455386e4f2321b0ab18e -https://conda.anaconda.org/conda-forge/noarch/zipp-3.9.0-pyhd8ed1ab_0.tar.bz2#6f3fd8c9e0ab504010fb4216d5919c24 -https://conda.anaconda.org/conda-forge/noarch/anyio-3.6.1-pyhd8ed1ab_1.tar.bz2#d65ef75084f8adbadb696dfd91148e79 -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.0.8-pyhd8ed1ab_0.tar.bz2#4d725d10caaad25d9c31bfb263044fb4 -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.1-pyha770c72_0.tar.bz2#eeec8814bd97b2681f708bb127478d7d -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_0.tar.bz2#61e961a94c8fd535e4496b17e7452dfe -https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.3-py39h5a03fae_0.tar.bz2#728f724f3714d043321fc1be4e332487 -https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.3-py39h5a03fae_0.tar.bz2#89d1393c99343641037afd4c5034ca05 -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py39hf3d152e_0.tar.bz2#4c2a0eabf0b8980b2c755646a6f750eb -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.0-pyhd8ed1ab_0.tar.bz2#eb521efe7f5550de7573bc1629b74a05 -https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.1-pyhd8ed1ab_2.tar.bz2#0e613217e78777045199372a2b0d5bd2 -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.11.1-py39hf3d152e_0.tar.bz2#fc5a19614b813f4e20f2676ecba3347e -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py39hb9d737c_1.tar.bz2#7cda413e43b252044a270c2477031c5c -https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 -https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py39hb9d737c_0.tar.bz2#1e7ffe59e21862559e06b981817e5058 -https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.45.1-py39hd73adbb_2.tar.bz2#f18d0d0194faf2d853a91a407548ac37 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.18.1-py39hb9d737c_1.tar.bz2#e2575d7508c7933047544ac7a15e021d -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-24.0.1-py39headdf64_0.tar.bz2#5f8db6d0d93052050562f0aecac242c5 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.6-py39hb9d737c_1.tar.bz2#a0fabd69dd35bb24ec84d28dc01c3c5b -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.1.1-pyhd8ed1ab_0.tar.bz2#5d280406501e79dc7aa9c9ac31d25a80 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py39hb9d737c_0.tar.bz2#a3c57360af28c0d9956622af99a521cd -https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py39hb9d737c_2.tar.bz2#76139de3552a2046135eb0b2d02a9c85 -https://conda.anaconda.org/conda-forge/noarch/bleach-5.0.1-pyhd8ed1ab_0.tar.bz2#1f5151d37e4a2b1137f81c89a3a769f2 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1004.tar.bz2#05a99367d885ec9990f25e74128a8a08 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.2-py39hd97740a_0.tar.bz2#e408fbfa625450d340d4ae84545bacd5 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.16.0-pyhd8ed1ab_0.tar.bz2#f39774717a77d98673ea29d28a586a84 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-7.4.2-pyhd8ed1ab_0.tar.bz2#8861f3816cd0e94029b539459d46a26c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 -https://conda.anaconda.org/conda-forge/noarch/mako-1.2.3-pyhd8ed1ab_0.tar.bz2#f19bdf719a181766edd09cbc08616868 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py39hb9d737c_1.tar.bz2#2b94cf785616198b112170b9838262a4 -https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.41-py39hb9d737c_0.tar.bz2#5918280217e1b7099106fee0771a920e -https://conda.anaconda.org/conda-forge/noarch/stack_data-0.5.1-pyhd8ed1ab_0.tar.bz2#3282a2d79f5f4d25469d71bc851771e3 -https://conda.anaconda.org/conda-forge/noarch/terminado-0.16.0-pyh41d4057_0.tar.bz2#e9a841f6e782edd1104211dbf8f4cfa9 -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee -https://conda.anaconda.org/conda-forge/noarch/alembic-1.8.1-pyhd8ed1ab_0.tar.bz2#bdde76f5d65a9374d07aa3dfa27571e0 -https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e -https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.7.0-pyhd8ed1ab_0.tar.bz2#f8439ce65664bec6d348346590ed57f0 -https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.1-pyhd8ed1ab_0.tar.bz2#0059a49c6f1410aab3c3b5572feb1a41 -https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.31-pyha770c72_0.tar.bz2#94fee21afe199936bc361608e537cd11 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e -https://conda.anaconda.org/conda-forge/noarch/ipython-8.5.0-pyh41d4057_1.tar.bz2#83600908360af344d9324c3409e0dfea -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.0-pyhd8ed1ab_0.tar.bz2#87eed34d791330d8acdab6a8ab63113f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.16.0-pyh210e3f2_0.tar.bz2#6a07cee9d25338f0b638576f6b476bf7 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.2.1-pyhd8ed1ab_0.tar.bz2#d74acbae5ea45838dec52f2ef7ce205b -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.2-pyhd8ed1ab_1.tar.bz2#81b7f46918555bf911ad2ba2f3259094 -https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.21.0-pyhd8ed1ab_0.tar.bz2#81f31b184703349ea7280c49ca4b5b4e -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.5.0-py39hf3d152e_1.tar.bz2#992fc6e337a76ea7717d825d7e799d19 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.2.1-pyhd8ed1ab_0.tar.bz2#e9e621cf9915b7d21befcec195274377 -https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-0.6.3-pyhd8ed1ab_0.tar.bz2#9d26ebd67e0e22aba13ac8a490d88d9e -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.15.2-pyhd8ed1ab_0.tar.bz2#9672ffc62b53259a88bf1880a39bd774 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.2.1-pyhd8ed1ab_0.tar.bz2#8e12f153954596420bab7cdeeabb3f15 -https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.1.0-pyhd8ed1ab_0.tar.bz2#3a8e2c7dcc674f2cb0784f1faba57055 -https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.4.6-pyhd8ed1ab_0.tar.bz2#892f2bf64c1493356b848d31beab2e7d -https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2#77fc67c5bbea44fd41e8bbe2ac82d1ad -https://conda.anaconda.org/conda-forge/noarch/jupyter-offlinenotebook-0.2.2-pyh1d7be83_0.tar.bz2#fe55056ce4bc4bd4953ba440270735fb -https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-singleuser-1.5.0-py39hf3d152e_1.tar.bz2#31dba5dc15564c19d36836786fafe297 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.4.8-pyhd8ed1ab_0.tar.bz2#6fbf13b0e8a6fa24bbae91205e8ce467 -https://conda.anaconda.org/conda-forge/noarch/nteract_on_jupyter-2.1.3-py_0.tar.bz2#1430ccd983ae6b161e2fbf4377965f7a diff --git a/repo2docker/buildpacks/conda/environment.py-3.9.yml b/repo2docker/buildpacks/conda/environment.py-3.9.yml index a854684eb..e69c4fe88 100644 --- a/repo2docker/buildpacks/conda/environment.py-3.9.yml +++ b/repo2docker/buildpacks/conda/environment.py-3.9.yml @@ -1,15 +1,15 @@ # AUTO GENERATED FROM environment.yml, DO NOT MANUALLY MODIFY -# Generated on 2022-10-13 14:39:21 UTC +# Generated on 2023-06-08 09:34:51 UTC channels: - conda-forge dependencies: - python=3.9.* -- nodejs=16 +- nodejs=18 - pip -- ipywidgets==8.0.2 -- jupyter-offlinenotebook==0.2.2 -- jupyter-resource-usage==0.6.3 -- jupyterlab==3.4.8 -- jupyterhub-singleuser==1.5.0 -- notebook==6.4.12 -- nteract_on_jupyter==2.1.3 +- ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets +- jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook +- jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage +- jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server +- jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub +- jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab +- notebook==6.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/environment.yml b/repo2docker/buildpacks/conda/environment.yml index fc3f00da1..156129bd1 100644 --- a/repo2docker/buildpacks/conda/environment.yml +++ b/repo2docker/buildpacks/conda/environment.yml @@ -1,13 +1,13 @@ channels: - conda-forge dependencies: - - python=3.7 - - nodejs=16 + - python=3.10 + - nodejs=18 - pip - - ipywidgets==8.0.2 - - jupyter-offlinenotebook==0.2.2 - - jupyter-resource-usage==0.6.3 - - jupyterlab==3.4.8 - - jupyterhub-singleuser==1.5.0 - - notebook==6.4.12 - - nteract_on_jupyter==2.1.3 + - ipywidgets==8.* # https://github.com/jupyter-widgets/ipywidgets + - jupyter-offlinenotebook==0.2.* # https://github.com/manics/jupyter-offlinenotebook + - jupyter-resource-usage==0.7.* # https://github.com/jupyter-server/jupyter-resource-usage + - jupyter_server==1.* # https://github.com/jupyter-server/jupyter_server + - jupyterhub-singleuser==3.* # https://github.com/jupyterhub/jupyterhub + - jupyterlab==3.* # https://github.com/jupyterlab/jupyterlab + - notebook==6.* # https://github.com/jupyter/notebook diff --git a/repo2docker/buildpacks/conda/freeze.py b/repo2docker/buildpacks/conda/freeze.py index 84475457f..a3a18b2b0 100755 --- a/repo2docker/buildpacks/conda/freeze.py +++ b/repo2docker/buildpacks/conda/freeze.py @@ -9,22 +9,17 @@ python freeze.py [3.8] """ -from argparse import ArgumentParser -from datetime import datetime import os import pathlib -import shutil +from argparse import ArgumentParser +from datetime import datetime from subprocess import check_call -import sys from ruamel.yaml import YAML - HERE = pathlib.Path(os.path.dirname(os.path.abspath(__file__))) ENV_FILE = HERE / "environment.yml" -FROZEN_FILE = os.path.splitext(ENV_FILE)[0] + ".lock" - ENV_FILE_T = HERE / "environment.py-{py}.yml" yaml = YAML(typ="rt") @@ -118,14 +113,20 @@ def set_python(py_env_file, py): "py", nargs="*", help="Python version(s) to update and freeze", - default=("3.7", "3.8", "3.9", "3.10"), + default=("3.7", "3.8", "3.9", "3.10", "3.11"), + ) + parser.add_argument( + "platform", + nargs="*", + help="Platform(s) to update and freeze", + default=("linux-64", "linux-aarch64"), ) args = parser.parse_args() - default_py = "3.7" for py in args.py: - env_file = pathlib.Path(str(ENV_FILE_T).format(py=py)) - set_python(env_file, py) - frozen_file = pathlib.Path(os.path.splitext(env_file)[0] + ".lock") - freeze(env_file, frozen_file) - if py == default_py: - shutil.copy(frozen_file, FROZEN_FILE) + for platform in args.platform: + env_file = pathlib.Path(str(ENV_FILE_T).format(py=py)) + set_python(env_file, py) + frozen_file = pathlib.Path( + os.path.splitext(env_file)[0] + f"-{platform}.lock" + ) + freeze(env_file, frozen_file, platform) diff --git a/repo2docker/buildpacks/conda/install-base-env.bash b/repo2docker/buildpacks/conda/install-base-env.bash index 33b917735..ebaf7fbbc 100755 --- a/repo2docker/buildpacks/conda/install-base-env.bash +++ b/repo2docker/buildpacks/conda/install-base-env.bash @@ -5,10 +5,10 @@ set -ex cd $(dirname $0) -export MAMBA_VERSION=0.25.0 -export CONDA_VERSION=4.13.0 +export MAMBA_VERSION=1.4.0 +export CONDA_VERSION=23.1.0 -URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/linux-64/micromamba-${MAMBA_VERSION}-0.tar.bz2" +URL="https://anaconda.org/conda-forge/micromamba/${MAMBA_VERSION}/download/${CONDA_PLATFORM}/micromamba-${MAMBA_VERSION}-0.tar.bz2" # make sure we don't do anything funky with user's $HOME # since this is run as root diff --git a/repo2docker/buildpacks/conda/requirements.py-3.5.pip b/repo2docker/buildpacks/conda/requirements.py-3.5.pip deleted file mode 100644 index 416274ad2..000000000 --- a/repo2docker/buildpacks/conda/requirements.py-3.5.pip +++ /dev/null @@ -1,17 +0,0 @@ -# pip-installed packages for Python 3.5 -# these should only be packages -# whose versions are too new to have builds available for Python 3.5 -alembic==1.0.3 -async-generator==1.10 -chardet==3.0.4 -idna==2.7 -jupyterhub==0.9.4 -mako==1.0.7 -notebook==5.7.8 -nteract-on-jupyter==1.9.6 -pamela==0.3.0 -python-editor==1.0.3 -python-oauth2==1.1.0 -requests==2.20.1 -sqlalchemy==1.2.14 -urllib3==1.24.1 diff --git a/repo2docker/buildpacks/docker.py b/repo2docker/buildpacks/docker.py index 5f0c2fb33..d1dfe4926 100644 --- a/repo2docker/buildpacks/docker.py +++ b/repo2docker/buildpacks/docker.py @@ -1,7 +1,9 @@ """Generates a variety of Dockerfiles based on an input matrix """ import os + import docker + from .base import BuildPack @@ -28,14 +30,15 @@ def build( build_args, cache_from, extra_build_kwargs, + platform=None, ): """Build a Docker image based on the Dockerfile in the source repo.""" # If you work on this bit of code check the corresponding code in # buildpacks/base.py where it is duplicated if not isinstance(memory_limit, int): raise ValueError( - "The memory limit has to be specified as an" - "integer but is '{}'".format(type(memory_limit)) + "The memory limit has to be specified as an " + f"integer but is '{type(memory_limit)}'" ) limits = {} if memory_limit: @@ -53,9 +56,9 @@ def build( container_limits=limits, cache_from=cache_from, labels=self.get_labels(), + platform=platform, ) build_kwargs.update(extra_build_kwargs) - for line in client.build(**build_kwargs): - yield line + yield from client.build(**build_kwargs) diff --git a/repo2docker/buildpacks/julia/julia_project.py b/repo2docker/buildpacks/julia/julia_project.py index e6e191dc2..7b6771c28 100644 --- a/repo2docker/buildpacks/julia/julia_project.py +++ b/repo2docker/buildpacks/julia/julia_project.py @@ -1,13 +1,14 @@ """Generates a Dockerfile based on an input matrix for Julia""" import functools import os +from functools import lru_cache import requests import semver import toml -from ..python import PythonBuildPack from ...semver import find_semver_match +from ..python import PythonBuildPack class JuliaProjectTomlBuildPack(PythonBuildPack): @@ -19,14 +20,14 @@ class JuliaProjectTomlBuildPack(PythonBuildPack): # Note that these must remain ordered, in order for the find_semver_match() # function to behave correctly. @property - @functools.lru_cache(maxsize=1) + @lru_cache(maxsize=1) def all_julias(self): try: json = requests.get( "https://julialang-s3.julialang.org/bin/versions.json" ).json() except Exception as e: - raise RuntimeError("Failed to fetch available Julia versions: {e}") + raise RuntimeError(f"Failed to fetch available Julia versions: {e}") vers = [semver.VersionInfo.parse(v) for v in json.keys()] # filter out pre-release versions not supported by find_semver_match() filtered_vers = [v for v in vers if v.prerelease is None] @@ -67,6 +68,7 @@ def julia_version(self): raise RuntimeError("Failed to find a matching Julia version: {compat}") return match + @lru_cache() def get_build_env(self): """Get additional environment settings for Julia and Jupyter @@ -79,23 +81,41 @@ def get_build_env(self): will be installed - `JULIA_DEPOT_PATH`: path where Julia libraries are installed. - `JULIA_VERSION`: default version of julia to be installed + - `JULIA_ARCH`: machine architecture used in Julia download URLs + - `JULIA_ARCH_SHORT`: machine architecture used in Julia download URLs - `JUPYTER`: environment variable required by IJulia to point to the `jupyter` executable For example, a tuple may be `('JULIA_VERSION', '0.6.0')`. """ + if self.platform == "linux/arm64": + julia_arch = julia_arch_short = "aarch64" + else: + julia_arch = "x86_64" + julia_arch_short = "x64" return super().get_build_env() + [ ("JULIA_PATH", "${APP_BASE}/julia"), ("JULIA_DEPOT_PATH", "${JULIA_PATH}/pkg"), ("JULIA_VERSION", self.julia_version), + ("JULIA_ARCH", julia_arch), + ("JULIA_ARCH_SHORT", julia_arch_short), ("JUPYTER", "${NB_PYTHON_PREFIX}/bin/jupyter"), ("JUPYTER_DATA_DIR", "${NB_PYTHON_PREFIX}/share/jupyter"), ] + @property + def project_dir(self): + if self.binder_dir: + return "${REPO_DIR}/" + self.binder_dir + else: + return "${REPO_DIR}" + + @lru_cache() def get_env(self): - return super().get_env() + [("JULIA_PROJECT", "${REPO_DIR}")] + return super().get_env() + [("JULIA_PROJECT", self.project_dir)] + @lru_cache() def get_path(self): """Adds path to Julia binaries to user's PATH. @@ -106,6 +126,7 @@ def get_path(self): """ return super().get_path() + ["${JULIA_PATH}/bin"] + @lru_cache() def get_build_scripts(self): """ Return series of build-steps common to "ALL" Julia repositories @@ -122,7 +143,7 @@ def get_build_scripts(self): "root", r""" mkdir -p ${JULIA_PATH} && \ - curl -sSL "https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_VERSION%[.-]*}/julia-${JULIA_VERSION}-linux-x86_64.tar.gz" | tar -xz -C ${JULIA_PATH} --strip-components 1 + curl -sSL "https://julialang-s3.julialang.org/bin/linux/${JULIA_ARCH_SHORT}/${JULIA_VERSION%[.-]*}/julia-${JULIA_VERSION}-linux-${JULIA_ARCH}.tar.gz" | tar -xz -C ${JULIA_PATH} --strip-components 1 """, ), ( @@ -134,6 +155,7 @@ def get_build_scripts(self): ), ] + @lru_cache() def get_assemble_scripts(self): """ Return series of build-steps specific to "this" Julia repository @@ -148,15 +170,19 @@ def get_assemble_scripts(self): The parent, CondaBuildPack, will add the build steps for any needed Python packages found in environment.yml. """ - return super().get_assemble_scripts() + [ + scripts = super().get_assemble_scripts() + scripts.append( ( "${NB_USER}", r""" - JULIA_PROJECT="" julia -e "using Pkg; Pkg.add(\"IJulia\"); using IJulia; installkernel(\"Julia\", \"--project=${REPO_DIR}\");" && \ - julia --project=${REPO_DIR} -e 'using Pkg; Pkg.instantiate(); Pkg.resolve(); pkg"precompile"' - """, + 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"' + """.format( + project=self.project_dir + ), ) - ] + ) + return scripts def detect(self): """ diff --git a/repo2docker/buildpacks/julia/julia_require.py b/repo2docker/buildpacks/julia/julia_require.py index 075b928e0..ab41ffc26 100644 --- a/repo2docker/buildpacks/julia/julia_require.py +++ b/repo2docker/buildpacks/julia/julia_require.py @@ -1,9 +1,10 @@ """Generates a Dockerfile based on an input matrix with REQUIRE for legacy Julia""" import os +from functools import lru_cache -from ..python import PythonBuildPack from ...semver import parse_version as V +from ..python import PythonBuildPack class JuliaRequireBuildPack(PythonBuildPack): @@ -54,6 +55,7 @@ def julia_version(self): self._julia_version = julia_version return self._julia_version + @lru_cache() def get_build_env(self): """Get additional environment settings for Julia and Jupyter @@ -69,12 +71,27 @@ def get_build_env(self): - `JULIA_DEPOT_PATH`: path where Julia libraries are installed. Similar to JULIA_PKGDIR, used in 1.x. - `JULIA_VERSION`: default version of julia to be installed + - `JULIA_ARCH`: machine architecture used in Julia download URLs + - `JULIA_ARCH_SHORT`: machine architecture used in Julia download URLs - `JUPYTER`: environment variable required by IJulia to point to the `jupyter` executable For example, a tuple may be `('JULIA_VERSION', '0.6.0')`. """ + if self.platform == "linux/arm64": + julia_arch = julia_arch_short = "aarch64" + else: + julia_arch = "x86_64" + julia_arch_short = "x64" + + if V(self.julia_version) < V("0.7"): + # IJulia with Julia 0.6 isn't compatible with more recent jupyter-core + # point it to the one in the kernel env + # I _think_ this is only relevant during installation + jupyter = "${KERNEL_PYTHON_PREFIX}/bin/jupyter" + else: + jupyter = "${NB_PYTHON_PREFIX}/bin/jupyter" return super().get_build_env() + [ ("JULIA_PATH", "${APP_BASE}/julia"), ("JULIA_HOME", "${JULIA_PATH}/bin"), # julia <= 0.6 @@ -82,9 +99,12 @@ def get_build_env(self): ("JULIA_PKGDIR", "${JULIA_PATH}/pkg"), ("JULIA_DEPOT_PATH", "${JULIA_PKGDIR}"), # julia >= 0.7 ("JULIA_VERSION", self.julia_version), - ("JUPYTER", "${NB_PYTHON_PREFIX}/bin/jupyter"), + ("JULIA_ARCH", julia_arch), + ("JULIA_ARCH_SHORT", julia_arch_short), + ("JUPYTER", jupyter), ] + @lru_cache() def get_path(self): """Adds path to Julia binaries to user's PATH. @@ -95,6 +115,7 @@ def get_path(self): """ return super().get_path() + ["${JULIA_HOME}"] + @lru_cache() def get_build_scripts(self): """ Return series of build-steps common to "ALL" Julia repositories @@ -111,7 +132,7 @@ def get_build_scripts(self): "root", r""" mkdir -p ${JULIA_PATH} && \ - curl -sSL "https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_VERSION%[.-]*}/julia-${JULIA_VERSION}-linux-x86_64.tar.gz" | tar -xz -C ${JULIA_PATH} --strip-components 1 + curl -sSL "https://julialang-s3.julialang.org/bin/linux/${JULIA_ARCH_SHORT}/${JULIA_VERSION%[.-]*}/julia-${JULIA_VERSION}-linux-${JULIA_ARCH}.tar.gz" | tar -xz -C ${JULIA_PATH} --strip-components 1 """, ), ( @@ -132,6 +153,7 @@ def get_build_scripts(self): ), ] + @lru_cache() def get_assemble_scripts(self): """ Return series of build-steps specific to "this" Julia repository @@ -159,6 +181,7 @@ def get_assemble_scripts(self): ) ] + @lru_cache() def get_build_script_files(self): files = { "julia/install-repo-dependencies.jl": "/tmp/install-repo-dependencies.jl" diff --git a/repo2docker/buildpacks/legacy/__init__.py b/repo2docker/buildpacks/legacy/__init__.py index 7f5d004f6..31980f9f7 100644 --- a/repo2docker/buildpacks/legacy/__init__.py +++ b/repo2docker/buildpacks/legacy/__init__.py @@ -16,11 +16,14 @@ class LegacyBinderDockerBuildPack: This buildpack has been deprecated. """ + def __init__(self, *args, **kwargs): + pass + def detect(self): """Check if current repo should be built with the Legacy BuildPack.""" log = logging.getLogger("repo2docker") try: - with open("Dockerfile", "r") as f: + with open("Dockerfile") as f: for line in f: if line.startswith("FROM"): if "andrewosh/binder-base" in line.split("#")[0].lower(): diff --git a/repo2docker/buildpacks/nix/__init__.py b/repo2docker/buildpacks/nix/__init__.py index b7ca105d7..94fd7b7c5 100644 --- a/repo2docker/buildpacks/nix/__init__.py +++ b/repo2docker/buildpacks/nix/__init__.py @@ -1,24 +1,29 @@ """BuildPack for nixpkgs environments""" import os +from functools import lru_cache -from ..base import BuildPack, BaseImage +from ..base import BaseImage class NixBuildPack(BaseImage): """A nix Package Manager BuildPack""" + @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() def get_env(self): """Ordered list of environment variables to be set for this image""" + return super().get_env() + [ ("NIX_PATH", "nixpkgs=/home/${NB_USER}/.nix-defexpr/channels/nixpkgs"), ("NIX_SSL_CERT_FILE", "/etc/ssl/certs/ca-certificates.crt"), ("GIT_SSL_CAINFO", "/etc/ssl/certs/ca-certificates.crt"), ] + @lru_cache() def get_build_scripts(self): """ Return series of build-steps common to all nix repositories. @@ -30,6 +35,10 @@ def get_build_scripts(self): - install nix package manager for user """ + if self.platform == "linux/arm64": + nix_arch = "aarch64" + else: + nix_arch = "x86_64" return super().get_build_scripts() + [ ( "root", @@ -43,13 +52,14 @@ def get_build_scripts(self): ), ( "${NB_USER}", - """ - bash /home/${NB_USER}/.local/bin/install-nix.bash && \ - rm /home/${NB_USER}/.local/bin/install-nix.bash + f""" + NIX_ARCH={nix_arch} bash /home/${{NB_USER}}/.local/bin/install-nix.bash && \ + rm /home/${{NB_USER}}/.local/bin/install-nix.bash """, ), ] + @lru_cache() def get_build_script_files(self): """Dict of files to be copied to the container image for use in building""" return { @@ -57,21 +67,21 @@ def get_build_script_files(self): "nix/nix-shell-wrapper": "/usr/local/bin/nix-shell-wrapper", } + @lru_cache() def get_assemble_scripts(self): """Return series of build-steps specific to this source repository.""" return super().get_assemble_scripts() + [ ( "${NB_USER}", - """ + f""" nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs && \ nix-channel --update && \ - nix-shell {} - """.format( - self.binder_path("default.nix") - ), + nix-shell {self.binder_path("default.nix")} + """, ) ] + @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/nix/install-nix.bash b/repo2docker/buildpacks/nix/install-nix.bash index 1eb657966..f3524e627 100644 --- a/repo2docker/buildpacks/nix/install-nix.bash +++ b/repo2docker/buildpacks/nix/install-nix.bash @@ -2,13 +2,17 @@ # This downloads and installs a pinned version of nix set -ex -NIX_VERSION="2.3.9" -NIX_SHA256="49763fd7fa06bcb712ced2f3f11afd275e3a4d7bc5ff0d6fd1d50a4c3ce7bbf4" +NIX_VERSION="2.13.2" +if [ "$NIX_ARCH" = "aarch64" ]; then + NIX_SHA256="4ae275a46a2441d3459ae389a90ce6e8f7eff12c2a084b2d003ba6f8d0899603" +else + NIX_SHA256="beaec0f28899c22f33adbe30e4ecfceef87b797278c5210ee693e22e9719dfb4" +fi # Do all our operations in /tmp, since we can't rely on current directory being writeable yet. cd /tmp -wget --quiet https://nixos.org/releases/nix/nix-$NIX_VERSION/nix-$NIX_VERSION-x86_64-linux.tar.xz -echo "$NIX_SHA256 nix-$NIX_VERSION-x86_64-linux.tar.xz" | sha256sum -c -tar xJf nix-*-x86_64-linux.tar.xz -sh nix-*-x86_64-linux/install -rm -r nix-*-x86_64-linux* +wget --quiet https://nixos.org/releases/nix/nix-$NIX_VERSION/nix-$NIX_VERSION-$NIX_ARCH-linux.tar.xz +echo "$NIX_SHA256 nix-$NIX_VERSION-$NIX_ARCH-linux.tar.xz" | sha256sum -c +tar xJf nix-*-$NIX_ARCH-linux.tar.xz +sh nix-*-$NIX_ARCH-linux/install +rm -r nix-*-$NIX_ARCH-linux* diff --git a/repo2docker/buildpacks/pipfile/__init__.py b/repo2docker/buildpacks/pipfile/__init__.py index a5117ff56..4b86eed1a 100644 --- a/repo2docker/buildpacks/pipfile/__init__.py +++ b/repo2docker/buildpacks/pipfile/__init__.py @@ -8,9 +8,11 @@ import json import os import re +from functools import lru_cache import toml +from ...semver import parse_version as V from ..conda import CondaBuildPack VERSION_PAT = re.compile(r"\d+(\.\d+)*") @@ -63,17 +65,22 @@ def python_version(self): # extract major.minor if py_version: - if len(py_version.split(".")) == 1: - self._python_version = self.major_pythons.get(py_version[0]) + py_version_info = py_version.split(".") + if len(py_version_info) == 1: + self._python_version = self.major_pythons[py_version_info[0]] else: # return major.minor - self._python_version = ".".join(py_version.split(".")[:2]) + self._python_version = ".".join(py_version_info[:2]) return self._python_version else: # use the default Python self._python_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." + ) return self._python_version + @lru_cache() def get_preassemble_script_files(self): """Return files needed for preassembly""" files = super().get_preassemble_script_files() @@ -83,15 +90,25 @@ def get_preassemble_script_files(self): 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}", "${KERNEL_PYTHON_PREFIX}/bin/pip install pipenv==2018.11.26") + ( + "${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 either Pipfile.lock, Pipfile, or runtime.txt declare the @@ -104,8 +121,8 @@ def get_assemble_scripts(self): # environment. assemble_scripts = super().get_assemble_scripts() - if self.py2: - # using Python 2 as a kernel, but Python 3 for the notebook server + 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 @@ -114,9 +131,7 @@ def get_assemble_scripts(self): assemble_scripts.append( ( "${NB_USER}", - '${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{}"'.format( - nb_requirements_file - ), + f'${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{nb_requirements_file}"', ) ) @@ -154,7 +169,8 @@ def get_assemble_scripts(self): "${NB_USER}", """(cd {working_directory} && \\ PATH="${{KERNEL_PYTHON_PREFIX}}/bin:$PATH" \\ - pipenv install {install_option} --system --dev \\ + pipenv install {install_option} --system --dev && \\ + pipenv --clear \\ )""".format( working_directory=working_directory, install_option="--ignore-pipfile" diff --git a/repo2docker/buildpacks/python/__init__.py b/repo2docker/buildpacks/python/__init__.py index 7ea2a8264..188e8e9cf 100644 --- a/repo2docker/buildpacks/python/__init__.py +++ b/repo2docker/buildpacks/python/__init__.py @@ -1,8 +1,9 @@ """Generates Dockerfiles based on an input matrix based on Python.""" import os +from functools import lru_cache -from ..conda import CondaBuildPack from ...utils import is_local_pip_requirement, open_guess_encoding +from ..conda import CondaBuildPack class PythonBuildPack(CondaBuildPack): @@ -23,6 +24,9 @@ def python_version(self): # not a Python runtime (e.g. R, which subclasses this) # use the default Python self._python_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." + ) return self._python_version py_version_info = runtime.split("-", 1)[1].split(".") @@ -45,8 +49,8 @@ def _get_pip_scripts(self): # whether it's distinct from the notebook or the same. pip = "${KERNEL_PYTHON_PREFIX}/bin/pip" scripts = [] - if self.py2: - # using python 2 kernel, + if self.separate_kernel_env: + # using legacy Python kernel # requirements3.txt allows installation in the notebook server env nb_requirements_file = self.binder_path("requirements3.txt") if os.path.exists(nb_requirements_file): @@ -55,9 +59,7 @@ def _get_pip_scripts(self): "${NB_USER}", # want the $NB_PYHTON_PREFIX environment variable, not for # Python's string formatting to try and replace this - '${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{}"'.format( - nb_requirements_file - ), + f'${{NB_PYTHON_PREFIX}}/bin/pip install --no-cache-dir -r "{nb_requirements_file}"', ) ) @@ -67,7 +69,7 @@ def _get_pip_scripts(self): scripts.append( ( "${NB_USER}", - '{} install --no-cache-dir -r "{}"'.format(pip, requirements_file), + f'{pip} install --no-cache-dir -r "{requirements_file}"', ) ) return scripts @@ -95,6 +97,7 @@ def _should_preassemble_pip(self): # allow assembly from subset return True + @lru_cache() def get_preassemble_script_files(self): assemble_files = super().get_preassemble_script_files() for name in ("requirements.txt", "requirements3.txt"): @@ -103,6 +106,7 @@ def get_preassemble_script_files(self): assemble_files[requirements_txt] = requirements_txt return assemble_files + @lru_cache() def get_preassemble_scripts(self): """Return scripts to run before adding the full repository""" scripts = super().get_preassemble_scripts() @@ -110,6 +114,7 @@ def get_preassemble_scripts(self): scripts.extend(self._get_pip_scripts()) return scripts + @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, @@ -126,9 +131,7 @@ def get_assemble_scripts(self): # 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}", "{} install --no-cache-dir .".format(pip)) - ) + assemble_scripts.append(("${NB_USER}", f"{pip} install --no-cache-dir .")) return assemble_scripts def detect(self): diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 243799c12..f2b189881 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -1,12 +1,17 @@ -import re -import os import datetime -import requests +import os +import re +from functools import lru_cache +import requests from ..semver import parse_version as V -from .python import PythonBuildPack from ._r_base import rstudio_base_scripts +from .python import PythonBuildPack + +# Aproximately the first snapshot on RSPM (Posit package manager) +# that seems to have a working IRKernel. +RSPM_CUTOFF_DATE = datetime.date(2018, 12, 7) class RBuildPack(PythonBuildPack): @@ -137,7 +142,7 @@ def detect(self): # no R snapshot date set through runtime.txt # Set it to two days ago from today self._checkpoint_date = self.mran_date(datetime.date.today()) - self._runtime = "r-{}".format(str(self._checkpoint_date)) + self._runtime = f"r-{str(self._checkpoint_date)}" return True def mran_date(self, date): @@ -151,6 +156,7 @@ def mran_date(self, date): year = date.year if date.month > 3 else date.year - 1 return datetime.date(year, qmon, 1) + @lru_cache() def get_env(self): """ Set custom env vars needed for RStudio to load @@ -165,6 +171,7 @@ def get_env(self): ("LD_LIBRARY_PATH", "${R_HOME}/lib:${LD_LIBRARY_PATH}"), ] + @lru_cache() def get_path(self): """ Return paths to be added to the PATH environment variable. @@ -174,6 +181,7 @@ def get_path(self): """ return super().get_path() + ["/usr/lib/rstudio-server/bin/"] + @lru_cache() def get_build_env(self): """ Return environment variables to be set. @@ -187,6 +195,7 @@ def get_build_env(self): ("R_LIBS_USER", "${APP_BASE}/rlibs") ] + @lru_cache() def get_packages(self): """ Return list of packages to be installed. @@ -200,10 +209,12 @@ def get_packages(self): "libapparmor1", "sudo", "lsb-release", + "libssl-dev", ] return super().get_packages().union(packages) + @lru_cache() def get_rspm_snapshot_url(self, snapshot_date, max_days_prior=7): for i in range(max_days_prior): snapshots = requests.post( @@ -219,7 +230,10 @@ def get_rspm_snapshot_url(self, snapshot_date, max_days_prior=7): # Construct a snapshot URL that will give us binary packages for Ubuntu Bionic (18.04) if "upsi" in snapshots: return ( - "https://packagemanager.posit.co/all/__linux__/bionic/" + # Env variables here are expanded by envsubst in the Dockerfile, after sourcing + # /etc/os-release. This allows us to use distro specific variables here to get + # appropriate binary packages without having to hard code version names here. + "https://packagemanager.posit.co/all/__linux__/${VERSION_CODENAME}/" + snapshots["upsi"] ) raise ValueError( @@ -228,29 +242,7 @@ def get_rspm_snapshot_url(self, snapshot_date, max_days_prior=7): ) ) - def get_mran_snapshot_url(self, snapshot_date, max_days_prior=7): - for i in range(max_days_prior): - try_date = snapshot_date - datetime.timedelta(days=i) - # Fall back to MRAN if packagemanager.posit.co doesn't have it - url = "https://mran.microsoft.com/snapshot/{}".format(try_date.isoformat()) - r = requests.head(url) - if r.ok: - return url - raise ValueError( - "No snapshot found for {} or {} days prior in mran.microsoft.com".format( - snapshot_date.strftime("%Y-%m-%d"), max_days_prior - ) - ) - - def get_cran_mirror_url(self, snapshot_date): - # Date after which we will use rspm + binary packages instead of MRAN + source packages - rspm_cutoff_date = datetime.date(2022, 1, 1) - - if snapshot_date >= rspm_cutoff_date or self.r_version >= V("4.1"): - return self.get_rspm_snapshot_url(snapshot_date) - else: - return self.get_mran_snapshot_url(snapshot_date) - + @lru_cache() def get_devtools_snapshot_url(self): """ Return url of snapshot to use for getting devtools install @@ -262,8 +254,12 @@ def get_devtools_snapshot_url(self): # Hardcoded rather than dynamically determined from a date to avoid extra API calls # Plus, we can always use packagemanager.posit.co here as we always install the # necessary apt packages. - return "https://packagemanager.posit.co/all/__linux__/bionic/2022-01-04+Y3JhbiwyOjQ1MjYyMTU7NzlBRkJEMzg" + # Env variables here are expanded by envsubst in the Dockerfile, after sourcing + # /etc/os-release. This allows us to use distro specific variables here to get + # 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() def get_build_scripts(self): """ Return series of build-steps common to all R repositories @@ -283,9 +279,19 @@ def get_build_scripts(self): We set the snapshot date used to install R libraries from based on the contents of runtime.txt. """ + if self.checkpoint_date < RSPM_CUTOFF_DATE: + raise RuntimeError( + f'Microsoft killed MRAN, the source of R package snapshots before {RSPM_CUTOFF_DATE.strftime("%Y-%m-%d")}. ' + f'This repo has a snapshot date of {self.checkpoint_date.strftime("%Y-%m-%d")} specified in runtime.txt. ' + "Please use a newer snapshot date" + ) - cran_mirror_url = self.get_cran_mirror_url(self.checkpoint_date) + cran_mirror_url = self.get_rspm_snapshot_url(self.checkpoint_date) + if self.platform != "linux/amd64": + raise RuntimeError( + f"RStudio is only available for linux/amd64 ({self.platform})" + ) scripts = [ ( "root", @@ -338,24 +344,25 @@ def get_build_scripts(self): rf""" R RHOME && \ mkdir -p /etc/rstudio && \ - echo 'options(repos = c(CRAN = "{cran_mirror_url}"))' > /opt/R/{self.r_version}/lib/R/etc/Rprofile.site && \ - echo 'r-cran-repos={cran_mirror_url}' > /etc/rstudio/rsession.conf + EXPANDED_CRAN_MIRROR_URL="$(. /etc/os-release && echo {cran_mirror_url} | envsubst)" && \ + echo "options(repos = c(CRAN = \"${{EXPANDED_CRAN_MIRROR_URL}}\"))" > /opt/R/{self.r_version}/lib/R/etc/Rprofile.site && \ + echo "r-cran-repos=${{EXPANDED_CRAN_MIRROR_URL}}" > /etc/rstudio/rsession.conf """, ), ( "${NB_USER}", # Install a pinned version of devtools, IRKernel and shiny - r""" - R --quiet -e "install.packages(c('devtools', 'IRkernel', 'shiny'), repos='{devtools_cran_mirror_url}')" && \ - R --quiet -e "IRkernel::installspec(prefix='$NB_PYTHON_PREFIX')" - """.format( - devtools_cran_mirror_url=self.get_devtools_snapshot_url() - ), + 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\"))" + """, ), ] return super().get_build_scripts() + scripts + @lru_cache() def get_preassemble_script_files(self): files = super().get_preassemble_script_files() installR_path = self.binder_path("install.R") @@ -364,6 +371,7 @@ def get_preassemble_script_files(self): return files + @lru_cache() def get_preassemble_scripts(self): """Install contents of install.R @@ -383,13 +391,13 @@ 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 - "Rscript %s && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages" - % installR_path, + f"Rscript {installR_path} && touch /tmp/.preassembled || true && rm -rf /tmp/downloaded_packages", ) ] return super().get_preassemble_scripts() + scripts + @lru_cache() def get_assemble_scripts(self): """Install the dependencies of or the repository itself""" assemble_scripts = super().get_assemble_scripts() @@ -401,9 +409,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 - """if [ ! -f /tmp/.preassembled ]; then Rscript {}; rm -rf /tmp/downloaded_packages; fi""".format( - installR_path - ), + f"""if [ ! -f /tmp/.preassembled ]; then Rscript {installR_path}; rm -rf /tmp/downloaded_packages; fi""", ) ] diff --git a/repo2docker/contentproviders/__init__.py b/repo2docker/contentproviders/__init__.py index 6398c233e..5c40476df 100755 --- a/repo2docker/contentproviders/__init__.py +++ b/repo2docker/contentproviders/__init__.py @@ -1,8 +1,8 @@ -from .git import Git from .base import Local -from .zenodo import Zenodo -from .figshare import Figshare from .dataverse import Dataverse +from .figshare import Figshare +from .git import Git from .hydroshare import Hydroshare from .mercurial import Mercurial from .swhid import Swhid +from .zenodo import Zenodo diff --git a/repo2docker/contentproviders/base.py b/repo2docker/contentproviders/base.py index f4f1cbbb0..672c39733 100644 --- a/repo2docker/contentproviders/base.py +++ b/repo2docker/contentproviders/base.py @@ -68,6 +68,6 @@ def detect(self, source, ref=None, extra_args=None): def fetch(self, spec, output_dir, yield_output=False): # nothing to be done if your content is already in the output directory - msg = "Local content provider assumes {} == {}".format(spec["path"], output_dir) + msg = f'Local content provider assumes {spec["path"]} == {output_dir}' assert output_dir == spec["path"], msg - yield "Using local repo {}.\n".format(spec["path"]) + yield f'Using local repo {spec["path"]}.\n' diff --git a/repo2docker/contentproviders/dataverse.py b/repo2docker/contentproviders/dataverse.py index a1c57caa9..9054f53ce 100644 --- a/repo2docker/contentproviders/dataverse.py +++ b/repo2docker/contentproviders/dataverse.py @@ -1,11 +1,10 @@ -import os import json +import os import shutil +from urllib.parse import parse_qs, urlparse, urlunparse -from urllib.parse import urlparse, urlunparse, parse_qs - -from .doi import DoiProvider from ..utils import copytree, deep_get +from .doi import DoiProvider class Dataverse(DoiProvider): @@ -20,7 +19,7 @@ class Dataverse(DoiProvider): def __init__(self): data_file = os.path.join(os.path.dirname(__file__), "dataverse.json") - with open(data_file, "r") as fp: + with open(data_file) as fp: self.hosts = json.load(fp)["installations"] super().__init__() @@ -76,9 +75,7 @@ def detect(self, doi, ref=None, extra_args=None): data = self.urlopen(search_url).json()["data"] if data["count_in_response"] != 1: self.log.debug( - "Dataverse search query failed!\n - doi: {}\n - url: {}\n - resp: {}\n".format( - doi, url, json.dump(data) - ) + f"Dataverse search query failed!\n - doi: {doi}\n - url: {url}\n - resp: {json.dump(data)}\n" ) return @@ -97,25 +94,29 @@ def fetch(self, spec, output_dir, yield_output=False): record_id = spec["record"] host = spec["host"] - yield "Fetching Dataverse record {}.\n".format(record_id) - url = "{}/api/datasets/:persistentId?persistentId={}".format( - host["url"], record_id - ) + yield f"Fetching Dataverse record {record_id}.\n" + url = f'{host["url"]}/api/datasets/:persistentId?persistentId={record_id}' resp = self.urlopen(url, headers={"accept": "application/json"}) record = resp.json()["data"] for fobj in deep_get(record, "latestVersion.files"): - file_url = "{}/api/access/datafile/{}".format( - host["url"], deep_get(fobj, "dataFile.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' ) - filename = os.path.join(fobj.get("directoryLabel", ""), fobj["label"]) + filename = fobj["label"] + original_filename = fobj["dataFile"].get("originalFileName", None) + if original_filename: + # replace preservation format filename (foo.tab) with original filename (foo.dta) + filename = original_filename + + filename_with_path = os.path.join(fobj.get("directoryLabel", ""), filename) - file_ref = {"download": file_url, "filename": filename} + file_ref = {"download": file_url, "filename": filename_with_path} fetch_map = {key: key for key in file_ref.keys()} - for line in self.fetch_file(file_ref, fetch_map, output_dir): - yield line + yield from self.fetch_file(file_ref, fetch_map, output_dir) new_subdirs = os.listdir(output_dir) # if there is only one new subdirectory move its contents diff --git a/repo2docker/contentproviders/doi.py b/repo2docker/contentproviders/doi.py index c1941ba83..03fa0171c 100644 --- a/repo2docker/contentproviders/doi.py +++ b/repo2docker/contentproviders/doi.py @@ -1,18 +1,15 @@ -import os import json -import shutil import logging - -from os import makedirs -from os import path -from requests import Session, HTTPError - +import os +import shutil +from os import makedirs, path from zipfile import ZipFile, is_zipfile -from .base import ContentProvider -from ..utils import copytree, deep_get -from ..utils import normalize_doi, is_doi +from requests import HTTPError, Session + from .. import __version__ +from ..utils import copytree, deep_get, is_doi, normalize_doi +from .base import ContentProvider class DoiProvider(ContentProvider): @@ -23,7 +20,7 @@ def __init__(self): self.session = Session() self.session.headers.update( { - "user-agent": "repo2docker {}".format(__version__), + "user-agent": f"repo2docker {__version__}", } ) @@ -38,7 +35,7 @@ def _urlopen(self, req, headers=None): if not isinstance(req, request.Request): req = request.Request(req) - req.add_header("User-Agent", "repo2docker {}".format(__version__)) + req.add_header("User-Agent", f"repo2docker {__version__}") if headers is not None: for key, value in headers.items(): req.add_header(key, value) @@ -52,7 +49,7 @@ def doi2url(self, doi): doi = normalize_doi(doi) try: - resp = self._request("https://doi.org/{}".format(doi)) + resp = self._request(f"https://doi.org/{doi}") resp.raise_for_status() # If the DOI doesn't resolve, just return URL except HTTPError: @@ -67,26 +64,26 @@ 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("Downloading file {} as {}\n".format(file_url, fname)) + logging.debug(f"Downloading file {file_url} as {fname}\n") - yield "Requesting {}\n".format(file_url) + yield f"Requesting {file_url}\n" resp = self._request(file_url, stream=True) resp.raise_for_status() if path.dirname(fname): sub_dir = path.join(output_dir, path.dirname(fname)) if not path.exists(sub_dir): - yield "Creating {}\n".format(sub_dir) + yield f"Creating {sub_dir}\n" makedirs(sub_dir, exist_ok=True) dst_fname = path.join(output_dir, fname) with open(dst_fname, "wb") as dst: - yield "Fetching {}\n".format(fname) + yield f"Fetching {fname}\n" for chunk in resp.iter_content(chunk_size=None): dst.write(chunk) if unzip and is_zipfile(dst_fname): - yield "Extracting {}\n".format(fname) + yield f"Extracting {fname}\n" zfile = ZipFile(dst_fname) zfile.extractall(path=output_dir) zfile.close() @@ -106,4 +103,4 @@ def fetch_file(self, file_ref, host, output_dir, unzip=False): copytree(path.join(output_dir, d), output_dir) shutil.rmtree(path.join(output_dir, d)) - yield "Fetched files: {}\n".format(os.listdir(output_dir)) + yield f"Fetched files: {os.listdir(output_dir)}\n" diff --git a/repo2docker/contentproviders/figshare.py b/repo2docker/contentproviders/figshare.py index 4b1517fc9..6c7b26c86 100644 --- a/repo2docker/contentproviders/figshare.py +++ b/repo2docker/contentproviders/figshare.py @@ -1,16 +1,14 @@ +import json import os import re -import json import shutil - -from os import makedirs -from os import path -from urllib.request import Request +from os import makedirs, path from urllib.error import HTTPError +from urllib.request import Request from zipfile import is_zipfile -from .doi import DoiProvider from ..utils import copytree, deep_get +from .doi import DoiProvider class Figshare(DoiProvider): @@ -75,11 +73,9 @@ def fetch(self, spec, output_dir, yield_output=False): article_version = spec["version"] host = spec["host"] - yield "Fetching Figshare article {} in version {}.\n".format( - article_id, article_version - ) + yield f"Fetching Figshare article {article_id} in version {article_version}.\n" resp = self.urlopen( - "{}{}/versions/{}".format(host["api"], article_id, article_version), + f'{host["api"]}{article_id}/versions/{article_version}', headers={"accept": "application/json"}, ) @@ -91,10 +87,9 @@ def fetch(self, spec, output_dir, yield_output=False): only_one_file = len(files) == 1 for file_ref in files: unzip = file_ref["name"].endswith(".zip") and only_one_file - for line in self.fetch_file(file_ref, host, output_dir, unzip): - yield line + yield from self.fetch_file(file_ref, host, output_dir, unzip) @property def content_id(self): """The Figshare article ID""" - return "{}.v{}".format(self.article_id, self.article_version) + return f"{self.article_id}.v{self.article_version}" diff --git a/repo2docker/contentproviders/git.py b/repo2docker/contentproviders/git.py index 345298c76..905fa4eee 100644 --- a/repo2docker/contentproviders/git.py +++ b/repo2docker/contentproviders/git.py @@ -1,7 +1,7 @@ import subprocess +from ..utils import R2dState, check_ref, execute_cmd from .base import ContentProvider, ContentProviderException -from ..utils import execute_cmd, check_ref, R2dState class Git(ContentProvider): @@ -29,13 +29,12 @@ def fetch(self, spec, output_dir, yield_output=False): # this prevents HEAD's submodules to be cloned if ref doesn't have them cmd.extend(["--no-checkout"]) cmd.extend([repo, output_dir]) - for line in execute_cmd(cmd, capture=yield_output): - yield line + yield from execute_cmd(cmd, capture=yield_output) except subprocess.CalledProcessError as e: - msg = "Failed to clone repository from {repo}".format(repo=repo) + msg = f"Failed to clone repository from {repo}" if ref != "HEAD": - msg += " (ref {ref})".format(ref=ref) + msg += f" (ref {ref})" msg += "." raise ContentProviderException(msg) from e @@ -44,33 +43,31 @@ def fetch(self, spec, output_dir, yield_output=False): hash = check_ref(ref, output_dir) if hash is None: self.log.error( - "Failed to check out ref %s", ref, extra=dict(phase=R2dState.FAILED) + f"Failed to check out ref {ref}", extra=dict(phase=R2dState.FAILED) ) - if ref == "master": + if ref == "master" or ref == "main": msg = ( - "Failed to check out the 'master' branch. " - "Maybe the default branch is not named 'master' " + f"Failed to check out the '{ref}' branch. " + f"Maybe the default branch is not named '{ref}' " "for this repository.\n\nTry not explicitly " "specifying `--ref`." ) else: - msg = "Failed to check out ref {}".format(ref) + msg = f"Failed to check out ref {ref}" raise ValueError(msg) # We don't need to explicitly checkout things as the reset will # take care of that. If the hash is resolved above, we should be # able to reset to it - for line in execute_cmd( + yield from execute_cmd( ["git", "reset", "--hard", hash], cwd=output_dir, capture=yield_output - ): - yield line + ) # ensure that git submodules are initialised and updated - for line in execute_cmd( + yield from execute_cmd( ["git", "submodule", "update", "--init", "--recursive"], cwd=output_dir, capture=yield_output, - ): - yield line + ) cmd = ["git", "rev-parse", "HEAD"] sha1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, cwd=output_dir) diff --git a/repo2docker/contentproviders/hydroshare.py b/repo2docker/contentproviders/hydroshare.py index 1cb8b6975..4104d97a6 100755 --- a/repo2docker/contentproviders/hydroshare.py +++ b/repo2docker/contentproviders/hydroshare.py @@ -1,14 +1,13 @@ -import zipfile +import json import os import shutil import time -import json -from datetime import datetime, timezone, timedelta - +import zipfile +from datetime import datetime, timedelta, timezone from urllib.request import urlretrieve -from .doi import DoiProvider from .base import ContentProviderException +from .doi import DoiProvider class Hydroshare(DoiProvider): @@ -59,9 +58,9 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): resource_id = spec["resource"] host = spec["host"] - bag_url = "{}{}".format(host["django_irods"], resource_id) + bag_url = f'{host["django_irods"]}{resource_id}' - yield "Downloading {}.\n".format(bag_url) + yield f"Downloading {bag_url}.\n" # bag downloads are prepared on demand and may need some time conn = self.urlopen(bag_url) @@ -76,13 +75,11 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): msg = "Bag taking too long to prepare, exiting now, try again later." yield msg raise ContentProviderException(msg) - yield "Bag is being prepared, requesting again in {} seconds.\n".format( - wait_time - ) + yield f"Bag is being prepared, requesting again in {wait_time} seconds.\n" time.sleep(wait_time) conn = self.urlopen(bag_url) if conn.status_code != 200: - msg = "Failed to download bag. status code {}.\n".format(conn.status_code) + msg = f"Failed to download bag. status code {conn.status_code}.\n" yield msg raise ContentProviderException(msg) # Bag creation seems to need a small time buffer after it says it's ready. @@ -102,4 +99,4 @@ def fetch(self, spec, output_dir, yield_output=False, timeout=120): @property def content_id(self): """The HydroShare resource ID""" - return "{}.v{}".format(self.resource_id, self.version) + return f"{self.resource_id}.v{self.version}" diff --git a/repo2docker/contentproviders/mercurial.py b/repo2docker/contentproviders/mercurial.py index 60d5f2fd8..e427cc022 100644 --- a/repo2docker/contentproviders/mercurial.py +++ b/repo2docker/contentproviders/mercurial.py @@ -1,7 +1,7 @@ import subprocess +from ..utils import R2dState, execute_cmd from .base import ContentProvider, ContentProviderException -from ..utils import execute_cmd, R2dState args_enabling_topic = ["--config", "extensions.topic="] @@ -41,8 +41,7 @@ def fetch(self, spec, output_dir, yield_output=False): # don't update so the clone will include an empty working # directory, the given ref will be updated out later cmd.extend(["--noupdate"]) - for line in execute_cmd(cmd, capture=yield_output): - yield line + yield from execute_cmd(cmd, capture=yield_output) except subprocess.CalledProcessError as error: msg = f"Failed to clone repository from {repo}" @@ -54,17 +53,16 @@ def fetch(self, spec, output_dir, yield_output=False): # check out the specific ref given by the user if ref is not None: try: - for line in execute_cmd( + yield from execute_cmd( ["hg", "update", "--clean", ref] + args_enabling_topic, cwd=output_dir, capture=yield_output, - ): - yield line + ) except subprocess.CalledProcessError: self.log.error( - "Failed to update to ref %s", ref, extra=dict(phase=R2dState.FAILED) + f"Failed to update to ref {ref}", extra=dict(phase=R2dState.FAILED) ) - raise ValueError("Failed to update to ref {}".format(ref)) + raise ValueError(f"Failed to update to ref {ref}") cmd = ["hg", "identify", "-i"] + args_enabling_topic sha1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, cwd=output_dir) diff --git a/repo2docker/contentproviders/swhid.py b/repo2docker/contentproviders/swhid.py index e20501770..18dc78a91 100644 --- a/repo2docker/contentproviders/swhid.py +++ b/repo2docker/contentproviders/swhid.py @@ -1,17 +1,16 @@ import io import os +import re import shutil import tarfile import time -import re - from os import path import requests -from .base import ContentProvider -from ..utils import copytree from .. import __version__ +from ..utils import copytree +from .base import ContentProvider def parse_swhid(swhid): @@ -34,12 +33,12 @@ def __init__(self): self.session = requests.Session() self.session.headers.update( { - "user-agent": "repo2docker {}".format(__version__), + "user-agent": f"repo2docker {__version__}", } ) def set_auth_token(self, token): - header = {"Authorization": "Bearer {}".format(token)} + header = {"Authorization": f"Bearer {token}"} self.session.headers.update(header) def _request(self, url, method="GET"): @@ -72,8 +71,8 @@ def detect(self, swhid, ref=None, extra_args=None): return {"swhid": swhid, "swhid_obj": swhid_dict} def fetch_directory(self, dir_hash, output_dir): - url = "{}/vault/directory/{}/".format(self.base_url, dir_hash) - yield "Fetching directory {} from {}\n".format(dir_hash, url) + url = f"{self.base_url}/vault/directory/{dir_hash}/" + yield f"Fetching directory {dir_hash} from {url}\n" resp = self._request(url, "POST") receipt = resp.json() status = receipt["status"] @@ -92,7 +91,7 @@ def fetch_directory(self, dir_hash, output_dir): # move its content one level up copytree(path.join(output_dir, dir_hash), output_dir) shutil.rmtree(path.join(output_dir, dir_hash)) - yield "Fetched files: {}\n".format(os.listdir(output_dir)) + yield f"Fetched files: {os.listdir(output_dir)}\n" def fetch(self, spec, output_dir, yield_output=False): swhid = spec["swhid"] @@ -101,12 +100,12 @@ def fetch(self, spec, output_dir, yield_output=False): if swhid_obj["type"] == "rev": # need to get the directory for this revision sha1git = swhid_obj["hash"] - url = "{}/revision/{}/".format(self.base_url, sha1git) - yield "Fetching revision {} from {}\n".format(sha1git, url) + url = f"{self.base_url}/revision/{sha1git}/" + yield f"Fetching revision {sha1git} from {url}\n" resp = self._request(url) assert resp.ok, (resp.content, self.session.headers) directory = resp.json()["directory"] - self.swhid = "swh:1:dir:{}".format(directory) + self.swhid = f"swh:1:dir:{directory}" yield from self.fetch_directory(directory, output_dir) elif swhid_obj["type"] == "dir": self.swhid = swhid diff --git a/repo2docker/contentproviders/zenodo.py b/repo2docker/contentproviders/zenodo.py index 7a5d09325..5d02f723b 100644 --- a/repo2docker/contentproviders/zenodo.py +++ b/repo2docker/contentproviders/zenodo.py @@ -1,14 +1,12 @@ -import os import json +import os import shutil - -from os import makedirs -from os import path -from urllib.request import Request +from os import makedirs, path from urllib.error import HTTPError +from urllib.request import Request -from .doi import DoiProvider from ..utils import copytree, deep_get +from .doi import DoiProvider class Zenodo(DoiProvider): @@ -66,9 +64,9 @@ def fetch(self, spec, output_dir, yield_output=False): record_id = spec["record"] host = spec["host"] - yield "Fetching Zenodo record {}.\n".format(record_id) + yield f"Fetching Zenodo record {record_id}.\n" resp = self.urlopen( - "{}{}".format(host["api"], record_id), + f'{host["api"]}{record_id}', headers={"accept": "application/json"}, ) @@ -77,10 +75,7 @@ def fetch(self, spec, output_dir, yield_output=False): files = deep_get(record, host["filepath"]) only_one_file = len(files) == 1 for file_ref in files: - for line in self.fetch_file( - file_ref, host, output_dir, unzip=only_one_file - ): - yield line + yield from self.fetch_file(file_ref, host, output_dir, unzip=only_one_file) @property def content_id(self): diff --git a/repo2docker/docker.py b/repo2docker/docker.py index 686a70db5..170eea3fb 100644 --- a/repo2docker/docker.py +++ b/repo2docker/docker.py @@ -2,9 +2,10 @@ Docker container engine for repo2docker """ -import docker -from traitlets import Dict from iso8601 import parse_date +from traitlets import Dict + +import docker from .engine import Container, ContainerEngine, ContainerEngineException, Image @@ -90,6 +91,7 @@ def build( fileobj=None, path="", labels=None, + platform=None, **kwargs, ): return self._apiclient.build( @@ -105,7 +107,7 @@ def build( fileobj=fileobj, path=path, labels=labels, - platform="linux/amd64", + platform=platform, **kwargs, ) @@ -118,6 +120,8 @@ def inspect_image(self, image): return Image(tags=image["RepoTags"], config=image["ContainerConfig"]) def push(self, image_spec): + if self.registry_credentials: + self._apiclient.login(**self.registry_credentials) return self._apiclient.push(image_spec, stream=True) def run( diff --git a/repo2docker/docker_utils.py b/repo2docker/docker_utils.py index d1cff3f7f..8531e96dc 100644 --- a/repo2docker/docker_utils.py +++ b/repo2docker/docker_utils.py @@ -5,7 +5,6 @@ import tarfile import tempfile import shutil -import json import subprocess import os diff --git a/repo2docker/engine.py b/repo2docker/engine.py index 9b5e92eb2..a8897a64e 100644 --- a/repo2docker/engine.py +++ b/repo2docker/engine.py @@ -2,9 +2,12 @@ Interface for a repo2docker container engine """ +import json +import os from abc import ABC, abstractmethod -from traitlets.config import LoggingConfigurable +from traitlets import Dict, default +from traitlets.config import LoggingConfigurable # Based on https://docker-py.readthedocs.io/en/4.2.0/containers.html @@ -131,7 +134,7 @@ def config(self): return self._config def __repr__(self): - return "Image(tags={},config={})".format(self.tags, self.config) + return f"Image(tags={self.tags},config={self.config})" class ContainerEngine(LoggingConfigurable): @@ -142,6 +145,37 @@ class ContainerEngine(LoggingConfigurable): Initialised with a reference to the parent so can also be configured using traitlets. """ + registry_credentials = Dict( + help=""" + Credentials dictionary, if set will be used to authenticate with + the registry. Typically this will include the keys: + + - `username`: The registry username + - `password`: The registry password or token + - `registry`: The registry URL + + This can also be set by passing a JSON object in the + CONTAINER_ENGINE_REGISTRY_CREDENTIALS environment variable. + """, + config=True, + ) + + @default("registry_credentials") + def _registry_credentials_default(self): + """ + Set the registry credentials from CONTAINER_ENGINE_REGISTRY_CREDENTIALS + """ + obj = os.getenv("CONTAINER_ENGINE_REGISTRY_CREDENTIALS") + if obj: + try: + return json.loads(obj) + except json.JSONDecodeError: + self.log.error( + "CONTAINER_ENGINE_REGISTRY_CREDENTIALS is not valid JSON" + ) + raise + return {} + string_output = True """ Whether progress events should be strings or an object. @@ -177,6 +211,7 @@ def build( fileobj=None, path="", labels=None, + platform=None, **kwargs, ): """ @@ -207,6 +242,8 @@ def build( path to the Dockerfile labels : dict Dictionary of labels to set on the image + platform: str + Platform to build for Returns ------- @@ -248,6 +285,9 @@ 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 diff --git a/repo2docker/utils.py b/repo2docker/utils.py index ef61814ba..9c2769e1d 100644 --- a/repo2docker/utils.py +++ b/repo2docker/utils.py @@ -1,13 +1,14 @@ -from contextlib import contextmanager -from enum import Enum -from functools import partial import os +import platform import re import subprocess -import chardet - -from shutil import copystat, copy2 +import warnings +from contextlib import contextmanager +from enum import Enum +from functools import partial +from shutil import copy2, copystat +import chardet from traitlets import Integer, TraitError @@ -136,13 +137,10 @@ def check_port(port): try: p = int(port) except ValueError as e: + raise ValueError(f'Port specification "{mapping}" has an invalid port.') + if not 0 < p <= 65535: raise ValueError( - 'Port specification "{}" has ' "an invalid port.".format(mapping) - ) - if p > 65535: - raise ValueError( - 'Port specification "{}" specifies ' - "a port above 65535.".format(mapping) + f'Port specification "{mapping}" specifies a port outside 1-65535.' ) return port @@ -152,8 +150,7 @@ def check_port_string(p): port, protocol = parts if protocol not in ("tcp", "udp"): raise ValueError( - 'Port specification "{}" has ' - "an invalid protocol.".format(mapping) + f'Port specification "{mapping}" has an invalid protocol.' ) elif len(parts) == 1: port = parts[0] @@ -168,7 +165,12 @@ def check_port_string(p): return ports for mapping in port_mappings: - parts = mapping.split(":") + if ":" in mapping: + parts = mapping.split(":") + else: + # single port '8888' specified, + # treat as '8888:8888' + parts = [mapping, mapping] *host, container_port = parts # just a port @@ -305,14 +307,14 @@ def validate(self, obj, value): num = float(value[:-1]) except ValueError: raise TraitError( - "{val} is not a valid memory specification. " - "Must be an int or a string with suffix K, M, G, T".format(val=value) + f"{value} is not a valid memory specification. " + "Must be an int or a string with suffix K, M, G, T" ) suffix = value[-1] if suffix not in self.UNIT_SUFFIXES: raise TraitError( - "{val} is not a valid memory specification. " - "Must be an int or a string with suffix K, M, G, T".format(val=value) + f"{value} is not a valid memory specification. " + "Must be an int or a string with suffix K, M, G, T" ) else: return int(float(num) * self.UNIT_SUFFIXES[suffix]) @@ -524,3 +526,22 @@ def is_local_pip_requirement(line): return True return False + + +def get_platform(): + """Return the target platform of the container image + + Returns either `linux/amd64` or `linux/arm64` + """ + m = platform.machine() + if m == "x86_64": + return "linux/amd64" + elif m == "aarch64": + # Linux reports aarch64 + return "linux/arm64" + elif m == "arm64": + # OSX reports arm64 + return "linux/arm64" + else: + warnings.warn(f"Unexpected platform '{m}', defaulting to linux/amd64") + return "linux/amd64" diff --git a/setup.py b/setup.py index e4eb16a0f..58abff7c0 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,8 @@ -from distutils.cmd import Command -from setuptools import setup, find_packages import sys +from distutils.cmd import Command + +from setuptools import find_packages, setup + import versioneer if sys.version_info[0] < 3: @@ -23,8 +25,8 @@ def finalize_options(self): pass def run(self): - from urllib.request import urlopen import json + from urllib.request import urlopen resp = urlopen(self.url, timeout=5) resp_body = resp.read() diff --git a/tests/base/node/README.md b/tests/base/node/README.md index 9b21a5000..09007cc86 100644 --- a/tests/base/node/README.md +++ b/tests/base/node/README.md @@ -1 +1 @@ -Test that node 12 and npm 6 are installed and runnable. +Test that node 16 and npm 8 are installed and runnable. diff --git a/tests/base/node/verify b/tests/base/node/verify index 7a4ba351a..8f662b65f 100755 --- a/tests/base/node/verify +++ b/tests/base/node/verify @@ -5,8 +5,14 @@ set -ex # check node system package and its version which node node --version -node --version | grep v16 +node --version | grep v18 +# 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 -npm --version | grep 8. diff --git a/tests/check-tmp b/tests/check-tmp new file mode 100755 index 000000000..6437c4371 --- /dev/null +++ b/tests/check-tmp @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +""" +Script to check for leftover files + +Checks a collection of temporary or cache directories, +to ensure we aren't wasting image size by forgetting cleanup steps. + +This script is run in every local repo image we test +""" + +import os +import sys +from subprocess import check_output +from textwrap import indent + +# directories larger than this are considered a failure +# a few little files here aren't a problem +THRESHOLD = 1 # in MB + +MB = 1024 * 1024 + +# the paths to check +# all of these locations +# should be cleaned up +# missing is okay +PATHS = [ + "/tmp/", + # check whole home? + # this shouldn't be empty, but for our tests (so far) it should be very small + # This is the easiest way to ensure we aren't leaving any unexpected files + # without knowing ahead of time where all possible caches might be (.npm, .cache, etc.) + "~/", + "/root/", +] + + +def du(path): + """Return disk usage in megabytes of a path""" + # -ks: get total size, reported in kilobytes + out = check_output(["du", "-Hks", path]) + return int(out.split(None, 1)[0]) / 1024 + + +def check_dir_size(path): + """Check the size of a directory + + Returns: + + True: directory size is below THRESHOLD or is missing + False: directory is larger than THRESHOLD + """ + path = os.path.expanduser(path) + + if not os.path.exists(path): + print("{path}: missing OK".format(**locals())) + return True + + size_mb = du(path) + print("{path}: {size_mb:.1f} MB".format(**locals()), end=" ") + if size_mb <= THRESHOLD: + print("OK") + return True + else: + print("FAIL") + # check size of files one-level deep (du only reports dirs) + for name in os.listdir(path): + subpath = os.path.join(path, name) + if os.path.isfile(subpath): + file_sz = os.stat(subpath).st_size / MB + if file_sz > 0.1: + print(" {file_sz:.1f}M {subpath}".format(**locals())) + # get report on all subdirs that are at least 100k + print( + indent( + check_output(["du", "-Hh", "-t", "100000", path]).decode("utf8"), " " + ) + ) + return False + + +def main(): + results = [check_dir_size(path) for path in PATHS] + if not all(results): + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/tests/conda/README.md b/tests/conda/README.md index 156976194..6f137f615 100644 --- a/tests/conda/README.md +++ b/tests/conda/README.md @@ -57,7 +57,7 @@ `--target-repo-dir` is meant to support custom paths where repositories can be copied to besides `${HOME}`. - + This test makes use of the `test-extra-args.yaml` file to influence additional arguments passed to `repo2docker` during the test. In this test, specify `--target-repo-dir=/srv/repo`. diff --git a/tests/conda/downgrade/environment.yml b/tests/conda/downgrade/environment.yml new file mode 100644 index 000000000..319f8d5dd --- /dev/null +++ b/tests/conda/downgrade/environment.yml @@ -0,0 +1,11 @@ +# originally xeus-cling@0.6.0 +# added python=3.9 pin because implicit downgrade of Python from 3.10 to 3.9 isn't allowed +name: xeus-cling +channels: + - conda-forge +dependencies: + - python=3.9 + - xeus-cling=0.6.0 + - xtensor=0.20.8 + - xtensor-blas=0.16.1 + - notebook diff --git a/tests/conda/downgrade/verify b/tests/conda/downgrade/verify new file mode 100755 index 000000000..07b409408 --- /dev/null +++ b/tests/conda/downgrade/verify @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +import json +import pprint +from subprocess import check_output + + +def json_sh(cmd): + """Run a command that produces JSON on stdout and return the parsed result""" + buf = check_output(cmd) + return json.loads(buf.decode("utf8", "replace")) + + +conda_pkg_list = json_sh(["conda", "list", "--json"]) +pprint.pprint(conda_pkg_list) +# make it a dict +pkgs = {pkg["name"]: pkg for pkg in conda_pkg_list} + +# base env resolved +assert pkgs["python"]["version"].startswith("3.9"), pkgs["python"] +assert "xeus-cling" in pkgs +assert pkgs["xeus-cling"]["version"] == "0.6.0" + +# verify downgrade +# 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 + +assert pkgs["openssl"]["version"].startswith("1.1.1"), pkgs["openssl"]["version"] +assert pkgs["python"]["version"] == "3.9.6", pkgs["python"]["version"] diff --git a/tests/conda/py-r-postbuild-file/verify.py b/tests/conda/py-r-postbuild-file/verify.py index 549a05a13..46ca44f25 100755 --- a/tests/conda/py-r-postbuild-file/verify.py +++ b/tests/conda/py-r-postbuild-file/verify.py @@ -4,8 +4,8 @@ def test_sys_version(): - """The default python version should be 3.7""" - assert sys.version_info[:2] == (3, 7) + """The default python version should be 3.10""" + assert sys.version_info[:2] == (3, 10) def test_there(): diff --git a/tests/conda/py2/verify b/tests/conda/py2/verify index b251755a6..da667ec25 100755 --- a/tests/conda/py2/verify +++ b/tests/conda/py2/verify @@ -1,7 +1,7 @@ #!/usr/bin/env python import sys -assert sys.version_info[:2] == (3, 7), sys.version +assert sys.version_info[:2] == (3, 10), sys.version # verify that we have Python 2 and Python 3 kernelspecs from jupyter_client.kernelspec import KernelSpecManager @@ -30,4 +30,4 @@ for pkg in pkgs: assert pkg["version"].startswith("2.7.") break else: - assert False, "python not found in %s" % pkg_names + assert False, f"python not found in {pkg_names}" diff --git a/tests/conda/py35-binder-dir/verify b/tests/conda/py35-binder-dir/verify index c43376a87..8cd1f0a9b 100755 --- a/tests/conda/py35-binder-dir/verify +++ b/tests/conda/py35-binder-dir/verify @@ -1,17 +1,28 @@ #!/usr/bin/env python +import os import sys -from subprocess import check_output +from subprocess import STDOUT, check_output -assert sys.version_info[:2] == (3, 5), sys.version +assert sys.version_info[:2] == (3, 10), sys.version -out = check_output(["micromamba", "--version"]).decode("utf8").strip() -assert out == "0.25.0", out -out = check_output(["mamba", "--version"]).decode("utf8").strip() +def sh(cmd, **kwargs): + return check_output(cmd, **kwargs).decode("utf8").strip() + + +kernel_python = os.path.join(os.environ["KERNEL_PYTHON_PREFIX"], "bin", "python") +out = sh([kernel_python, "--version"], stderr=STDOUT) +v = out.split()[1] +assert v[:3] == "3.5", out + +out = sh(["micromamba", "--version"]) +assert out == "1.4.0", out + +out = sh(["mamba", "--version"]) assert ( out - == """mamba 0.25.0 -conda 4.13.0""" + == """mamba 1.4.0 +conda 23.1.0""" ), out -import numpy +sh([kernel_python, "-c", "import numpy"]) diff --git a/tests/conda/py36-postBuild/environment.yml b/tests/conda/py36-postBuild/environment.yml new file mode 100644 index 000000000..c6ce14436 --- /dev/null +++ b/tests/conda/py36-postBuild/environment.yml @@ -0,0 +1,3 @@ +dependencies: + - python=3.6 + - numpy diff --git a/tests/conda/py36-postBuild/postBuild b/tests/conda/py36-postBuild/postBuild new file mode 100755 index 000000000..cf0db0125 --- /dev/null +++ b/tests/conda/py36-postBuild/postBuild @@ -0,0 +1,9 @@ +#!/bin/bash +set -ex + +# mamba/conda installs in kernel env +mamba install -y make + +# note `pip` on path is _not_ the kernel env! +# is this what we (or users) want? +pip install pytest diff --git a/tests/conda/py36-postBuild/verify b/tests/conda/py36-postBuild/verify new file mode 100755 index 000000000..e576d7ab5 --- /dev/null +++ b/tests/conda/py36-postBuild/verify @@ -0,0 +1,3 @@ +#!/bin/bash +set -ex +pytest -vs ./verify.py diff --git a/tests/conda/py36-postBuild/verify.py b/tests/conda/py36-postBuild/verify.py new file mode 100644 index 000000000..78c47c3e9 --- /dev/null +++ b/tests/conda/py36-postBuild/verify.py @@ -0,0 +1,85 @@ +""" +tests to be run with pytest inside the container + +can't be called test_whatever.py because then _host_ pytest will try to run it! +""" + +import json +import os +import shutil +from subprocess import check_output + +from pytest import fixture + +kernel_prefix = os.environ.get("KERNEL_PYTHON_PREFIX") +server_prefix = os.environ.get("NB_PYTHON_PREFIX") + + +def json_cmd(cmd): + """Run a command and decode its JSON output""" + out = check_output(cmd) + return json.loads(out.decode("utf8", "replace")) + + +def conda_pkgs(prefix): + """Conda package list as a dict""" + conda_json = json_cmd(["conda", "list", "--json", "-p", prefix]) + return {pkg["name"]: pkg for pkg in conda_json} + + +def pip_pkgs(prefix): + """Pip package list as a dict""" + pip_json = json_cmd([f"{prefix}/bin/pip", "list", "--format=json"]) + return {pkg["name"]: pkg for pkg in pip_json} + + +@fixture(scope="session") +def kernel_conda(): + return conda_pkgs(kernel_prefix) + + +@fixture(scope="session") +def server_conda(): + return conda_pkgs(server_prefix) + + +@fixture(scope="session") +def kernel_pip(): + return pip_pkgs(kernel_prefix) + + +@fixture(scope="session") +def server_pip(): + return pip_pkgs(server_prefix) + + +def test_which_python(): + # server python comes first. Is this expected? + assert shutil.which("python3") == f"{server_prefix}/bin/python3" + + +def test_kernel_env(kernel_conda): + assert kernel_prefix != server_prefix + kernel_python = kernel_conda["python"]["version"] + assert kernel_python[:3] == "3.6" + # test environment.yml packages + assert "numpy" in kernel_conda + + +def test_server_env(server_conda): + # this should be the default version + # it will need updating when the default changes + assert server_conda["python"]["version"].split(".")[:2] == ["3", "10"] + + +def test_conda_install(kernel_conda, server_conda): + # test that postBuild conda install went in the kernel env + assert "make" in kernel_conda + assert "make" not in server_conda + + +def test_pip_install(kernel_pip, server_pip): + # server env comes first for pip + # is this expected? + assert "pytest" not in kernel_pip + assert "pytest" in server_pip diff --git a/tests/conda/r3.6-target-repo-dir-flag/verify.py b/tests/conda/r3.6-target-repo-dir-flag/verify.py index 706dc41a9..701278364 100755 --- a/tests/conda/r3.6-target-repo-dir-flag/verify.py +++ b/tests/conda/r3.6-target-repo-dir-flag/verify.py @@ -1,6 +1,7 @@ #!/usr/bin/env python -import sys import os +import sys +from glob import glob # conda should still be in /srv/conda # and Python should still be in $NB_PYTHON_PREFIX @@ -15,3 +16,12 @@ # Repo should be writable assert os.access("/srv/repo", os.W_OK) + +# All files in repo dir should be readable and writeable +for path in glob("/src/repo/**/*", recursive=True): + assert os.access(path, os.R_OK) + assert os.access(path, os.W_OK) + +# Should be able to make a new file +with open("/srv/repo/writeable", "w") as fp: + fp.write("writeable") diff --git a/tests/conftest.py b/tests/conftest.py index 46860ab2f..a09ef0420 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,27 +1,37 @@ """ Custom test collector for our integration tests. -Each directory that has a script named 'verify' is considered -a test. jupyter-repo2docker is run on that directory, -and then ./verify is run inside the built container. It should -return a non-zero exit code for the test to be considered a -success. + +Test lifecycle: +- Find all directories that contain `verify` or `*.repos.yaml` +- If `verify` is found: + - Run `jupyter-repo2docker` on the test directory. + - Extra arguments may be added as YAML list of strings in `extra-args.yaml`. + - Run `./verify` inside the built container. + - It should return a non-zero exit code for the test to be considered a + successful. +- If a `*.repos.yaml` is found: + - For each entry of the form `{name, url, ref, verify}` + - Run `jupyter-repo2docker` with the `url` and `ref` + - Run the `verify` inside the built container """ import os import pipes import shlex -import requests import subprocess import time - from tempfile import TemporaryDirectory +import escapism import pytest +import requests import yaml from repo2docker.__main__ import make_r2d +TESTS_DIR = os.path.abspath(os.path.dirname(__file__)) + def pytest_collect_file(parent, path): if path.basename == "verify": @@ -30,12 +40,20 @@ def pytest_collect_file(parent, path): return RemoteRepoList.from_parent(parent, fspath=path) -def make_test_func(args): +def make_test_func(args, skip_build=False, extra_run_kwargs=None): """Generate a test function that runs repo2docker""" def test(): app = make_r2d(args) app.initialize() + if extra_run_kwargs: + app.extra_run_kwargs.update(extra_run_kwargs) + if skip_build: + + def build_noop(): + print("Skipping build") + + app.skip_build = build_noop if app.run_cmd: # verify test, run it app.start() @@ -46,7 +64,7 @@ def test(): container = app.start_container() port = app.port # wait a bit for the container to be ready - container_url = "http://localhost:%s/api" % port + container_url = f"http://localhost:{port}/api" # give the container a chance to start time.sleep(1) try: @@ -58,13 +76,13 @@ def test(): try: info = requests.get(container_url).json() except Exception as e: - print("Error: %s" % e) + print(f"Error: {e}") time.sleep(i * 3) else: print(info) success = True break - assert success, "Notebook never started in %s" % container + assert success, f"Notebook never started in {container}" finally: # stop the container container.stop() @@ -82,6 +100,14 @@ def run_test(args): return run_test +@pytest.fixture() +def base_image(): + """ + Base ubuntu image to use when testing specific BuildPacks + """ + return "buildpack-deps:bionic" + + def _add_content_to_git(repo_dir): """Add content to file 'test' in git repository and commit.""" # use append mode so this can be called multiple times @@ -121,7 +147,7 @@ def repo_with_content(git_repo): yield git_repo, sha1 -@pytest.fixture() +@pytest.fixture def repo_with_submodule(): """Create a git repository with a git submodule in a non-master branch. @@ -134,15 +160,13 @@ def repo_with_submodule(): the submodule yet. """ - with TemporaryDirectory() as git_a_dir, TemporaryDirectory() as git_b_dir: + submodule_repo = "https://github.com/binderhub-ci-repos/requirements" + submod_sha1_b = "20c4fe55a9b2c5011d228545e821b1c7b1723652" + + with TemporaryDirectory() as git_a_dir: # create "parent" repository subprocess.check_call(["git", "init"], cwd=git_a_dir) _add_content_to_git(git_a_dir) - # create repository with 2 commits that will be the submodule - subprocess.check_call(["git", "init"], cwd=git_b_dir) - _add_content_to_git(git_b_dir) - submod_sha1_b = _get_sha1(git_b_dir) - _add_content_to_git(git_b_dir) # create a new branch in the parent without any submodule subprocess.check_call( @@ -153,7 +177,14 @@ def repo_with_submodule(): ["git", "checkout", "-b", "branch-with-submod"], cwd=git_a_dir ) subprocess.check_call( - ["git", "submodule", "add", git_b_dir, "submod"], cwd=git_a_dir + [ + "git", + "submodule", + "add", + submodule_repo, + "submod", + ], + cwd=git_a_dir, ) # checkout the first commit for the submod, not the latest subprocess.check_call( @@ -171,20 +202,24 @@ def repo_with_submodule(): class Repo2DockerTest(pytest.Function): """A pytest.Item for running repo2docker""" - def __init__(self, name, parent, args=None): + def __init__( + self, name, parent, args=None, skip_build=False, extra_run_kwargs=None + ): self.args = args self.save_cwd = os.getcwd() - f = parent.obj = make_test_func(args) + f = parent.obj = make_test_func( + args, skip_build=skip_build, extra_run_kwargs=extra_run_kwargs + ) super().__init__(name, parent, callobj=f) def reportinfo(self): - return self.parent.fspath, None, "" + return (self.parent.fspath, None, "") def repr_failure(self, excinfo): err = excinfo.value if isinstance(err, SystemExit): - cmd = "jupyter-repo2docker %s" % " ".join(map(pipes.quote, self.args)) - return "%s | exited with status=%s" % (cmd, err.code) + cmd = f'jupyter-repo2docker {" ".join(map(pipes.quote, self.args))}' + return f"{cmd} | exited with status={err.code}" else: return super().repr_failure(excinfo) @@ -204,11 +239,35 @@ def collect(self): extra_args = yaml.safe_load(f) args += extra_args + print(self.fspath.basename, self.fspath.dirname, str(self.fspath)) + # re-use image name for multiple tests of the same image + # so we don't run through the build twice + rel_repo_dir = os.path.relpath(self.fspath.dirname, TESTS_DIR) + image_name = f"r2d-tests-{escapism.escape(rel_repo_dir, escape_char='-').lower()}-{int(time.time())}" + args.append(f"--image-name={image_name}") args.append(self.fspath.dirname) - yield Repo2DockerTest.from_parent(self, name="build", args=args) + + yield Repo2DockerTest.from_parent( + self, + name=self.fspath.basename, + args=args + ["./verify"], + skip_build=True, + ) + + # mount the tests dir as a volume + check_tmp_args = ( + args[:-1] + + ["--volume", f"{TESTS_DIR}:/io/tests"] + + [args[-1], "/io/tests/check-tmp"] + ) + yield Repo2DockerTest.from_parent( - self, name=self.fspath.basename, args=args + ["./verify"] + self, + name="check-tmp", + args=check_tmp_args, + skip_build=True, + extra_run_kwargs={"user": "root"}, ) diff --git a/tests/external/reproductions.repos.yaml b/tests/external/reproductions.repos.yaml index d019bc10e..d0ac496cd 100644 --- a/tests/external/reproductions.repos.yaml +++ b/tests/external/reproductions.repos.yaml @@ -10,30 +10,24 @@ ref: b8259dac9eb verify: python -c 'import matplotlib' # Test that a full remote/ref works -- name: Binder Examples - Requirements +- name: Binder Examples - Requirements - origin/main url: https://github.com/binder-examples/requirements - ref: origin/master + ref: origin/main verify: python -c 'import matplotlib' # Test that ref is added to branch if not present -- name: Binder Examples - Requirements +- name: Binder Examples - Requirements - main url: https://github.com/binder-examples/requirements - ref: master + ref: main verify: python -c 'import matplotlib' # Test that tags work + ref is added to tag if not present -- name: Binder Examples - Requirements +- name: Binder Examples - Requirements - tag url: https://github.com/binder-examples/requirements - ref: python-3.7 + ref: python-3.8 verify: python -c 'import matplotlib' -# Test that custom channels and downgrades don't -# get blocked by pinning -- name: Xeus-Cling - url: https://github.com/QuantStack/xeus-cling - ref: 0.6.0 - verify: jupyter kernelspec list # Zenodo record of https://github.com/binder-examples/requirements - name: 10.5281/zenodo.3242074 url: 10.5281/zenodo.3242074 - verify: python -c 'import matplotlib' + verify: /srv/conda/envs/kernel/bin/python -c 'import matplotlib' # Test that files in git-lfs are properly cloned - name: LFS url: https://github.com/binderhub-ci-repos/lfs diff --git a/tests/julia/README.md b/tests/julia/README.md index f6d2996f9..be3277c33 100644 --- a/tests/julia/README.md +++ b/tests/julia/README.md @@ -13,11 +13,13 @@ - Tests use of a `Project.toml` file for Julia, using the repo2docker default version of Julia as specified in `julia_project.py`. -### project-1.0.2 +### project-1.0.2-binder-dir - Tests use of a `Project.toml` file for Julia, using a version of Julia specified via `julia = "=1.0.2"` in `Project.toml`'s `[compat]` section. +- Test use of a `.binder` directory. + ### require - Tests use of a `REQUIRE` file for Julia, using the repo2docker default version diff --git a/tests/julia/project-1.0.2/Project.toml b/tests/julia/project-1.0.2-binder-dir/.binder/Project.toml similarity index 100% rename from tests/julia/project-1.0.2/Project.toml rename to tests/julia/project-1.0.2-binder-dir/.binder/Project.toml diff --git a/tests/julia/project-1.0.2-binder-dir/Project.toml b/tests/julia/project-1.0.2-binder-dir/Project.toml new file mode 100644 index 000000000..6fdcca7fa --- /dev/null +++ b/tests/julia/project-1.0.2-binder-dir/Project.toml @@ -0,0 +1,8 @@ +# A broken Project.toml, but the idea is that the test should ignore this file +# anyhow as there is a .binder folder. +# +[deps] +IteratorInterfaceExtensions = "invalid" + +[compat] +julia = "=1.0.invalid" diff --git a/tests/julia/project-1.0.2/verify b/tests/julia/project-1.0.2-binder-dir/verify similarity index 100% rename from tests/julia/project-1.0.2/verify rename to tests/julia/project-1.0.2-binder-dir/verify diff --git a/tests/memlimit/.gitignore b/tests/memlimit/.gitignore deleted file mode 100644 index 1320de820..000000000 --- a/tests/memlimit/.gitignore +++ /dev/null @@ -1 +0,0 @@ -cachebust diff --git a/tests/memlimit/dockerfile/Dockerfile b/tests/memlimit/dockerfile/Dockerfile deleted file mode 100644 index 9513e5e44..000000000 --- a/tests/memlimit/dockerfile/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM ubuntu:bionic - -RUN apt-get update && apt-get install --yes python3 - -COPY . . -RUN ./postBuild diff --git a/tests/memlimit/dockerfile/postBuild b/tests/memlimit/dockerfile/postBuild deleted file mode 100755 index af9f9a3b4..000000000 --- a/tests/memlimit/dockerfile/postBuild +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python3 -""" -Simplest program that tries to allocate a large amount of RAM. - -malloc lies on Linux by default, so we use memset to force the -kernel to actually give us real memory. - -NOTE: This file has to be duplicated & present in all the following locations: - - tests/memlimit/dockerfile/postBuild - - tests/memlimit/dockerfile/postBuild -See https://github.com/jupyterhub/repo2docker/issues/160 for reason -""" -from ctypes import cdll, c_void_p, memset -import os - -libc = cdll.LoadLibrary("libc.so.6") -libc.malloc.restype = c_void_p - -with open("mem_allocate_mb") as f: - mem_allocate_mb = int(f.read().strip()) - -size = 1024 * 1024 * mem_allocate_mb -print("trying to allocate {}MB".format(mem_allocate_mb)) - -ret = libc.malloc(size) - -memset(ret, 0, size) diff --git a/tests/memlimit/non-dockerfile/postBuild b/tests/memlimit/non-dockerfile/postBuild deleted file mode 100755 index af9f9a3b4..000000000 --- a/tests/memlimit/non-dockerfile/postBuild +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python3 -""" -Simplest program that tries to allocate a large amount of RAM. - -malloc lies on Linux by default, so we use memset to force the -kernel to actually give us real memory. - -NOTE: This file has to be duplicated & present in all the following locations: - - tests/memlimit/dockerfile/postBuild - - tests/memlimit/dockerfile/postBuild -See https://github.com/jupyterhub/repo2docker/issues/160 for reason -""" -from ctypes import cdll, c_void_p, memset -import os - -libc = cdll.LoadLibrary("libc.so.6") -libc.malloc.restype = c_void_p - -with open("mem_allocate_mb") as f: - mem_allocate_mb = int(f.read().strip()) - -size = 1024 * 1024 * mem_allocate_mb -print("trying to allocate {}MB".format(mem_allocate_mb)) - -ret = libc.malloc(size) - -memset(ret, 0, size) diff --git a/tests/pipfile/py2-with-server-and-kernel-req/verify b/tests/pipfile/py2-with-server-and-kernel-req/verify index 7246be615..5ff8a889c 100755 --- a/tests/pipfile/py2-with-server-and-kernel-req/verify +++ b/tests/pipfile/py2-with-server-and-kernel-req/verify @@ -2,7 +2,6 @@ import os import sys - # Verify - kernel's Python: use Python 2 print(sys.version_info) assert sys.version_info[:2] == (2, 7) diff --git a/tests/pipfile/py36/verify b/tests/pipfile/py36/verify index f71a6daa8..f54d226ad 100755 --- a/tests/pipfile/py36/verify +++ b/tests/pipfile/py36/verify @@ -1,8 +1,8 @@ -#!/usr/bin/env python +#!/srv/conda/envs/kernel/bin/python import sys -import pypi_pkg_test -import there - print(sys.version_info) assert sys.version_info[:2] == (3, 6) + +import pypi_pkg_test # noqa +import there # noqa diff --git a/tests/pipfile/setup-py-explicit-in-binder-dir/setup.py b/tests/pipfile/setup-py-explicit-in-binder-dir/setup.py index c67a722a7..ca077f415 100644 --- a/tests/pipfile/setup-py-explicit-in-binder-dir/setup.py +++ b/tests/pipfile/setup-py-explicit-in-binder-dir/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import find_packages, setup setup( name="Dummy", diff --git a/tests/pipfile/setup-py-explicit-in-binder-dir/verify b/tests/pipfile/setup-py-explicit-in-binder-dir/verify index 4c6eaf1e0..80f73003f 100755 --- a/tests/pipfile/setup-py-explicit-in-binder-dir/verify +++ b/tests/pipfile/setup-py-explicit-in-binder-dir/verify @@ -1,6 +1,6 @@ #!/usr/bin/env python -import there import dummy # This package should be available, as it was a dependency for dummy import pypi_pkg_test +import there diff --git a/tests/pipfile/setup-py-explicit/setup.py b/tests/pipfile/setup-py-explicit/setup.py index c67a722a7..ca077f415 100644 --- a/tests/pipfile/setup-py-explicit/setup.py +++ b/tests/pipfile/setup-py-explicit/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import find_packages, setup setup( name="Dummy", diff --git a/tests/pipfile/setup-py-explicit/verify b/tests/pipfile/setup-py-explicit/verify index 4c6eaf1e0..80f73003f 100755 --- a/tests/pipfile/setup-py-explicit/verify +++ b/tests/pipfile/setup-py-explicit/verify @@ -1,6 +1,6 @@ #!/usr/bin/env python -import there import dummy # This package should be available, as it was a dependency for dummy import pypi_pkg_test +import there diff --git a/tests/pipfile/setup-py-implicit/setup.py b/tests/pipfile/setup-py-implicit/setup.py index c67a722a7..ca077f415 100644 --- a/tests/pipfile/setup-py-implicit/setup.py +++ b/tests/pipfile/setup-py-implicit/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import find_packages, setup setup( name="Dummy", diff --git a/tests/r/README.md b/tests/r/README.md index 61df6db48..51488e41f 100644 --- a/tests/r/README.md +++ b/tests/r/README.md @@ -24,18 +24,6 @@ `runtime.txt` is omitted and a recent enough snapshot date is assumed a RSPM snapshot of CRAN to be used. -### r3.6-mran - -- Test setup of a R 3.6 environment by specifying `r-3.6-...` in `runtime.txt`, - where the date provided in `runtime.txt` is old enough for a MRAN snapshot of - CRAN to be used. - -### r4.0-mran - -- Test setup of a R 4.0 environment by specifying `r-4.0-...` in `runtime.txt`, - where the date provided in `runtime.txt` is old enough for a MRAN snapshot of - CRAN to be used. - ### r4.0-rspm - Test setup of a R 4.0 environment by specifying `r-4.0-...` in `runtime.txt`, diff --git a/tests/r/r3.6-mran/runtime.txt b/tests/r/r3.6-mran/runtime.txt deleted file mode 100644 index 308424ab2..000000000 --- a/tests/r/r3.6-mran/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -r-3.6-2016-01-03 diff --git a/tests/r/r3.6-mran/install.R b/tests/r/r3.6-rspm/install.R similarity index 100% rename from tests/r/r3.6-mran/install.R rename to tests/r/r3.6-rspm/install.R diff --git a/tests/r/r3.6-rspm/runtime.txt b/tests/r/r3.6-rspm/runtime.txt new file mode 100644 index 000000000..ef918a220 --- /dev/null +++ b/tests/r/r3.6-rspm/runtime.txt @@ -0,0 +1 @@ +r-3.6-2018-12-07 diff --git a/tests/r/r3.6-mran/verify b/tests/r/r3.6-rspm/verify similarity index 63% rename from tests/r/r3.6-mran/verify rename to tests/r/r3.6-rspm/verify index 26f561028..475dd91f8 100755 --- a/tests/r/r3.6-mran/verify +++ b/tests/r/r3.6-rspm/verify @@ -7,7 +7,7 @@ if (!(version$major == "3" && as.double(version$minor) >= 6 && as.double(version quit("yes", 1) } -# Fail if MRAN isn't the configured CRAN mirror -if (!(startsWith(options()$repos["CRAN"], "https://mran.microsoft.com"))) { +# Fail if RSPM isn't the configured CRAN mirror +if (!(startsWith(options()$repos["CRAN"], "https://packagemanager.posit.co"))) { quit("yes", 1) } diff --git a/tests/r/r4.0-mran/install.R b/tests/r/r4.0-mran/install.R deleted file mode 100644 index f609959ef..000000000 --- a/tests/r/r4.0-mran/install.R +++ /dev/null @@ -1 +0,0 @@ -install.packages("digest") diff --git a/tests/r/r4.0-mran/runtime.txt b/tests/r/r4.0-mran/runtime.txt deleted file mode 100644 index b051a4326..000000000 --- a/tests/r/r4.0-mran/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -r-4.0-2021-07-07 diff --git a/tests/r/r4.0-mran/verify b/tests/r/r4.0-mran/verify deleted file mode 100755 index b821ec6cc..000000000 --- a/tests/r/r4.0-mran/verify +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env Rscript -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)) { - quit("yes", 1) -} - -# The date we have chosen should give us an MRAN mirror -if (!(startsWith(options()$repos["CRAN"], "https://mran.microsoft.com"))) { - quit("yes", 1) -} \ No newline at end of file diff --git a/tests/unit/contentproviders/test_dataverse.py b/tests/unit/contentproviders/test_dataverse.py index 3d912a7b9..abdfe456d 100644 --- a/tests/unit/contentproviders/test_dataverse.py +++ b/tests/unit/contentproviders/test_dataverse.py @@ -1,19 +1,19 @@ import json import os -import pytest import re - from io import BytesIO from tempfile import TemporaryDirectory from unittest.mock import patch -from urllib.request import urlopen, Request +from urllib.parse import urlsplit +from urllib.request import Request, urlopen -from repo2docker.contentproviders import Dataverse +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")) +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 = [ ( [ @@ -96,7 +96,6 @@ def doi_resolver(req, context): @pytest.fixture def dv_files(tmpdir): - f1 = tmpdir.join("some-file.txt") f1.write("some content") @@ -133,7 +132,8 @@ def test_dataverse_fetch(dv_files, requests_mock): spec = {"host": harvard_dv, "record": "doi:10.7910/DVN/6ZXAGT"} def mock_filecontent(req, context): - file_no = int(req.url.split("/")[-1]) - 1 + parts = urlsplit(req.url) + file_no = int(parts.path.split("/")[-1]) - 1 return open(dv_files[file_no], "rb").read() requests_mock.get( @@ -153,7 +153,7 @@ def mock_filecontent(req, context): for l in dv.fetch(spec, d): output.append(l) unpacked_files = set(os.listdir(d)) - expected = set(["directory", "some-file.txt"]) + expected = {"directory", "some-file.txt"} assert expected == unpacked_files assert os.path.isfile( os.path.join(d, "directory", "subdirectory", "the-other-file.txt") diff --git a/tests/unit/contentproviders/test_doi.py b/tests/unit/contentproviders/test_doi.py index dbe391604..dab3d7fcd 100644 --- a/tests/unit/contentproviders/test_doi.py +++ b/tests/unit/contentproviders/test_doi.py @@ -1,17 +1,17 @@ import json +import logging import os import re -import urllib -import pytest import tempfile -import logging - -from unittest.mock import patch, MagicMock, mock_open +import urllib +from unittest.mock import MagicMock, mock_open, patch from zipfile import ZipFile -from repo2docker.contentproviders.doi import DoiProvider -from repo2docker.contentproviders.base import ContentProviderException +import pytest + from repo2docker import __version__ +from repo2docker.contentproviders.base import ContentProviderException +from repo2docker.contentproviders.doi import DoiProvider def test_content_id(): @@ -27,7 +27,7 @@ def test_url_headers(requests_mock): result = doi.urlopen("https://mybinder.org", headers=headers) assert "test1" in result.request.headers assert "Test2" in result.request.headers - assert result.request.headers["User-Agent"] == "repo2docker {}".format(__version__) + assert result.request.headers["User-Agent"] == f"repo2docker {__version__}" def test_unresolving_doi(): diff --git a/tests/unit/contentproviders/test_figshare.py b/tests/unit/contentproviders/test_figshare.py index 7d29fbcbc..b4f42de31 100644 --- a/tests/unit/contentproviders/test_figshare.py +++ b/tests/unit/contentproviders/test_figshare.py @@ -1,18 +1,17 @@ import json import os import re -import pytest - from contextlib import contextmanager from io import BytesIO -from tempfile import TemporaryDirectory, NamedTemporaryFile +from tempfile import NamedTemporaryFile, TemporaryDirectory from unittest.mock import patch -from urllib.request import urlopen, Request +from urllib.request import Request, urlopen from zipfile import ZipFile -from repo2docker.contentproviders import Figshare -from repo2docker.__main__ import make_r2d +import pytest +from repo2docker.__main__ import make_r2d +from repo2docker.contentproviders import Figshare test_content_ids = [ ("https://figshare.com/articles/title/9782777", "9782777.v1"), @@ -113,8 +112,8 @@ def test_detect_not_figshare(): def figshare_archive(prefix="a_directory"): with NamedTemporaryFile(suffix=".zip") as zfile: with ZipFile(zfile.name, mode="w") as zip: - zip.writestr("{}/some-file.txt".format(prefix), "some content") - zip.writestr("{}/some-other-file.txt".format(prefix), "some more content") + zip.writestr(f"{prefix}/some-file.txt", "some content") + zip.writestr(f"{prefix}/some-other-file.txt", "some more content") yield zfile.name @@ -127,7 +126,7 @@ def test_fetch_zip(requests_mock): { "name": "afake.zip", "is_link_only": False, - "download_url": "file://{}".format(fig_path), + "download_url": f"file://{fig_path}", } ] } @@ -135,9 +134,7 @@ def test_fetch_zip(requests_mock): "https://api.figshare.com/v2/articles/123456/versions/42", json=mock_response, ) - requests_mock.get( - "file://{}".format(fig_path), content=open(fig_path, "rb").read() - ) + 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: @@ -146,7 +143,7 @@ def test_fetch_zip(requests_mock): output.append(l) unpacked_files = set(os.listdir(d)) - expected = set(["some-other-file.txt", "some-file.txt"]) + expected = {"some-other-file.txt", "some-file.txt"} assert expected == unpacked_files @@ -157,12 +154,12 @@ def test_fetch_data(requests_mock): "files": [ { "name": "afake.file", - "download_url": "file://{}".format(a_path), + "download_url": f"file://{a_path}", "is_link_only": False, }, { "name": "bfake.data", - "download_url": "file://{}".format(b_path), + "download_url": f"file://{b_path}", "is_link_only": False, }, {"name": "cfake.link", "is_link_only": True}, @@ -173,12 +170,8 @@ def test_fetch_data(requests_mock): "https://api.figshare.com/v2/articles/123456/versions/42", json=mock_response, ) - requests_mock.get( - "file://{}".format(a_path), content=open(a_path, "rb").read() - ) - requests_mock.get( - "file://{}".format(b_path), content=open(b_path, "rb").read() - ) + requests_mock.get(f"file://{a_path}", content=open(a_path, "rb").read()) + requests_mock.get(f"file://{b_path}", content=open(b_path, "rb").read()) with TemporaryDirectory() as d: output = [] diff --git a/tests/unit/contentproviders/test_git.py b/tests/unit/contentproviders/test_git.py index 3957a95f3..fd63f9689 100644 --- a/tests/unit/contentproviders/test_git.py +++ b/tests/unit/contentproviders/test_git.py @@ -1,7 +1,9 @@ import os -import pytest import subprocess from tempfile import TemporaryDirectory + +import pytest + from repo2docker.contentproviders import Git @@ -33,7 +35,7 @@ def test_submodule_clone(repo_with_submodule): pass assert os.path.exists(os.path.join(clone_dir2, "test")) - assert not os.path.exists(os.path.join(submod_dir, "test")) + assert not os.path.exists(os.path.join(submod_dir, "requirements.txt")) with TemporaryDirectory() as clone_dir: submod_dir = os.path.join(clone_dir, "submod") # set by fixture @@ -42,7 +44,7 @@ def test_submodule_clone(repo_with_submodule): for _ in git_content.fetch(spec, clone_dir): pass assert os.path.exists(os.path.join(clone_dir, "test")) - assert os.path.exists(os.path.join(submod_dir, "test")) + assert os.path.exists(os.path.join(submod_dir, "requirements.txt")) # get current sha1 of submodule cmd = ["git", "rev-parse", "HEAD"] diff --git a/tests/unit/contentproviders/test_hydroshare.py b/tests/unit/contentproviders/test_hydroshare.py index da80905fb..0c8acfd14 100755 --- a/tests/unit/contentproviders/test_hydroshare.py +++ b/tests/unit/contentproviders/test_hydroshare.py @@ -1,16 +1,15 @@ import os -import pytest - +import re from contextlib import contextmanager -from tempfile import TemporaryDirectory, NamedTemporaryFile +from tempfile import NamedTemporaryFile, TemporaryDirectory from unittest.mock import patch from zipfile import ZipFile -import re + +import pytest from repo2docker.contentproviders import Hydroshare from repo2docker.contentproviders.base import ContentProviderException - doi_responses = { "https://doi.org/10.4211/hs.b8f6eae9d89241cf8b5904033460af61": ( "https://www.hydroshare.org/resource/b8f6eae9d89241cf8b5904033460af61" @@ -36,7 +35,6 @@ 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) @@ -103,8 +101,8 @@ def test_detect_hydroshare(requests_mock): def hydroshare_archive(prefix="b8f6eae9d89241cf8b5904033460af61/data/contents"): with NamedTemporaryFile(suffix=".zip") as zfile: with ZipFile(zfile.name, mode="w") as zip: - zip.writestr("{}/some-file.txt".format(prefix), "some content") - zip.writestr("{}/some-other-file.txt".format(prefix), "some more content") + zip.writestr(f"{prefix}/some-file.txt", "some content") + zip.writestr(f"{prefix}/some-other-file.txt", "some more content") yield zfile @@ -149,7 +147,7 @@ def test_fetch_bag(): output.append(l) unpacked_files = set(os.listdir(d)) - expected = set(["some-other-file.txt", "some-file.txt"]) + expected = {"some-other-file.txt", "some-file.txt"} assert expected == unpacked_files diff --git a/tests/unit/contentproviders/test_local.py b/tests/unit/contentproviders/test_local.py index fcb2a6a87..ef288aef7 100644 --- a/tests/unit/contentproviders/test_local.py +++ b/tests/unit/contentproviders/test_local.py @@ -1,5 +1,5 @@ import os -from tempfile import TemporaryDirectory, NamedTemporaryFile +from tempfile import NamedTemporaryFile, TemporaryDirectory from repo2docker.contentproviders import Local diff --git a/tests/unit/contentproviders/test_mercurial.py b/tests/unit/contentproviders/test_mercurial.py index 4619ef862..0acb91d1e 100644 --- a/tests/unit/contentproviders/test_mercurial.py +++ b/tests/unit/contentproviders/test_mercurial.py @@ -8,7 +8,6 @@ from repo2docker.contentproviders import Mercurial from repo2docker.contentproviders.mercurial import args_enabling_topic - SKIP_HG = os.environ.get("REPO2DOCKER_SKIP_HG_TESTS", "").lower() not in { "", "0", diff --git a/tests/unit/contentproviders/test_swhid.py b/tests/unit/contentproviders/test_swhid.py index 953218e3c..56fee1dfc 100644 --- a/tests/unit/contentproviders/test_swhid.py +++ b/tests/unit/contentproviders/test_swhid.py @@ -1,22 +1,22 @@ +import io import json +import logging import os -import io -import tarfile -import shutil import re -import urllib -import pytest +import shutil +import tarfile import tempfile -import logging -import requests_mock - +import urllib from os import makedirs from os.path import join -from unittest.mock import patch, MagicMock, mock_open +from unittest.mock import MagicMock, mock_open, patch from zipfile import ZipFile -from repo2docker.contentproviders.swhid import Swhid, parse_swhid +import pytest +import requests_mock + from repo2docker.contentproviders.base import ContentProviderException +from repo2docker.contentproviders.swhid import Swhid, parse_swhid # this is a slightly stripped down copy of swh.model.cli.swhid_of_dir(). @@ -99,7 +99,7 @@ def mocked_provider(tmpdir, dirhash, tarfile_buf): adapter.register_uri( "GET", - "mock://api/1/revision/{}/".format(NULLID), + f"mock://api/1/revision/{NULLID}/", json={ "author": {"fullname": "John Doe "}, "directory": dirhash, @@ -107,25 +107,25 @@ def mocked_provider(tmpdir, dirhash, tarfile_buf): ) adapter.register_uri( "POST", - "mock://api/1/vault/directory/{}/".format(dirhash), + f"mock://api/1/vault/directory/{dirhash}/", json={ - "fetch_url": "mock://api/1/vault/directory/{}/raw/".format(dirhash), + "fetch_url": f"mock://api/1/vault/directory/{dirhash}/raw/", "status": "new", }, ) adapter.register_uri( "GET", - "mock://api/1/vault/directory/{}/".format(dirhash), + f"mock://api/1/vault/directory/{dirhash}/", [ { "json": { - "fetch_url": "mock://api/1/vault/directory/{}/raw/".format(dirhash), + "fetch_url": f"mock://api/1/vault/directory/{dirhash}/raw/", "status": "pending", } }, { "json": { - "fetch_url": "mock://api/1/vault/directory/{}/raw/".format(dirhash), + "fetch_url": f"mock://api/1/vault/directory/{dirhash}/raw/", "status": "done", } }, @@ -133,7 +133,7 @@ def mocked_provider(tmpdir, dirhash, tarfile_buf): ) adapter.register_uri( "GET", - "mock://api/1/vault/directory/{}/raw/".format(dirhash), + f"mock://api/1/vault/directory/{dirhash}/raw/", content=tarfile_buf, ) return provider diff --git a/tests/unit/contentproviders/test_zenodo.py b/tests/unit/contentproviders/test_zenodo.py index c46cf8d94..0755163da 100644 --- a/tests/unit/contentproviders/test_zenodo.py +++ b/tests/unit/contentproviders/test_zenodo.py @@ -1,15 +1,15 @@ import json import os -import pytest import re - from contextlib import contextmanager from io import BytesIO -from tempfile import TemporaryDirectory, NamedTemporaryFile +from tempfile import NamedTemporaryFile, TemporaryDirectory from unittest.mock import patch -from urllib.request import urlopen, Request +from urllib.request import Request, urlopen from zipfile import ZipFile +import pytest + from repo2docker.contentproviders import Zenodo doi_responses = { @@ -82,8 +82,8 @@ def test_detect_zenodo(test_input, expected, requests_mock): def zenodo_archive(prefix="a_directory"): with NamedTemporaryFile(suffix=".zip") as zfile: with ZipFile(zfile.name, mode="w") as zip: - zip.writestr("{}/some-file.txt".format(prefix), "some content") - zip.writestr("{}/some-other-file.txt".format(prefix), "some more content") + zip.writestr(f"{prefix}/some-file.txt", "some content") + zip.writestr(f"{prefix}/some-other-file.txt", "some more content") yield zfile.name @@ -96,15 +96,13 @@ def test_fetch_software_from_github_archive(requests_mock): "files": [ { "filename": "some_dir/afake.zip", - "links": {"download": "file://{}".format(zen_path)}, + "links": {"download": f"file://{zen_path}"}, } ], "metadata": {"upload_type": "other"}, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) - requests_mock.get( - "file://{}".format(zen_path), content=open(zen_path, "rb").read() - ) + requests_mock.get(f"file://{zen_path}", content=open(zen_path, "rb").read()) zen = Zenodo() spec = {"host": test_zen.hosts[1], "record": "1234"} @@ -115,7 +113,7 @@ def test_fetch_software_from_github_archive(requests_mock): output.append(l) unpacked_files = set(os.listdir(d)) - expected = set(["some-other-file.txt", "some-file.txt"]) + expected = {"some-other-file.txt", "some-file.txt"} assert expected == unpacked_files @@ -129,15 +127,13 @@ def test_fetch_software(requests_mock): # this is the difference to the GitHub generated one, # the ZIP file isn't in a directory "filename": "afake.zip", - "links": {"download": "file://{}".format(zen_path)}, + "links": {"download": f"file://{zen_path}"}, } ], "metadata": {"upload_type": "software"}, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) - requests_mock.get( - "file://{}".format(zen_path), content=open(zen_path, "rb").read() - ) + requests_mock.get(f"file://{zen_path}", content=open(zen_path, "rb").read()) with TemporaryDirectory() as d: zen = Zenodo() @@ -147,7 +143,7 @@ def test_fetch_software(requests_mock): output.append(l) unpacked_files = set(os.listdir(d)) - expected = set(["some-other-file.txt", "some-file.txt"]) + expected = {"some-other-file.txt", "some-file.txt"} assert expected == unpacked_files @@ -159,21 +155,21 @@ def test_fetch_data(requests_mock): "files": [ { "filename": "afake.zip", - "links": {"download": "file://{}".format(a_zen_path)}, + "links": {"download": f"file://{a_zen_path}"}, }, { "filename": "bfake.zip", - "links": {"download": "file://{}".format(b_zen_path)}, + "links": {"download": f"file://{b_zen_path}"}, }, ], "metadata": {"upload_type": "data"}, } requests_mock.get("https://zenodo.org/api/records/1234", json=mock_response) requests_mock.get( - "file://{}".format(a_zen_path), content=open(a_zen_path, "rb").read() + f"file://{a_zen_path}", content=open(a_zen_path, "rb").read() ) requests_mock.get( - "file://{}".format(b_zen_path), content=open(b_zen_path, "rb").read() + f"file://{b_zen_path}", content=open(b_zen_path, "rb").read() ) with TemporaryDirectory() as d: diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index e7da9906f..bfb76ba21 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -1,13 +1,13 @@ import errno -import pytest from tempfile import TemporaryDirectory from unittest.mock import patch -import docker import escapism +import pytest -from repo2docker.app import Repo2Docker +import docker from repo2docker.__main__ import make_r2d +from repo2docker.app import Repo2Docker from repo2docker.utils import chdir from repo2docker.docker_utils import DockerCLI diff --git a/tests/unit/test_args.py b/tests/unit/test_args.py index 5e8c2484a..53913d944 100644 --- a/tests/unit/test_args.py +++ b/tests/unit/test_args.py @@ -2,10 +2,11 @@ Test argument parsing and r2d construction """ import os + import pytest -import logging -from repo2docker.__main__ import make_r2d + from repo2docker import __version__ +from repo2docker.__main__ import make_r2d def test_version(capsys): @@ -14,7 +15,7 @@ def test_version(capsys): """ with pytest.raises(SystemExit): make_r2d(["--version"]) - assert capsys.readouterr().out == "{}\n".format(__version__) + assert capsys.readouterr().out == f"{__version__}\n" def test_simple(): @@ -71,10 +72,6 @@ def test_run_required(): with pytest.raises(SystemExit): make_r2d(["--no-run", "-p", "8000:8000", "."]) - # Can't publish any ports while running if we don't specify a command explicitly - with pytest.raises(SystemExit): - make_r2d(["-p", "8000:8000", "."]) - def test_clean(): """ @@ -98,3 +95,36 @@ def test_invalid_image_name(): """ with pytest.raises(SystemExit): make_r2d(["--image-name", "_invalid", "."]) + + +def test_build_config_priority(tmp_path): + config_file = str(tmp_path.joinpath("repo2docker_config.py")) + with open(config_file, "w") as f: + f.write("c.Repo2Docker.dry_run = True") + r2d = make_r2d(["--config", config_file, "."]) + assert r2d.dry_run + r2d = make_r2d(["--config", config_file, "--build", "."]) + assert not r2d.dry_run + with open(config_file, "w") as f: + f.write("c.Repo2Docker.dry_run = False") + r2d = make_r2d(["--config", config_file, "--no-build", "."]) + assert r2d.dry_run + + +@pytest.mark.parametrize( + "trait, arg, default", + [ + ("output_image_spec", "--image-name", ""), + ("ref", "--ref", None), + ], +) +def test_config_priority(tmp_path, trait, arg, default): + config_file = str(tmp_path.joinpath("repo2docker_config.py")) + r2d = make_r2d(["."]) + assert getattr(r2d, trait) == default + with open(config_file, "w") as f: + f.write(f"c.Repo2Docker.{trait} = 'config'") + r2d = make_r2d(["--config", config_file, "."]) + assert getattr(r2d, trait) == "config" + r2d = make_r2d(["--config", config_file, arg, "cli", "."]) + assert getattr(r2d, trait) == "cli" diff --git a/tests/unit/test_argumentvalidation.py b/tests/unit/test_argumentvalidation.py index d2475b89f..78b964649 100644 --- a/tests/unit/test_argumentvalidation.py +++ b/tests/unit/test_argumentvalidation.py @@ -7,7 +7,6 @@ import pytest - here = os.path.dirname(os.path.abspath(__file__)) test_dir = os.path.dirname(here) docker_simple = os.path.join(test_dir, "dockerfile", "simple") @@ -163,7 +162,7 @@ def test_port_mapping_no_run_fail(temp_cwd): assert not validate_arguments( builddir, args_list, - "To publish user defined port mappings, the container must also be run", + "To publish user-defined port mappings, the container must also be run", ) @@ -176,7 +175,7 @@ def test_all_ports_mapping_no_run_fail(temp_cwd): assert not validate_arguments( builddir, args_list, - "To publish user defined port mappings, the container must also be run", + "To publish user-defined port mappings, the container must also be run", ) diff --git a/tests/unit/test_binder_dir.py b/tests/unit/test_binder_dir.py index 9e777b0ab..3d7f6eb23 100644 --- a/tests/unit/test_binder_dir.py +++ b/tests/unit/test_binder_dir.py @@ -6,21 +6,21 @@ @pytest.mark.parametrize("binder_dir", ["binder", ".binder", ""]) -def test_binder_dir(tmpdir, binder_dir): +def test_binder_dir(tmpdir, binder_dir, base_image): tmpdir.chdir() if binder_dir: os.mkdir(binder_dir) - bp = buildpacks.BuildPack() + bp = buildpacks.BuildPack(base_image) assert binder_dir == bp.binder_dir assert bp.binder_path("foo.yaml") == os.path.join(binder_dir, "foo.yaml") -def test_exclusive_binder_dir(tmpdir): +def test_exclusive_binder_dir(tmpdir, base_image): tmpdir.chdir() os.mkdir("./binder") os.mkdir("./.binder") - bp = buildpacks.BuildPack() + bp = buildpacks.BuildPack(base_image) with pytest.raises(RuntimeError): _ = bp.binder_dir diff --git a/tests/unit/test_buildpack.py b/tests/unit/test_buildpack.py index eda7bb924..38fc5c237 100644 --- a/tests/unit/test_buildpack.py +++ b/tests/unit/test_buildpack.py @@ -1,46 +1,47 @@ from os.path import join as pjoin +from tempfile import TemporaryDirectory import pytest -from tempfile import TemporaryDirectory + from repo2docker.buildpacks import LegacyBinderDockerBuildPack, PythonBuildPack from repo2docker.utils import chdir -def test_legacy_raises(): +def test_legacy_raises(base_image): # check legacy buildpack raises on a repo that triggers it with TemporaryDirectory() as repodir: with open(pjoin(repodir, "Dockerfile"), "w") as d: d.write("FROM andrewosh/binder-base") with chdir(repodir): - bp = LegacyBinderDockerBuildPack() + bp = LegacyBinderDockerBuildPack(base_image) with pytest.raises(RuntimeError): bp.detect() -def test_legacy_doesnt_detect(): +def test_legacy_doesnt_detect(base_image): # check legacy buildpack doesn't trigger with TemporaryDirectory() as repodir: with open(pjoin(repodir, "Dockerfile"), "w") as d: d.write("FROM andrewosh/some-image") with chdir(repodir): - bp = LegacyBinderDockerBuildPack() + bp = LegacyBinderDockerBuildPack(base_image) assert not bp.detect() -def test_legacy_on_repo_without_dockerfile(): +def test_legacy_on_repo_without_dockerfile(base_image): # check legacy buildpack doesn't trigger on a repo w/o Dockerfile with TemporaryDirectory() as repodir: with chdir(repodir): - bp = LegacyBinderDockerBuildPack() + bp = LegacyBinderDockerBuildPack(base_image) assert not bp.detect() @pytest.mark.parametrize("python_version", ["2.6", "3.0", "4.10", "3.99"]) -def test_unsupported_python(tmpdir, python_version): +def test_unsupported_python(tmpdir, python_version, base_image): tmpdir.chdir() - bp = PythonBuildPack() + bp = PythonBuildPack(base_image) bp._python_version = python_version assert bp.python_version == python_version with pytest.raises(ValueError): diff --git a/tests/unit/test_cache_from.py b/tests/unit/test_cache_from.py index 973ca1865..bd56672bf 100644 --- a/tests/unit/test_cache_from.py +++ b/tests/unit/test_cache_from.py @@ -4,17 +4,15 @@ from unittest.mock import MagicMock -import docker from repo2docker.docker_utils import DockerCLI from repo2docker.buildpacks import ( BaseImage, DockerBuildPack, - LegacyBinderDockerBuildPack, ) -def test_cache_from_base(tmpdir): +def test_cache_from_base(tmpdir, base_image): cache_from = ["image-1:latest"] fake_log_value = {"stream": "fake"} fake_client = MagicMock(spec=DockerCLI) @@ -23,7 +21,7 @@ def test_cache_from_base(tmpdir): # Test base image build pack tmpdir.chdir() - for line in BaseImage().build( + for line in BaseImage(base_image).build( fake_client, "image-2", 100, {}, cache_from, extra_build_kwargs ): assert line == fake_log_value @@ -32,7 +30,7 @@ def test_cache_from_base(tmpdir): assert called_kwargs["cache_from"] == cache_from -def test_cache_from_docker(tmpdir): +def test_cache_from_docker(tmpdir, base_image): cache_from = ["image-1:latest"] fake_log_value = {"stream": "fake"} fake_client = MagicMock(spec=DockerCLI) @@ -44,7 +42,7 @@ def test_cache_from_docker(tmpdir): with tmpdir.join("Dockerfile").open("w") as f: f.write("FROM scratch\n") - for line in DockerBuildPack().build( + for line in DockerBuildPack(base_image).build( fake_client, "image-2", 100, {}, cache_from, extra_build_kwargs ): assert line == fake_log_value diff --git a/tests/unit/test_clone_depth.py b/tests/unit/test_clone_depth.py index 7989b1175..55102eac1 100644 --- a/tests/unit/test_clone_depth.py +++ b/tests/unit/test_clone_depth.py @@ -8,12 +8,10 @@ """ import os import subprocess - from tempfile import TemporaryDirectory from repo2docker.app import Repo2Docker - URL = "https://github.com/binderhub-ci-repos/repo2docker-ci-clone-depth" diff --git a/tests/unit/test_connect_url.py b/tests/unit/test_connect_url.py index 681cc6808..dbc0c2608 100644 --- a/tests/unit/test_connect_url.py +++ b/tests/unit/test_connect_url.py @@ -1,10 +1,11 @@ """ Test if the explict hostname is supplied correctly to the container """ -import requests import time -from repo2docker.app import Repo2Docker +import requests + +from repo2docker.app import Repo2Docker # Minimal Dockerfile to make build as fast as possible DOCKER_FILE = """ @@ -40,8 +41,8 @@ def test_connect_url(tmpdir): app.start() container = app.start_container() - container_url = "http://{}:{}/api".format(app.hostname, app.port) - expected_url = "http://{}:{}".format(app.hostname, app.port) + container_url = f"http://{app.hostname}:{app.port}/api" + expected_url = f"http://{app.hostname}:{app.port}" # wait a bit for the container to be ready # give the container a chance to start @@ -59,13 +60,13 @@ def test_connect_url(tmpdir): try: info = requests.get(container_url).json() except Exception as e: - print("Error: %s" % e) + print(f"Error: {e}") time.sleep(i * 3) else: print(info) success = True break - assert success, "Notebook never started in %s" % container + assert success, f"Notebook never started in {container}" finally: # stop the container container.stop() diff --git a/tests/unit/test_docker.py b/tests/unit/test_docker.py index 2fe0b6f5e..c47aa4fa0 100644 --- a/tests/unit/test_docker.py +++ b/tests/unit/test_docker.py @@ -2,6 +2,9 @@ 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) @@ -19,3 +22,43 @@ 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) diff --git a/tests/unit/test_editable.py b/tests/unit/test_editable.py index 6947b7d21..de4d6261e 100644 --- a/tests/unit/test_editable.py +++ b/tests/unit/test_editable.py @@ -5,7 +5,6 @@ from repo2docker.__main__ import make_r2d - DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "dockerfile", "editable") diff --git a/tests/unit/test_env.py b/tests/unit/test_env.py index ee01b3615..fde4aed43 100644 --- a/tests/unit/test_env.py +++ b/tests/unit/test_env.py @@ -30,7 +30,7 @@ def test_env(capfd): "repo2docker", # 'key=value' are exported as is in docker "-e", - "FOO={}".format(ts), + f"FOO={ts}", "--env", "BAR=baz", # 'key' is exported with the currently exported value @@ -65,7 +65,7 @@ def test_env(capfd): # stderr should contain lines of output declares = [x for x in captured.err.splitlines() if x.startswith("declare")] - assert 'declare -x FOO="{}"'.format(ts) in declares + assert f'declare -x FOO="{ts}"' in declares assert 'declare -x BAR="baz"' in declares assert 'declare -x SPAM="eggs"' in declares assert "declare -x NO_SPAM" not in declares diff --git a/tests/unit/test_env_yml.py b/tests/unit/test_env_yml.py index c744ccf3a..03169a68e 100644 --- a/tests/unit/test_env_yml.py +++ b/tests/unit/test_env_yml.py @@ -1,26 +1,26 @@ """ Test if the environment.yml is empty or it constains other data structure than a dictionary """ -import os -import sys + import pytest + from repo2docker import buildpacks -def test_empty_env_yml(tmpdir): +def test_empty_env_yml(tmpdir, base_image): tmpdir.chdir() p = tmpdir.join("environment.yml") p.write("") - bp = buildpacks.CondaBuildPack() + bp = buildpacks.CondaBuildPack(base_image) py_ver = bp.python_version - # If the environment.yml is empty python_version will get an empty string - assert py_ver == "" + # If the environment.yml is empty, python_version will get the default Python version + assert py_ver == bp.major_pythons["3"] -def test_no_dict_env_yml(tmpdir): +def test_no_dict_env_yml(tmpdir, base_image): tmpdir.chdir() q = tmpdir.join("environment.yml") q.write("numpy\n " "matplotlib\n") - bq = buildpacks.CondaBuildPack() + bq = buildpacks.CondaBuildPack(base_image) with pytest.raises(TypeError): py_ver = bq.python_version diff --git a/tests/unit/test_external_scripts.py b/tests/unit/test_external_scripts.py index d03debe55..278707c87 100644 --- a/tests/unit/test_external_scripts.py +++ b/tests/unit/test_external_scripts.py @@ -1,5 +1,6 @@ """Test if assemble scripts from outside of r2d repo are accepted.""" import time + from repo2docker.app import Repo2Docker from repo2docker.buildpacks import PythonBuildPack diff --git a/tests/unit/test_freeze.py b/tests/unit/test_freeze.py index 66b0c3bbd..ddcd29f3e 100644 --- a/tests/unit/test_freeze.py +++ b/tests/unit/test_freeze.py @@ -2,12 +2,11 @@ from tempfile import TemporaryDirectory from unittest.mock import patch +import pytest from ruamel.yaml import YAML from repo2docker.buildpacks.conda.freeze import set_python -import pytest - V = "3.7" yaml = YAML(typ="rt") diff --git a/tests/unit/test_labels.py b/tests/unit/test_labels.py index c13cff4bf..e6e1f2e9e 100644 --- a/tests/unit/test_labels.py +++ b/tests/unit/test_labels.py @@ -1,18 +1,19 @@ """ Test if labels are supplied correctly to the container """ -from repo2docker.app import Repo2Docker -from repo2docker.buildpacks import BuildPack -from repo2docker import __version__ -import pytest from unittest.mock import Mock +import pytest + +from repo2docker import __version__ +from repo2docker.app import Repo2Docker +from repo2docker.buildpacks import BuildPack URL = "https://github.com/binderhub-ci-repos/repo2docker-ci-clone-depth" -def test_buildpack_labels_rendered(): - bp = BuildPack() +def test_buildpack_labels_rendered(base_image): + bp = BuildPack(base_image) assert "LABEL" not in bp.render() bp.labels["first_label"] = "firstlabel" assert 'LABEL first_label="firstlabel"\n' in bp.render() diff --git a/tests/unit/test_memlimit.py b/tests/unit/test_memlimit.py index b02a9570f..739a78b14 100644 --- a/tests/unit/test_memlimit.py +++ b/tests/unit/test_memlimit.py @@ -3,21 +3,18 @@ """ import os - from unittest.mock import MagicMock -import docker - import pytest +import docker from repo2docker.buildpacks import BaseImage, DockerBuildPack from repo2docker.docker_utils import DockerCLI - basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -def test_memory_limit_enforced(tmpdir): +def test_memory_limit_enforced(tmpdir, base_image): fake_cache_from = ["image-1:latest"] fake_log_value = {"stream": "fake"} fake_client = MagicMock(spec=DockerCLI) @@ -31,7 +28,7 @@ def test_memory_limit_enforced(tmpdir): # Test that the buildpack passes the right arguments to the docker # client in order to enforce the memory limit tmpdir.chdir() - for line in BaseImage().build( + for line in BaseImage(base_image).build( fake_client, "image-2", memory_limit, @@ -51,34 +48,17 @@ def test_memory_limit_enforced(tmpdir): } -def test_memlimit_same_postbuild(): - """ - Validate that the postBuild files for the dockerfile and non-dockerfile - tests are the same - - Until https://github.com/jupyterhub/repo2docker/issues/160 gets fixed. - """ - filepaths = [ - os.path.join(basedir, "memlimit", t, "postBuild") - for t in ("dockerfile", "non-dockerfile") - ] - file_contents = [] - for fp in filepaths: - with open(fp) as f: - file_contents.append(f.read()) - # Make sure they're all the same - assert len(set(file_contents)) == 1 - - @pytest.mark.parametrize("BuildPack", [BaseImage, DockerBuildPack]) -def test_memlimit_argument_type(BuildPack): +def test_memlimit_argument_type(BuildPack, base_image): # check that an exception is raised when the memory limit isn't an int fake_log_value = {"stream": "fake"} fake_client = MagicMock(spec=DockerCLI) fake_client.build.return_value = iter([fake_log_value]) with pytest.raises(ValueError) as exc_info: - for line in BuildPack().build(fake_client, "image-2", "10Gi", {}, [], {}): + for line in BuildPack(base_image).build( + fake_client, "image-2", "10Gi", {}, [], {} + ): pass assert "The memory limit has to be specified as an" in str(exc_info.value) diff --git a/tests/unit/test_ports.py b/tests/unit/test_ports.py index edb71424a..aaebcdab1 100644 --- a/tests/unit/test_ports.py +++ b/tests/unit/test_ports.py @@ -2,16 +2,17 @@ Test Port mappings work on running non-jupyter workflows """ -import requests -import time import os -import tempfile import random +import tempfile +import time from getpass import getuser -import docker import pytest +import requests +import docker +from repo2docker.__main__ import make_r2d from repo2docker.app import Repo2Docker @@ -81,13 +82,13 @@ def _cleanup(): if all_ports: port = port_mapping["8888/tcp"][0]["HostPort"] - url = "http://{}:{}".format(host, port) + url = f"http://{host}:{port}" for i in range(5): try: r = requests.get(url) r.raise_for_status() except Exception as e: - print("No response from {}: {}".format(url, e)) + print(f"No response from {url}: {e}") container.reload() assert container.status == "running" time.sleep(3) @@ -95,7 +96,7 @@ def _cleanup(): else: break else: - pytest.fail("Never succeded in talking to %s" % url) + pytest.fail(f"Never succeeded in talking to {url}") assert "Directory listing" in r.text @@ -113,3 +114,16 @@ def test_port_mapping(request, tmpdir, host, protocol): """Test a port mapping""" port = str(random.randint(50000, 51000)) read_port_mapping_response(request, tmpdir, host=host, port=port, protocol=protocol) + + +@pytest.mark.parametrize( + "port_str, port_dict", + [ + ("8000", {"8000/tcp": "8000"}), + ("8000:9000", {"9000/tcp": "8000"}), + ("127.0.0.1:8000:9000", {"9000/tcp": ("127.0.0.1", "8000")}), + ], +) +def test_port_args(port_str, port_dict): + app = make_r2d(["-p", port_str, "."]) + assert app.ports == port_dict diff --git a/tests/unit/test_preassemble.py b/tests/unit/test_preassemble.py index d3a08f773..70dad5337 100644 --- a/tests/unit/test_preassemble.py +++ b/tests/unit/test_preassemble.py @@ -6,7 +6,7 @@ @pytest.mark.parametrize("binder_dir", ["", ".binder", "binder"]) -def test_combine_preassemble_steps(tmpdir, binder_dir): +def test_combine_preassemble_steps(tmpdir, binder_dir, base_image): tmpdir.chdir() if binder_dir: os.mkdir(binder_dir) @@ -19,7 +19,7 @@ def test_combine_preassemble_steps(tmpdir, binder_dir): with open(os.path.join(binder_dir, "runtime.txt"), "w") as f: f.write("r-2019-01-30") - bp = buildpacks.RBuildPack() + bp = buildpacks.RBuildPack(base_image) files = bp.get_preassemble_script_files() assert len(files) == 2 diff --git a/tests/unit/test_r.py b/tests/unit/test_r.py index 438c87d5f..a7028d829 100644 --- a/tests/unit/test_r.py +++ b/tests/unit/test_r.py @@ -1,8 +1,8 @@ from datetime import date +from unittest.mock import patch import pytest from requests.models import Response -from unittest.mock import patch from repo2docker import buildpacks @@ -10,7 +10,7 @@ @pytest.mark.parametrize( "runtime_version, expected", [("", "4.2"), ("3.6", "3.6"), ("3.5.1", "3.5")] ) -def test_version_specification(tmpdir, runtime_version, expected): +def test_version_specification(tmpdir, runtime_version, expected, base_image): tmpdir.chdir() with open("runtime.txt", "w") as f: @@ -18,17 +18,17 @@ def test_version_specification(tmpdir, runtime_version, expected): runtime_version += "-" f.write(f"r-{runtime_version}2019-01-01") - r = buildpacks.RBuildPack() + r = buildpacks.RBuildPack(base_image) assert r.r_version.startswith(expected) -def test_version_completion(tmpdir): +def test_version_completion(tmpdir, base_image): tmpdir.chdir() with open("runtime.txt", "w") as f: f.write("r-3.6-2019-01-01") - r = buildpacks.RBuildPack() + r = buildpacks.RBuildPack(base_image) assert r.r_version == "3.6.3" @@ -40,17 +40,17 @@ def test_version_completion(tmpdir): ("r-3.5-2019-01-01", (2019, 1, 1)), ], ) -def test_mran_date(tmpdir, runtime, expected): +def test_cran_date(tmpdir, runtime, expected, base_image): tmpdir.chdir() with open("runtime.txt", "w") as f: f.write(runtime) - r = buildpacks.RBuildPack() + r = buildpacks.RBuildPack(base_image) assert r.checkpoint_date == date(*expected) -def test_snapshot_rspm_date(): +def test_snapshot_rspm_date(base_image): test_dates = { # Even though there is no snapshot specified in the interface at https://packagemanager.posit.co/client/#/repos/1/overview # For 2021 Oct 22, the API still returns a valid URL that one can install @@ -61,11 +61,12 @@ def test_snapshot_rspm_date(): date(2022, 1, 1): date(2022, 1, 1), } - r = buildpacks.RBuildPack() + r = buildpacks.RBuildPack(base_image) for requested, expected in test_dates.items(): snapshot_url = r.get_rspm_snapshot_url(requested) assert snapshot_url.startswith( - "https://packagemanager.posit.co/all/__linux__/bionic/" + # VERSION_CODENAME is handled at runtime during the build + "https://packagemanager.posit.co/all/__linux__/${VERSION_CODENAME}/" + expected.strftime("%Y-%m-%d") ) @@ -73,20 +74,15 @@ def test_snapshot_rspm_date(): r.get_rspm_snapshot_url(date(1691, 9, 5)) -@pytest.mark.parametrize("expected", [date(2019, 12, 29), date(2019, 12, 26)]) -@pytest.mark.parametrize("requested", [date(2019, 12, 31)]) -def test_snapshot_mran_date(requested, expected): - def mock_request_head(url): - r = Response() - if url == "https://mran.microsoft.com/snapshot/" + expected.isoformat(): - r.status_code = 200 - else: - r.status_code = 404 - r.reason = "Mock MRAN no snapshot" - return r - - with patch("requests.head", side_effect=mock_request_head): - r = buildpacks.RBuildPack() - assert r.get_mran_snapshot_url( - requested - ) == "https://mran.microsoft.com/snapshot/{}".format(expected.isoformat()) +def test_mran_dead(tmpdir, base_image): + tmpdir.chdir() + + with open("runtime.txt", "w") as f: + f.write("r-3.6-2017-06-04") + + r = buildpacks.RBuildPack(base_image) + with pytest.raises( + RuntimeError, + match=r"^Microsoft killed MRAN, the source of R package snapshots before 2018-12-07.*", + ): + r.get_build_scripts() diff --git a/tests/unit/test_semver.py b/tests/unit/test_semver.py index bbbf8ca50..b07272be1 100644 --- a/tests/unit/test_semver.py +++ b/tests/unit/test_semver.py @@ -1,5 +1,6 @@ import pytest from semver import VersionInfo + from repo2docker import semver diff --git a/tests/unit/test_subdir.py b/tests/unit/test_subdir.py index 43d08fce3..4e7007311 100644 --- a/tests/unit/test_subdir.py +++ b/tests/unit/test_subdir.py @@ -4,8 +4,8 @@ import os import escapism - import pytest + from repo2docker.app import Repo2Docker TEST_REPO = "https://github.com/binderhub-ci-repos/repo2docker-subdir-support" @@ -21,7 +21,7 @@ def test_subdir(run_repo2docker): run_repo2docker(argv) # check that we restored the current working directory - assert cwd == os.getcwd(), "We should be back in %s" % cwd + assert cwd == os.getcwd(), f"We should be back in {cwd}" def test_subdir_in_image_name(): diff --git a/tests/unit/test_users.py b/tests/unit/test_users.py index 2bceb5ff9..642e4f3b2 100644 --- a/tests/unit/test_users.py +++ b/tests/unit/test_users.py @@ -34,26 +34,21 @@ def test_user(): subprocess.check_call( [ "repo2docker", - "-v", - "{}:/home/{}".format(tmpdir, username), - "--user-id", - userid, - "--user-name", - username, + f"--volume={tmpdir}:/home/{username}", + f"--user-id={userid}", + f"--user-name={username}", tmpdir, "--", "/bin/bash", "-c", - "id -u > id && pwd > pwd && whoami > name && echo -n $USER > env_user".format( - ts - ), + "id -u > id && pwd > pwd && whoami > name && echo -n $USER > env_user", ] ) with open(os.path.join(tmpdir, "id")) as f: assert f.read().strip() == userid with open(os.path.join(tmpdir, "pwd")) as f: - assert f.read().strip() == "/home/{}".format(username) + assert f.read().strip() == f"/home/{username}" with open(os.path.join(tmpdir, "name")) as f: assert f.read().strip() == username with open(os.path.join(tmpdir, "name")) as f: diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index ef9a8d38f..c518bbd23 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -1,13 +1,16 @@ """ Tests for repo2docker/utils.py """ -import traitlets import os -from repo2docker import utils -import pytest +import platform import subprocess import tempfile +import pytest +import traitlets + +from repo2docker import utils + def test_capture_cmd_no_capture_success(): # This should succeed @@ -90,7 +93,7 @@ def test_invalid_port_mapping(port_spec): with pytest.raises(ValueError) as e: utils.validate_and_generate_port_mapping([port_spec]) - assert 'Port specification "{}"'.format(port_spec) in str(e.value) + assert f'Port specification "{port_spec}"' in str(e.value) def test_deep_get(): @@ -158,3 +161,17 @@ def test_open_guess_encoding(): ) def test_local_pip_requirement(req, is_local): assert utils.is_local_pip_requirement(req) == is_local + + +@pytest.mark.parametrize( + "machine_name,expected", + [ + ("x86_64", "linux/amd64"), + ("aarch64", "linux/arm64"), + ("arm64", "linux/arm64"), + ("other", "linux/amd64"), + ], +) +def test_get_platform(monkeypatch, machine_name, expected): + monkeypatch.setattr(platform, "machine", lambda: machine_name) + assert utils.get_platform() == expected diff --git a/tests/unit/test_volumes.py b/tests/unit/test_volumes.py index db6efba2d..9e108ec82 100644 --- a/tests/unit/test_volumes.py +++ b/tests/unit/test_volumes.py @@ -22,7 +22,7 @@ def test_volume_abspath(): [ "repo2docker", "-v", - "{}:/home/{}".format(tmpdir, username), + f"{tmpdir}:/home/{username}", "--user-id", str(os.geteuid()), "--user-name", @@ -31,7 +31,7 @@ def test_volume_abspath(): "--", "/bin/bash", "-c", - "echo -n {} > ts".format(ts), + f"echo -n {ts} > ts", ] ) @@ -61,7 +61,7 @@ def test_volume_relpath(): "--", "/bin/bash", "-c", - "echo -n {} > ts".format(ts), + f"echo -n {ts} > ts", ] ) diff --git a/tests/venv/default/verify b/tests/venv/default/verify index 559670863..b5b2b9920 100755 --- a/tests/venv/default/verify +++ b/tests/venv/default/verify @@ -2,7 +2,7 @@ # Verify that the default just provides a py3 environment with jupyter import sys -assert sys.version_info[:2] == (3, 7), sys.version +assert sys.version_info[:2] == (3, 10), sys.version import jupyter with open("/tmp/appendix") as f: diff --git a/tests/venv/numpy/verify b/tests/venv/numpy/verify index 34769ecb1..ef098d21a 100755 --- a/tests/venv/numpy/verify +++ b/tests/venv/numpy/verify @@ -1,6 +1,6 @@ #!/usr/bin/env python import sys -assert sys.version_info[:2] == (3, 7) +assert sys.version_info[:2] == (3, 10) import numpy diff --git a/tests/venv/postBuild/postBuild b/tests/venv/postBuild/postBuild index c1e89e8a3..4f301be50 100755 --- a/tests/venv/postBuild/postBuild +++ b/tests/venv/postBuild/postBuild @@ -1,3 +1,4 @@ #!/bin/bash jupyter nbextension enable --py --sys-prefix ipyleaflet -npm install --global configurable-http-proxy \ No newline at end of file +npm install --global configurable-http-proxy +npm cache clean --force diff --git a/tests/venv/py35/verify b/tests/venv/py35/verify index 4abec3090..6475d4f3c 100755 --- a/tests/venv/py35/verify +++ b/tests/venv/py35/verify @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/srv/conda/envs/kernel/bin/python import sys print(sys.version_info) diff --git a/tests/venv/usr-bin/verify b/tests/venv/usr-bin/verify index 4370b68ed..c6efe7823 100755 --- a/tests/venv/usr-bin/verify +++ b/tests/venv/usr-bin/verify @@ -4,4 +4,4 @@ import os assert os.path.expanduser("~/.local/bin") in os.getenv("PATH"), os.getenv("PATH") assert os.getcwd() == os.environ["REPO_DIR"] -assert "{}/.local/bin".format(os.environ["REPO_DIR"]) in os.getenv("PATH") +assert f'{os.environ["REPO_DIR"]}/.local/bin' in os.getenv("PATH") diff --git a/versioneer.py b/versioneer.py index 2b5454051..03a560576 100644 --- a/versioneer.py +++ b/versioneer.py @@ -275,7 +275,6 @@ """ -from __future__ import print_function try: import configparser @@ -344,7 +343,7 @@ def get_config_from_root(root): # the top of versioneer.py for instructions on writing your setup.cfg . setup_cfg = os.path.join(root, "setup.cfg") parser = configparser.SafeConfigParser() - with open(setup_cfg, "r") as f: + with open(setup_cfg) as f: parser.readfp(f) VCS = parser.get("versioneer", "VCS") # mandatory @@ -404,7 +403,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= stderr=(subprocess.PIPE if hide_stderr else None), ) break - except EnvironmentError: + except OSError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue @@ -414,7 +413,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= return None, None else: if verbose: - print("unable to find command, tried %s" % (commands,)) + print(f"unable to find command, tried {commands}") return None, None stdout = p.communicate()[0].strip() if sys.version_info[0] >= 3: @@ -429,7 +428,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= 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 @@ -961,7 +960,7 @@ def git_get_keywords(versionfile_abs): # _version.py. keywords = {} try: - f = open(versionfile_abs, "r") + f = open(versionfile_abs) for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) @@ -976,7 +975,7 @@ def git_get_keywords(versionfile_abs): if mo: keywords["date"] = mo.group(1) f.close() - except EnvironmentError: + except OSError: pass return keywords @@ -1000,11 +999,11 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = set([r.strip() for r in refnames.strip("()").split(",")]) + 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 = set([r[len(TAG) :] for r in refs if r.startswith(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 @@ -1013,7 +1012,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): # 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 = set([r for r in refs if re.search(r"\d", r)]) + tags = {r for r in refs if re.search(r"\d", r)} if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: @@ -1107,7 +1106,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? - pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out + pieces["error"] = f"unable to parse git-describe output: '{describe_out}'" return pieces # tag @@ -1116,10 +1115,9 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): 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, - ) + pieces[ + "error" + ] = f"tag '{full_tag}' doesn't start with prefix '{tag_prefix}'" return pieces pieces["closest-tag"] = full_tag[len(tag_prefix) :] @@ -1166,13 +1164,13 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): files.append(versioneer_file) present = False try: - f = open(".gitattributes", "r") + f = open(".gitattributes") for line in f.readlines(): if line.strip().startswith(versionfile_source): if "export-subst" in line.strip().split()[1:]: present = True f.close() - except EnvironmentError: + except OSError: pass if not present: f = open(".gitattributes", "a+") @@ -1236,7 +1234,7 @@ def versions_from_file(filename): try: with open(filename) as f: contents = f.read() - except EnvironmentError: + except OSError: raise NotThisMethod("unable to read _version.py") mo = re.search( r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S @@ -1257,7 +1255,7 @@ def write_to_version_file(filename, versions): with open(filename, "w") as f: f.write(SHORT_VERSION_PY % contents) - print("set %s to '%s'" % (filename, versions["version"])) + print(f"set {filename} to '{versions['version']}'") def plus_or_dot(pieces): @@ -1482,7 +1480,7 @@ def get_versions(verbose=False): try: ver = versions_from_file(versionfile_abs) if verbose: - print("got version from file %s %s" % (versionfile_abs, ver)) + print(f"got version from file {versionfile_abs} {ver}") return ver except NotThisMethod: pass @@ -1755,11 +1753,7 @@ def do_setup(): root = get_root() try: cfg = get_config_from_root(root) - except ( - EnvironmentError, - configparser.NoSectionError, - configparser.NoOptionError, - ) as e: + except (OSError, configparser.NoSectionError, configparser.NoOptionError) as e: if isinstance(e, (EnvironmentError, configparser.NoSectionError)): print("Adding sample versioneer config to setup.cfg", file=sys.stderr) with open(os.path.join(root, "setup.cfg"), "a") as f: @@ -1784,9 +1778,9 @@ def do_setup(): ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") if os.path.exists(ipy): try: - with open(ipy, "r") as f: + with open(ipy) as f: old = f.read() - except EnvironmentError: + except OSError: old = "" if INIT_PY_SNIPPET not in old: print(" appending to %s" % ipy) @@ -1805,12 +1799,12 @@ def do_setup(): manifest_in = os.path.join(root, "MANIFEST.in") simple_includes = set() try: - with open(manifest_in, "r") as f: + with open(manifest_in) as f: for line in f: if line.startswith("include "): for include in line.split()[1:]: simple_includes.add(include) - except EnvironmentError: + except OSError: pass # That doesn't cover everything MANIFEST.in can do # (http://docs.python.org/2/distutils/sourcedist.html#commands), so @@ -1844,7 +1838,7 @@ def scan_setup_py(): found = set() setters = False errors = 0 - with open("setup.py", "r") as f: + with open("setup.py") as f: for line in f.readlines(): if "import versioneer" in line: found.add("import")