Repository: conda/conda-libmamba-solver Branch: main Commit: 6b2d3a41c654 Files: 128 Total size: 1.5 MB Directory structure: gitextract_zwz4fenl/ ├── .authors.yml ├── .devcontainer/ │ ├── apt-deps.txt │ ├── conda-forge/ │ │ └── devcontainer.json │ ├── defaults/ │ │ └── devcontainer.json │ ├── post_create.sh │ └── post_start.sh ├── .flake8 ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── 0_bug.yml │ │ ├── 1_feature.yml │ │ ├── 2_documentation.yml │ │ └── epic.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── TEST_FAILURE_REPORT_TEMPLATE.md │ ├── dependabot.yml │ ├── disclaimer.txt │ ├── labels.yml │ ├── template-files/ │ │ ├── config.yml │ │ └── templates/ │ │ ├── issue_template_details.yml │ │ └── pull_request_template_details.md │ └── workflows/ │ ├── builds-review.yaml │ ├── cla.yml │ ├── docs.yml │ ├── issues.yml │ ├── labels.yml │ ├── lock.yml │ ├── performance.yml │ ├── project.yml │ ├── stale.yml │ ├── tests.yml │ └── update.yml ├── .gitignore ├── .mailmap ├── .pre-commit-config.yaml ├── AUTHORS.md ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── HOW_WE_USE_GITHUB.md ├── LICENSE ├── README.md ├── RELEASE.md ├── conda_libmamba_solver/ │ ├── __init__.py │ ├── conda_build_exceptions.py │ ├── exceptions.py │ ├── index.py │ ├── mamba_utils.py │ ├── plugin.py │ ├── repoquery.py │ ├── shards.py │ ├── shards_cache.py │ ├── shards_subset.py │ ├── shards_typing.py │ ├── solver.py │ ├── state.py │ └── utils.py ├── dev/ │ ├── requirements.txt │ └── scripts/ │ ├── BenchmarkChart.ipynb │ ├── httpx-fetch-all-shards.py │ └── requests-fetch-all-shards.py ├── docs/ │ ├── Makefile │ ├── _static/ │ │ └── css/ │ │ └── custom.css │ ├── _templates/ │ │ └── navbar_center.html │ ├── conf.py │ ├── dev/ │ │ ├── future-work.md │ │ ├── implementation.md │ │ ├── index.md │ │ ├── performance-testing.md │ │ ├── setup.md │ │ ├── sharded.md │ │ ├── shards_python.mmd │ │ └── workflows.md │ ├── environment.yml │ ├── index.md │ ├── robots.txt │ └── user-guide/ │ ├── configuration.md │ ├── faq.md │ ├── index.md │ ├── libmamba-vs-classic.md │ ├── more-resources.md │ ├── performance.md │ └── subcommands.md ├── durations/ │ ├── Linux.json │ ├── Windows.json │ └── macOS.json ├── news/ │ └── TEMPLATE ├── pyproject.toml ├── recipe/ │ └── meta.yaml ├── rever.xsh └── tests/ ├── __init__.py ├── channel_testing/ │ ├── helpers.py │ └── reposerver.py ├── conftest.py ├── data/ │ ├── conda_build_recipes/ │ │ ├── LICENSE │ │ ├── baddeps/ │ │ │ └── meta.yaml │ │ ├── jedi/ │ │ │ └── meta.yaml │ │ ├── multioutput/ │ │ │ └── meta.yaml │ │ └── stackvana/ │ │ └── meta.yaml │ ├── lock_this_env.yml │ └── mamba_repo/ │ ├── LICENSE │ ├── channeldata.json │ ├── index.html │ ├── noarch/ │ │ ├── current_repodata.json │ │ ├── current_repodata.json.bz2 │ │ ├── index.html │ │ ├── repodata.json │ │ ├── repodata.json.bz2 │ │ ├── repodata_from_packages.json │ │ ├── repodata_from_packages.json.bz2 │ │ └── test-package-0.1-0.tar.bz2 │ └── recipes/ │ └── test-package/ │ └── meta.yaml ├── http_test_server.py ├── repodata_time_machine.py ├── requirements.txt ├── run_in_profiler.py ├── test_channels.py ├── test_downstream.py ├── test_experimental.py ├── test_index.py ├── test_performance.py ├── test_plugin.py ├── test_repoquery.py ├── test_shards.py ├── test_shards_subset.py ├── test_solver.py ├── test_solver_differences.py ├── test_user_agent.py ├── test_workarounds.py └── utils.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .authors.yml ================================================ - name: Jaime Rodríguez-Guerra email: jaimergp@users.noreply.github.com aliases: - jaimergp num_commits: 174 first_commit: 2022-01-31 17:24:37 github: jaimergp - name: Jannis Leidel email: jannis@leidel.info num_commits: 43 first_commit: 2022-02-17 14:48:48 github: jezdez - name: pre-commit-ci[bot] email: 66853113+pre-commit-ci[bot]@users.noreply.github.com num_commits: 112 first_commit: 2022-11-22 08:39:31 github: pre-commit-ci[bot] - name: Christopher Ostrouchov email: chris.ostrouchov@gmail.com num_commits: 10 first_commit: 2023-01-24 15:12:29 github: costrouc - name: Daniel Holth email: dholth@anaconda.com num_commits: 32 first_commit: 2022-10-19 21:11:39 github: dholth - name: Matthew R. Becker email: beckermr@users.noreply.github.com num_commits: 1 first_commit: 2022-01-19 18:26:25 github: beckermr - name: conda-bot email: 18747875+conda-bot@users.noreply.github.com aliases: - Conda Bot num_commits: 103 first_commit: 2022-11-15 16:45:31 github: conda-bot - name: Ken Odegard email: kodegard@anaconda.com num_commits: 10 first_commit: 2022-03-04 23:25:33 github: kenodegard - name: Albert DeFusco email: albert.defusco+gh@me.com num_commits: 1 first_commit: 2023-03-01 13:29:51 github: AlbertDeFusco - name: John Kirkham github: jakirkham email: jakirkham@gmail.com num_commits: 1 first_commit: 2023-04-18 12:42:06 - name: Travis Hathaway email: travis.j.hathaway@gmail.com num_commits: 8 first_commit: 2023-11-10 15:58:32 github: travishathaway - name: Klaus Zimmermann email: klaus.zimmermann@quansight.com num_commits: 1 first_commit: 2024-06-11 10:52:46 - name: Thomas Lam email: 79589038+tl-hbk@users.noreply.github.com num_commits: 1 first_commit: 2024-03-19 14:05:09 github: tl-hbk - name: dependabot[bot] email: 49699333+dependabot[bot]@users.noreply.github.com num_commits: 26 first_commit: 2024-07-22 19:11:59 github: dependabot[bot] - name: Jonathan J. Helmus email: jjhelmus@gmail.com num_commits: 4 first_commit: 2024-09-20 12:11:32 github: jjhelmus - name: Kevin Markham email: justmarkham@users.noreply.github.com num_commits: 1 first_commit: 2024-08-12 11:49:20 github: justmarkham - name: Julien Jerphanion email: git@jjerphan.xyz github: jjerphan num_commits: 1 first_commit: 2025-03-05 00:42:28 - name: Agriya Khetarpal email: 74401230+agriyakhetarpal@users.noreply.github.com github: agriyakhetarpal num_commits: 1 first_commit: 2025-10-16 17:26:43 - name: Stacy Noland email: 46572585+stacynoland@users.noreply.github.com github: stacynoland num_commits: 1 first_commit: 2025-11-24 12:33:24 - name: Ryan Keith email: rkeith@anaconda.com num_commits: 1 first_commit: 2025-12-11 16:50:18 github: ryanskeith - name: Sophia Castellarin email: scastellarin@openteams.com num_commits: 1 first_commit: 2026-01-07 03:17:00 github: soapy1 - name: John Costa email: costajohnt@gmail.com github: costajohnt num_commits: 1 first_commit: 2026-04-27 03:34:42 - name: Dan Yeaw email: dan@yeaw.me num_commits: 1 first_commit: 2026-05-01 18:41:55 ================================================ FILE: .devcontainer/apt-deps.txt ================================================ git less htop nano ssh ================================================ FILE: .devcontainer/conda-forge/devcontainer.json ================================================ // For format details, see https://aka.ms/devcontainer.json. For config options, see the { "name": "Miniforge (default-channel=conda-forge)", "image": "condaforge/miniforge3:latest", // Uncomment to force x64 instead of native (slower!) // "runArgs": ["--platform=linux/amd64"], // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], "mounts": [ "source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached", "source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached" ], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh conda-forge", // Use 'postStartCommand' to run commands after the container is started. "postStartCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh", // Configure tool-specific properties. "customizations": { "vscode": { "settings": { "python.defaultInterpreterPath": "/opt/conda/bin/python", "python.testing.pytestArgs": [ "tests" ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true }, "extensions": [ "charliermarsh.ruff", "eamodio.gitlens", "ms-toolsai.jupyter", "be5invis.toml" ] } } // Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", } ================================================ FILE: .devcontainer/defaults/devcontainer.json ================================================ // For format details, see https://aka.ms/devcontainer.json { "name": "Miniconda (default-channel=defaults)", "image": "continuumio/miniconda3:latest", // Uncomment to force x64 instead of native (slower!) // "runArgs": ["--platform=linux/amd64"], // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], "mounts": [ "source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached", "source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached" ], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh defaults", // Use 'postStartCommand' to run commands after the container is started. "postStartCommand": "bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh defaults", // Configure tool-specific properties. "customizations": { "vscode": { "settings": { "python.defaultInterpreterPath": "/opt/conda/bin/python", "python.testing.pytestArgs": [ "tests" ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true }, "extensions": [ "charliermarsh.ruff", "eamodio.gitlens", "ms-toolsai.jupyter", "be5invis.toml" ] } } // Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", } ================================================ FILE: .devcontainer/post_create.sh ================================================ #!/bin/bash # This script assumes we are running in a Miniconda container where: # - /opt/conda is the Miniconda or Miniforge installation directory # - https://github.com/conda/conda is mounted at /workspaces/conda # - https://github.com/conda/conda-libmamba-solver is mounted at # /workspaces/conda-libmamba-solver # - https://github.com/mamba-org/mamba is (optionally) mounted at # /workspaces/mamba set -euo pipefail HERE=$(dirname $0) BASE_CONDA=${BASE_CONDA:-/opt/conda} SRC_CONDA=${SRC_CONDA:-/workspaces/conda} SRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver} if which apt-get > /dev/null; then echo "Installing system dependencies" apt-get update DEBIAN_FRONTEND=noninteractive xargs -a "$HERE/apt-deps.txt" apt-get install -y fi if [ ! -f "$SRC_CONDA/pyproject.toml" ]; then echo "https://github.com/conda/conda not found! Please clone or mount to $SRC_CONDA" exit 1 fi # Clear history to avoid unneeded conflicts echo "Clearing base history..." echo '' > "$BASE_CONDA/conda-meta/history" echo "Setting default channel..." "$BASE_CONDA/bin/conda" config --append channels $1 echo "Installing dev & test dependencies..." "$BASE_CONDA/bin/conda" install -n base -c $1 --yes \ --file="$SRC_CONDA/tests/requirements.txt" \ --file="$SRC_CONDA/tests/requirements-ci.txt" \ --file="$SRC_CONDA/tests/requirements-Linux.txt" \ --file="$SRC_CONDA/tests/requirements-s3.txt" \ --file="$SRC_CONDA_LIBMAMBA_SOLVER/dev/requirements.txt" \ --file="$SRC_CONDA_LIBMAMBA_SOLVER/tests/requirements.txt" \ conda-forge::editables \ conda-pypi \ pre-commit ================================================ FILE: .devcontainer/post_start.sh ================================================ #!/bin/bash # This script assumes we are running in a Miniconda container where: # - /opt/conda is the Miniconda or Miniforge installation directory # - https://github.com/conda/conda is mounted at /workspaces/conda # - https://github.com/conda/conda-libmamba-solver is mounted at # /workspaces/conda-libmamba-solver # - https://github.com/mamba-org/mamba is (optionally) mounted at # /workspaces/mamba set -euo pipefail BASE_CONDA=${BASE_CONDA:-/opt/conda} SRC_CONDA=${SRC_CONDA:-/workspaces/conda} SRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver} SRC_MAMBA=${SRC_MAMBA:-/workspaces/mamba} cat >> ~/.bashrc < /tmp/mamba-environment-dev.yml # Environment.yml is missing make echo " - make" >> /tmp/mamba-environment-dev.yml "$BASE_CONDA/condabin/conda" env update \ --quiet \ --prefix "$BASE_CONDA" \ --file /tmp/mamba-environment-dev.yml # Clean build directory to avoid issues with stale build files test -f "$SRC_MAMBA/build/CMakeCache.txt" && rm -rf "$SRC_MAMBA/build" fi # Compile cd "$SRC_MAMBA" "$BASE_CONDA/bin/cmake" -B build/ \ -DBUILD_LIBMAMBA=ON \ -DBUILD_SHARED=ON \ -DCMAKE_INSTALL_PREFIX="$BASE_CONDA" \ -DCMAKE_PREFIX_PATH="$BASE_CONDA" \ -DBUILD_LIBMAMBAPY=ON "$BASE_CONDA/bin/cmake" --build build/ -j\${NPROC:-2} if [ ! -f ~/.mamba-develop-installed ]; then "$BASE_CONDA/condabin/conda" remove -p "$BASE_CONDA" -yq --force libmambapy libmamba fi make install -C build/ cd - "$BASE_CONDA/bin/pip" install -e "$SRC_MAMBA/libmambapy/" --no-deps if [ "\$mamba_version" == "1" ]; then test -f "$BASE_CONDA/conda-meta/mamba-"*".json" && "$BASE_CONDA/bin/pip" install -e "$SRC_MAMBA/mamba/" --no-deps else echo "Mamba binary installation not supported yet" fi touch ~/.mamba-develop-installed || true ) EOF cd "$SRC_CONDA" echo "Initializing conda in dev mode..." "$BASE_CONDA/bin/python" -m conda init --dev bash cd - echo "Installing conda-libmamba-solver in dev mode..." "$BASE_CONDA/bin/conda" pypi install -e "$SRC_CONDA_LIBMAMBA_SOLVER" set -x conda list -p "$BASE_CONDA" conda info conda config --show-sources set +x echo "Source ~/.bashrc and run develop-mamba() for dev-install; mamba at $SRC_MAMBA" ================================================ FILE: .flake8 ================================================ [flake8] max-line-length = 99 ignore = E126,E133,E226,E241,E242,E302,E704,E731,E722,W503,E402,W504,F821,E203 exclude = tests/*,conda_libmamba_solver/mamba_utils.py ================================================ FILE: .github/CODEOWNERS ================================================ # Syntax for this file at https://help.github.com/articles/about-codeowners/ * @conda/conda-maintainers ================================================ FILE: .github/ISSUE_TEMPLATE/0_bug.yml ================================================ # edit this in https://github.com/conda/infrastructure name: Bug Report description: Create a bug report. labels: - type::bug body: - type: markdown attributes: value: | Because processing new bug reports is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible. > [!NOTE] > Bug reports that are incomplete or missing information may be closed as inactionable. Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary. 💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community! - type: checkboxes id: checks attributes: label: Checklist description: Please confirm and check all of the following options. options: - label: I added a descriptive title required: true - label: I searched open reports and couldn't find a duplicate required: true - type: textarea id: what attributes: label: What happened? description: What should have happened instead? Please provide as many details as possible. The more information provided, the more likely we are able to replicate your problem and offer a solution. validations: required: true - type: textarea id: info attributes: label: Conda Info description: | Let's collect some basic information about your conda install. Please run the following command from your command line and paste the output below. ```bash conda info ``` render: shell - type: textarea id: config attributes: label: Conda Config description: | Let's collect any customizations you may have for your conda install. Please run the following command from your command line and paste the output below. ```bash conda config --show-sources ``` render: shell - type: textarea id: list attributes: label: Conda list description: | The packages installed into your environment can offer clues as to the problem you are facing. Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below. ```bash conda list --show-channel-urls ``` render: shell - type: textarea id: context attributes: label: Additional Context description: Include any additional information (or screenshots) that you think would be valuable. ================================================ FILE: .github/ISSUE_TEMPLATE/1_feature.yml ================================================ # edit this in https://github.com/conda/infrastructure name: Feature Request description: Create a feature request. labels: - type::feature body: - type: markdown attributes: value: | Because processing new feature requests is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible. > [!NOTE] > Feature requests that are incomplete or missing information may be closed as inactionable. Since there are already a lot of open issues, please also take a moment to search existing ones to see if your feature request has already been submitted. If you find something related, please upvote that issue and provide additional details as necessary. 💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community! - type: checkboxes id: checks attributes: label: Checklist description: Please confirm and check all of the following options. options: - label: I added a descriptive title required: true - label: I searched open requests and couldn't find a duplicate required: true - type: textarea id: idea attributes: label: What is the idea? description: Describe what the feature is and the desired state. validations: required: true - type: textarea id: why attributes: label: Why is this needed? description: Who would benefit from this feature? Why would this add value to them? What problem does this solve? - type: textarea id: what attributes: label: What should happen? description: What should be the user experience with the feature? Describe from a user perspective what they would do and see. - type: textarea id: context attributes: label: Additional Context description: Include any additional information that you think would be valuable. ================================================ FILE: .github/ISSUE_TEMPLATE/2_documentation.yml ================================================ # edit this in https://github.com/conda/infrastructure name: Documentation description: Create a documentation related issue. labels: - type::documentation body: - type: markdown attributes: value: | > [!NOTE] > Documentation requests that are incomplete or missing information may be closed as inactionable. Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary. 💐 Thank you for helping to make conda better. We would be unable to improve conda without our community! - type: checkboxes id: checks attributes: label: Checklist description: Please confirm and check all of the following options. options: - label: I added a descriptive title required: true - label: I searched open reports and couldn't find a duplicate required: true - type: textarea id: what attributes: label: What happened? description: Mention here any typos, broken links, or missing, incomplete, or outdated information, etc. that you have noticed in the conda docs or CLI help. validations: required: true - type: textarea id: context attributes: label: Additional Context description: Include any additional information (or screenshots) that you think would be valuable. ================================================ FILE: .github/ISSUE_TEMPLATE/epic.yml ================================================ # edit this in https://github.com/conda/infrastructure name: Epic description: A collection of related tickets. labels: - epic body: - type: markdown attributes: value: | This form is intended for grouping and collecting together related tickets to better gauge the scope of a problem/feature. If you are attempting to report a bug, propose a new feature, or some other code change please use one of the other forms available. > [!NOTE] > Epics that are incomplete or missing information may be closed as inactionable. Since there are already a lot of open issues, please also take a moment to search existing ones to see if a similar epic has already been opened. If you find something related, please upvote that issue and provide additional details as necessary. 💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community! - type: checkboxes id: checks attributes: label: Checklist description: Please confirm and check all of the following options. options: - label: I added a descriptive title required: true - label: I searched open issues and couldn't find a duplicate required: true - type: textarea id: what attributes: label: What? description: >- What feature or problem will be addressed in this epic? placeholder: Please describe here. validations: required: true - type: textarea id: why attributes: label: Why? description: >- Why is the reported issue(s) a problem, or why is the proposed feature needed? (Research and spike issues can be linked here.) value: | - [ ] placeholder: Please describe here and/or link to relevant supporting issues. validations: required: true - type: textarea id: user_impact attributes: label: User impact description: >- In what specific way(s) will users benefit from this change? (e.g. use cases or performance improvements) placeholder: Please describe here. validations: required: true - type: textarea id: goals attributes: label: Goals description: >- What goal(s) should this epic accomplish? value: | - [ ] validations: required: true - type: textarea id: tasks attributes: label: Tasks description: >- What needs to be done to implement this change? value: | - [ ] validations: required: false - type: textarea id: blocked_by attributes: label: 'This epic is blocked by:' description: >- Epics and issues that block this epic. value: | - [ ] validations: required: false - type: textarea id: blocks attributes: label: 'This epic blocks:' description: >- Epics and issues that are blocked by this epic. value: | - [ ] validations: required: false ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ### Description ### Checklist - did you ... - [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes? - [ ] Add / update necessary tests? - [ ] Add / update outdated documentation? ================================================ FILE: .github/TEST_FAILURE_REPORT_TEMPLATE.md ================================================ --- title: "{{ env.TITLE }}" labels: [type::bug, type::testing] --- The {{ workflow }} workflow failed on {{ date | date("YYYY-MM-DD HH:mm") }} UTC Full run: https://github.com/conda/conda-libmamba-solver/actions/runs/{{ env.RUN_ID }} (This post will be updated if another test fails, as long as this issue remains open.) ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" groups: github-actions: patterns: - '*' ================================================ FILE: .github/disclaimer.txt ================================================ Copyright (C) 2022 Anaconda, Inc Copyright (C) 2023 conda SPDX-License-Identifier: BSD-3-Clause ================================================ FILE: .github/labels.yml ================================================ # Builds - name: build::review description: trigger a build for this PR color: "7B4052" ================================================ FILE: .github/template-files/config.yml ================================================ conda/governance: # [required] community files - CODE_OF_CONDUCT.md conda/conda: # issue template details for templates/issues/bug.yml template - .github/template-files/templates/issue_template_details.yml conda/infrastructure: # [required] general workflows - .github/workflows/cla.yml - .github/workflows/update.yml # [optional] to include repo in https://github.com/orgs/conda/projects/2 - .github/workflows/issues.yml - .github/workflows/labels.yml - .github/workflows/project.yml # [optional] stale bot workflows - .github/workflows/stale.yml - .github/workflows/lock.yml # [optional] general processes for the conda org - src: templates/HOW_WE_USE_GITHUB.md dst: HOW_WE_USE_GITHUB.md # [optional] standard issue templates - src: templates/issues/bug.yml dst: .github/ISSUE_TEMPLATE/0_bug.yml - src: templates/issues/feature.yml dst: .github/ISSUE_TEMPLATE/1_feature.yml - src: templates/issues/documentation.yml dst: .github/ISSUE_TEMPLATE/2_documentation.yml - src: templates/issues/epic.yml dst: .github/ISSUE_TEMPLATE/epic.yml # [optional] standard PR template - src: templates/pull_requests/news_tests_docs.md dst: .github/template-files/templates/pull_request_template_details.md - src: templates/pull_requests/base.md dst: .github/PULL_REQUEST_TEMPLATE.md # [optional] rever release files - src: templates/releases/RELEASE.md dst: RELEASE.md with: canary_channel: https://anaconda.org/conda-canary placeholder: YY.MM.MICRO placeholder_x: YY.MM.x - src: templates/releases/rever.xsh dst: rever.xsh - src: templates/releases/TEMPLATE dst: news/TEMPLATE ================================================ FILE: .github/template-files/templates/issue_template_details.yml ================================================ - type: textarea id: info attributes: label: Conda Info description: | Let's collect some basic information about your conda install. Please run the following command from your command line and paste the output below. ```bash conda info ``` render: shell - type: textarea id: config attributes: label: Conda Config description: | Let's collect any customizations you may have for your conda install. Please run the following command from your command line and paste the output below. ```bash conda config --show-sources ``` render: shell - type: textarea id: list attributes: label: Conda list description: | The packages installed into your environment can offer clues as to the problem you are facing. Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below. ```bash conda list --show-channel-urls ``` render: shell ================================================ FILE: .github/template-files/templates/pull_request_template_details.md ================================================ ### Checklist - did you ... - [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes? - [ ] Add / update necessary tests? - [ ] Add / update outdated documentation? ================================================ FILE: .github/workflows/builds-review.yaml ================================================ name: Review builds on: pull_request: types: - labeled jobs: build: if: | github.event_name == 'pull_request' && github.event.label.name == 'build::review' strategy: matrix: include: - runner: ubuntu-latest subdir: noarch runs-on: ${{ matrix.runner }} steps: - name: Remove build label uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.CANARY_ACTION_TOKEN }} script: | const { data: pullRequest } = await github.rest.pulls.get({ ...context.repo, pull_number: context.issue.number, }) const buildLabel = '${{ github.event.label.name }}' const labels = pullRequest.labels.map(label => label.name) const hasBuildLabel = labels.includes(buildLabel) if (hasBuildLabel) { await github.rest.issues.removeLabel({ ...context.repo, issue_number: context.issue.number, name: buildLabel, }) } # Clean checkout of specific git ref needed for package metadata version # which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.ref }} clean: true fetch-depth: 0 - name: Create and upload review build uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 with: package-name: conda-libmamba-solver subdir: ${{ matrix.subdir }} anaconda-org-channel: conda-canary anaconda-org-label: '${{ github.event.repository.name }}-pr-${{ github.event.number }}' anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }} comment-headline: 'Review build status' comment-token: ${{ secrets.CANARY_ACTION_TOKEN }} conda-build-arguments: '--override-channels -c conda-forge/label/mamba_dev -c conda-forge' ================================================ FILE: .github/workflows/cla.yml ================================================ name: CLA on: issue_comment: types: - created pull_request_target: jobs: check: if: >- !github.event.repository.fork && ( github.event.issue.pull_request && github.event.comment.body == '@conda-bot check' || github.event_name == 'pull_request_target' ) runs-on: ubuntu-slim steps: - name: Check CLA uses: conda/actions/check-cla@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 with: # [required] # A token with ability to comment, label, and modify the commit status # (`pull_request: write` and `statuses: write` for fine-grained PAT; `repo` for classic PAT) # (default: secrets.GITHUB_TOKEN) token: ${{ secrets.CLA_ACTION_TOKEN }} # [required] # Label to apply to contributor's PR once CLA is signed label: cla-signed # [required] # Token for opening signee PR in the provided `cla_repo` # (`pull_request: write` for fine-grained PAT; `repo` and `workflow` for classic PAT) cla_token: ${{ secrets.CLA_FORK_TOKEN }} ================================================ FILE: .github/workflows/docs.yml ================================================ name: Docs on: # Runs on pushes targeting the default branch push: branches: ["main"] pull_request: paths: - "docs/**" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Allow one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: docs: runs-on: ubuntu-latest defaults: run: shell: bash -el {0} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 with: activate-environment: conda-libmamba-solver environment-file: docs/environment.yml python-version: '3.11' auto-activate-base: false - name: Build Documentation run: | cd docs make dirhtml - name: Upload artifact uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 with: # Upload entire repository path: 'docs/_build/dirhtml' pages: runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' needs: [docs] # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 ================================================ FILE: .github/workflows/issues.yml ================================================ name: Automate Issues on: # NOTE: github.event is issue_comment payload: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#issue_comment issue_comment: types: [created] env: FEEDBACK_LBL: pending::feedback SUPPORT_LBL: pending::support jobs: # NOTE: will update label if anyone responds, not just the author/reporter # TODO: create conda-issue-sorting team and modify this to toggle label based on # whether a non-issue-sorting engineer commented pending_support: # if [pending::feedback] and anyone responds if: >- !github.event.repository.fork && !github.event.issue.pull_request && contains(github.event.issue.labels.*.name, 'pending::feedback') runs-on: ubuntu-slim steps: # remove [pending::feedback] - uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0 with: labels: ${{ env.FEEDBACK_LBL }} github_token: ${{ secrets.PROJECT_TOKEN }} # add [pending::support], if still open - uses: actions-ecosystem/action-add-labels@18f1af5e3544586314bbe15c0273249c770b2daf # v1.1.3 if: github.event.issue.state == 'open' with: labels: ${{ env.SUPPORT_LBL }} github_token: ${{ secrets.PROJECT_TOKEN }} ================================================ FILE: .github/workflows/labels.yml ================================================ name: Sync Labels on: # NOTE: github.event is workflow_dispatch payload: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch workflow_dispatch: inputs: delete-unmapped: description: Delete labels not mapped in either global or local label configurations. default: false type: boolean dry-run: description: Run label synchronization workflow without making any changes. default: false type: boolean jobs: sync: if: '!github.event.repository.fork' runs-on: ubuntu-slim env: GLOBAL: https://raw.githubusercontent.com/conda/infra/main/.github/global.yml LOCAL: .github/labels.yml steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - id: has_local uses: andstor/file-existence-action@558493d6c74bf472d87c84eab196434afc2fa029 # v3.1.0 with: files: ${{ env.LOCAL }} - name: Global Only uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3 if: steps.has_local.outputs.files_exists == 'false' with: config-file: ${{ env.GLOBAL }} delete-other-labels: ${{ inputs.delete-unmapped }} dry-run: ${{ inputs.dry-run }} - name: Global & Local uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3 if: steps.has_local.outputs.files_exists == 'true' with: config-file: | ${{ env.GLOBAL }} ${{ env.LOCAL }} delete-other-labels: ${{ inputs.delete-unmapped }} dry-run: ${{ inputs.dry-run }} ================================================ FILE: .github/workflows/lock.yml ================================================ name: Lock on: # NOTE: github.event is workflow_dispatch payload: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch workflow_dispatch: schedule: - cron: 0 6 * * * permissions: issues: write pull-requests: write jobs: lock: if: '!github.event.repository.fork' runs-on: ubuntu-slim steps: - uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0 with: # Number of days of inactivity before a closed issue is locked issue-inactive-days: 180 # Do not lock issues created before a given timestamp, value must follow ISO 8601 exclude-issue-created-before: '' # Do not lock issues with these labels, value must be a comma separated list of labels or '' exclude-any-issue-labels: '' # Labels to add before locking an issue, value must be a comma separated list of labels or '' add-issue-labels: locked # Reason for locking an issue, value must be one of resolved, off-topic, too heated, spam or '' issue-lock-reason: resolved # Number of days of inactivity before a closed pull request is locked pr-inactive-days: 365 # Do not lock pull requests created before a given timestamp, value must follow ISO 8601 exclude-pr-created-before: '' # Do not lock pull requests with these labels, value must be a comma separated list of labels or '' exclude-any-pr-labels: '' # Labels to add before locking a pull request, value must be a comma separated list of labels or '' add-pr-labels: locked # Reason for locking a pull request, value must be one of resolved, off-topic, too heated, spam or '' pr-lock-reason: resolved # Limit locking to issues, pull requests or discussions, value must be a comma separated list of issues, prs, discussions or '' process-only: issues, prs ================================================ FILE: .github/workflows/performance.yml ================================================ name: Performance on: pull_request: types: - labeled workflow_run: workflows: - CI branches: - main types: - completed concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true env: CONDA_SOLVER: libmamba jobs: linux: if: | (github.event_name == 'pull_request' && github.event.label.name == 'performance::run') || (github.event.workflow_run.conclusion == 'success') name: Linux, Python ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.9"] env: OS: "linux" PYTHON: ${{ matrix.python-version }} steps: - name: Checkout our source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: path: conda-libmamba-solver fetch-depth: 0 - name: Checkout conda uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda path: conda - name: Run performance tests run: > docker run --rm -v ${GITHUB_WORKSPACE}/conda:/opt/conda-src -v ${GITHUB_WORKSPACE}/conda-libmamba-solver:/opt/conda-libmamba-solver-src -e TEST_SPLITS -e TEST_GROUP -e CONDA_SOLVER ghcr.io/conda/conda-ci:main-linux-python${{ matrix.python-version }} bash -c "sudo /opt/conda/condabin/conda install -p /opt/conda \ --file /opt/conda-libmamba-solver-src/dev/requirements.txt && /opt/conda/bin/python -m pip install /opt/conda-libmamba-solver-src \ --no-deps -vvv && source /opt/conda-src/dev/linux/bashrc.sh && /opt/conda/bin/python -m pytest /opt/conda-libmamba-solver-src \ -vv --durations=0 --timeout=1800 -m 'slow'" macos: if: | (github.event_name == 'pull_request' && github.event.label.name == 'performance::run') || (github.event.workflow_run.conclusion == 'success') name: MacOS, Python ${{ matrix.python-version }} runs-on: macos-latest strategy: fail-fast: false matrix: python-version: ["3.9"] env: OS: "macos" PYTHON: ${{ matrix.python-version }} steps: - name: Checkout our source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: path: conda-libmamba-solver fetch-depth: 0 - name: Checkout conda uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda ref: libmamba path: conda - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 with: activate-environment: conda-test-env use-only-tar-bz2: true # IMPORTANT: This needs to be set for caching to work properly! - name: Setup environment shell: bash -l {0} working-directory: conda run: | set -euxo pipefail # restoring the default for changeps1 to have parity with dev conda config --set changeps1 true # make sure the caching works correctly conda config --set use_only_tar_bz2 true # install all test requirements conda install --yes \ --file tests/requirements.txt \ --file ../conda-libmamba-solver/dev/requirements.txt \ python=${{ matrix.python-version }} conda update openssl ca-certificates certifi conda info python -c "from mamba import __version__; print('mamba', __version__)" - name: Install conda-libmamba-solver shell: bash -l {0} working-directory: conda-libmamba-solver run: | python -m pip install . -vv --no-deps - name: Run performance tests shell: bash -l {0} working-directory: conda run: | eval "$(sudo ${CONDA_PREFIX}/bin/python -m conda init bash --dev)" python -m pytest ${GITHUB_WORKSPACE}/conda-libmamba-solver -vv --durations=0 --timeout=1800 -m "slow" windows: if: | (github.event_name == 'pull_request' && github.event.label.name == 'performance::run') || (github.event.workflow_run.conclusion == 'success') name: Windows, Python ${{ matrix.python-version }} runs-on: windows-latest strategy: fail-fast: false matrix: python-version: ["3.9"] env: OS: "windows" PYTHON: ${{ matrix.python-version }} steps: - name: Checkout our source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: path: conda-libmamba-solver fetch-depth: 0 - name: Checkout conda uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda ref: libmamba path: conda - name: Set temp dirs correctly # https://github.com/actions/virtual-environments/issues/712 run: | echo "TMPDIR=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV echo "TMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV - name: Setup environment shell: cmd working-directory: conda run: | :: add mamba to requirements type ..\conda-libmamba-solver\dev\requirements.txt >> .\tests\requirements.txt if errorlevel 1 exit 1 :: initialize conda dev call .\dev\windows\setup.bat if errorlevel 1 exit 1 call .\dev-init.bat if errorlevel 1 exit 1 python -c "from mamba import __version__; print('mamba', __version__)" if errorlevel 1 exit 1 conda info -a if errorlevel 1 exit 1 - name: Install conda-libmamba-solver shell: cmd working-directory: conda run: | call .\dev-init.bat if errorlevel 1 exit 1 python -m pip install --no-deps -vv "%GITHUB_WORKSPACE%\conda-libmamba-solver" if errorlevel 1 exit 1 - name: Run performance tests shell: cmd working-directory: conda run: | CALL dev-init.bat if errorlevel 1 exit 1 python -m pytest "%GITHUB_WORKSPACE%\conda-libmamba-solver" -vv --durations=0 --timeout=1800 -m "slow" if errorlevel 1 exit 1 ================================================ FILE: .github/workflows/project.yml ================================================ name: Add to Project on: pull_request_target: types: - opened jobs: add_to_project: if: '!github.event.repository.fork' runs-on: ubuntu-slim steps: - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 with: # PRs are added to the Review project project-url: https://github.com/orgs/conda/projects/16 github-token: ${{ secrets.PROJECT_TOKEN }} ================================================ FILE: .github/workflows/stale.yml ================================================ name: Stale on: # NOTE: github.event is workflow_dispatch payload: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch workflow_dispatch: inputs: dryrun: description: 'dryrun: Preview stale issues/prs without marking them (true|false)' required: true type: boolean default: true schedule: - cron: 0 4 * * * permissions: issues: write pull-requests: write jobs: stale: if: '!github.event.repository.fork' runs-on: ubuntu-slim strategy: matrix: include: - only-issue-labels: '' days-before-issue-stale: 365 days-before-issue-close: 30 # [type::support] issues have a more aggressive stale/close timeline - only-issue-labels: type::support days-before-issue-stale: 90 days-before-issue-close: 21 steps: - uses: conda/actions/read-yaml@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 id: read_yaml with: path: https://raw.githubusercontent.com/conda/infra/main/.github/messages.yml - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 id: stale with: # Only issues with these labels are checked whether they are stale only-issue-labels: ${{ matrix.only-issue-labels }} # Idle number of days before marking issues stale days-before-issue-stale: ${{ matrix.days-before-issue-stale }} # Idle number of days before closing stale issues/PRs days-before-issue-close: ${{ matrix.days-before-issue-close }} # Idle number of days before marking PRs stale days-before-pr-stale: 365 # Idle number of days before closing stale PRs days-before-pr-close: 30 # Comment on the staled issues stale-issue-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-issue'] }} # Label to apply on staled issues stale-issue-label: stale # Label to apply on closed issues close-issue-label: stale::closed # Reason to use when closing issues close-issue-reason: not_planned # Comment on the staled PRs stale-pr-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-pr'] }} # Label to apply on staled PRs stale-pr-label: stale # Label to apply on closed PRs close-pr-label: stale::closed # Remove stale label from issues/PRs on updates/comments remove-stale-when-updated: true # Add specified labels to issues/PRs when they become unstale labels-to-add-when-unstale: stale::recovered # Remove specified labels to issues/PRs when they become unstale labels-to-remove-when-unstale: stale,stale::closed # Max number of operations per run operations-per-run: ${{ secrets.STALE_OPERATIONS_PER_RUN || 100 }} # Dry-run debug-only: ${{ github.event.inputs.dryrun || false }} # Order to get issues/PRs ascending: true # Delete branch after closing a stale PR delete-branch: false # Issues with these labels will never be considered stale exempt-issue-labels: stale::recovered,epic # Issues with these labels will never be considered stale exempt-pr-labels: stale::recovered,epic # Exempt all issues/PRs with milestones from stale exempt-all-milestones: true # Assignees on issues/PRs exempted from stale exempt-assignees: mingwandroid - name: Print outputs run: echo ${{ join(steps.stale.outputs.*, ',') }} ================================================ FILE: .github/workflows/tests.yml ================================================ name: Tests on: # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#push push: branches: - main - feature/** - '[0-9].*.x' # e.g., 4.14.x - '[0-9][0-9].*.x' # e.g., 23.3.x # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request pull_request: # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch workflow_dispatch: # CONDA-LIBMAMBA-SOLVER CHANGE schedule: - cron: "15 7 * * 1-5" # Mon to Fri, 7:15am # /CONDA-LIBMAMBA-SOLVER CHANGE concurrency: # Concurrency group that uses the workflow name and PR number if available # or commit SHA as a fallback. If a new build is triggered under that # concurrency group while a previous build is running it will be canceled. # Repeated pushes to a PR will cancel all previous builds, while multiple # merges to main will not cancel. group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true env: # https://conda.github.io/conda-libmamba-solver/user-guide/configuration/#advanced-options CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED: true # Reruns on upstream tests PYTEST_RERUN_FAILURES: 1 # Reruns on our tests PYTEST_RERUN_FAILURES_CLS: 0 # upstream conda tests that we want to skip PYTEST_ADDOPTS: "-k \"not test_get_index_lazy and not test_strict_resolve_get_reduced_index and not test_reorder_channel_priority\"" # for conda-libmamba-solver PYTEST_CLS_ADDOPTS: "-m \"not slow and not benchmark and not trouble\"" # See https://github.com/conda/conda/pull/13694 # we can't break classic from here; no need to test it # those tests will still be available for local debugging if necessary CONDA_TEST_SOLVERS: libmamba CONDA_REF: main # pin conda version to latest for more stable tests jobs: # detect whether any code changes are included in this PR changes: runs-on: ubuntu-latest permissions: # necessary to detect changes # https://github.com/dorny/paths-filter#supported-workflows pull-requests: read outputs: code: ${{ steps.filter.outputs.code }} steps: - name: Checkout Source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # dorny/paths-filter needs git clone for non-PR events # https://github.com/dorny/paths-filter#supported-workflows if: github.event_name != 'pull_request' - name: Filter Changes uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: filter with: # CONDA-LIBMAMBA-SOLVER CHANGE # changed some paths: filters: | code: - 'conda_libmamba_solver/**' - '*.py' - '.github/workflows/tests.yml' - 'tests/**' - 'dev/requirements.txt' - 'pyproject.toml' # /CONDA-LIBMAMBA-SOLVER CHANGE # windows test suite windows: # only run test suite if there are code changes needs: changes if: needs.changes.outputs.code == 'true' runs-on: windows-latest strategy: fail-fast: false matrix: # test lower version (w/ defaults) and upper version (w/ defaults and conda-forge) python-version: ['3.10', '3.13'] default-channel: [defaults, conda-forge] test-type: [conda-libmamba-solver, unit, integration] test-group: [1, 2, 3] exclude: - default-channel: conda-forge python-version: '3.10' - test-type: unit test-group: 3 - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE env: ErrorActionPreference: Stop # powershell exit immediately on error PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }} PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }} steps: - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE path: conda # CONDA-LIBMAMBA-SOLVER CHANGE ref: ${{ env.CONDA_REF }} # CONDA-LIBMAMBA-SOLVER CHANGE - name: Checkout conda-libmamba-solver uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 path: conda-libmamba-solver # /CONDA-LIBMAMBA-SOLVER CHANGE - name: Hash + Timestamp shell: bash # use bash to run date command run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV - name: Cache Conda uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: ~/conda_pkgs_dir key: cache-${{ env.HASH }} - name: Setup Miniconda uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 with: # CONDA-LIBMAMBA-SOLVER CHANGE: add conda\ condarc-file: conda\.github\condarc-${{ matrix.default-channel }} run-post: false # skip post cleanup - name: Upgrade conda-libmamba-solver (without sharded repodata) shell: bash -el {0} run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver - name: Conda Install working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE # CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt run: > conda install --yes --file tests\requirements.txt --file tests\requirements-${{ runner.os }}.txt --file tests\requirements-ci.txt --file tests\requirements-s3.txt --file ..\conda-libmamba-solver\dev\requirements.txt ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ..\\conda-libmamba-solver\\tests\\requirements.txt' || '' }} python=${{ matrix.python-version }} - name: Conda Remove anaconda-auth run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos # CONDA-LIBMAMBA-SOLVER CHANGE - name: Install conda-libmamba-solver run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Conda Info run: python -m conda info --verbose - name: Conda Config run: conda config --show-sources - name: Conda List Extra run: | conda env list conda list -n base conda list --show-channel-urls - name: Setup PowerShell # for tests/shell, so only necessary for integration tests if: matrix.test-type == 'integration' run: | Invoke-Expression "& { $(Invoke-RestMethod https://aka.ms/install-powershell.ps1) }" "PWSHPATH=$env:LOCALAPPDATA\Microsoft\powershell" | Out-File -FilePath $env:GITHUB_ENV -Append - name: PowerShell Info # for tests/shell, so only necessary for integration tests if: matrix.test-type == 'integration' run: | Get-Command -All powershell Get-Command -All "$env:PWSHPATH\pwsh.exe" - name: Run Upstream Tests working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE run: python -m pytest --durations-path=durations\${{ runner.os }}.json --group=${{ matrix.test-group }} --splits=${{ env.PYTEST_SPLITS }} --reruns=${{ env.PYTEST_RERUN_FAILURES }} -m "${{ env.PYTEST_MARKER }}" # CONDA-LIBMAMBA-SOLVER CHANGE - name: Run conda-libmamba-solver Tests working-directory: conda-libmamba-solver if: ${{ matrix.test-type == 'conda-libmamba-solver' }} shell: bash -el {0} run: | python -m pip install -e ../conda/ --no-deps --no-build-isolation python -m conda init --all . $CONDA_PREFIX/etc/profile.d/conda.sh python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16 #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Upload Coverage uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 if: false # CONDA-LIBMAMBA-SOLVER CHANGE with: flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }} - name: Upload Test Results if: '!cancelled()' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: test-results-${{ env.HASH }} # CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths path: | conda\.coverage conda\durations\${{ runner.os }}.json conda\test-report.xml retention-days: 1 # temporary, combined in aggregate below # linux test suite linux: # only run test suite if there are code changes needs: changes if: needs.changes.outputs.code == 'true' runs-on: ${{ matrix.runs-on }} defaults: run: # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell shell: bash -el {0} # bash exit immediately on error + login shell strategy: fail-fast: false matrix: # test all lower versions (w/ defaults) and upper version (w/ defaults and conda-forge) runs-on: [ubuntu-latest, ubuntu-24.04-arm] python-version: ['3.10', '3.11', '3.12', '3.13'] default-channel: [defaults, conda-forge] test-type: [conda-libmamba-solver, unit, integration] test-group: [1, 2, 3] exclude: - python-version: '3.10' default-channel: conda-forge - python-version: '3.11' default-channel: conda-forge - python-version: '3.12' default-channel: conda-forge - test-type: unit test-group: 3 - runs-on: ubuntu-24.04-arm python-version: '3.10' - runs-on: ubuntu-24.04-arm python-version: '3.11' - runs-on: ubuntu-24.04-arm python-version: '3.12' - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE env: PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }} PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }} steps: - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE path: conda # CONDA-LIBMAMBA-SOLVER CHANGE ref: ${{ env.CONDA_REF }} # CONDA-LIBMAMBA-SOLVER CHANGE - name: Checkout conda-libmamba-solver uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 path: conda-libmamba-solver # /CONDA-LIBMAMBA-SOLVER CHANGE - name: Hash + Timestamp run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV - name: Cache Conda uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: ~/conda_pkgs_dir key: cache-${{ env.HASH }} - name: Setup Miniconda uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 with: # CONDA-LIBMAMBA-SOLVER CHANGE: add conda/ condarc-file: conda/.github/condarc-${{ matrix.default-channel }} run-post: false # skip post cleanup - name: Upgrade conda-libmamba-solver (without sharded repodata) run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver - name: Conda Install working-directory: conda run: > conda install --yes --file tests/requirements.txt --file tests/requirements-${{ runner.os }}.txt --file tests/requirements-ci.txt --file tests/requirements-s3.txt --file ../conda-libmamba-solver/dev/requirements.txt ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }} python=${{ matrix.python-version }} - name: Conda Remove anaconda-auth run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos # CONDA-LIBMAMBA-SOLVER CHANGE - name: Install conda-libmamba-solver run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Conda Info run: python -m conda info --verbose - name: Conda Config run: conda config --show-sources - name: Conda List Extra run: | conda env list conda list -n base conda list --show-channel-urls - name: Setup Shells # for tests/shell, so only necessary for integration tests if: matrix.test-type == 'integration' run: sudo apt update && sudo apt install ash csh fish tcsh xonsh zsh - name: Run Tests working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE run: python -m pytest --durations-path=durations/${{ runner.os }}.json --group=${{ matrix.test-group }} --splits=${{ env.PYTEST_SPLITS }} --reruns=${{ env.PYTEST_RERUN_FAILURES }} -m "${{ env.PYTEST_MARKER }}" # CONDA-LIBMAMBA-SOLVER CHANGE - name: Run conda-libmamba-solver Tests working-directory: conda-libmamba-solver if: ${{ matrix.test-type == 'conda-libmamba-solver' }} run: | python -m pip install -e ../conda/ --no-deps --no-build-isolation python -m conda init --all . $CONDA_PREFIX/etc/profile.d/conda.sh python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16 #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Upload Coverage uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 if: false # CONDA-LIBMAMBA-SOLVER CHANGE with: flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }} - name: Upload Test Results if: '!cancelled()' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: test-results-${{ env.HASH }} path: | conda/.coverage conda/durations/${{ runner.os }}.json conda/test-report.xml retention-days: 1 # temporary, combined in aggregate below # linux benchmarks linux-benchmarks: needs: changes if: false # needs.changes.outputs.code == 'true' # disable for now. runs-on: ubuntu-latest defaults: run: # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell shell: bash -el {0} # bash exit immediately on error + login shell strategy: fail-fast: false matrix: python-version: ['3.12'] steps: - name: Checkout Source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Hash + Timestamp run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-benchmark-$(date -u "+%Y%m")" >> $GITHUB_ENV - name: Cache Conda uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: ~/conda_pkgs_dir key: cache-${{ env.HASH }} - name: Setup Miniconda uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 - name: Conda Install run: conda install --yes --file tests/requirements.txt python=${{ matrix.python-version }} - name: Conda Info run: python -m conda info --verbose - name: Conda Config run: conda config --show-sources - name: Conda List run: conda list --show-channel-urls - name: Run Benchmarks uses: CodSpeedHQ/action@d872884a306dd4853acf0f584f4b706cf0cc72a2 # v4.13.0 with: token: ${{ secrets.CODSPEED_TOKEN }} run: $CONDA/envs/test/bin/pytest --codspeed mode: instrumentation # linux-qemu test suite linux-qemu: # only run test suite if there are code changes # CONDA-LIBMAMBA-SOLVER CHANGE # needs: changes if: false # needs.changes.outputs.code == 'true' #/ CONDA-LIBMAMBA-SOLVER CHANGE # Run one single fast test per docker+qemu emulated linux platform to test that # test execution is possible there (container+tools+dependencies work). Can be # changed / extended to run specific tests in case there are platform related # things to test. Running more tests is time consuming due to emulation # (factor 2-10x slower). runs-on: ubuntu-latest defaults: run: # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell shell: bash -el {0} # bash exit immediately on error + login shell strategy: fail-fast: false matrix: python-version: ['3.12'] image: ['continuumio/miniconda3:latest', 'condaforge/miniforge3:latest'] platform: [arm64, ppc64le, s390x] exclude: - image: 'continuumio/miniconda3:latest' platform: ppc64le - image: 'condaforge/miniforge3:latest' platform: s390x steps: - name: Checkout Source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Setup QEMU uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 - name: Run Tests run: docker run --rm --volume ${PWD}:/opt/conda-src --workdir /opt/conda-src --platform linux/${{ matrix.platform }} ${{ matrix.image }} bash -lc ". /opt/conda/etc/profile.d/conda.sh && set -x && conda create --name test --yes --file tests/requirements.txt --file tests/requirements-${{ runner.os }}.txt --file tests/requirements-ci.txt python=${{ matrix.python-version }} && conda activate test && python -m conda info --verbose && conda config --show-sources && conda list --show-channel-urls && python -m pytest tests/test_api.py::test_DepsModifier_contract" # macos test suite macos: # only run test suite if there are code changes needs: changes if: needs.changes.outputs.code == 'true' runs-on: ${{ (matrix.arch == 'osx-64' && 'macos-15-intel') || 'macos-latest' }} defaults: run: # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell shell: bash -el {0} # bash exit immediately on error + login shell strategy: fail-fast: false matrix: # test lower version (w/ osx-64 & conda-forge & unit tests) and upper version (w/ osx-arm64 & defaults & integration tests) arch: [osx-64, osx-arm64] python-version: ['3.10', '3.13'] default-channel: [defaults, conda-forge] test-type: [conda-libmamba-solver, unit, integration] # CONDA-LIBMAMBA-SOLVER CHANGE test-group: [1, 2, 3] exclude: - arch: osx-64 python-version: '3.13' - arch: osx-64 default-channel: defaults - arch: osx-64 test-type: integration - arch: osx-arm64 python-version: '3.10' - arch: osx-arm64 default-channel: conda-forge - arch: osx-arm64 test-type: unit - arch: osx-arm64 # CONDA-LIBMAMBA-SOLVER CHANGE test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE - test-type: unit test-group: 3 - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 2 # CONDA-LIBMAMBA-SOLVER CHANGE - test-type: conda-libmamba-solver # CONDA-LIBMAMBA-SOLVER CHANGE test-group: 3 # CONDA-LIBMAMBA-SOLVER CHANGE env: PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }} PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }} steps: - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 repository: conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE path: conda # CONDA-LIBMAMBA-SOLVER CHANGE ref: ${{ env.CONDA_REF }} # CONDA-LIBMAMBA-SOLVER CHANGE - name: Checkout conda-libmamba-solver uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 path: conda-libmamba-solver # /CONDA-LIBMAMBA-SOLVER CHANGE - name: Hash + Timestamp run: echo "HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u "+%Y%m")" >> $GITHUB_ENV - name: Cache Conda uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: ~/conda_pkgs_dir key: cache-${{ env.HASH }} - name: Setup Miniconda uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0 with: # CONDA-LIBMAMBA-SOLVER CHANGE: add conda/ condarc-file: conda/.github/condarc-${{ matrix.default-channel }} run-post: false # skip post cleanup # conda not preinstalled in arm64 runners miniconda-version: ${{ (matrix.default-channel == 'defaults' && matrix.arch == 'osx-arm64') && 'latest' || null }} miniforge-version: ${{ (matrix.default-channel == 'conda-forge' && matrix.arch == 'osx-64') && 'latest' || null }} architecture: ${{ runner.arch }} - name: Upgrade conda-libmamba-solver (without sharded repodata) run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver - name: Conda Install working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE # CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt run: > conda install --yes --file tests/requirements.txt --file tests/requirements-ci.txt --file tests/requirements-s3.txt --file ../conda-libmamba-solver/dev/requirements.txt ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }} python=${{ matrix.python-version }} - name: Conda Remove anaconda-auth if: matrix.arch != 'osx-64' run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos # CONDA-LIBMAMBA-SOLVER CHANGE - name: Install conda-libmamba-solver run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Conda Info run: python -m conda info --verbose - name: Conda Config run: conda config --show-sources - name: Conda List run: conda list --show-channel-urls - name: Setup Shells # for tests/shell, so only necessary for integration tests if: matrix.test-type == 'integration' run: brew update && brew install fish xonsh - name: Run Tests working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE if: ${{ matrix.test-type != 'conda-libmamba-solver' }} # CONDA-LIBMAMBA-SOLVER CHANGE run: python -m pytest --durations-path=durations/${{ runner.os }}.json --group=${{ matrix.test-group }} --splits=${{ env.PYTEST_SPLITS }} --reruns=${{ env.PYTEST_RERUN_FAILURES }} -m "${{ env.PYTEST_MARKER }}" # CONDA-LIBMAMBA-SOLVER CHANGE - name: Run conda-libmamba-solver Tests working-directory: conda-libmamba-solver if: ${{ matrix.test-type == 'conda-libmamba-solver' }} run: | python -m pip install -e ../conda/ --no-deps --no-build-isolation python -m conda init --all . $CONDA_PREFIX/etc/profile.d/conda.sh python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16 #/ CONDA-LIBMAMBA-SOLVER CHANGE - name: Upload Coverage uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 if: false # CONDA-LIBMAMBA-SOLVER CHANGE with: flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }} - name: Upload Test Results if: '!cancelled()' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: test-results-${{ env.HASH }} # CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths path: | conda/.coverage conda/durations/${{ runner.os }}.json conda/test-report.xml retention-days: 1 # temporary, combined in aggregate below # aggregate and upload aggregate: # only aggregate test suite if there are code changes needs: [changes, windows, linux, linux-benchmarks, linux-qemu, macos] if: >- !cancelled() && needs.changes.outputs.code == 'true' runs-on: ubuntu-latest steps: - name: Download Artifacts uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - name: Upload Combined Test Results # provides one downloadable archive of all matrix run test results for further analysis uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: test-results-${{ github.sha }}-all path: test-results-* retention-days: 7 # for durations.yml workflow - name: Test Summary uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: test-results-*/test-report.xml # required check analyze: needs: [windows, linux, linux-qemu, linux-benchmarks, macos, aggregate] if: '!cancelled()' runs-on: ubuntu-latest steps: - name: Determine Success uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 id: alls-green # CONDA-LIBMAMBA-SOLVER CHANGE with: # permit jobs to be skipped if there are no code changes (see changes job) allowed-skips: ${{ toJSON(needs) }} jobs: ${{ toJSON(needs) }} # CONDA-LIBMAMBA-SOLVER CHANGE - name: Checkout our source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure' - name: Report failures if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure' uses: JasonEtco/create-an-issue@1b14a70e4d8dc185e5cc76d3bec9eab20257b2c5 # v2.9.2 env: GITHUB_TOKEN: ${{ secrets.CONDA_LIBMAMBA_SOLVER_ISSUES }} RUN_ID: ${{ github.run_id }} TITLE: "Scheduled tests failed" with: filename: .github/TEST_FAILURE_REPORT_TEMPLATE.md update_existing: true # /CONDA-LIBMAMBA-SOLVER CHANGE # canary builds build: name: Build canary needs: [analyze] # only build canary build if # - prior steps succeeded, # - this is the main repo, and # - we are on the main, feature, or release branch if: >- !cancelled() && !github.event.repository.fork && ( github.ref_name == 'main' || startsWith(github.ref_name, 'feature/') || endsWith(github.ref_name, '.x') ) runs-on: ubuntu-latest steps: # Clean checkout of specific git ref needed for package metadata version # which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR: - name: Checkout Source uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.ref }} clean: true fetch-depth: 0 # Explicitly use Python 3.11 since each of the OSes has a different default Python - name: Setup Python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: '3.11' - name: Detect Label shell: python run: | from pathlib import Path from re import match from os import environ if "${{ github.ref_name }}" == "main": # main branch commits are uploaded to the dev label label = "dev" elif "${{ github.ref_name }}".startswith("feature/"): # feature branch commits are uploaded to a custom label label = "${{ github.ref_name }}" else: # release branch commits are added to the rc label # see https://github.com/conda/infrastructure/issues/760 _, name = "${{ github.repository }}".split("/") label = f"rc-{name}-${{ github.ref_name }}" Path(environ["GITHUB_ENV"]).write_text(f"ANACONDA_ORG_LABEL={label}") - name: Create & Upload uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 env: # Run conda-build in isolated activation to properly package conda _CONDA_BUILD_ISOLATED_ACTIVATION: 1 with: package-name: ${{ github.event.repository.name }} subdir: noarch anaconda-org-channel: conda-canary anaconda-org-label: ${{ env.ANACONDA_ORG_LABEL }} anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }} conda-build-arguments: --override-channels --channel conda-forge ================================================ FILE: .github/workflows/update.yml ================================================ name: Update Repository on: # every Sunday at 00:36 UTC # https://crontab.guru/#36_2_*_*_0 schedule: - cron: 36 2 * * 0 workflow_dispatch: issue_comment: types: - created jobs: update: if: >- !github.event.repository.fork && ( github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || ( github.event_name == 'issue_comment' && github.event.issue.pull_request && ( github.event.comment.body == '@conda-bot render' || github.event.comment.body == '@conda-bot recreate' ) ) ) runs-on: ubuntu-slim steps: - if: github.event_name == 'issue_comment' uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 with: comment-id: ${{ github.event.comment.id }} reactions: eyes reactions-edit-mode: replace token: ${{ secrets.SYNC_TOKEN }} - if: github.event.comment.body == '@conda-bot render' name: Configure git origin run: | echo REPOSITORY=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.repo.full_name') >> $GITHUB_ENV echo REF=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.ref') >> $GITHUB_ENV - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: repository: ${{ env.REPOSITORY || github.repository }} ref: ${{ env.REF || '' }} token: ${{ secrets.SYNC_TOKEN }} - name: Configure git user run: | git config --global user.name 'Conda Bot' git config --global user.email '18747875+conda-bot@users.noreply.github.com' - uses: conda/actions/combine-durations@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 id: durations continue-on-error: true - uses: conda/actions/template-files@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0 id: templates continue-on-error: true - name: Commit changes # no-op if there are no updates continue-on-error: true run: | git add . git commit --message "🤖 updated file(s)" - if: github.event.comment.body != '@conda-bot render' name: Create fork # no-op if the repository is already forked run: echo FORK=$(gh repo fork --clone=false --default-branch-only 2>&1 | awk '{print $1}') >> $GITHUB_ENV env: GH_TOKEN: ${{ secrets.SYNC_TOKEN }} - if: github.event.comment.body != '@conda-bot render' id: create # no-op if no commits were made uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: push-to-fork: ${{ env.FORK }} token: ${{ secrets.SYNC_TOKEN }} branch: update delete-branch: true title: 🤖 Update infrastructure file(s) body: | [update.yml]: ${{ github.server_url }}/${{ github.repository }}/blob/main/.github/workflows/update.yml Your friendly repository updater. ${{ steps.durations.outputs.summary }} ${{ steps.templates.outputs.summary }} This PR was triggered by @${{ github.triggering_actor }} via ${{ github.event_name }}.
Commands Trigger actions by commenting on this PR: - `@conda-bot render` will run rendering workflows and commit and push any changes to this PR - `@conda-bot recreate` will recreate this PR, overwriting any edits that have been made to it
###### Auto-generated by the [`update.yml`][update.yml] workflow, see ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}. - if: github.event.comment.body == '@conda-bot render' id: update name: Push changes run: git push --force-with-lease - if: always() && github.event_name == 'issue_comment' uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 with: comment-id: ${{ github.event.comment.id }} reactions: ${{ (steps.create.conclusion == 'success' || steps.update.conclusion == 'success') && 'hooray' || 'confused' }} reactions-edit-mode: replace token: ${{ secrets.SYNC_TOKEN }} ================================================ FILE: .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 # PEP 582; used by e.g. github.com/David-OConnor/pyflow __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 maintainted 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/ .vscode/ # rever rever/ # setuptools_scm _version.py # codspeed .codspeed/ ================================================ FILE: .mailmap ================================================ # This file was autogenerated by rever: https://regro.github.io/rever-docs/ # This prevent git from showing duplicates with various logging commands. # See the git documentation for more details. The syntax is: # # good-name bad-name # # You can skip bad-name if it is the same as good-name and is unique in the repo. # # This file is up-to-date if the command git log --format="%aN <%aE>" | sort -u # gives no duplicates. Agriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com> Albert DeFusco Christopher Ostrouchov Dan Yeaw Daniel Holth Jaime Rodríguez-Guerra jaimergp Jannis Leidel John Costa John Kirkham Jonathan J. Helmus Julien Jerphanion Ken Odegard Kevin Markham Klaus Zimmermann Matthew R. Becker Ryan Keith Sophia Castellarin Stacy Noland <46572585+stacynoland@users.noreply.github.com> Thomas Lam <79589038+tl-hbk@users.noreply.github.com> Travis Hathaway conda-bot <18747875+conda-bot@users.noreply.github.com> Conda Bot <18747875+conda-bot@users.noreply.github.com> dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> ================================================ FILE: .pre-commit-config.yaml ================================================ # disable autofixing PRs, commenting "pre-commit.ci autofix" on a pull request triggers a autofix ci: autofix_prs: false # generally speaking we ignore all vendored code as well as tests data exclude: | (?x)^( tests/data/.* | conda_libmamba_solver/mamba_utils\.py )$ repos: # generic verification and formatting - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: # standard end of line/end of file cleanup - id: mixed-line-ending - id: end-of-file-fixer - id: trailing-whitespace # ensure syntaxes are valid - id: check-toml - id: check-yaml exclude: | (?x)^( (conda\.)?recipe/meta.yaml ) # catch git merge/rebase problems - id: check-merge-conflict - repo: https://github.com/asottile/blacken-docs rev: 1.20.0 hooks: # auto format Python codes within docstrings - id: blacken-docs additional_dependencies: [black] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.15.12 hooks: # lint & attempt to correct failures (e.g. pyupgrade) - id: ruff-check args: [--fix] # compatible replacement for black - id: ruff-format - repo: meta # see https://pre-commit.com/#meta-hooks hooks: - id: check-hooks-apply - id: check-useless-excludes - repo: https://github.com/PyCQA/bandit rev: 1.9.4 hooks: - id: bandit args: [--exit-zero] exclude: ^(tests/) - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.5.6 hooks: - id: insert-license files: \.py$ args: [--license-filepath, .github/disclaimer.txt, --no-extra-eol] exclude: ^(tests/repodata_time_machine.py|mamba_utils\.py|tests/channel_testing/helpers\.py|tests/channel_testing/reposerver\.py) # extend global exclude ================================================ FILE: AUTHORS.md ================================================ All of the people who have made at least one contribution to conda-libmamba-solver. Authors are sorted alphabetically. * Agriya Khetarpal * Albert DeFusco * Christopher Ostrouchov * Dan Yeaw * Daniel Holth * Jaime Rodríguez-Guerra * Jannis Leidel * John Costa * John Kirkham * Jonathan J. Helmus * Julien Jerphanion * Ken Odegard * Kevin Markham * Klaus Zimmermann * Matthew R. Becker * Ryan Keith * Sophia Castellarin * Stacy Noland * Thomas Lam * Travis Hathaway * conda-bot * dependabot[bot] * pre-commit-ci[bot] ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. > The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), > and this project adheres to [calendar versioning](https://calver.org/) in the `YY.M.MICRO`format. [//]: # (current developments) ## 26.4.1 (2026-05-01) ### Bug fixes * Show the target platform instead of the host platform in the progress message during cross-platform lockfile export. (#911) * Open the sharded repodata cache (`repodata_shards.db`) in WAL mode with a longer SQLite busy timeout, so the pipelined cache reader thread no longer races with the network writer thread and raises `sqlite3.OperationalError: database is locked`. Fall back to the default journal mode on filesystems where WAL is not supported. (#924) * Fix `add_pip_as_python_dependency` not being honored when sharded repodata is enabled. (#918 via #929) ### Contributors * @costajohnt made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/911 * @danyeaw made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/929 * @dholth * @jezdez * @conda-bot * @pre-commit-ci[bot] ## 26.4.0 (2026-04-16) ### Enhancements * Enable `use_sharded_repodata` by default. The solver will check for `repodata_shards.msgpack.zst` and use sharded repodata if it is present in at least one channel. Sharded repodata can be disabled with `conda config --set plugins.use_sharded_repodata false` or the environment variable `CONDA_PLUGINS_USE_SHARDED_REPODATA=0`. (#836) ### Bug fixes * Improve timeout behavior when fetching shards. (#890) * Fix race condition while reading shards index cache. (#890) ### Contributors * @dholth * @conda-bot * @dependabot[bot] * @pre-commit-ci[bot] ## 26.3.0 (2026-03-04) ### ✨ Special Announcement ✨ Following the preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata in conda-libmamba-solver 25.11.0, this release marks this feature as ready to be used by a wider audience. See below's 25.11.0 release for more information on how to enable it. ### Enhancements * Add offline mode support for sharded repodata. When offline mode is enabled, the solver will use cached shards even if they are expired, and gracefully fall back to non-sharded repodata if no cache exists. Missing shards in offline mode return empty shards rather than failing. (#710) ### Bug fixes * Remove `.tar.bz2` with matching `.conda`-format packages during shard traversal if `conda` is not in "use_only_tar_bz2" mode; needed as shards directly adds individual packages to the solver. (#710) * Fall back to `repodata.json` path if no channel has `repodata_shards.msgpack.zst` instead of computing repodata subsets for monolithic channels. (#716) * Ensure `track_features` fields are recorded properly in `conda-meta/*.json`. (#804 via #805) * Remove sqlite3 sharded repodata cache and create another on error. (#823) * Ensure that channel order is preserved when fetching data from shards. (#824 via #828) * Explicitly close sqlite3 connections after shard traversal to avoid a Python 3.13+ warning. (#843). * Fall back to `repodata.json`, but don't mark shards as unavailable, unless we receive a 4xx error code besides 416. (#844) * Use relative join on `s3://`-hosted `repodata_shards.msgpack.zst` and shards `base_url`, instead of truncating to just `base_url`. (#866) ### Docs * Update documentation to reflect that the cudatoolkit/cpuonly issue has returned. (#815) ### Other * Use lazy `PrefixData` getter to remove custom workaround for `conda` update checks. (#784 via #817) * Refactor `LibMambaIndexHelper._channel_urls` to preserve arch/noarch in `Channel()` objects; simplify sharded channel handling. (#841) * The `cpuonly` mutex no longer correctly prevents CUDA packages from being installed. For a time it appeared to work when non-cuda systems showed a virtual package `__cuda=0=0`, but with no `__cuda` package the mutex appears to no longer work. Reversing (#131 via #741) ### Contributors * @dholth * @jaimergp * @jezdez * @ryanskeith * @soapy1 * @conda-bot * @dependabot[bot] * @pre-commit-ci[bot] ## 25.11.0 (2025-11-24) ### ✨ Special Announcement ✨ This release includes preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata, a substantially more efficient way of distributing the necessary metadata to install packages in your environments. You can try it by: - Enabling it in your settings with `conda config --set plugins.use_sharded_repodata true` - Setting this environment variable: `CONDA_PLUGINS_USE_SHARDED_REPODATA=1` Note that sharded repodata requires that the target channels expose the necessary metadata too, so it will only work with CEP-16-ready deployments. `conda-libmamba-solver` will fallback to traditional (monolithic) repodata if not available, so you can mix sharded and non-sharded channels without problems. ### Enhancements * Add experimental support for [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata. Enable it with `conda config --set plugins.use_sharded_repodata true` or `CONDA_PLUGINS_USE_SHARDED_REPODATA=1`. (#684, #695, #696, #715 via #722, #730, #748, #736, #756, #762) * When sharded repodata is enabled, the solver checks every channel for an index, `repodata_shards.msgpack.zst`, and re-checks every 7 days if not found. It builds a subset of repodata by recursively traversing the dependencies of all installed and requested packages, using shards to fetch only the package metadata that could possibly be part of the solution from each channel. This smaller amount of package metadata is sent to the solver. Sharded repodata can save a significant amount of bandwith, memory, and parse time when installing packages. * Cache shards in a sqlite database in `${CONDA_PREFIX}/pkgs/cache/repodata_shards.db`. * This implementation does not use shards for `conda search` or other repodata uses that do not include a solve. * Add support for [CEP 17](https://conda.org/learn/ceps/cep-0017/) `python_site_packages_path`. (#560 via #628) * Add new messaging for when `conda` is outdated, environment is [frozen](https://conda.org/learn/ceps/cep-0022/), and `conda-self` is installed. (#753 via #766) * Add a codspeed benchmarking GitHub action and a few benchmarks. (#754 via #755) ### Bug fixes * Constrain the torchvision version in `test_pytorch_gpu`. (#659 via #661) * Correctly record channel platform in conda-meta record files. (#662 via #663) * Import `CondaSolver` from its canonical location in `conda.plugins.types`. (#691) * The `cpuonly` mutex now correctly prevents CUDA packages from being installed, matching classic solver behavior. (#131 via #741) ### Deprecations * Replace deprecated `conda.core.index._supplement_index_with_system` with `conda.core.index.Index().system_packages`. (#654 via #655) * Drop support for Python 3.9. (#747) ### Docs * Update documentation to reflect that the cudatoolkit/cpuonly issue has been resolved for the libmamba solver. (#131) * Document the [sharded repodata implementation](https://conda.github.io/conda-libmamba-solver/dev/sharded/). (#756, #745) ### Other * Improve repository server in test suite. (#700) * Add Python 3.13 to the CI matrix. (#747) * Test osx-64 with `conda-forge`, and osx-arm64 with `defaults`, since Anaconda does not build osx-64 dependencies anymore. (#729, #747) ## Contributors * @agriyakhetarpal made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/741 * @dholth * @jaimergp * @jezdez * @jjhelmus * @kenodegard * @stacynoland made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/766 * @travishathaway ## 25.4.0 (2025-04-25) ### Enhancements * Use `conda.reporters.get_spinner()` to support conda reporter plugins. (#641) ### Bug fixes * Always percent-encode spaces in `file://` channel URLs. (#640) * Fix a bug where auto-selection of GPU variants of `pytorch` and `torchvision` didn't work as expected. (#646 via #647) * Avoid `libmamba` `MatchSpec` parsing errors by skipping nameless channel information in passed specs. (#645 via #648) ### Contributors * @jaimergp ## 25.3.0 (2025-03-14) ### Bug fixes * Fix issue with content trust post-solve hooks that prevented signatures from being verified when the solved package records didn't include subdir information in their channel metadata. (#616 via #617) * Protect against `conda.base.context.context.restore_free_channel` deprecation by using `getattr`. (#629) * Remove all packages with `--no-deps`, not just the last one to be analyzed. (#632) ### Docs * Mention conda ecosystem's adaptation of `libsolv`. (#624) ### Contributors * @jaimergp * @jjerphan * @kenodegard ## 25.1.1 (2025-01-24) ### Bug fixes * Consider whether the full spec matches anything installed (not just name) when `--satisfied-skip-solve` is in use. (#605 via #606) ### Contributors * @jaimergp ## 25.1.0 (2025-01-21) ### Bug fixes * Fix dependency handling in `conda env update --prune`. (#595 via #596) * Accept both `pathlib.Path()` and `str` for `LibMambaSolver()` prefix. (#586) ### Contributors * @dholth * @jaimergp ## 24.11.1 (2024-12-04) ### Bug fixes * Ensure `PackageRecord` URLs are percent-decoded before passing them back to `conda`. (#583) ### Contributors * @jaimergp ## 24.11.0 (2024-11-27) 🚀 This release ships compatibility for `libmamba 2.x`. It's a major rewrite! Make sure to check the changelog entry for `24.11.0rc` for more details. ### Bug fixes * Load SOLV repodata cache in offline mode too. (#570) ### Contributors * @jaimergp ## 24.11.0rc (2024-10-31) ### Enhancements * Require `libmambapy` v2. This is a big refactor in `libmamba` internals, which also allowed us to remove a lot of code in `conda-libmamba-solver`. (#457) ### Deprecations * `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` has no effect anymore. Channels coming from installed packages are no longer added to the channel list. (#411 via #457) * Removed `conda_libmamba_solver.state.BaseIndexHelper`. The base class is now `conda_libmamba_solver.index.IndexHelper`. (#457) * Verbose logging in `libsolv` has a big overhead in `libmamba` v2, so we have disabled it by default (even if the user adds `-vvv` flags to the CLI). To opt-in, please set `CONDA_LIBMAMBA_SOLVER_DEBUG_LIBSOLV` to a truthy value. (#457) * Python 3.8 is no longer supported. The minimum version is now 3.9. (#457) ### Contributors * @jaimergp ## 24.9.0 (2024-09-25) ### Bug fixes * Use `Solver` instance configuration to initialize the `libmamba` context without implicitly relying on the `conda` context settings. (#525) * Fix conda-build compatibility regression where arch-specific outputs can't be found in the test phase if a `noarch` output was built first. (#531) ### Docs * Add installation workarounds FAQ with conda-standalone. (#505 via #511) * Update user guide to reflect conda-libmamba-solver being the default solver in conda. (#516 via #517) * Include `mamba-org/mamba` as a required cloned repository for setting up a dev environment. (#528) ### Contributors * @jaimergp * @jjhelmus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/528 * @justmarkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/510 ## 24.7.0 (2024-07-17) ### Bug fixes * Allow wildcards in package names for `conda remove` (e.g. `conda remove "python-*"`). (#434 via #435) * Avoid duplicate channel listing when using channel-pinned specs like `channel::package`. (#449) * Fix a performance regression where `.solv` repodata cache files were not being loaded when available. (#481 via #482) * Do not ignore virtual packages as input specs. (#480 via #485) * Pin `libmambapy <2` to defend against upcoming API changes. (#492) ### Docs * Document development workflows with devcontainers. (#451) ### Other * Add DevContainer configurations for local development workflows. (#451) ### Contributors * @jaimergp * @tl-hbk made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/449 * @zklaus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/476 ## 24.1.0 (2024-01-29) ### Enhancements * Prioritize explicitly requested specs with stricter constraints over implicit ones or name-only specs (e.g. a CLI-specified `name=version=build` will be sent to the solver before CLI-specified `name=version` and `name`). This happens to fix #391. (#381) * Load `pkgs_dirs` records when called in offline mode. (#396 via #423) ### Bug fixes * Fix a regression introduced in #378, where certain solves would hard crash due to the given specs input order. (#391 via #381) * Properly propagate customized local channels (conda-build workspaces). Requires `libmamba 1.5.6` or above. (#398 via #401) * Do not raise an error if an unsupported `MatchSpec` field can be safely dropped instead. Currently ignoring `url`, `md5` and `sha256`. (#418 via #421, #427 via #429). * Do not crash if a stateless repodata cache is accessed with `--offline` or `--use-index-cache`. (#396 via #423). ### Other * Remove old `SolverOutputState.specs` preparation logic from `state.py`, which was no longer in use since 23.9.0. Instead, enumerate all known specs in a certain order (see Enhancements for details). This list is then consumed by `Solver._specs_to_tasks()` as usual. (#381) ### Contributors * @isuruf made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/401 * @jaimergp ## 23.12.0 (2023-12-12) ### Enhancements * Add some boundary checks to `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS`. (#394, #403) ### Bug fixes * Instantiate `IndexHelper` in offline mode for compatibility with conda-build. Otherwise the index can get out of sync during long build processes. (#386 via #395) ### Docs * Use new conda-sphinx-theme for documentation site. (#367 via #370) * Reorganize the layout of the documentation site. (#370) ### Contributors * @dholth * @jaimergp * @jezdez * @travishathaway made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/370 ## 23.11.1 (2023-11-16) ### Enhancements * Raise a friendlier `InvalidSpec` error instead of `RuntimeError` when libmamba detects a problem in the configured solver jobs. (#352 via #357) * Ensure specs, `SolverInputState.installed` and `SolverInputState.virtual` containers are consistently sorted. (#378) ### Bug fixes * Configure pinned specs just once to avoid solver bugs related with their persistence (i.e. inability to downgrade environments if pinned specs are present and a transient dependency needs to be removed). (#354 via #355) * Detect whether a channel is part of a multichannel so the latter is used in the `PackageRecord` entries for conda-build. Fixes an issue with conda-build and custom multichannels. (#363 via #365) * Allow authenticated URLs in `default_channels` and other multichannels. (#364 via #366) * Preserve authentication while reloading local channels. (#366) ### Contributors * @jaimergp ## 23.11.0 (2023-11-02) ### Bug fixes * Do not use `libmamba`'s default signal handler so users can `Ctrl-C` from `conda`. (#337 via #340) * Defer conda-build-specific exception definition and import until it is needed by the solver. (#342) * Interpret "excluded by strict priority" solver errors as proper satisfiability conflicts and avoid printing related yet uninformative warnings. (#343) * Ensure that historic specs are kept in the environment, even if that means raising a conflict. (#341 via #345) ### Docs * Document environment variables used for advanced configuration. (#349) ### Other * Require `libmambapy >=1.5.3` for improved signal handling and `MatchSpec` syntax compliance. (#347) ### Contributors * @dholth * @jaimergp ## 23.9.3 (2023-10-24) ### Bug fixes * Massage bracket-containing specs (e.g. `ca-certificates[version='>=2023']`) so they are understood by `libmambapy.Query`, fixing a bug where `conda` would erroneously complain about no package records matching the configured pinned specs. (#327 via #328) ### Contributors * @jaimergp ## 23.9.2 (2023-10-19) ### Bug fixes * Use the conda version reported at runtime (instead of the one reported by `conda list`) to figure out whether there are conda updates available. (#316) * Allow the index to be empty in `--offline` runs with no local cache available for the configured channels. (#323) ### Contributors * @costrouc * @jaimergp ## 23.9.1 (2023-09-29) ### Enhancements * Increase performance of `notify_conda_outdated` logic. (#298) ### Bug fixes * Prevent solver from bouncing between two compatible solutions when the same command is run twice in a row. (#302) ### Contributors * @costrouc * @jaimergp ## 23.9.0 (2023-09-28) ### Enhancements * Expose libmamba's `repoquery` search features as a conda subcommand plugin. (#258) * Rewrite how we create tasks for `libsolv`, making use of `libmamba`'s `add_pin` features. Requires `libmambapy >=1.5.1`. (#270, #288) * Name-only pins will lock the corresponding package if installed. ([conda#13031](https://github.com/conda/conda/pull/13031) via #289) * Use the `.solv` cache for repodata if available and recent. (#295) ### Bug fixes * Handle commands with no channels passed gracefully. (#256) * Workaround for missing `noarch` field in returned `PackageRecord` payload. (#257) * Port logic from [conda/conda#9614](https://github.com/conda/conda/pull/9614), which fixes a bug where the `--prune` flag was not working correctly in `conda env update` commands. (#270) * Ensure environments are not aggressively updated to higher priority channels under some conditions. (#240 via #270, #285) * Do not inject those channels from installed packages that do not exist or are unavailable. (#262 via #274) * Correctly print all configured channels in `PackagesNotFoundError` exceptions. (#284) * Do not crash if a `MatchSpec` with a build string is specified in the CLI and there's a pinned spec for the same package name. (#286 via #289) * Only apply `defaults::pkg` workarounds for the default value `default_channels`. (#292) ### Deprecations * Users won't be able to override pinned specs with incompatible CLI specs anymore. Instead they must modify their pinned specs explicitly. ([conda#9016](https://github.com/conda/conda/issues/9016) via #289, #294) ### Docs * Document intentional deviations from conda's `classic` solver behavior. (#289) ### Other * Explain why `defaults::pkg_name` is broken libmamba 1.5.x ([details](https://github.com/mamba-org/mamba/issues/2431)). (#266) ## 23.7.0 (2023-07-31) ### Enhancements * Add basic integrations for local channels in conda-build. (#194) ### Bug fixes * Add backwards-compatible support for the new namespaced settings in `libmamba.Context`. (#192 via #193) * Fixes an error where a user-supplied package in the CLI would get dropped if the argument happened to match a larger string in the argument list. (#221 via #222) * Fix authentication in package downloads. (#216 via #226) * Fix unhandled channels coming from injected virtual packages in `conda-lock`. (#230 via #234) * Handle URL-encoded channels correctly with recent `libmamba` versions. (#247 via #248) ### Docs * Added notes about development workflows with libmamba from source. (#191) ### Other * Adding libmamba/libmambapy as development dependencies within docker images. (#191) ### Contributors * @costrouc * @jaimergp * @conda-bot * @pre-commit-ci[bot] ## 23.5.0 (2023-05-25) ### Enhancements * Provide a `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` environment variable to prevent channels from being injected from installed packages. This is useful for air-gapped environments where outside channels are not available. (#108 via #184) * Simplify `libmambapy.Context` initialization so we only set the bits that we use. (#209) * Use the new `RepoInterface` and remove the `SubdirData` subclass workarounds, which requires `conda 23.5.0`. (#210) ### Bug fixes * Fix an issue where running `conda update ` would result in the package being _downgraded_ if no newer versions were available. (#71 via #158) * Ensure unauthenticated channels are not re-injected in the channel lists from installed packages if an authenticated equivalent is already present. (#108 via #184) * Honor `context.repodata_threads`. (#200) * Do not set `quiet` manually when `context.json` is true. (#187) ### Deprecations * Remove unneeded user-agent tests. (#183) ### Docs * Document known solver behavior differences. (#115, #131 via #197) * Update development docs to reflect changes in build system and other inaccuracies. (#208) ### Other * Add tests reproducing the known solver differences. (#115, #131 via #197) * Skip tests on libmamba 1.4.2 temporarily to workaround some test failures. Tracked by #186. (#187) ### Contributors * @jakirkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/189 * @costrouc * @jaimergp * @jezdez * @kenodegard * @conda-bot * @pre-commit-ci[bot] ## 23.3.0 (2023-03-31) ### Enhancements * Simplify exception parsing and enable new (experimental) conflict reports in `libmamba`. (#102 via #103, #160) * Use `conda`'s `SubdirData` for all repodata fetching and caching. (#59, #68 via #65, #171) ### Bug fixes * Disable lockfiles within libmambapy to conform with conda's behavior of not using them. (#120) * Fix JSON serialization errors in some exceptions. (#140 via #142) * Fix API breakage upstream: `SubdirData.cache_path_json` property changed from `str` to `PrefixPath`. Depend directly on `boltons.setutils.IndexedSet`. (#151) * Updated bundled conda recipe and corresponding CI workflow. (#166) * Bumped minimum conda version from 22.11.1 -> 23.3.0 due to change in boltons IndexedSet. (#170) * Add workaround for `defaults::` specs. (#173 via #172) ### Deprecations * Python 3.7 is no longer supported. The minimum version is now 3.8. (#174) ### Other * Change the build-system to `hatchling` + `hatch-cvs` for a `setuptools-scm`-like versioning setup. (#128 via #127) * Add conda-forge based CI environments. (#133) * Fix cache directory in flaky test. (#157) * CI: Pin `minio` to `2023-03-13T19-46-17Z` to avoid breaking changes. (#159) * Require `libmamba 1.4.1` or greater and remove unused code paths. (#165) ### Contributors * @AlbertDeFusco made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/142 * @costrouc * @jaimergp * @jezdez * @conda-bot * @pre-commit-ci[bot] ## [23.1.0] - 2023-01-31 ### Bug fixes * Fix "Packages Not Found" error messages to be more accurate and informative. (#96 via #101) * Ensure solves are deterministic and input order independent. (#75 via #111) * Fix compatibility errors with newer conda versions >=23.1.0 since we are using an internal API SubdirData. (#118 via #119) ### Docs * Mention expected versions and how to upgrade from experimental builds. (#89 via #93) ### Other * CI: Add scheduled runs with self-reported issues. (#60 via #106) * Fix typo in workflow documentation so it is consistent with the setup page. (#110) ### Contributors * @costrouc made their first contribution in #110 * @jaimergp * @jezdez * @conda-bot * @pre-commit-ci[bot] ## [22.12.0] - 2022-12-01 ### Upgrade notice To upgrade to `conda-libmamba-solver 22.12.0` please update to `conda 22.11.0` using the "classic" solver first: ``` $ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda=22.11.0 ``` and then install a new version of conda-libmamba-solver: ``` $ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda-libmamba-solver=22.12.0 ``` Afterwards, please use the new `CONDA_SOLVER` environment variable and ``--solver`` as mentioned below. ### Added * Added a new documentation site: https://conda.github.io/conda-libmamba-solver/ (#58) * Added [CEP 4](https://github.com/conda-incubator/ceps/blob/main/cep-4.md) compatible plugin for conda's `solvers` plugin hook. (#63) ### Changed * The `conda-libmamba-solver` package is now generally available, removes the `experimental` label. (#53) * The index will also load channels only listed as part the installed packages in the active prefix. (#52) * Updated compatibility to [mamba 1.0.0](https://github.com/mamba-org/mamba/releases/tag/2022.11.01) and [conda 22.11.0](https://github.com/conda/conda/releases/tag/22.11.0). (#78) ### Deprecated * Deprecate support for Python 3.6.x. ### Fixed * Fixed a wrong dependency on libmambapy. (#90) * If missing or empty, package records will have their `subdir` field populated by the channel platform. (#53) ## [22.8.1] - 2022-08-25 ### Fixed * Amend packaging metadata (#51) ## [22.8.0] - 2022-08-24 ### Added * Check if conda is outdated with `libmamba` instead of relying on conda's implementation (#46) ### Changed * Rely on conda's `SubdirData` as a fallback for channel protocols not supported by `libmamba` (#49) ### Deprecated * Deprecate `libmamba-draft` solver variant (#45) ### Removed * Remove legacy debugging code and file-logging based on stream capture (#48) ## [22.6.0] - 2022-06-28 ### Added * Custom user agent (#29) * Compatibility with conda-build (#30) ### Changed * Enable support for user-defined `repodata_fn` while ignoring `current_repodata.json` (#34) * Faster Python version changes (#33) * Remove base environment protection (#43) ### Fixed * Fix libmamba 0.23 compatibility (#35) * Fix handling of `*`-enabled build strings (#36) * Fix `escape_channel_url` problems (#32) * Fix error reporting if S3-backed channels are used (#41) ## [22.3.1] - 2022-03-23 ### Fixed * Make sure `noarch` packages get reinstalled if Python version changed (#26) * Accept star-only version specs (e.g. `libblas=*=*mkl`) and fix support for `channel::package` syntax (#25) * Enable support for authenticated channels (#23) ## [22.3.0] - 2022-03-09 _First public release_ ## [22.2.0] - 2022-02-01 _Internal pre-release as a separate repository._ [Unreleased]: https://github.com/conda/conda-libmamba-solver/compare/22.8.1..main [22.3.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.1 [22.3.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.0 [22.2.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.2.0 [22.6.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.6.0 [22.8.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.0 [22.8.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.1 [22.12.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0 [23.1.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/23.1.0 ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Conda Organization Code of Conduct # The Short Version Be kind to others. Do not insult or put down others. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are not appropriate for the conda Organization. All communication should be appropriate for a professional audience including people of many different backgrounds. Sexual language and imagery is not appropriate. The conda Organization is dedicated to providing a harassment-free community for everyone, regardless of gender, sexual orientation, gender identity and expression, disability, physical appearance, body size, race, or religion. We do not tolerate harassment of community members in any form. Thank you for helping make this a welcoming, friendly community for all. ## Report an Incident * Report a code of conduct incident [using a form](https://form.jotform.com/221527028480048). * Report a code of conduct incident via email: [conduct@conda.org](mailto:conduct@conda.org). * Contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence.   And now the longer version... # Conda Organization Diversity Statement The conda Organization welcomes and encourages participation in our community by people of all backgrounds and identities. We are committed to promoting and sustaining a culture that values mutual respect, tolerance, and learning, and we work together as a community to help each other live out these values. We have created this diversity statement because we believe that a diverse community is stronger, more vibrant, and produces better software and better science. A diverse community where people treat each other with respect has more potential contributors, more sources for ideas, and fewer shared assumptions that might hinder development or research. Although we have phrased the formal diversity statement generically to make it all-inclusive, we recognize that there are specific identities that are impacted by systemic discrimination and marginalization. We welcome all people to participate in the conda Organization community regardless of their identity or background. # Conda Organization Code of Conduct: Introduction & Scope This code of conduct should be honored by everyone who participates in the conda Organization community. It should be honored in any conda Organization-related activities, by anyone claiming affiliation with the conda Organization, and especially when someone is representing the conda Organization in any role (including as an event volunteer or speaker). This code of conduct applies to all spaces managed by the conda Organization, including all public and private mailing lists, issue trackers, wikis, forums, and any other communication channel used by our community. The code of conduct equally applies at conda Organization events and governs standards of behavior for attendees, speakers, volunteers, booth staff, and event sponsors. This code is not exhaustive or complete. It serves to distill our understanding of a collaborative, inclusive community culture. Please try to follow this code in spirit as much as in letter, to create a friendly and productive environment that enriches the conda Organization community. The conda Organization Code of Conduct follows below. # Standards for Behavior The conda Organization is a worldwide community. All communication should be appropriate for a professional audience including people of many different backgrounds. **Please always be kind and courteous. There's never a need to be mean or rude or disrespectful.** Thank you for helping make this a welcoming, friendly community for all. We strive to: **Be empathetic, welcoming, friendly, and patient.** We remember that the conda Organization is crafted by human beings who deserve to be treated with kindness and empathy. We work together to resolve conflict and assume good intentions. We may all experience some frustration from time to time, but we do not allow frustration to turn into a personal attack. A community where people feel uncomfortable or threatened is not a productive one. **Be collaborative.** Our work depends on the participation of many people, and in turn others depend on our work. Open source communities depend on effective and friendly collaboration to achieve their goals. **Be inquisitive.** Nobody knows everything! Asking questions early avoids many problems later, so we encourage questions, although we may direct them to the appropriate forum. We will try hard to be responsive and helpful. **Be careful in the words that we choose.** We are careful and respectful in our communication and we take responsibility for our own speech. Be kind to others. Do not insult or put down other members of the community. ## Unacceptable Behavior We are committed to making participation in this community a harassment-free experience. We will not accept harassment or other exclusionary behaviors, such as: - The use of sexualized language or imagery - Excessive profanity (please avoid curse words; people differ greatly in their sensitivity to swearing) - Posting sexually explicit or violent material - Violent or intimidating threats or language directed against another person - Inappropriate physical contact and/or unwelcome sexual attention or sexual comments - Sexist, racist, or otherwise discriminatory jokes and language - Trolling or insulting and derogatory comments - Written or verbal comments which have the effect of excluding people on the basis of membership in a specific group, including level of experience, gender, gender identity and expression, sexual orientation, disability, neurotype, personal appearance, body size, race, ethnicity, age, religion, or nationality - Public or private harassment - Sharing private content, such as emails sent privately or non-publicly, or direct message history, without the sender's consent - Continuing to initiate interaction (such as photography, recording, messaging, or conversation) with someone after being asked to stop - Sustained disruption of talks, events, or communications, such as heckling of a speaker - Publishing (or threatening to post) other people's personally identifying information ("doxing"), such as physical or electronic addresses, without explicit permission - Other unethical or unprofessional conduct - Advocating for, or encouraging, any of the above behaviors The conda Organization prioritizes marginalized people’s safety over privileged people’s comfort. The conda CoC Committee reserves the right not to act on complaints including, but not limited to: * ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’. * Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you.” * Communicating in a ‘tone’ you don’t find congenial. * Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions. ## Behavior Outside of conda Organization Spaces The CoC Committee does not influence behavior and membership in spaces outside the conda Organization. However, if you are being harassed by a member of the conda community outside our spaces, you may still report it to the CoC Committee. We will take all good-faith reports of harassment by conda community members seriously. This includes harassment outside our spaces and harassment that took place at any point in time. The CoC Committee reserves the right to exclude people from conda Organization spaces based on their past behavior, including behavior outside conda Organization spaces and behavior towards people who are not in the conda community. # Confidentiality and Public Statements to the Community The CoC Committee will keep the identity of the reporter confidential. Whenever possible, CoC cases will be reported to the community. The level of detail in reports will vary from case to case. Reports will describe at least the type of infraction that was reported, and the Committee's decision and any action taken. In most cases, the report will not include personally identifiable information. # Live Events > **If you feel your safety is in jeopardy or the situation is an emergency, we urge you to contact local law enforcement before making a report to the event's Code of Conduct committee members, [representatives](#coc-representatives), or other staff.** (In the U.S., call 911.) Live events present particular challenges: **Code of conduct reports, and consequences that stem from them, merit a thoughtful and deliberative process. Decisions and consequences matter for the reporter, the reported, and for the community at large. However, many reports, especially at live events, require rapid action to quickly address the behavior being reported.** To better support situations where immediate action may be required, these guidelines are used *during* live events: * All conda Organization events will have specific, named Code of Conduct contacts for the events. * The names and contact mechanisms for the Code of Conduct representatives will be clearly and frequently communicated to event participants. ## CoC Representatives Every conda Organization associated event will have named CoC Committee members or *CoC representatives* that are the first point of contact for that event. Who these people are will be clearly and frequently communicated to event participants. CoC approved representatives are used when there are no committee members participating in the event. ## Live Events: Reporting and Actions At conda Organization events, Code of Conduct committee members or representatives will attempt to gather and write down [information](#what-to-include-in-a-report) from anyone making a verbal report at a live event. Recording the details in writing is exceedingly important in order for us to effectively respond to reports. If event staff write down a report taken verbally, then the person making the report will be asked to review the written report for accuracy. For reports made during live events, or in any situation where urgent action is needed: * Any two (or more) event organizers, event staff, CoC Committee members or CoC representatives can decide if immediate action is to be taken and what that action is. In exceptionally dangerous situations, this decision can be made by a single person. * These rapid decisions can be reconsidered during the event as more information becomes available. * The scope of any rapid decision is limited to the current event / situation. * The report, any related information, and any decisions and consequences will be reported to the full Code of Conduct Committee as soon as possible. The full Code of Conduct Committee will then consider the report using the full timeline and processes defined below. The Committee may decide to apply consequences in other spaces beyond the space where the behavior was reported. Potential *immediate* consequences for violating the conda Organization Code of Conduct at a live event include, but are not limited to: - Warning the person to cease their behavior and that any further reports will result in sanctions - Requiring that the person avoid any interaction with, and physical proximity to, the person they are harassing for the remainder of the event - Ending a talk that violates the policy early - Not publishing the video or slides of a talk that violated the policy - Not allowing a speaker who violated the policy to give (further) talks at the event now or in the future - Immediately ending any event volunteer responsibilities and privileges the reported person holds - Expelling the person from the event without a refund - Requiring that the person immediately leave the event and not return - Any other response that the CoC members, representatives, or event staff deem necessary and appropriate to the situation # Reporting Guidelines If you believe someone is violating the code of conduct, please report this in a timely manner. Code of conduct violations reduce the value of the community for everyone. The conda Code of Conduct (CoC) Committee and the conda Organization take reports of misconduct very seriously and are committed to preserving and maintaining the welcoming nature of our community. > [!NOTE] > You are also encouraged to reach out to the conda Code of Conduct (CoC) Committee if you want clarification on something, if you notice some borderline behavior, or just have a concern. Send us a note at [conduct@conda.org](mailto:conduct@conda.org). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The conda CoC Committee commits to maintaining confidentiality with regard to the reporter of an incident. For possibly unintentional breaches of the code of conduct, you may want to respond to the person and point out this code of conduct (either in public or in private, whatever is most appropriate). If you would prefer not to do that, please report the issue to the conda CoC Committee directly. Take care of each other. Alert someone if you notice a dangerous situation, someone in distress, or violations of this code of conduct, even if they seem inconsequential. ## How to Submit a Report The CoC Committee is committed to promptly addressing any reported issues. If you have experienced or witnessed behavior that violates the conda Organization Code of Conduct, please let us know. You can report an incident * via the **[Incident Reporting Form](https://form.jotform.com/221527028480048)** * via email: [conduct@conda.org](mailto:conduct@conda.org) * contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence. Reports submitted via the form or committee email address are sent to the [full conda Code of Conduct Committee](#committee-membership). ## What to Include in a Report Our ability to address any code of conduct breaches in a timely and effective manner is impacted by the amount of information you can provide, so, we ask you to include as much of the following information as you can**: - **Your contact info** (so we can get in touch with you if we need to follow up). This will be kept confidential. You can also file a report [anonymously](#anonymous-reporting). - The **approximate time and location of the incident** (please be as specific as possible). - **Identifying information** (e.g. name, nickname, screen name, physical description) of the individual whose behavior is being reported. - **Description of the behavior** (if reporting harassing language, please be specific about the words used), **your account of what happened**, and any available **supporting records** (e.g. email, GitHub issue, screenshots, etc.). - **Description of the circumstances/context** surrounding the incident. - Let us know **if the incident is ongoing**, and/or if this is part of an ongoing pattern of behavior. - Names and contact info, if possible, of **anyone else who witnessed** or was involved in this incident. (Did anyone else observe the incident?) - **Any other relevant information** you believe we should have. ## Anonymous Reporting The reporting form supports anonymous incident reporting. Anonymous reporting works best when the behavior happened in a public space and was witnessed by many. If an incident is reported anonymously and was not witnessed by others, then the committee may be limited in what actions it can take and what it can report to the larger community. Nevertheless, the CoC Committee is still interested in receiving these reports. They are helpful when determining what we need to address as a community, and when looking for evidence of repeated behavior. ## Conflicts of Interest Committee members are expected to recuse themselves if they have a conflict of interest, and are required to recuse themselves if they are the accused or the target of the reported behavior. In addition, the CoC Committee can [vote](#voting-and-decision-making) to remove a committee member from a case, if the committee feels that the member has a conflict of interest. This [vote](#voting-and-decision-making) requires a simple majority. If you are concerned about making a report that will be read by all committee members, you are strongly encouraged to contact [individual committee members](#committee-membership) directly. # Enforcement: What Happens After a Report is Filed? ## Acknowledgment and Responding to Immediate Needs CoC Committee members and/or event staff will attempt to ensure your safety and help with any immediate needs. The CoC Committee will make every effort to **acknowledge receipt within 24 hours** (and we'll aim for much more quickly than that). ## Reviewing the Report The CoC Committee will make all efforts to **review the incident within three days** and determine: - Whether this is an ongoing situation, or if there is a threat to anyone's physical safety - What happened - Whether this event constitutes a code of conduct violation - Who the bad actor was, if any ## Contacting the Person Reported After the CoC Committee has had time to review and discuss the report, someone will attempt to contact the person who is the subject of the report to inform them of what has been reported about them. We will then ask that person for their account of what happened. ## Response and Potential Consequences Once the CoC Committee has completed our investigation of the report, we will make a decision as to how to respond. The person making a report will not normally be consulted as to the proposed resolution of the issue, except insofar as we need to understand how to help them feel safe. Potential consequences for violating the conda Organization code of conduct include: - Nothing (if we determine that no violation occurred) - Private feedback or reprimand from the CoC Committee to the individual(s) involved - Warning the person to cease their behavior and that any further reports will result in sanctions - A public announcement that an incident occurred - Mediation (only if both reporter and reportee agree) - An imposed vacation (e.g. asking someone to "take a week off" from a mailing list) - A permanent or temporary ban from some or all the conda Organization spaces (mailing lists, GitHub repos, in-person events, etc.) - Assistance to the complainant with a report to other bodies, for example, institutional offices or appropriate law enforcement agencies - Removing a person from the conda Organization membership or other formal affiliation - Publishing an account of the harassment and calling for the resignation of the alleged harasser from their responsibilities (may be called for if the person is an event leader, or refuses to stand aside from the conflict of interest, or similar) - Any other response that the CoC Committee deems necessary and appropriate to the situation No one espousing views or values contrary to the standards of our code of conduct will be permitted to hold any position representing the conda Organization, including volunteer positions. The CoC Committee has the right and responsibility to remove, edit, or reject comments, commits, code, website edits, issues, and other contributions that are not aligned with this code of conduct. We aim to **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved. We will contact the person who is the subject of the report to let them know what actions will be taken as a result of the report, if any. Our policy is to make sure that everyone aware of the initial incident is also made aware that official action has been taken, while still respecting the privacy of individuals. In addition, we will also usually [notify the community](#confidentiality-and-public-statements-to-the-community) that an incident has been reported, what type of incident it was, and what the response was, again respecting the privacy of individuals. ## Appealing a Decision To appeal a decision of the CoC Committee, contact the [Committee Co-Chairs](#committee-membership), with your appeal. Please include as much detail as possible about why you are appealing the decision. The Co-Chairs will review the appeal, possibly consulting with the full Committee, and then issue a decision. # Timeline Summary: | Time | Event | Details | | ---- | ---- | ---- | | Within 24 Hours | Acknowledge | The CoC Committee will make every effort to **acknowledge receipt of a report within 24 hours**. | | Within 3 Days | Review | The CoC Committee aims to **review the incident within three days**. | | Within 1 Week | Resolve | We will **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved. | # Voting and Decision Making Committee votes and decisions require both a minimum quorum size for the vote to be counted, and then a minimum percentage of cast affirmative votes to pass. Except where otherwise noted, votes require a quorum and a simple majority to pass: * Minimum Quorum: * More than 50% of eligible committee members must vote. * Eligibile members do not include those excluded because of [conflicts of interest](#conflicts-of-interest). * Affirmative vote threshold: * More than 50% of the votes cast need to be affirmative to take action. # Committee Membership You can reach the entire CoC Committee by emailing [conduct@conda.org](mailto:conduct@conda.org). | Name | Employer / Funding | Steering Council Member | Current Term Ends | | ---- | ---- | ---- | --- | | [Eric Dill](https://github.com/ericdill) | [Anaconda](https://anaconda.com/) | | 2026-07-01 | | [Dasha Gurova](https://github.com/dashagurova) | [Anaconda](https://anaconda.com/) | | 2026-07-01 | | [Bianca Henderson](https://github.com/beeankha) | [Red Hat](https://redhat.com/) | | 2026-07-01 | | [Katherine Kinnaman](https://github.com/kathatherine) | [Anaconda](https://anadonda.com/) | | 2026-07-01 | | [Mahe Iram Khan](https://github.com/ForgottenProgramme) | [Anaconda](https://anaconda.com/) | | 2025-07-01 | | [Ken Odegard](https://github.com/kenodegard) | [Anaconda](https://anaconda.com/) | | 2025-07-01 | | [Crystal Soja](https://github.com/csoja), Co-Chair | [Anaconda](https://anaconda.com/) | | 2025-07-01 | | [Jaime Rodríguez-Guerra](https://github.com/jaimergp), Co-Chair | [Quansight](https://quansight.com/) | yes | 2025-07-01 | # Terms and New Members * Committee members are appointed for two year terms. Committee members can choose to renew their memberships. * Committee members can resign before their term ends. * Committee members can also be removed by a [simple majority vote](#voting-and-decision-making) from their fellow committee members. * New committee members are added by a simple majority vote as well. # Eligibility Anyone from the community who is interested and able to do CoC Committee work is eligible to be nominated for the committee. New committee members can be nominated by any community member, including nominating themselves. ## Shared Funding Unlike the Steering Council, we are not limiting the number of Committee members who share a common source of funding. However, if a report involves someone who shares funding with CoC Committee members, then the remainder of the committee may vote to exclude some or all Committee members with that same funding, even if that excludes a majority of the CoC Committee. This should be done only if the separately funded Committee members feel that the common funding is interfering with decision making. Note: This requires tracking the funding sources of CoC Committee members. ## Overlap with Steering Council Membership Committee members can also be on the conda Organization Steering Council. However, Steering Council members have to make up less than 50% of the Code of Conduct Committee. # Updating this Code of Conduct The conda Organization's Code of Conduct can be updated by a [simple majority vote](#voting-and-decision-making) of the CoC Committee. # License This code of conduct is based on the [NumFOCUS code of conduct template](https://github.com/numfocus/numfocus/blob/8759e21481552f213489e3718979ccecf68e9ead/manual/numfocus-coc.md) as it existed on 2022/03/08 (which is the 2019/11/20 version). Several added sections are based on the [Galaxy Community Code of Conduct](https://galaxyproject.org/community/coc/). The NumFOCUS code of conduct template was itself adapted from numerous sources, including the [*Geek Feminism wiki, created by the Ada Initiative and other volunteers, which is under a Creative Commons Zero license*](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), the [*Contributor Covenant version 1.2.0*](http://contributor-covenant.org/version/1/2/0/), the [*Bokeh Code of Conduct*](https://github.com/bokeh/bokeh/blob/master/CODE_OF_CONDUCT.md), the [*SciPy Code of Conduct*](https://github.com/jupyter/governance/blob/master/conduct/enforcement.md), the [*Carpentries Code of Conduct*](https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html#enforcement-manual), and the [*NeurIPS Code of Conduct*](https://neurips.cc/public/CodeOfConduct). **The conda Organization Code of Conduct is licensed under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).** ================================================ FILE: HOW_WE_USE_GITHUB.md ================================================ # How We Use GitHub [conda-org]: https://github.com/conda [project-refinement]: https://github.com/orgs/conda/projects/22/views/14 [project-backlog]: https://github.com/orgs/conda/projects/22/views/2 [project-current-sprint]: https://github.com/orgs/conda/projects/22/views/10 [project-review]: https://github.com/orgs/conda/projects/16 [docs-toc]: https://github.blog/changelog/2021-04-13-table-of-contents-support-in-markdown-files/ [docs-saved-reply]: https://docs.github.com/en/get-started/writing-on-github/working-with-saved-replies/creating-a-saved-reply [infrastructure]: https://github.com/conda/infrastructure [workflow-sync]: https://github.com/conda/infrastructure/blob/main/.github/workflows/sync.yml [labels-global]: https://github.com/conda/infrastructure/blob/main/.github/global.yml [workflow-cla]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/cla.yml [workflow-issues]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/issues.yml [workflow-labels]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/labels.yml [workflow-lock]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/lock.yml [workflow-project]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/project.yml [workflow-stale]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/stale.yml [labels-local]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/labels.yml [labels-page]: https://github.com/conda/conda-libmamba-solver/labels This document seeks to outline how we as a community use GitHub Issues to track bugs and feature requests while still catering to development practices & project management (_e.g._, release cycles, feature planning, priority sorting, etc.). **Topics:** - [What is "Issue Sorting"?](#what-is-issue-sorting) - [Labeling](#labeling) - [Types of Issues](#types-of-issues) - [Standard Issue](#standard-issue) - [Epics](#epics) - [Spikes](#spikes) - [Working on Issues](#working-on-issues) - [Development Processes](#development-processes) - [Code Review and Merging](#code-review-and-merging) > [!NOTE] > This document is written in the style of an FAQ. For easier navigation, use [GitHub's table of contents feature][docs-toc]. ## What is "Issue Sorting"? > [!NOTE] > "Issue sorting" is similar to that of "triaging", but we've chosen to use different terminology because "triaging" is a word related to very weighty topics (_e.g._, injuries and war) and we would like to be sensitive to those connotations. Additionally, we are taking a more "fuzzy" approach to sorting (_e.g._, severities may not be assigned, etc.). "Issue Sorting" refers to the process of assessing the priority of incoming issues. Below is a high-level diagram of the flow of issues: ```mermaid flowchart LR subgraph flow_sorting [Issue Sorting in Issue Tracker] state_sorting{{Maintainer sorting}} end subgraph flow_roadmap [Roadmap Board] board_refinement{{Refinement}} board_backlog{{Backlog}} board_refinement-->board_backlog board_backlog-- reprioritize -->board_backlog board_progress{{Current Sprint - In Progress}} end state_new(New Issues) state_closed(Closed) state_new-->state_sorting state_sorting-- accepted for work -->board_refinement state_sorting-- duplicate, off-topic, support resolved -->state_closed board_backlog-- pending work -->board_progress board_refinement-- not actionable -->state_closed board_backlog-- resolved, irrelevant -->state_closed board_progress-- resolved -->state_closed ``` ### Why sort issues? At the most basic "bird's eye view" level, sorted issues will fall into the category of four main priority levels: - Do now - Do sometime - Provide user support - Never do (_i.e._, close) At its core, sorting enables new issues to be placed into these four categories, which helps to ensure that they will be processed at a velocity similar to or exceeding the rate at which new issues are coming in. One of the benefits of actively sorting issues is to avoid engineer burnout and to make necessary work sustainable; this is done by eliminating a never-ending backlog that has not been reviewed by any maintainers. There will always be broad-scope design and architecture implementations that the maintainers will be interested in pursuing; by actively organizing issues, they will be able to more easily track and tackle both specific and big-picture goals. ### Who does the sorting? Core maintainers help with sorting issues, making decisions regarding closing issues and setting feature work priorities, among other sorting-related tasks. ### How does issue sorting and board intake work? New issues that are opened in any of the repositories in the [conda GitHub organization][conda-org] are reviewed in the repository issue tracker first. During sorting in the issue tracker, issues are reviewed for the following outcomes: - Mitigation via short-term workarounds and fixes - Redirection to the correct project - Determining if support can be provided for errors and questions - Closing out of any duplicate/off-topic issues The core maintainers are not seeking to _resolve_ issues that arise. Instead, the goal is to understand the issue and to determine whether it is legitimate, and then to collect as much relevant information as possible so that the maintainers can make an informed decision about the appropriate resolution schedule. Issues can remain in this investigatory phase (_e.g._, querying the user for more details, asking the user to attempt other workarounds, other debugging efforts, etc.) and are likely to remain in this state the longest, but should still be progressing over the course of 1-2 weeks. Items are added to the [Refinement tab of the Roadmap Board][project-refinement] once sorting has concluded and the core maintainer has enough information to make a decision about the appropriate resolution schedule for the issue. Newly opened pull requests are automatically added to the [Review board][project-review] by [`.github/workflows/project.yml`][workflow-project]. Issues that are not accepted for planned work are closed instead (_e.g._ duplicates, redirects, user errors, resolved support questions, etc.). ### Where do work issues go after being sorted? Once issues are accepted for work, they are added to the ["Refinement" tab of the Roadmap Board][project-refinement]. After refinement and prioritization, issues move to ["Backlog"][project-backlog] and then to ["Current Sprint"][project-current-sprint] when actively being worked. Issues are closed once the work is complete. ### What is the purpose of having a "Backlog"? Issues are "backlogged" when they have been accepted and refined but are not yet planned into the current sprint. ### What automation procedures are currently in place? Global automation procedures synced out from the [`conda/infrastructure`][infrastructure] repo include: - [Marking/Closing stale issues and pull requests][workflow-stale]: - https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 21 days of inactivity and are closed after 7 more days of inactivity (that is, closed after 30 inactive days total) - non https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity) - all pull requests are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity) - [Locking of closed issues and pull requests with no further activity][workflow-lock] after 365 days - [Adding new pull requests to the Review board][workflow-project] - [Indicating an issue is ready for a maintainer's attention][workflow-issues] by toggling https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Afeedback with https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Asupport after a contributor leaves a comment - [Verifying that contributors have signed the CLA][workflow-cla] before allowing pull requests to be merged; if the contributor hasn't signed the CLA previously, merging is blocked until a manual review can be done - [Syncing out templates, labels, workflows, and documentation][workflow-sync] from [`conda/infrastructure`][infrastructure] to the other repositories ### Are there any templates to use as responses for commonly-seen issues? Some of the same types of issues appear regularly (_e.g._, issues that are duplicates of others, issues that should be filed in the Anaconda issue tracker, errors that are due to a user's specific setup/environment, etc.). Below are some boilerplate responses for the most commonly-seen issues to be sorted:
Duplicate Issue

This is a duplicate of [link to primary issue]; please feel free to continue the discussion there.
> **Warning** > Apply the https://github.com/conda/conda-libmamba-solver/labels/duplicate label to the issue being closed and https://github.com/conda/conda-libmamba-solver/labels/duplicate%3A%3Aprimary to the original issue.
Anaconda Products
Thank you for filing this issue! Unfortunately, this is off-topic for this repo because it is related to an Anaconda product.
If you are encountering issues with Anaconda products or services, you have several options for receiving community
support:

- [Anaconda community forums](https://community.anaconda.cloud)
- [Anaconda issue tracker on GitHub](https://github.com/ContinuumIO/anaconda-issues/issues)
> **Warning** > Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic label to these issues before closing them out.
General Off Topic
Unfortunately, this issue is outside the scope of support we offer via GitHub or is not directly related to this project.
Community support can be found elsewhere, though, and we encourage you to explore the following options:

- [Conda discourse forum](https://conda.discourse.group/)
- [Community chat channels](https://conda.org/community#chat)
- [Stack Overflow posts tagged "conda"](https://stackoverflow.com/questions/tagged/conda)
> **Warning** > Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic label to these issues before closing them out.
In order to not have to manually type or copy/paste the above repeatedly, note that it's possible to add text for the most commonly-used responses via [GitHub's "Add Saved Reply" option][docs-saved-reply]. ## Labeling This section covers the labels and conventions used during issue sorting. ### How does labeling work? Labeling is a very important means for core maintainers to keep track of the current state of an issue with regards to the asynchronous nature of communicating with users. Utilizing the proper labels helps to identify the severity of the issue as well as to quickly understand the current state of a discussion. Each label has an associated description that clarifies how the label should be used. Hover on the label to see its description. Label colors are used to distinguish labels by category. Generally speaking, labels with the same category are considered mutually exclusive, but in some cases labels sharing the same category can occur concurrently, as they indicate qualifiers as opposed to types. For example, we may have the following types, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Afeature, and https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Adocumentation, where for any one issue there would be _at most_ **one** of these to be defined (_i.e._ an issue should not be a bug _and_ a feature request at the same time). Alternatively, with issues involving specific operating systems (_i.e._, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Alinux, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Amacos, and https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Awindows), an issue could be labeled with one or more, depending on the system(s) the issue occurs on. Please note that there are also automation policies in place that are affected by labeling. For example, if an issue is labeled as https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport, that issue will be marked https://github.com/conda/conda-libmamba-solver/labels/stale after 21 days of inactivity and auto-closed after seven more days without activity (30 inactive days total), which is earlier than issues without this label. See [What automation procedures are currently in place?](#what-automation-procedures-are-currently-in-place) for more details. ### What labels are required for each issue? At minimum, both `type` and `source` labels should be specified on each issue before adding it to the "Refinement" tab of the Roadmap Board. All issues that are bugs should also be tagged with a `severity` label. The `type` labels are exclusive of each other: each sorted issue should have exactly one `type` label. These labels give high-level information on the issue's classification (_e.g._, bug, feature, tech debt, etc.) The `source` labels are exclusive of each other: each sorted issue should have exactly one `source` label. These labels give information on the sub-group to which the issue's author belongs (_e.g._, a partner, a frequent contributor, the wider community, etc.). Through these labels, maintainers gain insight into how well we're meeting the needs of various groups. The `severity` labels are exclusive of each other and, while required for the https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug label, they can also be applied to other types to indicate demand or need. These labels help us to prioritize our work. Severity is not the only factor for work prioritization, but it is an important consideration. Please review the descriptions of the `type`, `source`, and `severity` labels on the [labels page][labels-page] prior to use. ### How are new labels defined? Labels are defined using a scoped syntax with an optional high-level category (_e.g._, `source`, `tag`, `type`, etc.) and a specific topic, much like the following: - `[topic]` - `[category::topic]` - `[category::topic-phrase]` This syntax helps with issue sorting enforcement, as it helps to ensure that sorted issues are, at minimum, categorized by type and source. There are a number of labels that have been defined for the different repositories. In order to create a streamlined sorting process, label terminologies are standardized using similar (if not the same) labels. ### How are new labels added? New **global** labels (_i.e._, labels that apply equally to all repositories within the conda GitHub organization) are added to [`conda/infrastructure`][infrastructure]'s [`.github/global.yml` file][labels-global]; new **local** labels (_i.e._, labels specific to particular repositories) are added to each repository's [`.github/labels.yml` file][labels-local]. All new labels should follow the labeling syntax described in ["How are new labels defined?"](#how-are-new-labels-defined). Global labels are combined with any local labels and these aggregated labels are used by the [`.github/workflows/labels.yml` workflow][workflow-labels] to synchronize the labels available for the repository. ## Types of Issues ### Standard Issue Standard issues represent typical bug reports, feature requests, or other work items that have a clear definition and expected outcome. ### Epics Epics are large work items that can be broken down into smaller, more manageable issues. They typically represent major features or significant changes that span multiple iterations or releases. Relate the smaller issues to the epic using the sub-issues feature in GitHub. ### Spikes #### What is a spike? "Spike" is a term that is borrowed from extreme programming and agile development. They are used when the **outcome of an issue is unknown or even optional**. For example, when first coming across a problem that has not been solved before, a project may choose to either research the problem or create a prototype in order to better understand it. Additionally, spikes represent work that **may or may not actually be completed or implemented**. An example of this are prototypes created to explore possible solutions. Not all prototypes are implemented and the purpose of creating a prototype is often to explore the problem space more. For research-oriented tasks, the end result of this research may be that a feature request simply is not viable at the moment and would result in putting a stop to that work. Finally, spikes are usually **timeboxed**. However, given the open source/volunteer nature of our contributions, we do not enforce this for our contributors. When a timebox is set, this means that we are limiting how long we want someone to work on said spike. We do this to prevent contributors from falling into a rabbit hole they may never return from. Instead, we set a time limit to perform work on the spike and then have the assignee report back. If the tasks defined in the spike have not yet been completed, a decision is made on whether it makes sense to perform further work on the spike. #### When do I create a spike? A spike should be created when we do not have enough information to move forward with solving a problem. That simply means that, whenever we are dealing with unknowns or processes the project team has never encountered before, it may be useful for us to create a spike. In day-to-day work, this kind of situation may appear when new bug reports or feature requests come in that deal with problems or technologies that the project team is unfamiliar with. All issues that the project team has sufficient knowledge of should instead proceed as regular issues. #### When do I not create a spike? Below are some common scenarios where creating a spike is not appropriate: - Writing a technical specification for a feature we know how to implement - Design work that would go into drafting how an API is going to look and function - Any work that must be completed or is not optional ## Working on Issues ### How do I assign myself to an issue I am actively reviewing? If you do **not** have permissions, please indicate that you are working on an issue by leaving a comment. Someone who has permissions will assign you to the issue. If two weeks have passed without a pull request or an additional comment requesting information, you may be removed from the issue and the issue reassigned. If you are assigned to an issue but will not be able to continue work on it, please comment to indicate that you will no longer be working on it and press `unassign me` next to your username in the `Assignees` section of the issue page (top right). If you **do** have permissions, please assign yourself to the issue by pressing `assign myself` under the `Assignees` section of the issue page (top right). ## Development Processes The following are practices the conda organization encourages for feature development. While we recommend projects under the conda organization adopt these practices, they are not strictly required. ### How should we approach feature development? For new features, first open an issue if one doesn’t exist. Once the feature request has been accepted (indicated by the issue's status transitioning from "Sorting" to "Refinement"), create a specification to gather early feedback. This can include mockups, API/command references, a written plan in the issue, and sample CLI arguments (without functionality). ### What is our change process? For larger features, break down the work into smaller, manageable issues that are added to the backlog. As long as a feature remains on the roadmap or backlog, do not create long-lived feature branches that span multiple pull requests. Instead, you should integrate small slices of an overall feature directly into the main branch to avoid complex integration challenges. ### Should we make unrelated changes at the same time? When making changes, try to follow the Campsite Rule to leave things better than when you found them. You should enhance the code you encounter, even if primary goal is unrelated. This could involve refactoring small sections, improving readability, or fixing minor bugs. ## Code Review and Merging ### What are the review requirements? #### Standard Review Most code changes require one reviewer from someone on the maintainer team for the repository. Instead of waiting for someone on the team to review it, directly requesting a review from the person you previously identified to work with is preferred to optimize teamwork. If you paired with them during development, continuous review counts as this requirement. #### Second Review Required only when the code author or the first reviewer feels like it is necessary to get another set of eyes on a proposed change. In this case, they add someone specific through GitHub's Request Review feature with a comment on what they want the person to look for. ### What are the code review best practices? If you are conducting a review, adhere to these best practices: - Provide comprehensive feedback in the first review to minimize review rounds - Reserve Request Changes for blocking issues (bugs or other major problems) — Select Comment for suggestions and improvements - Follow-up reviews should focus on whether requested changes resolve original comments - Code should be production-ready and maintainable when merged, but doesn't need to be perfect - If providing feedback outside the core review focus (nitpicks, tips, suggestions), clearly mark these as non-blocking comments that don't need to be addressed before merging. ### How do we merge code? If you are the approving reviewer (typically the first reviewer, or the second reviewer when needed) and you have completed your review and approved the changes, you should merge the code immediately to maintain development velocity. Normally, we use squash and merge to keep a clean git history. If you are merging a pull request, help ensure that the pull request title is updated. ================================================ FILE: LICENSE ================================================ BSD 3-Clause License Copyright (c) 2022, Anaconda, Inc. Copyright (c) 2023, conda All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --- This work also includes code borrowed from mamba.utils v0.19, licensed as BSD 3-Clause ================================================ FILE: README.md ================================================ # conda-libmamba-solver The fast mamba solver, now in conda! ## What is this exactly? conda-libmamba-solver is a new solver for the [conda package manager](https://docs.conda.io/) which uses the solver from the [mamba project](https://mamba.readthedocs.io/) behind the scenes, while carefully implementing conda's functionality and expected behaviors on top. The library used by mamba to do the heavy-lifting is called [libsolv](https://github.com/openSUSE/libsolv). Additional information about the project can be found in the blog post on Anaconda's weblog: [A Faster Solver for Conda: Libmamba](https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community). ## Documentation Check the [documentation](https://conda.github.io/conda-libmamba-solver/) for instructions on how to install, use and make the most out the new conda solver! ## Build status | [![Build status](https://github.com/conda/conda-libmamba-solver/actions/workflows/tests.yml/badge.svg)](https://github.com/conda/conda-libmamba-solver/actions/workflows/tests.yml?query=branch%3Amain) [![Docs status](https://github.com/conda/conda-libmamba-solver/actions/workflows/docs.yml/badge.svg)](https://github.com/conda/conda-libmamba-solver/actions/workflows/docs.yml?query=branch%3Amain) [![codecov](https://codecov.io/gh/conda/conda-libmamba-solver/branch/main/graph/badge.svg)](https://codecov.io/gh/conda/conda-libmamba-solver) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/conda/conda-libmamba-solver/main.svg)](https://results.pre-commit.ci/latest/github/conda/conda-libmamba-solver/main) [![CalVer version used YY.MM.MICRO](https://img.shields.io/badge/calver-YY.MM.MICRO-22bfda.svg?style=flat-square)](https://calver.org) | [![Anaconda-Server Badge](https://anaconda.org/conda-canary/conda-libmamba-solver/badges/latest_release_date.svg)](https://anaconda.org/conda-canary/conda-libmamba-solver) | | --- | :-: | | [`conda install defaults::conda-libmamba-solver`](https://anaconda.org/anaconda/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/anaconda/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/anaconda/conda-libmamba-solver) | | [`conda install conda-forge::conda-libmamba-solver`](https://anaconda.org/conda-forge/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/conda-forge/conda-libmamba-solver) | | [`conda install conda-canary/label/dev::conda-libmamba-solver`](https://anaconda.org/conda-canary/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/conda-canary/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/conda-canary/conda-libmamba-solver) | ================================================ FILE: RELEASE.md ================================================ [epic template]: https://github.com/conda/conda-libmamba-solver/issues/new?assignees=&labels=epic&template=epic.yml [compare]: https://github.com/conda/conda-libmamba-solver/compare [new release]: https://github.com/conda/conda-libmamba-solver/releases/new [infrastructure]: https://github.com/conda/infrastructure [rever docs]: https://regro.github.io/rever-docs [release docs]: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes [merge conflicts]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts [Anaconda Recipes]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock [conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock # Release Process > [!NOTE] > Throughout this document are references to the version number as `YY.MM.MICRO`, this should be replaced with the correct version number. Do **not** prefix the version with a lowercase `v`. ## 1. Open the release issue and cut a release branch. (do this ~1 week prior to release) > [!NOTE] > The new release branch should adhere to the naming convention of `YY.MM.x` (note the difference to `YY.MM.MICRO`). In the case of patch/hotfix releases, however, do NOT cut a new release branch; instead, use the previously-cut `YY.MM.x` release branch. Use the issue template below to create the release issue. After creating the release issue, pin it for easy access.

Release Template

#### Title: ```markdown Release `YY.MM.x` ``` #### Body: ```markdown ### Summary Placeholder for `conda-libmamba-solver YY.MM.x` release. | Pilot | | |---|---| | Co-pilot | | ### Tasks [milestone]: https://github.com/conda/conda-libmamba-solver/milestone/ [process]: https://github.com/conda/conda-libmamba-solver/blob/main/RELEASE.md [releases]: https://github.com/conda/conda-libmamba-solver/releases [main]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock [conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock [ReadTheDocs]: https://readthedocs.com/projects/continuumio-conda-libmamba-solver/ [zulip]: https://conda.zulipchat.com/#narrow/channel/480811-releases

The week before release week

- [ ] Create release branch (named `YY.MM.x`) - [ ] Ensure release candidates are being successfully built (see `conda-canary/label/rc-conda-libmamba-solver-YY.MM.x`) - [ ] [Complete outstanding PRs][milestone] - [ ] Check for deprecated features - [ ] Test release candidates

Release week

- [ ] Create release PR (see [release process][process]) - [ ] Create Zulip thread on [#releases][zulip] - [ ] Announce `YY.MM.MICRO` in-progress - [ ] [Publish release][releases] - [ ] Merge `YY.MM.x` back into `main` - [ ] Activate the `YY.MM.x` branch on [ReadTheDocs][ReadTheDocs] - [ ] Bump/update feedstocks - [ ] [Anaconda, Inc.'s feedstock][main] - [ ] [conda-forge feedstock][conda-forge] - [ ] Hand off to packaging team(s) - [ ] Announce release - [ ] Create & publish conda.org blog post - [ ] Post on Zulip thread
```
If a patch release is necessary, reopen the original release issue and append the following template to the release issue summary.

Patch Release Template

#### Append to existing 'Release `YY.MM.x`' issue: ```markdown

Patch YY.MM.MICRO

- [ ] - [ ] Create release PR (see [release process][process]) - [ ] Update Zulip thread on [#releases][zulip] - [ ] Announce `YY.MM.MICRO` in-progress - [ ] [Publish release][releases] - [ ] Merge `YY.MM.x` back into `main` - [ ] Bump/update feedstocks - [ ] [Anaconda, Inc.'s feedstock][main] - [ ] [conda-forge feedstock][conda-forge] - [ ] Hand off to packaging team(s) - [ ] Announce release - [ ] Post on Zulip thread
```
> [!NOTE] > The [epic template][epic template] is perfect for this; remember to remove the **`epic`** label. > [!NOTE] > A patch release is like a regular, i.e., follow the same steps in the process as you would for a regular release. Most patches are authored by existing contributors (most likely maintainers themselves) so running `rever ` may succeed on the first pass. ## 2. Alert various parties of the upcoming release. (do this ~1 week prior to release) Let various interested parties know about the upcoming release; at minimum, conda-forge maintainers should be informed. For major features, a blog post describing the new features should be prepared and posted once the release is completed (see the announcements section of the release issue). ## 3. Manually test canary build(s). ### Canary Builds for Manual Testing Once the release PRs are filed, successful canary builds will be available on `https://anaconda.org/conda-canary/conda-libmamba-solver/files?channel=rc-conda-libmamba-solver-YY.MM.x` for manual testing. > [!NOTE] > You do not need to apply the `build::review` label for release PRs; every commit to the release branch builds and uploads canary builds to the respective `rc-` label. ## 4. Ensure `rever.xsh` and `news/TEMPLATE` are up to date. These are synced from [`conda/infrastructure`][infrastructure].

5. Run rever. (ideally done on the Monday of release week)

Currently, there are only 2 activities we use rever for, (1) aggregating the authors and (2) updating the changelog. Aggregating the authors can be an error-prone process and also suffers from a builtin circular dependency (_i.e._, to generate an updated `.authors.yml` we need an updated `.mailmap` but to have an updated `.mailmap` we need an updated `.authors.yml`). This is why the following steps are very heavy-handed (and potentially repetitive) in running rever commands, undoing commits, squashing/reordering commits, etc. 1. Install [`rever`][rever docs] and activate the environment: ```bash $ conda create -n rever conda-forge::rever $ conda activate rever (rever) $ ``` 2. Clone and `cd` into the repository if you haven't done so already: ```bash (rever) $ git clone git@github.com:/conda-libmamba-solver.git (rever) $ cd conda-libmamba-solver ``` 2. Fetch the latest changes from the remote and checkout the release branch created a week ago: ```bash (rever) $ git fetch upstream (rever) $ git checkout YY.MM.x ``` 2. Create a versioned branch, this is where rever will make its changes: ```bash (rever) $ git checkout -b changelog-YY.MM.MICRO ``` 2. Run `rever --activities authors `: > **Note:** > Include `--force` when re-running any rever commands for the same ``, otherwise, rever will skip the activity and no changes will be made (i.e., rever remembers if an activity has been run for a given version). ```bash (rever) $ rever --activities authors --force ``` - If rever finds that any of the authors are not correctly represented in `.authors.yml` it will produce an error. If the author that the error pertains to is: - **a new contributor**: the snippet suggested by rever should be added to the `.authors.yml` file. - **an existing contributor**, a result of using a new name/email combo: find the existing author in `.authors.yml` and add the new name/email combo to that author's `aliases` and `alterative_emails`. - Once you have successfully run `rever --activities authors` with no errors, review the commit made by rever. This commit will contain updates to one or more of the author files (`.authors.yml`, `.mailmap`, and `AUTHORS.md`). Due to the race condition between `.authors.yml` and `.mailmap`, we want to extract changes made to any of the following keys in `.authors.yml` and commit them separately from the other changes in the rever commit: - `name` - `email` - `github` - `aliases` - `alternate_emails` Other keys (e.g., `num_commits` and `first_commit`) do not need to be included in this separate commit as they will be overwritten by rever. - Here's a sample run where we undo the commit made by rever in order to commit the changes to `.authors.yml` separately: ```bash (rever) $ rever --activities authors --force YY.MM.MICRO # changes were made to .authors.yml as per the prior bullet (rever) $ git diff --name-only HEAD HEAD~1 .authors.yml .mailmap AUTHORS.md # undo commit (rever) $ git reset --soft HEAD~1 # undo changes made to everything except .authors.yml (rever) $ git restore --staged --worktree .mailmap AUTHORS.md ``` - Commit these changes to `.authors.yml`: ```bash (rever) $ git add . (rever) $ git commit -m "Update .authors.yml" ``` - Rerun `rever --activities authors --force ` and finally check that your `.mailmap` is correct by running: ```bash git shortlog -se ``` Compare this list with `AUTHORS.md`. If they have any discrepancies, additional modifications to `.authors.yml` is needed, so repeat the above steps as needed. - Once you are pleased with how the author's file looks, we want to undo the rever commit and commit the `.mailmap` changes separately: ```bash # undo commit (but preserve changes) (rever) $ git reset --soft HEAD~1 # undo changes made to everything except .mailmap (rever) $ git restore --staged --worktree .authors.yml AUTHORS.md ``` - Commit these changes to `.mailmap`: ```bash (rever) $ git add . (rever) $ git commit -m "Update .mailmap" ``` - Continue repeating the above processes until the `.authors.yml` and `.mailmap` are corrected to your liking. After completing this, you will have at most two commits on your release branch: ```bash (rever) $ git cherry -v + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap ``` 4. Review news snippets (ensure they are all using the correct Markdown format, **not** reStructuredText) and add additional snippets for undocumented PRs/changes as necessary. > **Note:** > We've found it useful to name news snippets with the following format: `-`. > > We've also found that we like to include the PR #s inline with the text itself, e.g.: > > ```markdown > ## Enhancements > > * Add `win-arm64` as a known platform (subdir). (#11778) > ``` - You can utilize [GitHub's compare view][compare] to review what changes are to be included in this release. Make sure you compare the current release branch against the previous one - Add a new news snippet for any PRs of importance that are missing. - Commit these changes to news snippets: ```bash (rever) $ git add . (rever) $ git commit -m "Update news" ``` - After completing this, you will have at most three commits on your release branch: ```bash (rever) $ git cherry -v + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news ``` 5. Run `rever --activities changelog`: > **Note:** > This has previously been a notoriously fickle step (likely due to incorrect regex patterns in the `rever.xsh` config file and missing `github` keys in `.authors.yml`) so beware of potential hiccups. If this fails, it's highly likely to be an innocent issue. ```bash (rever) $ rever --activities changelog --force ``` - Any necessary modifications to `.authors.yml`, `.mailmap`, or the news snippets themselves should be amended to the previous commits. - Once you have successfully run `rever --activities changelog` with no errors simply revert the last commit (see the next step for why): ```bash # undo commit (and discard changes) (rever) $ git reset --hard HEAD~1 ``` - After completing this, you will have at most three commits on your release branch: ```bash (rever) $ git cherry -v + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news ``` 6. Now that we have successfully run the activities separately, we wish to run both together. This will ensure that the contributor list, a side-effect of the authors activity, is included in the changelog activity. ```bash (rever) $ rever --force ``` - After completing this, you will have at most five commits on your release branch: ```bash (rever) $ git cherry -v + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news + a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO + 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO ``` 7. Since rever does not include stats on first-time contributors, we will need to add this manually. - Use [GitHub's auto-generated release notes][new release] to get a list of all new contributors (and their first PR) and manually merge this list with the contributor list in `CHANGELOG.md`. See [GitHub docs][release docs] for how to auto-generate the release notes. - Commit these final changes: ```bash (rever) $ git add . (rever) $ git commit -m "Add first-time contributions" ``` - After completing this, you will have at most six commits on your release branch: ```bash (rever) $ git cherry -v + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news + a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO + 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO + 93fdf029fd4cf235872c12cab12a1f7e8f95a755 Add first-time contributions ``` 8. Push this versioned branch. ```bash (rever) $ git push -u upstream changelog-YY.MM.MICRO ``` 9. Open the Release PR targeting the `YY.MM.x` branch.
GitHub PR Template ```markdown ## Description ✂️ snip snip ✂️ the making of a new release. Xref # ```
10. Update release issue to include a link to the release PR. 11. [Create][new release] the release and **SAVE AS A DRAFT** with the following values: > **Note:** > Only publish the release after the release PR is merged, until then always **save as draft**. | Field | Value | |---|---| | Choose a tag | `YY.MM.MICRO` | | Target | `YY.MM.x` | | Body | copy/paste blurb from `CHANGELOG.md` |
## 6. Wait for review and approval of release PR. ## 7. Merge release PR and publish release. To publish the release, go to the project's release page (e.g., https://github.com/conda/conda-libmamba-solver/releases) and add the release notes from `CHANGELOG.md` to the draft release you created earlier. Then publish the release. > [!NOTE] > Release notes can be drafted and saved ahead of time. ## 8. Merge/cherry pick the release branch over to the `main` branch.
Internal process 1. From the main "< > Code" page of the repository, select the drop down menu next to the `main` branch button and then select "View all branches" at the very bottom. 2. Find the applicable `YY.MM.x` branch and click the "New pull request" button. 3. "Base" should point to `main` while "Compare" should point to `YY.MM.x`. 4. Ensure that all of the commits being pulled in look accurate, then select "Create pull request". > [!NOTE] > Make sure NOT to push the "Update Branch" button. If there are [merge conflicts][merge conflicts], create a temporary "connector branch" dedicated to fixing merge conflicts separately from the `YY.MM.x` and `main` branches. 5. Review and merge the pull request the same as any code change pull request. > [!NOTE] > The commits from the release branch need to be retained in order to be able to compare individual commits; in other words, a "merge commit" is required when merging the resulting pull request vs. a "squash merge". Protected branches will require permissions to be temporarily relaxed in order to enable this action.
## 9. Open PRs to bump [Anaconda Recipes][Anaconda Recipes] and [conda-forge][conda-forge] feedstocks to use `YY.MM.MICRO`. > [!NOTE] > Conda-forge's PRs will be auto-created via the `regro-cf-autotick-bot`. Follow the instructions below if any changes need to be made to the recipe that were not automatically added (these instructions are only necessary for anyone who is _not_ a conda-forge feedstock maintainer, since maintainers can push changes directly to the autotick branch): > - Create a new branch based off of autotick's branch (autotick's branches usually use the `regro-cf-autotick-bot:XX.YY.[$patch_number]_[short hash]` syntax) > - Add any changes via commits to that new branch > - Open a new PR and push it against the `main` branch > > Make sure to include a comment on the original `autotick-bot` PR that a new pull request has been created, in order to avoid duplicating work! `regro-cf-autotick-bot` will close the auto-created PR once the new PR is merged. > > For more information about this process, please read the ["Pushing to regro-cf-autotick-bot branch" section of the conda-forge documentation](https://conda-forge.org/docs/maintainer/updating_pkgs.html#pushing-to-regro-cf-autotick-bot-branch). ## 10. Hand off to Anaconda's packaging team. > [!NOTE] > This step should NOT be done past Thursday morning EST; please start the process on a Monday, Tuesday, or Wednesday instead in order to avoid any potential debugging sessions over evenings or weekends.
Internal process 1. Open packaging request in #package_requests Slack channel, include links to the Release PR and feedstock PRs. 2. Message packaging team/PM to let them know that a release has occurred and that you are the release manager.
## 11. Continue championing and shepherding. Remember to make all relevant announcements and continue to update the release issue with the latest details as tasks are completed. ================================================ FILE: conda_libmamba_solver/__init__.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause try: from ._version import version as __version__ except ImportError: try: from importlib.metadata import version __version__ = version("conda_libmamba_solver") del version except ImportError: __version__ = "0.0.0.unknown" def get_solver_class(key: str = "libmamba"): if key == "libmamba": from .solver import LibMambaSolver return LibMambaSolver raise ValueError("Key must be 'libmamba'") ================================================ FILE: conda_libmamba_solver/conda_build_exceptions.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ This exception is only used in conda-build, so we can't import it directly. conda_build is not a dependency, but we only import this when conda-build is calling the solver, so it's fine to import it here. """ from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from collections.abc import Iterable from conda.models.match_spec import MatchSpec from conda_build.exceptions import DependencyNeedsBuildingError class ExplainedDependencyNeedsBuildingError(DependencyNeedsBuildingError): """ We need to subclass this to add the explanation to the error message. We also add a couple of attributes to make it easier to set up. """ def __init__( self, matchspecs: Iterable[MatchSpec] | None = None, explanation: str | None = None, *args, **kwargs, ): super().__init__(*args, **kwargs) self.matchspecs = self.matchspecs or matchspecs or [] self.explanation = explanation def __str__(self) -> str: msg = self.message if not self.explanation: # print simple message in log.warning() calls return msg return "\n".join([msg, self.explanation]) ================================================ FILE: conda_libmamba_solver/exceptions.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Exceptions used in conda-libmamba-solver """ from conda.exceptions import UnsatisfiableError class LibMambaUnsatisfiableError(UnsatisfiableError): """An exception to report unsatisfiable dependencies. The error message is passed directly as a str. """ def __init__(self, message: str, **kwargs): super(UnsatisfiableError, self).__init__(str(message)) ================================================ FILE: conda_libmamba_solver/index.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ This module provides a convenient interface between `libmamba.Solver` and conda's `PrefixData`. In other words, it allows to expose channels loaded in `conda` to the `libmamba` machinery without using the `libmamba` networking stack. Internally, the `libmamba`'s index is made of: - A 'Pool' object, exposed to libsolv. - The pool is made of `Repo` objects. - Each repo corresponds to a repodata.json file. - Each repodata comes from a channel+subdir combination. Some notes about channels ------------------------- In a way, conda channels are an abstraction over a collection of channel subdirs. For example, when the user wants 'conda-forge', it actually means 'repodata.json' files from the configured platform subdir and 'noarch'. Some channels are actually 'MultiChannel', which provide a collection of channels. The most common example is 'defaults', which includes 'main', 'r' and 'msys2'. So, for conda-forge on Linux amd64 we get: - https://conda.anaconda.org/conda-forge/linux-64 - https://conda.anaconda.org/conda-forge/noarch For defaults on macOS with Apple Silicon (M1 and friends): - https://repo.anaconda.org/main/osx-arm64 - https://repo.anaconda.org/main/noarch - https://repo.anaconda.org/r/osx-arm64 - https://repo.anaconda.org/r/noarch - https://repo.anaconda.org/msys2/osx-arm64 - https://repo.anaconda.org/msys2/noarch However, users will just say 'defaults' or 'conda-forge', for convenience. This means that we need to deal with several formats of channel information, which ultimately lead to a collection of subdir-specific URLs: - Channel names from the CLI or configuration files / env-vars - Channel URLs if names are not available (channel not served in anaconda.org) - conda.models.channel.Channel objects Their origins can be: - Specified by the user on the command-line (-c arguments) - Specified by the configuration files (.condarc) or environment vars (context object) - Added from channel-specific MatchSpec (e.g. `conda-forge::python`) - Added from installed packages in target environment (e.g. a package that was installed from a non-default channel remembers where it comes from) Also note that a channel URL might have authentication in the form: - https://user:password@server.com/channel - https://server.com/t/your_token_goes_here/channel Finally, a channel can be mounted in a local directory and referred to via a regular path, or a file:// URL, with or without normalization on Windows. The approach ------------ We pass the subdir-specific, authenticated URLs to conda's 'SubdirData.repo_patch', which download the JSON files but do not process them to PackageRecords. Once the cache has been populated, we can instantiate 'libmamba.Repo' objects directly. We maintain a map of subdir-specific URLs to `conda.model.channel.Channel` and `libmamba.Repo` objects. """ from __future__ import annotations import logging import os from dataclasses import dataclass from functools import partial from pathlib import Path from typing import TYPE_CHECKING from conda.base.constants import KNOWN_SUBDIRS, REPODATA_FN, ChannelPriority from conda.base.context import context from conda.common.compat import on_win from conda.common.io import DummyExecutor, ThreadLimitedThreadPoolExecutor, time_recorder from conda.common.url import path_to_url, remove_auth, split_anaconda_token from conda.core.package_cache_data import PackageCacheData from conda.core.subdir_data import SubdirData from conda.models.channel import Channel from conda.models.match_spec import MatchSpec from conda.models.records import PackageRecord from libmambapy import MambaNativeException, Query from libmambapy.solver.libsolv import ( Database, PackageTypes, PipAsPythonDependency, Priorities, RepodataOrigin, ) from libmambapy.specs import ( Channel as LibmambaChannel, ) from libmambapy.specs import ( ChannelResolveParams, CondaURL, NoArchType, PackageInfo, ) from conda_libmamba_solver.shards_subset import build_repodata_subset from .mamba_utils import logger_callback if TYPE_CHECKING: from collections.abc import Callable, Iterable from typing import Any, Literal from conda.common.path import PathsType from conda.gateways.repodata import RepodataState from libmambapy import QueryResult from libmambapy.solver.libsolv import RepoInfo from conda_libmamba_solver.shards import ShardBase from .shards_typing import PackageRecordDict from .state import SolverInputState log = logging.getLogger(f"conda.{__name__}") @dataclass class _ChannelRepoInfo: "A dataclass mapping conda Channels, libmamba Repos and URLs" channel: Channel | None repo: RepoInfo url_w_cred: str url_no_cred: str @property def canonical_name(self) -> str: if self.channel: return self.channel.canonical_name url_parts = self.url_no_cred.split("/") if url_parts[-1] in KNOWN_SUBDIRS: return url_parts[-2] return url_parts[-1] def _is_sharded_repodata_enabled(): """ Flag to see whether we should check for sharded repodata. """ return context.plugins.use_sharded_repodata is True # type: ignore _SUPPORTS_PYTHON_SITE_PACKAGES = hasattr(PackageInfo, "python_site_packages_path") def _package_info_from_package_dict( record: PackageRecordDict, filename: str, url: str, channel_id: str, add_pip_as_python_dependency=False, ) -> PackageInfo: """ Build libmamba PackageInfo from an unprocessed repodata "packages", "packages.conda" entry. """ if (noarch := record.get("noarch")) in ("python", "generic"): noarch = NoArchType(noarch.title()) else: noarch = NoArchType("No") # include the python_site_packages_path attribute if libmambapy includes support if _SUPPORTS_PYTHON_SITE_PACKAGES: extra = { "python_site_packages_path": record.get("python_site_packages_path") or "", } else: extra = {} # the dict has not been "enriched" with channel, subdir, url, filename # channel examples # 'https://repo.anaconda.com/pkgs/main' # Channel("pkgs/main"), Channel('@') # package_url examples, full URL to package or "" for a virtual package, # possibly a local package # filename, the key from repodata track_features = record.get("track_features") or [] # track_features can be stored as a space- or comma-separated string if track_features and isinstance(track_features, str): track_features = track_features.replace(" ", ",").split(",") track_features = list(f for f in (ff.strip() for ff in track_features) if f) # Build depends list and append pip if conditions are met depends = list(record.get("depends") or []) if ( add_pip_as_python_dependency and record["name"] == "python" and record["version"].startswith(("2.", "3.")) ): depends.append("pip") return PackageInfo( name=record["name"], version=record["version"], build_string=record.get("build", ""), build_number=record.get("build_number", 0), channel=channel_id, package_url=url, platform=record.get("subdir") or "", filename=filename, license=record.get("license") or "", # does the solver use this? md5=record.get("md5") or "", sha256=record.get("sha256") or "", signatures=record.get("signatures") or "", track_features=track_features, # conda can have list or tuple, but libmamba only accepts lists depends=depends, constrains=list(record.get("constrains") or []), defaulted_keys=list(record.get("defaulted_keys") or []), noarch=noarch, size=record.get("size") or 0, timestamp=int( (record.get("timestamp") or 0) * 1000 ), # XXX packages may have either seconds or milliseconds timestamps, see convert-if-out-of-range code in conda **extra, ) class LibMambaIndexHelper: """ Interface between conda and libmamba for the purpose of building the "index". The index is the collection of package records that can be part of a solution. It is built by collecting all the repodata.json files from channels and their subdirs. For existing environments, the installed packages are also added to the index (this helps with simplifying solutions and outputs). The local cache can also be added as a "channel", which is useful in offline mode or with no channels configured. """ def __init__( self, channels: Iterable[Channel], subdirs: Iterable[str] = (), repodata_fn: str = REPODATA_FN, installed_records: Iterable[PackageRecord] = (), pkgs_dirs: PathsType = (), in_state: SolverInputState | None = None, ): platform_less_channels: list[Channel] = [] for channel in channels: if channel.platform: # When .platform is defined, .urls() will ignore subdirs kw. Remove! log.info( "Platform-aware channels are not supported. " "Ignoring platform %s from channel %s. " "Use subdirs keyword if necessary.", channel.platform, channel, ) channel = Channel(**{k: v for k, v in channel.dump().items() if k != "platform"}) platform_less_channels.append(channel) self.channels = platform_less_channels self.subdirs = subdirs or context.subdirs self.repodata_fn = repodata_fn self.in_state = in_state self._add_pip_as_python_dependency = context.add_pip_as_python_dependency self.db = self._init_db() self.repos: list[_ChannelRepoInfo] = self._load_channels() if pkgs_dirs: self.repos.extend(self._load_pkgs_cache(pkgs_dirs)) if installed_records: self.repos.append(self._load_installed(installed_records)) self._set_repo_priorities() # These are to support lazy self.repos, but it's not currently lazy. self._pkgs_dirs = pkgs_dirs self._installed_records = installed_records @classmethod def from_platform_aware_channel(cls, channel: Channel) -> LibMambaIndexHelper: if not channel.platform: raise ValueError(f"Channel {channel} must define 'platform' attribute.") subdir = channel.platform channel = Channel(**{k: v for k, v in channel.dump().items() if k != "platform"}) return cls(channels=(channel,), subdirs=(subdir,)) def n_packages( self, repos: Iterable[RepoInfo] | None = None, filter_: Callable | None = None, ) -> int: repos = repos or [repo_info.repo for repo_info in self.repos] count = 0 for repo in repos: if filter_: for pkg in self.db.packages_in_repo(repo): if filter_(pkg): count += 1 else: count += len(self.db.packages_in_repo(repo)) return count def reload_channel(self, channel: Channel) -> None: urls = {} for url in channel.urls(with_credentials=False, subdirs=self.subdirs): for repo_info in self.repos: if repo_info.url_no_cred == url: log.debug("Reloading repo %s", repo_info.url_no_cred) urls[repo_info.url_w_cred] = channel self.db.remove_repo(repo_info.repo) for new_repo_info in self._load_channels(urls, try_solv=False): for repo_info in self.repos: if repo_info.url_no_cred == new_repo_info.url_no_cred: repo_info.repo = new_repo_info.repo self._set_repo_priorities() def _init_db(self) -> Database: custom_channels = { # Add custom channels as a workaround for this weird conda behavior # See https://github.com/conda/conda/issues/13501 **{c.name: c for c in self.channels if c.location != context.channel_alias.location}, **context.custom_channels, } custom_channels = { name: LibmambaChannel( url=CondaURL.parse(channel.base_url.replace(" ", "%20")), display_name=name, platforms=set(self.subdirs), ) for (name, channel) in custom_channels.items() if channel.base_url } custom_multichannels = { channel_name: [ custom_channels.get( channel.name, LibmambaChannel( url=CondaURL.parse(channel.base_url.replace(" ", "%20")), display_name=channel.name, platforms=set(self.subdirs), ), ) for channel in channels if channel.base_url ] for channel_name, channels in context.custom_multichannels.items() } params = ChannelResolveParams( platforms=set(self.subdirs), channel_alias=CondaURL.parse(str(context.channel_alias)), custom_channels=ChannelResolveParams.ChannelMap(custom_channels), custom_multichannels=ChannelResolveParams.MultiChannelMap(custom_multichannels), home_dir=str(Path.home()), current_working_dir=os.getcwd(), ) db = Database(params) db.set_logger(logger_callback) return db def _load_channels( self, urls_to_channel: dict[str, Channel] | None = None, try_solv: bool = True, ) -> list[_ChannelRepoInfo]: if urls_to_channel is None: urls_to_channel = self._channel_urls(self.subdirs, self.channels) urls_to_channel = self._encoded_urls_to_channels(urls_to_channel) # Prefer sharded repodata loading if enabled if self.in_state and _is_sharded_repodata_enabled(): # _load_channel_repo_info_shards() must return ChannelRepoInfo # matching the key order of urls_to_channel: channel_repos_info = self._load_channel_repo_info_shards(urls_to_channel) if channel_repos_info is not None: return channel_repos_info log.debug("No sharded channels available. Fall back to non-sharded path.") # Classic "monolithic repodata.json" path return self._load_channel_repo_info_json(urls_to_channel, try_solv) def _load_channel_repo_info_shards( self, urls_to_channel: dict[str, Channel] ) -> list[_ChannelRepoInfo] | None: """ Load repository information from sharded repodata cache. """ # make a subset of possible dependencies root_packages = (*self.in_state.installed.keys(), *self.in_state.requested) channel_data = build_repodata_subset(root_packages, urls_to_channel) if channel_data is None: return # caller should fall back to repodata.json channel_repo_infos = self._load_repo_info_from_repodata_dict(channel_data) return channel_repo_infos def _load_channel_repo_info_json( self, urls_to_channel: dict[str, Channel], try_solv: bool ) -> list[_ChannelRepoInfo]: """ Load repository information from repodata.json files. """ urls_to_json_path_and_state = self._fetch_repodata_jsons(tuple(urls_to_channel.keys())) channel_repo_infos = [] for url_w_cred, (json_path, state) in urls_to_json_path_and_state.items(): url_no_token, _ = split_anaconda_token(url_w_cred) url_no_cred = remove_auth(url_no_token) repo = self._load_repo_info_from_json_path( json_path, url_no_cred, state, try_solv=(try_solv and not self.in_state), ) channel_repo_infos.append( _ChannelRepoInfo( channel=urls_to_channel[url_w_cred], repo=repo, url_w_cred=url_w_cred, url_no_cred=url_no_cred, ) ) return channel_repo_infos @staticmethod def _channel_urls(subdirs: Iterable[str], channels: list[Channel]) -> dict[str, Channel]: "Map authenticated URLs to channel objects." # class method for testing etc. urls = {} seen_noauth = set() channels_with_subdirs = [] for channel in channels: for url in channel.urls(with_credentials=True, subdirs=subdirs): channels_with_subdirs.append(Channel(url)) for channel in channels_with_subdirs: noauth_urls = [ url for url in channel.urls(with_credentials=False) if url.endswith(channel.subdir) ] if seen_noauth.issuperset(noauth_urls): continue auth_urls = [ url.replace(" ", "%20") for url in channel.urls(with_credentials=True) if url.endswith(tuple(subdirs)) ] if noauth_urls != auth_urls: # authed channel always takes precedence urls.update({url: channel for url in auth_urls}) seen_noauth.update(noauth_urls) continue # at this point, we are handling an unauthed channel; in some edge cases, # an auth'd variant of the same channel might already be present in `urls`. # we only add them if we haven't seen them yet for url in noauth_urls: if url not in seen_noauth: urls[url] = channel seen_noauth.add(url) return urls @staticmethod def _encoded_urls_to_channels(urls_to_channel: dict[str, Channel]) -> dict[str, Channel]: """ Return copy of urls_to_channel with %-encoded spaces. Usage: _encoded_urls_to_channels(_channel_urls(subdirs, channels)) """ # conda.common.url.path_to_url does not %-encode spaces encoded_urls_to_channel: dict[str, Channel] = {} for url, channel in urls_to_channel.items(): if url.startswith("file://"): url = url.replace(" ", "%20") encoded_urls_to_channel[url] = channel return encoded_urls_to_channel def _fetch_repodata_jsons(self, urls: Iterable[str]) -> dict[str, tuple[str, RepodataState]]: Executor = ( DummyExecutor if context.debug or context.repodata_threads == 1 else partial(ThreadLimitedThreadPoolExecutor, max_workers=context.repodata_threads) ) with Executor() as executor: return { url: (str(path), state) for (url, path, state) in executor.map(self._fetch_one_repodata_json, urls) } def _fetch_one_repodata_json(self, url: str) -> tuple[str, os.PathLike, RepodataState]: channel = Channel.from_url(url) if not channel.subdir: raise ValueError("Channel URLs must specify a subdir!") if "PYTEST_CURRENT_TEST" in os.environ: # Workaround some testing issues - TODO: REMOVE # Fix conda.testing.helpers._patch_for_local_exports by removing last line for key, cached in list(SubdirData._cache_.items()): if not isinstance(key, tuple): continue # should not happen, but avoid IndexError just in case if key[:2] == (url, self.repodata_fn) and cached._mtime == float("inf"): del SubdirData._cache_[key] # /Workaround subdir_data = SubdirData(channel, repodata_fn=self.repodata_fn) if context.offline or context.use_index_cache: # This might not exist (yet, anymore), but that's ok because we'll check # for existence later and safely ignore if needed json_path = subdir_data.cache_path_json state = subdir_data.repo_cache.load_state() else: # TODO: This method loads reads the whole JSON file (does not parse) json_path, state = subdir_data.repo_fetch.fetch_latest_path() return url, json_path, state def _load_repo_info_from_json_path( self, json_path: str, channel_url: str, state: RepodataState | None, try_solv: bool = True ) -> RepoInfo | None: if try_solv and on_win: # .solv loading is so slow on Windows is not even worth it. Use JSON instead. # https://github.com/mamba-org/mamba/pull/2753#issuecomment-1739122830 log.debug("Overriding truthy 'try_solv' as False on Windows for performance reasons.") try_solv = False json_path = Path(json_path) solv_path = json_path.with_suffix(".solv") if state: repodata_origin = RepodataOrigin(url=channel_url, etag=state.etag, mod=state.mod) else: repodata_origin = None channel = Channel(channel_url) channel_id = self._channel_to_id(channel) if try_solv and repodata_origin: try: log.debug( "Loading %s (%s) from SOLV repodata at %s", channel_id, channel_url, solv_path ) return self.db.add_repo_from_native_serialization( path=str(solv_path), expected=repodata_origin, channel_id=channel_id, add_pip_as_python_dependency=PipAsPythonDependency( context.add_pip_as_python_dependency ), ) except Exception as exc: log.debug("Failed to load from SOLV. Trying JSON.", exc_info=exc) try: log.debug( "Loading %s (%s) from JSON repodata at %s", channel_id, channel_url, json_path ) repo = self.db.add_repo_from_repodata_json( path=str(json_path), url=channel_url, channel_id=channel_id, add_pip_as_python_dependency=PipAsPythonDependency( context.add_pip_as_python_dependency ), package_types=( PackageTypes.TarBz2Only if context.use_only_tar_bz2 else PackageTypes.CondaOrElseTarBz2 ), ) except MambaNativeException as exc: if "does not exist" in str(exc) and context.offline: # Ignore errors in offline mode. This is needed to pass # tests/test_create.py::test_offline_with_empty_index_cache. # In offline mode, with no repodata cache available, conda can still # create a channel from the pkgs/ content. For that to work, we must # not error out this early. If the package is still not found, the solver # will complain that the package cannot be found. log.warning("Could not load repodata for %s.", channel_id) log.debug("Ignored MambaNativeException in offline mode: %s", exc, exc_info=exc) return None raise exc if try_solv and repodata_origin: try: self.db.native_serialize_repo( repo=repo, path=str(solv_path), metadata=repodata_origin ) except MambaNativeException as exc: log.debug("Ignored SOLV writing error for %s", channel_id, exc_info=exc) return repo def _channel_to_id(self, channel: Channel): channel_id = channel.canonical_name if channel_id in context.custom_multichannels: # In multichannels, the canonical name of a "subchannel" is the multichannel name # which makes it ambiguous for `channel::specs`. In those cases, take the channel # regular name; e.g. for repo.anaconda.com/pkgs/main, do not take defaults, but # pkgs/main instead. channel_id = channel.name return channel_id def _load_installed(self, records: Iterable[PackageRecord]) -> _ChannelRepoInfo: packages = [self._package_info_from_package_record(record) for record in records] repo = self.db.add_repo_from_packages( packages=packages, name="installed", add_pip_as_python_dependency=PipAsPythonDependency.No, ) self.db.set_installed_repo(repo) return _ChannelRepoInfo( channel=None, repo=repo, url_w_cred="installed", url_no_cred="installed" ) def _load_pkgs_cache(self, pkgs_dirs: PathsType) -> list[RepoInfo]: repos = [] for path in pkgs_dirs: package_cache_data = PackageCacheData(path) package_cache_data.load() packages = [ self._package_info_from_package_record(record) for record in package_cache_data.values() ] repo = self.db.add_repo_from_packages(packages=packages, name=path) # path_to_url does not %-encode spaces path_as_url = path_to_url(path).replace(" ", "%20") repos.append( _ChannelRepoInfo( channel=None, repo=repo, url_w_cred=path_as_url, url_no_cred=path_as_url ) ) return repos @time_recorder(module_name=__name__) def _load_repo_info_from_repodata_dict( self, repodata_subset: dict[str, ShardBase] ) -> list[_ChannelRepoInfo]: """ Load repository information from deserialized repodata.json-like structures. """ repos = [] for channel_url, shardlike in repodata_subset.items(): repodata = shardlike.build_repodata() # Don't like going back and forth between channel objects and URLs; # build_repodata_subset() expands channels into per-subdir URLs as # part of fetch: channel_object = Channel(channel_url) channel_id = self._channel_to_id(channel_object) # must be appropriate for string concatenation: base_url = shardlike.base_url packages = [] for package_group in ("packages", "packages.conda"): for filename, record in repodata.get(package_group, {}).items(): package = _package_info_from_package_dict( record, filename, url=f"{base_url}{filename}", channel_id=channel_id, add_pip_as_python_dependency=self._add_pip_as_python_dependency, ) packages.append(package) repo = self.db.add_repo_from_packages( packages=packages, name=channel_url, add_pip_as_python_dependency=PipAsPythonDependency( context.add_pip_as_python_dependency ), ) repos.append( _ChannelRepoInfo( channel=channel_object, repo=repo, url_w_cred=channel_url, url_no_cred=channel_url, ) ) return repos def _package_info_from_package_record(self, record: PackageRecord) -> PackageInfo: if record.get("noarch", None) and record.noarch.value in ("python", "generic"): noarch = NoArchType(record.noarch.value.title()) else: noarch = NoArchType("No") # include the python_site_packages_path attribute if libmambapy includes support if _SUPPORTS_PYTHON_SITE_PACKAGES: extra = { "python_site_packages_path": record.get("python_site_packages_path") or "", } else: extra = {} return PackageInfo( name=record.name, version=record.version, build_string=record.build or "", build_number=record.build_number or 0, channel=str(record.channel), package_url=record.get("url") or "", platform=record.subdir, filename=record.fn or f"{record.name}-{record.version}-{record.build or ''}", license=record.get("license") or "", md5=record.get("md5") or "", sha256=record.get("sha256") or "", signatures=record.get("signatures") or "", # conda can have list or tuple, but libmamba only accepts lists track_features=list(record.get("track_features") or []), depends=list(record.get("depends") or []), constrains=list(record.get("constrains") or []), defaulted_keys=list(record.get("defaulted_keys") or []), noarch=noarch, size=record.get("size") or 0, timestamp=int((record.get("timestamp") or 0) * 1000), **extra, ) def _set_repo_priorities(self) -> None: has_priority = context.channel_priority in ( ChannelPriority.STRICT, ChannelPriority.FLEXIBLE, ) subprio_index = len(self.repos) if has_priority: # max channel priority value is the number of unique channels channel_prio = len({repo.canonical_name for repo in self.repos}) current_channel_name = self.repos[0].canonical_name for repo_info in self.repos: if repo_info.repo is None: continue if has_priority: if repo_info.canonical_name != current_channel_name: channel_prio -= 1 current_channel_name = repo_info.canonical_name priority = channel_prio else: priority = 0 if has_priority: # NOTE: -- This was originally 0, but we need 1. # Otherwise, conda/conda @ test_create::test_force_remove fails :shrug: subpriority = 1 else: subpriority = subprio_index subprio_index -= 1 log.debug( "Channel: %s, prio: %s : %s", repo_info.url_no_cred, priority, subpriority, ) self.db.set_repo_priority(repo_info.repo, Priorities(priority, subpriority)) # region Repoquery ################# def search( self, queries: Iterable[str | MatchSpec] | str | MatchSpec, return_type: Literal["records", "dict", "raw"] = "records", ) -> list[PackageRecord] | dict[str, Any] | QueryResult: if isinstance(queries, (str, MatchSpec)): queries = [queries] queries = list(map(str, queries)) result = Query.find(self.db, queries) return self._process_query_result(result, return_type) def depends( self, query: str | MatchSpec, tree: bool = False, return_type: Literal["records", "dict", "raw"] = "records", ) -> list[PackageRecord] | dict[str, Any] | QueryResult: query = str(query) result = Query.depends(self.db, query, tree) return self._process_query_result(result, return_type) def whoneeds( self, query: str | MatchSpec, tree: bool = False, return_type: Literal["records", "dict", "raw"] = "records", ) -> list[PackageRecord] | dict[str, Any] | QueryResult: query = str(query) result = Query.whoneeds(self.db, query, tree) return self._process_query_result(result, return_type) def explicit_pool(self, specs: Iterable[MatchSpec]) -> tuple[str, ...]: """ Returns all the package names that (might) depend on the passed specs """ explicit_pool: set[str] = set() for spec in specs: pkg_records = self.depends(spec.dist_str()) for record in pkg_records: explicit_pool.add(record.name) return tuple(explicit_pool) def _process_query_result( self, result: QueryResult, return_type: Literal["records", "dict", "raw"] = "records", ) -> list[PackageRecord] | dict[str, Any] | QueryResult: if return_type == "raw": return result result = result.to_dict() if result.get("result", {}).get("status") != "OK": query_type = result.get("query", {}).get("type", "") query = result.get("query", {}).get("query", "") error_msg = result.get("result", {}).get("msg", f"Faulty response: {result.json()}") raise ValueError(f"{query_type} query '{query}' failed: {error_msg}") if return_type == "records": pkg_records = [] for pkg in result["result"]["pkgs"]: record = PackageRecord(**pkg) pkg_records.append(record) return pkg_records # return_type == "dict" return result # endregion ================================================ FILE: conda_libmamba_solver/mamba_utils.py ================================================ # Copyright (C) 2019 QuantStack and the Mamba contributors. # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause # TODO: Temporarily vendored from mamba.utils v0.19 on 2021.12.02 # Decide what to do with it when we split into a plugin # 2022.02.15: updated vendored parts to v0.21.2 # 2022.11.14: only keeping channel prioritization and context initialization logic now # 2024.09.24: parameterize init_api_context from __future__ import annotations import os import logging import sys from collections.abc import Iterable from functools import lru_cache from importlib.metadata import version from pathlib import Path from typing import TYPE_CHECKING, Iterable import libmambapy from conda.base.constants import ChannelPriority from conda.base.context import context from conda.common.compat import on_win if TYPE_CHECKING: from .index import _ChannelRepoInfo log = logging.getLogger(f"conda.{__name__}") _db_log = logging.getLogger("conda.libmamba.db") _libmamba_context = None @lru_cache(maxsize=1) def mamba_version() -> str: return version("libmambapy") def _get_base_url(url: str, name: str | None = None) -> str: tmp = url.rsplit("/", 1)[0] if name: if tmp.endswith(name): return tmp.rsplit("/", 1)[0] return tmp def init_libmamba_context( channels: Iterable[str] | None = None, platform: str | None = None, target_prefix: str | None = None, ) -> libmambapy.Context: global _libmamba_context if _libmamba_context is None: # This function has to be called BEFORE 1st initialization of the context _libmamba_context = libmambapy.Context( libmambapy.ContextOptions( enable_signal_handling=False, enable_logging=True, ) ) libmamba_context = _libmamba_context # Output params libmamba_context.output_params.json = context.json if libmamba_context.output_params.json: libmambapy.cancel_json_output(libmamba_context) libmamba_context.output_params.quiet = context.quiet libmamba_context.output_params.verbosity = context.verbosity libmamba_context.set_log_level( { 4: libmambapy.LogLevel.TRACE, 3: libmambapy.LogLevel.DEBUG, 2: libmambapy.LogLevel.INFO, 1: libmambapy.LogLevel.WARNING, 0: libmambapy.LogLevel.ERROR, }[context.verbosity] ) # Prefix params libmamba_context.prefix_params.conda_prefix = context.conda_prefix libmamba_context.prefix_params.root_prefix = context.root_prefix libmamba_context.prefix_params.target_prefix = str( target_prefix if target_prefix is not None else context.target_prefix ) # Networking params -- we always operate offline from libmamba's perspective libmamba_context.remote_fetch_params.user_agent = context.user_agent libmamba_context.local_repodata_ttl = context.local_repodata_ttl libmamba_context.offline = True libmamba_context.use_index_cache = True # General params libmamba_context.add_pip_as_python_dependency = context.add_pip_as_python_dependency libmamba_context.always_yes = context.always_yes libmamba_context.dry_run = context.dry_run libmamba_context.envs_dirs = context.envs_dirs libmamba_context.pkgs_dirs = context.pkgs_dirs libmamba_context.use_lockfiles = False libmamba_context.use_only_tar_bz2 = context.use_only_tar_bz2 # Channels and platforms libmamba_context.platform = platform if platform is not None else context.subdir libmamba_context.channels = list(channels) if channels is not None else context.channels libmamba_context.channel_alias = str( _get_base_url(context.channel_alias.url(with_credentials=True)) ) RESERVED_NAMES = {"local", "defaults"} additional_custom_channels = {} for el in context.custom_channels: if context.custom_channels[el].canonical_name not in RESERVED_NAMES: additional_custom_channels[el] = _get_base_url( context.custom_channels[el].url(with_credentials=True), el ) libmamba_context.custom_channels = additional_custom_channels additional_custom_multichannels = { "local": list(context.conda_build_local_paths), "defaults": [channel.url(with_credentials=True) for channel in context.default_channels], } for el in context.custom_multichannels: if el not in RESERVED_NAMES: additional_custom_multichannels[el] = [] for c in context.custom_multichannels[el]: additional_custom_multichannels[el].append( _get_base_url(c.url(with_credentials=True)) ) libmamba_context.custom_multichannels = additional_custom_multichannels libmamba_context.default_channels = [ _get_base_url(x.url(with_credentials=True)) for x in context.default_channels ] if context.channel_priority is ChannelPriority.STRICT: libmamba_context.channel_priority = libmambapy.ChannelPriority.Strict elif context.channel_priority is ChannelPriority.FLEXIBLE: libmamba_context.channel_priority = libmambapy.ChannelPriority.Flexible elif context.channel_priority is ChannelPriority.DISABLED: libmamba_context.channel_priority = libmambapy.ChannelPriority.Disabled return libmamba_context def logger_callback(level: libmambapy.solver.libsolv.LogLevel, msg: str, logger: logging.Logger =_db_log) -> None: # from libmambapy.solver.libsolv import LogLevel # levels = { # LogLevel.Debug: logging.DEBUG, # 0 -> 10 # LogLevel.Warning: logging.WARNING, # 1 -> 30 # LogLevel.Error: logging.ERROR, # 2 -> 40 # LogLevel.Fatal: logging.FATAL, # 3 -> 50 # } if level.value == 0: # This incurs a large performance hit! logger.debug(msg) else: logger.log((level.value + 2) * 10, msg) def palettes_and_formats() -> tuple[libmambapy.solver.ProblemsMessageFormat, libmambapy.solver.ProblemsMessageFormat]: # _indents = ["│ ", " ", "├─ ", "└─ "] if os.getenv("NO_COLOR"): use_color = False elif os.getenv("FORCE_COLOR"): use_color = True else: use_color = all([sys.stdout.isatty(), sys.stdin.isatty()]) palette_no_color = libmambapy.Palette.no_color() problems_format_nocolor = libmambapy.solver.ProblemsMessageFormat() problems_format_nocolor.unavailable = palette_no_color.failure problems_format_nocolor.available = palette_no_color.success problems_format_auto = ( libmambapy.solver.ProblemsMessageFormat() if use_color else problems_format_nocolor ) return problems_format_auto, problems_format_nocolor problems_format_auto, problems_format_nocolor = palettes_and_formats() ================================================ FILE: conda_libmamba_solver/plugin.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Entry points for the conda plugin system """ from conda.common.configuration import PrimitiveParameter from conda.plugins import hookimpl from conda.plugins.types import CondaSetting, CondaSolver, CondaSubcommand from .repoquery import configure_parser, repoquery from .solver import LibMambaSolver @hookimpl def conda_solvers(): """ The conda plugin hook implementation to load the solver into conda. """ yield CondaSolver( name="libmamba", backend=LibMambaSolver, ) @hookimpl def conda_subcommands(): yield CondaSubcommand( name="repoquery", summary="Advanced search for repodata.", action=repoquery, configure_parser=configure_parser, ) @hookimpl def conda_settings(): """ Define all settings specific to the conda-libmamba-solver plugin. """ yield CondaSetting( name="use_sharded_repodata", description="Enable use of sharded repodata when available.", parameter=PrimitiveParameter(True, element_type=bool), ) ================================================ FILE: conda_libmamba_solver/repoquery.py ================================================ # Copyright (C) 2019, QuantStack # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Implementation of the 'conda repoquery' subcommand. Based on 'mamba repoquery' for v1.x. """ import argparse import json import sys from itertools import chain from conda.base.context import context from conda.cli import conda_argparse from conda.core.prefix_data import PrefixData from conda.exceptions import CondaError from conda.models.channel import Channel from conda.models.match_spec import MatchSpec from conda.reporters import get_spinner from libmambapy import Context as LibmambaContext from .index import LibMambaIndexHelper def configure_parser(parser: argparse.ArgumentParser): package_cmds = argparse.ArgumentParser(add_help=False) package_cmds.add_argument("specs", help="The target package(s).", nargs="+") package_grp = package_cmds.add_argument_group("Subcommand options") package_grp.add_argument( "-i", "--installed", action="store_true", default=True, help=argparse.SUPPRESS, ) package_grp.add_argument( "-p", "--platform", default=context.subdir, help="Platform/subdir to search packages for. Defaults to current platform.", ) package_grp.add_argument( "--no-installed", action="store_true", help="Do not search currently installed packages." ) package_grp.add_argument( "--pretty", action="store_true", help="Prettier output with more details." ) package_grp.add_argument( "-a", "--all-channels", action="store_true", help="Look at all channels (for depends / whoneeds).", ) package_grp.add_argument( "--use-cache-only", action="store_true", help="Search in pkgs_dirs too", ) view_cmds = argparse.ArgumentParser(add_help=False) view_grp = view_cmds.add_argument_group("Dependency options") view_grp.add_argument( "-t", "--tree", action="store_true", help="Show dependencies in a tree-like format." ) view_grp.add_argument( "--recursive", action="store_true", help="Show dependencies recursively." ) subparser = parser.add_subparsers(dest="subcmd") whoneeds = subparser.add_parser( "whoneeds", help="Show packages that depend on this package.", parents=[package_cmds, view_cmds], ) depends = subparser.add_parser( "depends", help="Show dependencies of this package.", parents=[package_cmds, view_cmds], ) search = subparser.add_parser( "search", help="Show all available package versions.", parents=[package_cmds], ) for cmd in (whoneeds, search, depends): conda_argparse.add_parser_channels(cmd) conda_argparse.add_parser_networking(cmd) conda_argparse.add_parser_known(cmd) conda_argparse.add_parser_json(cmd) def repoquery(args: argparse.Namespace) -> int: if not args.subcmd: print("repoquery needs a subcommand (search, depends or whoneeds), e.g.:", file=sys.stderr) print(" conda repoquery search python\n", file=sys.stderr) return 1 cli_flags = [getattr(args, attr, False) for attr in ("tree", "recursive", "pretty")] if sum([context.json, *cli_flags]) > 1: print("Use only one of --json, --tree, --recursive and --pretty.", file=sys.stderr) return 1 if hasattr(args, "channel"): channels = args.channel else: channels = None if args.all_channels or channels is None: if channels: print("WARNING: Using all channels instead of configured channels\n", file=sys.stderr) channels = context.channels use_installed = args.installed if args.no_installed: use_installed = False # if we're asking for depends and channels are given, disregard # installed packages to prevent weird mixing if args.subcmd in ("depends", "whoneeds") and use_installed and channels: use_installed = False if args.subcmd == "search" and not args.installed: only_installed = False elif args.all_channels or (channels and len(channels)): only_installed = False else: only_installed = True if only_installed and args.no_installed: print("No channels selected. Use -a to search all channels.", file=sys.stderr) return 1 if use_installed: prefix_data = PrefixData(context.target_prefix) prefix_data.load() installed_records = prefix_data.iter_records() else: installed_records = () if args.use_cache_only: with get_spinner("Collecting package metadata from pkgs_dirs"): index = LibMambaIndexHelper( installed_records=(), channels=(), subdirs=(args.platform, "noarch"), repodata_fn=context.repodata_fns[-1], pkgs_dirs=context.pkgs_dirs, ) else: channels_from_specs = [] for spec in args.specs: ms = MatchSpec(spec) channel = ms.get_exact_value("channel") if channel: channels_from_specs.append(channel) with get_spinner("Collecting package metadata"): index = LibMambaIndexHelper( installed_records=installed_records, channels=[ Channel(c) for c in chain(channels or (), dict.fromkeys(channels_from_specs)) ], subdirs=(args.platform, "noarch"), repodata_fn=context.repodata_fns[-1], ) if args.subcmd == "search": result = index.search(args.specs, return_type="raw") if context.json: print(json.dumps(result.groupby("name").to_dict(), indent=2)) elif getattr(args, "pretty", None): print(result.pretty(show_all_builds=True)) else: print(result.groupby("name").table()) elif args.subcmd == "depends": if len(args.specs) > 1: raise CondaError("Only one query supported for 'depends'.") result = index.depends( args.specs[0], tree=getattr(args, "tree", False) or getattr(args, "recursive", False), return_type="raw", ) if context.json: print(json.dumps(result.to_dict(), indent=2)) elif getattr(args, "tree", None) or getattr(args, "pretty", None): # TODO: Report upstream raise CondaError("--tree currently not available for this subcommand.") print(result.tree(LibmambaContext.instance().graphics_params)) else: print(result.sort("name").table()) elif args.subcmd == "whoneeds": if len(args.specs) > 1: raise CondaError("Only one query supported for 'whoneeds'.") result = index.whoneeds( args.specs[0], tree=getattr(args, "tree", False) or getattr(args, "recursive", False), return_type="raw", ) if context.json: print(json.dumps(result.to_dict(), indent=2)) elif getattr(args, "tree", None) or getattr(args, "pretty", None): # TODO: Report upstream raise CondaError("--tree currently not available for this subcommand.") print(result.tree(LibmambaContext.instance().graphics_params)) else: print(result.sort("name").table()) else: raise CondaError(f"Unrecognized subcommand: {args.subcmd}") return 0 ================================================ FILE: conda_libmamba_solver/shards.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Models for sharded repodata, and to make monolithic repodata look like sharded repodata. """ from __future__ import annotations import abc import concurrent.futures import functools import json import logging from collections import defaultdict from typing import TYPE_CHECKING from urllib.parse import urljoin, urlparse, urlunparse, uses_relative import conda.exceptions import conda.gateways.repodata import msgpack import zstandard from conda.base.context import context from conda.core.subdir_data import SubdirData from conda.gateways.connection.session import get_session from conda.gateways.repodata import ( _add_http_value_to_dict, conda_http_errors, ) from conda.models.channel import Channel from libmambapy.bindings import specs from . import shards_cache log = logging.getLogger(__name__) if TYPE_CHECKING: from collections.abc import Iterable, KeysView from conda.gateways.repodata import RepodataCache from requests import Response from conda_libmamba_solver.shards_typing import RepodataDict, ShardsIndexDict from .shards_typing import PackageRecordDict, ShardDict SHARDS_CONNECTIONS_DEFAULT = 10 ZSTD_MAX_SHARD_SIZE = 2**20 * 16 # maximum size necessary when compressed data has no size header # Schemes that urljoin handles correctly (registered in urllib.parse.uses_relative) _URLJOIN_SAFE_SCHEMES = frozenset(uses_relative) def _safe_urljoin_with_slash(base_url: str, relative_url: str = "") -> str: """ Join base_url with relative_url, ensuring proper handling of all URL schemes. Python's urllib.parse.urljoin only handles schemes registered in ``urllib.parse.uses_relative``. For unregistered schemes like ``s3://``, it returns just ``"."`` instead of the resolved URL. This function falls back to a scheme-swap workaround for those cases. The result always ends with "/" to enable proper string concatenation with filenames. See: https://github.com/conda/conda-libmamba-solver/issues/866 """ parsed = urlparse(base_url) # For schemes that urljoin handles correctly, use the standard behavior if parsed.scheme in _URLJOIN_SAFE_SCHEMES: # Standard urljoin behavior: join with relative_url, then "." for trailing slash result = urljoin(urljoin(base_url, relative_url), ".") return result # For unregistered schemes (e.g. s3://), urljoin drops the host. # Work around that by temporarily swapping in https://, then restoring # the original scheme on the result. relative_parsed = urlparse(relative_url) if not relative_parsed.scheme and parsed.scheme: https_base_url = urlunparse(parsed._replace(scheme="https")) joined_https = urljoin(urljoin(https_base_url, relative_url), ".") result = urlunparse(urlparse(joined_https)._replace(scheme=parsed.scheme)) else: result = urljoin(urljoin(base_url, relative_url), ".") # Ensure trailing slash for proper concatenation if not result.endswith("/"): result += "/" return result # For reference, the largest shard "conda-forge/linux-64/vim" is 2608283 bytes # or < 2**19*5 decompressed (486155 bytes compressed); the index is 575219 bytes # decompressed (514039 bytes compressed) and is mostly uncompressible hash data. def _shards_connections() -> int: """ If context.repodata_threads is not set, find the size of the connection pool in a typical https:// session. This should significantly reduce dropped connections. We match requests' default 10. Is this shared between all sessions? Or do we get a different pool for a different get_session(url)? Other adapters (file://, s3://) used in conda would have different concurrency behavior; we are not prepared to have separate threadpools per connection type. """ if context.repodata_threads is not None: return context.repodata_threads return SHARDS_CONNECTIONS_DEFAULT def ensure_hex_hash(record: PackageRecordDict): """ Convert bytes checksums to hex; leave unchanged if already str. """ for hash_type in "sha256", "md5": if hash_value := record.get(hash_type): if not isinstance(hash_value, str): record[hash_type] = bytes(hash_value).hex() return record @functools.cache def spec_to_package_name(spec: str) -> str: """ Given a dependency spec, return the package name. """ # Note: hope for no MatchSpec-without-name in repodata, although it is # possible in the MatchSpec grammar. parsed_spec = specs.MatchSpec.parse(spec) name = str(parsed_spec.name) return name def shard_mentioned_packages(shard: ShardDict, extra: Iterable[str] = ()) -> Iterable[str]: """ Return all dependency names mentioned in a shard, not including the shard's own package name. Additional names can be injected via ``extra``. """ unique_specs = set() for package in (*shard["packages"].values(), *shard["packages.conda"].values()): ensure_hex_hash(package) # otherwise we could do this at serialization for spec in (*package.get("depends", ()),): # , *package.get("constrains", ())): if spec in unique_specs: continue unique_specs.add(spec) name = spec_to_package_name(spec) yield name # not much improvement from only yielding unique names yield from extra class ShardBase(abc.ABC): """ Abstract base class for shard-like objects. Defines the common interface for both sharded repodata (Shards) and traditional repodata presented as shards (ShardLike). """ url: str repodata_no_packages: RepodataDict visited: dict[str, ShardDict | None] _base_url: str @property @abc.abstractmethod def package_names(self) -> KeysView[str]: """Return the names of all packages available in this shard collection.""" ... @property def base_url(self) -> str: """ Return self.url joined with base_url from repodata, or self.url if no base_url was present. Packages are found here. Note base_url can be a relative or an absolute url. Uses _safe_urljoin_with_slash to handle non-HTTP schemes (s3://, etc.). """ return _safe_urljoin_with_slash(self.url, self._base_url) def __contains__(self, package: str) -> bool: """Check if a package is available in this shard collection.""" return package in self.package_names @abc.abstractmethod def shard_url(self, package: str) -> str: """ Return shard URL for a given package. For monolithic repodata, should not be fetched but is a unique identifier. Raise KeyError if package is not in the index. """ ... @abc.abstractmethod def shard_loaded(self, package: str) -> bool: """ Return True if the given package's shard is in memory. """ ... def visit_package(self, package: str) -> ShardDict: """ Return a shard that is already loaded in memory and mark as visited. """ ... def visit_shard(self, package: str, shard: ShardDict): """ Store new shard data in the visited dict. """ self.visited[package] = shard @abc.abstractmethod def fetch_shard(self, package: str) -> ShardDict: """ Fetch an individual shard for the given package. """ ... @abc.abstractmethod def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]: """ Fetch multiple shards in one go. """ ... def build_repodata(self) -> RepodataDict: """ Return monolithic repodata including all visited shards. """ repodata: RepodataDict = { **self.repodata_no_packages, "packages": {}, "packages.conda": {}, } for _, shard in self.visited.items(): if shard is None: continue # recorded visited but not available shards for package_group in ("packages", "packages.conda"): repodata[package_group].update(shard[package_group]) return repodata class ShardLike(ShardBase): """ Present a "classic" repodata.json as per-package shards. """ def __init__(self, repodata: RepodataDict, url: str = ""): """ url: must be unique for all ShardLike used together. """ self.repodata_no_packages: RepodataDict = { **repodata, "packages": {}, "packages.conda": {}, } all_packages = { "packages": repodata.get("packages", {}), "packages.conda": repodata.get("packages.conda", {}), } self.url = url shards = defaultdict(lambda: {"packages": {}, "packages.conda": {}}) for group_name, group in all_packages.items(): for package, record in group.items(): name = record["name"] shards[name][group_name][package] = record # defaultdict behavior no longer wanted self.shards: dict[str, ShardDict] = dict(shards) # type: ignore # used to write out repodata subset self.visited: dict[str, ShardDict | None] = {} # alternate location for packages, if not self.url try: base_url = self.repodata_no_packages["info"]["base_url"] if not isinstance(base_url, str): log.warning(f'repodata["info"]["base_url"] was not a str, got {type(base_url)}') raise TypeError() self._base_url = base_url except KeyError: self._base_url = "" def __repr__(self): left, right = super().__repr__().split(maxsplit=1) return f"{left} {self.url} {right}" @property def package_names(self) -> KeysView[str]: return self.shards.keys() def shard_url(self, package: str) -> str: """ Return shard URL for a given package. Raise KeyError if package is not in the index. """ self.shards[package] return f"{self.url}#{package}" def shard_loaded(self, package: str) -> bool: """ Return True if the given package's shard is in memory. """ return package in self.shards def visit_package(self, package: str) -> ShardDict: """ Return a shard that is already in memory and mark as visited. """ shard = self.fetch_shard(package) assert shard is not None return shard def fetch_shard(self, package: str) -> ShardDict: """ "Fetch" an individual shard. Update self.visited with all not-None packages. Raise KeyError if package is not in the index. """ shard = self.shards[package] self.visited[package] = shard return shard def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]: """ Fetch multiple shards in one go. Update self.visited with all not-None packages. """ return {package: self.fetch_shard(package) for package in packages} def _shards_base_url(url, shards_base_url) -> str: """ Return shards_base_url joined with base_url and url. Note shards_base_url can be a relative or an absolute url. Uses _safe_urljoin_with_slash to handle non-HTTP schemes (s3://, etc.). """ if shards_base_url and not shards_base_url.endswith("/"): shards_base_url += "/" return _safe_urljoin_with_slash(url, shards_base_url) class Shards(ShardBase): """ Handle repodata_shards.msgpack.zst and individual per-package shards. """ _shards_base_url: str shards_cache: shards_cache.ShardCache | None def __init__( self, shards_index: ShardsIndexDict, url: str, cache: shards_cache.ShardCache | None = None ): """ Args: shards_index: raw parsed msgpack dict. Don't change it or base_url, shards_base_url will be wrong. url: URL of repodata_shards.msgpack.zst """ self.shards_index = shards_index self.url = url self.shards_cache = cache # https://github.com/conda/conda-index/pull/209 ensures that sharded # repodata will always include base_url, even if it is an empty string; # rattler/pixi require these keys. self._base_url = shards_index["info"]["base_url"] # doesn't track changes to self.shards_index self._shards_base_url = _shards_base_url( self.url, self.shards_index["info"].get("shards_base_url", "") ) # Use the channel's base URL to share session amongst subdir locations channel_base_url = Channel(self.shards_base_url).base_url self.session = get_session(channel_base_url) self.repodata_no_packages = { "info": shards_index["info"], "packages": {}, "packages.conda": {}, "repodata_version": 2, } # used to write out repodata subset # not used in traversal algorithm self.visited: dict[str, ShardDict | None] = {} @property def package_names(self): return self.packages_index.keys() @property def packages_index(self): return self.shards_index["shards"] @property def shards_base_url(self) -> str: """ Return self.url joined with shards_base_url. Note shards_base_url can be a relative or an absolute url. """ return self._shards_base_url def shard_url(self, package: str) -> str: """ Return shard URL for a given package. Raise KeyError if package is not in the index. """ shard_name = f"{bytes(self.packages_index[package]).hex()}.msgpack.zst" # "Individual shards are stored under the URL .msgpack.zst" return f"{self.shards_base_url}{shard_name}" def shard_loaded(self, package: str) -> bool: """ Return True if the given package's shard is in memory. """ return package in self.visited def visit_package(self, package: str) -> ShardDict: """ Return a shard that is already in memory and mark as visited. """ shard = self.visited[package] return shard def fetch_shard(self, package: str) -> ShardDict: """ Fetch an individual shard for the given package. Default implementation calls fetch_shards() with a single package. Subclasses may override for more efficient single-fetch operations. Raise KeyError if package is not in the index. """ return self.fetch_shards([package])[package] def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]: """ Return mapping of *package names* to Shard for given packages. If a shard is already in self.visited, it is not fetched again. """ results = {} def fetch(s, url, package_to_fetch): timeout = ( context.remote_connect_timeout_secs, context.remote_read_timeout_secs, ) response = s.get(url, timeout=timeout) response.raise_for_status() data = response.content return shards_cache.AnnotatedRawShard( url=url, package=package_to_fetch, compressed_shard=data ) packages = sorted(list(packages)) urls_packages = {} # package shards to fetch for package in packages: if package in self.visited: results[package] = self.visited[package] else: urls_packages[self.shard_url(package)] = package with concurrent.futures.ThreadPoolExecutor(max_workers=_shards_connections()) as executor: futures = { executor.submit(fetch, self.session, url, package): (url, package) for url, package in urls_packages.items() if package not in results } for future in concurrent.futures.as_completed(futures): log.debug(". %s", futures[future]) url, package = futures[future] self._process_fetch_result(future, url, package, results) self.visited.update(results) return results def _process_fetch_result(self, future, url, package, results): """ Process a single fetched shard. """ # Fail early if no cache to store the result. if self.shards_cache is None: raise ValueError("self.shards_cache is None") with conda_http_errors(url, package): fetch_result = future.result() # Decompress and save record results[fetch_result.package] = msgpack.loads( zstandard.decompress( fetch_result.compressed_shard, max_output_size=ZSTD_MAX_SHARD_SIZE ) ) self.shards_cache.insert(fetch_result) def _repodata_shards(url, cache: RepodataCache) -> bytes: """ Fetch shards index with cache. Update cache state. Return shards data, either newly fetched or from cache. In offline mode, returns cached data even if expired. If no cache exists in offline mode, raises RepodataIsEmpty to signal unavailability. """ # In offline mode, return cached data if available, even if expired if context.offline: if cache.cache_path_shards.exists(): return cache.cache_path_shards.read_bytes() else: # In offline mode with no cache, signal that shards are not available. # The caller (fetch_shards_index) catches RepodataIsEmpty and falls back to non-sharded repodata. raise conda.gateways.repodata.RepodataIsEmpty(url, status_code=404, response=None) session = get_session(url) state = cache.state headers = {} etag = state.etag last_modified = state.mod if etag: headers["If-None-Match"] = str(etag) if last_modified: headers["If-Modified-Since"] = str(last_modified) filename = "repodata_shards.msgpack.zst" with conda_http_errors(url, filename): timeout = ( context.remote_connect_timeout_secs, context.remote_read_timeout_secs, ) response: Response = session.get( url, headers=headers, proxies=session.proxies, timeout=timeout ) response.raise_for_status() response_bytes = response.content if response.status_code == 304: # should we save cache-control to state here to put another n # seconds on the "make a remote request" clock and/or touch cache # mtime # # Hold the cache lock while reading: RepodataCache.replace() does # unlink()+rename() under this same lock, so without it a concurrent # writer can briefly remove the file between those two operations, # causing FileNotFoundError on Windows. with cache.lock("r+"): return cache.cache_path_shards.read_bytes() saved_fields = {conda.gateways.repodata.URL_KEY: url} for header, key in ( ("Etag", conda.gateways.repodata.ETAG_KEY), ( "Last-Modified", conda.gateways.repodata.LAST_MODIFIED_KEY, ), ("Cache-Control", conda.gateways.repodata.CACHE_CONTROL_KEY), ): _add_http_value_to_dict(response, header, saved_fields, key) state.update(saved_fields) # should we return the response and let caller save cache data to state? return response_bytes # Like conda.gateways.repodata.jlap.fetch. If this returns True, then we mark # shards as not supported; otherwise, we will check again next time. def _is_http_error_most_400_codes(status_code: str | int) -> bool: """ Determine whether the `HTTPError` is an HTTP 400 error code (except for 416). """ return isinstance(status_code, int) and 400 <= status_code < 500 and status_code != 416 def fetch_shards_index(sd: SubdirData, cache: shards_cache.ShardCache | None) -> Shards | None: """ Check a SubdirData's URL for shards. Return shards index bytes from cache or network. Return None if not found; caller should fetch normal repodata. TODO: If this function fails to retrieve the sharded repodata index file, it will mark it is as not supporting this feature in cache. This can problematic because sometimes server errors can happen which will lead it to wrongly assuming the channel doesn't support sharding. We need to rethink our logic for determining shard support. """ fetch = sd.repo_fetch repo_cache = fetch.repo_cache # repo_cache.load_state() will clear the file on JSONDecodeError but cache.load() # will raise the exception. # repo_cache.load_state( # binary=True # ) # won't succeed when .msgpack.zst is missing as it wants to compare the timestamp (returns empty state) # Load state ourselves to avoid clearing when binary cached data is missing. # If we fall back to monolithic repodata.json, the standard fetch code will # load the state again in text mode. try: with repo_cache.lock("r+") as state_file: # cannot use pathlib.read_text / write_text on any locked file, as # it will release the lock early state = json.loads(state_file.read()) repo_cache.state.update(state) except (FileNotFoundError, json.JSONDecodeError): pass cache_state = repo_cache.state if cache_state.should_check_format("shards"): # look for shards index shards_data = None shards_index_url = f"{sd.url_w_subdir}/repodata_shards.msgpack.zst" if not repo_cache.cache_path_shards.exists(): # avoid 304 not modified if we don't have the file cache_state.etag = "" cache_state.mod = "" elif not repo_cache.stale(): # load from cache without network request with repo_cache.lock("r+"): shards_data = repo_cache.cache_path_shards.read_bytes() # If we don't have shards_data yet, try fetching (repodata_shards handles offline mode) if shards_data is None: try: shards_data = _repodata_shards(shards_index_url, repo_cache) cache_state.set_has_format("shards", True) # this will also set state["refresh_ns"] = time.time_ns(); we could # call cache.refresh() if we got a 304 instead: repo_cache.save(shards_data) except conda.gateways.repodata.UnavailableInvalidChannel as err: # repodata_shards converts HTTP errors to conda errors. # fetch repodata.json / repodata.json.zst instead if _is_http_error_most_400_codes(err.status_code): cache_state.set_has_format("shards", False) repo_cache.refresh() except conda.exceptions.CondaHTTPError as err: # repodata_shards converts HTTP errors to conda errors. # fetch repodata.json / repodata.json.zst instead if ( hasattr(err._caused_by, "response") and hasattr(err._caused_by.response, "status_code") and _is_http_error_most_400_codes(err._caused_by.response.status_code) ): cache_state.set_has_format("shards", False) repo_cache.refresh() if shards_data: # basic parse (move into caller?) shards_index: ShardsIndexDict = msgpack.loads( zstandard.decompress(shards_data, max_output_size=ZSTD_MAX_SHARD_SIZE) ) # type: ignore shards = Shards(shards_index, shards_index_url, cache) return shards return None def batch_retrieve_from_cache(sharded: list[Shards], packages: list[str]): """ Given a list of Shards objects and a list of package names, fetch all URLs from a shared local cache, and update Shards with those per-package shards. Return the remaining URLs that must be fetched from the network. """ sharded = [shardlike for shardlike in sharded if isinstance(shardlike, Shards)] wanted = [] # XXX update batch_retrieve_from_cache to work with (Shards, package name) # tuples instead of broadcasting across shards itself. for shard in sharded: for package_name in packages: if package_name in shard: # and not package_name in shard.visited wanted.append((shard, package_name, shard.shard_url(package_name))) log.debug("%d shards to fetch", len(wanted)) if not sharded: log.debug("No sharded channels found.") return wanted shared_shard_cache = sharded[0].shards_cache from_cache = shared_shard_cache.retrieve_multiple([shard_url for *_, shard_url in wanted]) # add fetched Shard objects to Shards objects visited dict for shard, package, shard_url in wanted: if from_cache_shard := from_cache.get(shard_url): shard.visit_shard(package, from_cache_shard) return wanted def batch_retrieve_from_network(wanted: list[tuple[Shards, str, str]]): """ Given a list of (Shards, package name, shard URL) tuples, group by Shards and call fetch_shards with a list of all URLs for that Shard. """ shard_packages: dict[Shards, list[str]] = defaultdict(list) for shard, package, _ in wanted: shard_packages[shard].append(package) # XXX it might be better to pull networking and Session() out of Shards(), # so that we can e.g. use the same session for a Channel(); typically a # noarch+arch pair of subdirs. # Could we share a ThreadPoolExecutor and see better session utilization? for shard, packages in shard_packages.items(): shard.fetch_shards(packages) def fetch_channels(url_to_channel: dict[str, Channel]) -> dict[str, ShardBase] | None: """ Args: url_to_channel: not modified, must already be expanded to subdirs. Attempt to fetch the sharded index first and then fall back to retrieving a traditional `repodata.json` file. Returns: A dict mapping channel URLs to `Shard` or `ShardLike` objects. None if no channels have shards. This dict preserves the key order of the input `url_to_channel`. """ # copy incoming dict to retain order: channel_data: dict[str, ShardBase | None] = {url: None for url in url_to_channel} # The parallel version may reorder channels, does this matter? non_sharded_channels = [] with concurrent.futures.ThreadPoolExecutor(max_workers=_shards_connections()) as executor: futures = { executor.submit( fetch_shards_index, SubdirData(Channel(channel_url)), None ): channel_url for (channel_url, _) in url_to_channel.items() } futures_non_sharded = {} for future in concurrent.futures.as_completed(futures): channel_url = futures[future] found = future.result() if found: channel_data[channel_url] = found else: non_sharded_channels.append((channel_url, Channel(channel_url))) # If all are None then don't do ShardLike. if all(value is None for value in channel_data.values()): return None # caller should interpret this as falling back to the older code path # Latency penalty launching these requests here instead of when we # non_sharded_channels.append(), but we want to leave a fallback to the # non-sharded path open. for channel_url, _ in non_sharded_channels: futures_non_sharded[ executor.submit(SubdirData(Channel(channel_url)).repo_fetch.fetch_latest_parsed) ] = channel_url for future in concurrent.futures.as_completed(futures_non_sharded): channel_url = futures_non_sharded[future] repodata_json, _ = future.result() # the filename is not strictly repodata.json since we could have # fetched the same data from repodata.json.zst; but makes the # urljoin consistent with shards which end with # /repodata_shards.msgpack.zst url = f"{channel_url}/repodata.json" found = ShardLike(repodata_json, url) channel_data[channel_url] = found return {url: shard for url, shard in channel_data.items() if shard is not None} ================================================ FILE: conda_libmamba_solver/shards_cache.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Cache suitable for shards, not allowed to change because they are named after their own sha256 hash. """ from __future__ import annotations import logging import sqlite3 from dataclasses import dataclass from typing import TYPE_CHECKING import msgpack import zstandard if TYPE_CHECKING: from pathlib import Path from .shards_typing import ShardDict log = logging.getLogger(__name__) SHARD_CACHE_NAME = "repodata_shards.db" ZSTD_MAX_SHARD_SIZE = 2**20 * 16 # maximum size necessary when compresed data has no size header @dataclass class AnnotatedRawShard: def __init__(self, url: str, package: str, compressed_shard: bytes): # prevent easy mistake of swapping url, package assert "://" in url assert "://" not in package self.url = url self.package = package # remove this field to avoid confusion? self.compressed_shard = compressed_shard url: str package: str compressed_shard: bytes def connect(dburi="cache.db"): """ Get database connection. dburi: uri-style sqlite database filename; accepts certain ?= parameters. """ conn = sqlite3.connect(dburi, uri=True, timeout=30.0) conn.row_factory = sqlite3.Row with conn as c: try: mode = c.execute("PRAGMA journal_mode = WAL").fetchone()[0] except sqlite3.DatabaseError: mode = None if mode and mode.lower().startswith("wal"): c.execute("PRAGMA synchronous = NORMAL") c.execute("PRAGMA foreign_keys = ON") return conn class ShardCache: """ Handle caching for individual shards (not the index of shards). """ def __init__(self, base: Path, create=True): """ base: directory and filename prefix for cache. """ self.base = base self.connect(create=create) def __enter__(self): return self def __exit__(self, exc_type, exc_val, exec_tb): self.close() def close(self): """ Clean up connection. ShardCache can no longer be used after close(). """ if self.conn: self.conn.close() self.conn = None def copy(self): """ Copy cache with new connection. Useful for threads. """ return ShardCache(self.base, create=False) def connect(self, create=True, retry=True): """ Args: create: if True, create table if not exists. retry: remove cache, log warning, and retry on error. """ global SHARD_CACHE_NAME dburi = (self.base / SHARD_CACHE_NAME).as_uri() self.conn = connect(dburi) if not create: return try: # this schema will also get confused if we merge packages into a single # shard, but the package name should be advisory. with self.conn as c: c.execute( "CREATE TABLE IF NOT EXISTS shards (" "url TEXT PRIMARY KEY, package TEXT, shard BLOB, " "timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP)" ) except sqlite3.DatabaseError as e: # Python 3.11 adds sqlite_errorcode. This is meant to delete and # retry on all DatabaseError for Python 3.10, but on Python 3.11+ # only retry on SQLITE_NOTADB. Other errors e.g. busy, locked, would # propagate. has_errorcode = hasattr(e, "sqlite_errorcode") if retry and ((not has_errorcode) or (e.sqlite_errorcode == sqlite3.SQLITE_NOTADB)): log.warning("%s '%s'; remove and retry.", dburi, e) try: self.remove_cache() except OSError as e: # alternate filename if primary cannot be removed. log.warning("%s '%s'; use alternate filename.", dburi, e) SHARD_CACHE_NAME = "repodata_shards_1.db" # pass False so that we only retry once: return self.connect(create=create, retry=False) raise def insert(self, raw_shard: AnnotatedRawShard): """ Args: url: of shard package: package name raw_shard: msgpack.zst compressed shard data """ # decompress and return shard for convenience, also to validate? unless # caller would rather retrieve the shard from another thread. with self.conn as c: c.execute( "INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)", (raw_shard.url, raw_shard.package, raw_shard.compressed_shard), ) def retrieve(self, url) -> ShardDict | None: with self.conn as c: row = c.execute("SELECT shard FROM shards WHERE url = ?", (url,)).fetchone() return ( msgpack.loads( zstandard.decompress(row["shard"], max_output_size=ZSTD_MAX_SHARD_SIZE) ) if row else None ) # type: ignore def retrieve_multiple(self, urls: list[str]) -> dict[str, ShardDict | None]: """ Query database for cached shard urls. Return a dict of urls in cache mapping to the Shard or None if not present. """ if not urls: return {} # this optimization does not save a noticeable amount of time. # In one test reusing the context saves difference between .006s and .01s # We could make this a threadlocal. dctx = zstandard.ZstdDecompressor() query = f"SELECT url, shard FROM shards WHERE url IN ({','.join(('?',) * len(urls))}) ORDER BY url" with self.conn as c: result: dict[str, ShardDict | None] = { row["url"]: msgpack.loads( dctx.decompress(row["shard"], max_output_size=ZSTD_MAX_SHARD_SIZE) ) if row else None for row in c.execute(query, urls) # type: ignore } return result def clear_cache(self): """ Truncate the database by removing all rows from tables """ with self.conn as c: c.execute("DELETE FROM shards") def remove_cache(self): """ Remove the sharded cache database. """ self.close() try: (self.base / SHARD_CACHE_NAME).unlink() except OSError: # possibly workable on Windows (self.base / SHARD_CACHE_NAME).rename(self.base / f"{SHARD_CACHE_NAME}.conda_trash") ================================================ FILE: conda_libmamba_solver/shards_subset.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Sharded repodata subsets. Traverse dependencies of installed and to-be-installed packages to generate a useful subset for the solver. The algorithm developed here is a direct result of the following CEP: - https://conda.org/learn/ceps/cep-0016 (Sharded Repodata) In this algorithm we treat a (channel, package name) as a node, its dependencies as edges. We then traverse all edges to discover all reachable (channel, package name) tuples. The solver should be able to find a solution with only this subset. This subset is overgenerous since the user is unlikely to want to install very old packages and their dependencies. If this is too slow, we could deploy heuristics that automatically ignore older package versions. We could also allow the user to configure minimum versions of common packages and ignore older versions and their dependencies, falling back to a full solve if unsatisfiable. We treat both sharded and monolithic repodata as if they were made up of per-package shards, computing a subset of both. This is because it is possible for the monolithic repodata to mention packages that exist in the true sharded repodata but would not be found by only traversing the shards. We treat all repodata as sharded, even if no actual sharded repodata has been found. ## Example usage The following constructs several repodata (`noarch` and `linux-64`) from a single channel name and a list of root packages: ``` from conda.models.channel import Channel from conda_libmamba_solver.shards_subset import build_repodata_subset channel = Channel("conda-forge-sharded/linux-64") channel_data = build_repodata_subset(["python", "pandas"], [channel.url()]) repodata = {} for url in channel_data: repodata[url] = channel_data.build_repodata() # ... this is what's fed to the solver ``` """ from __future__ import annotations import functools import logging import queue import sys import threading from collections import deque from concurrent.futures import Future, ThreadPoolExecutor from contextlib import contextmanager, suppress from dataclasses import dataclass from pathlib import Path from queue import SimpleQueue from typing import TYPE_CHECKING import conda.gateways.repodata import msgpack import zstandard from conda.base.context import context from conda_libmamba_solver import shards_cache from conda_libmamba_solver.shards_cache import AnnotatedRawShard from .shards import ( ZSTD_MAX_SHARD_SIZE, Shards, _shards_connections, batch_retrieve_from_cache, batch_retrieve_from_network, fetch_channels, shard_mentioned_packages, ) log = logging.getLogger(__name__) if TYPE_CHECKING: from collections.abc import Callable, Iterable, Iterator, Sequence from queue import SimpleQueue as Queue from typing import Literal, TypeVar from conda.models.channel import Channel from conda_libmamba_solver.shards_cache import ShardCache from conda_libmamba_solver.shards_typing import ShardDict from .shards import ShardBase # Waiting for worker threads to shutdown cleanly, or raise error. THREAD_WAIT_TIMEOUT = 5 # seconds REACHABLE_PIPELINED_MAX_TIMEOUTS = 10 # number of times we can timeout waiting for shards @dataclass(order=True) class Node: distance: int = sys.maxsize package: str = "" channel: str = "" visited: bool = False shard_url: str = "" def to_id(self) -> NodeId: return NodeId(self.package, self.channel, self.shard_url) @dataclass(order=True, eq=True, frozen=True) class NodeId: package: str channel: str shard_url: str = "" def __hash__(self): return hash((self.package, self.channel, self.shard_url)) def _nodes_from_packages( root_packages: list[str], shardlikes: Iterable[ShardBase] ) -> Iterator[tuple[NodeId, Node]]: """ Yield (NodeId, Node) for all root packages found in shardlikes. """ for package in root_packages: for shardlike in shardlikes: if package in shardlike: node = Node(0, package, shardlike.url, shard_url=shardlike.shard_url(package)) node_id = node.to_id() yield node_id, node def filter_redundant_packages(repodata: ShardDict, use_only_tar_bz2=False) -> ShardDict: """ Given repodata or a single shard, remove any .tar.bz2 packages that have a .conda counterpart. Return a shallow copy if use_only_tar_bz2==False, else unmodified input. """ if use_only_tar_bz2: return repodata _tar_bz2 = ".tar.bz2" _conda = ".conda" _len_tar_bz2 = len(_tar_bz2) legacy_packages = repodata.get("packages", {}) conda_packages = repodata.get("packages.conda", {}) return { **repodata, "packages": { k: v for k, v in legacy_packages.items() if f"{k[:-_len_tar_bz2]}{_conda}" not in conda_packages }, } @contextmanager def _install_shards_cache(shardlikes): """ Add shards_cache to shardlikes for duration of traversal, then remove and close. """ with shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) as cache: for shardlike in shardlikes: if isinstance(shardlike, Shards): shardlike.shards_cache = cache yield cache for shardlike in shardlikes: if isinstance(shardlike, Shards): shardlike.shards_cache = None @dataclass class RepodataSubset: nodes: dict[NodeId, Node] shardlikes: Sequence[ShardBase] DEFAULT_STRATEGY = "pipelined" def __init__(self, shardlikes: Iterable[ShardBase]): self.nodes = {} self.shardlikes = list(shardlikes) self._use_only_tar_bz2 = context.use_only_tar_bz2 self._add_pip_as_python_dependency = context.add_pip_as_python_dependency @classmethod def has_strategy(cls, strategy: str) -> bool: """ Return True if this class provides the named shard traversal strategy. """ return hasattr(cls, f"reachable_{strategy}") def neighbors(self, node: Node) -> Iterator[Node]: """ Retrieve all unvisited neighbors of a node Neighbors in the context are dependencies of a package """ discovered = set() for shardlike in self.shardlikes: if node.package not in shardlike: continue # check that we don't fetch the same shard twice... shard = shardlike.fetch_shard( node.package ) # XXX this is the only place that in-memory (repodata.json) shards are found for the first time shard = filter_redundant_packages(shard, self._use_only_tar_bz2) shardlike.visit_shard(node.package, shard) # ensure solver has "pip" record if add_pip_as_python_dependency: extra = ( ("pip",) if self._add_pip_as_python_dependency and node.package == "python" else () ) for package in shard_mentioned_packages(shard, extra=extra): node_id = NodeId(package, shardlike.url) if node_id not in self.nodes: self.nodes[node_id] = Node(node.distance + 1, package, shardlike.url) yield self.nodes[node_id] if package not in discovered: # now this is per package name, not per (name, channel) tuple discovered.add(package) def outgoing(self, node: Node): """ All nodes that can be reached by this node, plus cost. """ # If we set a greater cost for sharded repodata than the repodata that # is already in memory and tracked nodes as (channel, package) tuples, # we might be able to find more shards-to-fetch-in-parallel more # quickly. On the other hand our goal is that the big channels will all # be sharded. for n in self.neighbors(node): yield n, 1 def reachable(self, root_packages, *, strategy=DEFAULT_STRATEGY) -> None: """ Run named reachability strategy or the default. Update `self.shardlikes` with reachable package records. Later, [shardlike.build_repodata() for shardlike in shardlikes] can be used to generate repodata.json-format subsets of each channel. """ return getattr(self, f"reachable_{strategy}")(root_packages) def reachable_bfs(self, root_packages): """ Fetch all packages reachable from `root_packages`' by following dependencies using the "breadth-first search" algorithm. Update associated `self.shardlikes` to contain enough data to build a repodata subset. """ with _install_shards_cache(self.shardlikes): return self._reachable_bfs(root_packages) def _reachable_bfs(self, root_packages): """ Inner reachable_bfs() implementation. """ self.nodes = dict(_nodes_from_packages(root_packages, self.shardlikes)) node_queue = deque(self.nodes.values()) sharded = [s for s in self.shardlikes if isinstance(s, Shards)] while node_queue: # Batch fetch all nodes at current level to_retrieve = {node.package for node in node_queue if not node.visited} if to_retrieve: not_in_cache = batch_retrieve_from_cache(sharded, sorted(to_retrieve)) batch_retrieve_from_network(not_in_cache) # Process one level level_size = len(node_queue) for _ in range(level_size): node = node_queue.popleft() if node.visited: # pragma: no cover continue # we should never add visited nodes to node_queue node.visited = True for next_node, _ in self.outgoing(node): if not next_node.visited: node_queue.append(next_node) def reachable_pipelined(self, root_packages): """ Fetch all packages reachable from `root_packages`' by following dependencies. Build repodata subset using concurrent threads to follow dependencies, fetch from cache, and fetch from network. """ # In offline mode shards are retrieved from the cache database as usual, # but cache misses are forwarded to offline_nofetch_thread returning # empty shards. if context.offline: network_worker = offline_nofetch_thread else: network_worker = network_fetch_thread # Ignore cache on shards object, use our own. Necessary if there are no # sharded channels. with shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) as cache: return self._reachable_pipelined( root_packages, network_worker=network_worker, cache=cache ) def _reachable_pipelined( self, root_packages, network_worker: Callable[ [ Queue[Sequence[NodeId] | None], Queue[list[tuple[NodeId, ShardDict] | Exception]], ShardCache, Sequence[ShardBase], ], None, ], cache: shards_cache.ShardCache, ): """ Set up queues and threads for shard traversal with a configurable network_worker. Called by reachable_pipelined() """ cache_in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue() shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]] | Exception] = SimpleQueue() cache_miss_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue() cache_thread = threading.Thread( target=cache_fetch_thread, args=(cache_in_queue, shard_out_queue, cache_miss_queue, cache), daemon=True, # may have to set to False if we ever want to run in a subinterpreter ) network_thread = threading.Thread( target=network_worker, args=(cache_miss_queue, shard_out_queue, cache, self.shardlikes), daemon=True, ) try: cache_thread.start() network_thread.start() self._pipelined_traversal( root_packages, cache_in_queue, shard_out_queue, cache_thread, network_thread ) finally: cache_in_queue.put(None) # These should finish almost immediately, but if not, raise an error: cache_thread.join(THREAD_WAIT_TIMEOUT) network_thread.join(THREAD_WAIT_TIMEOUT) def _pipelined_traversal( self, root_packages, cache_in_queue: Queue[list[NodeId] | None], shard_out_queue: Queue[list[tuple[NodeId, ShardDict]] | Exception], cache_thread: threading.Thread, network_thread: threading.Thread, ): """ Run reachability algorithm given queues to submit and receive shards. """ shardlikes_by_url = {s.url: s for s in self.shardlikes} pending: set[NodeId] = set() in_flight: set[NodeId] = set() timeouts = 0 self.nodes = {} # create start condition parent_node = Node(0) pending.update(self.visit_node(parent_node, root_packages)) def pump(): """ Find shards we already have and those we need. Submit those need to cache_in_queue, those we have to shard_out_queue. """ have, need = self.drain_pending(pending, shardlikes_by_url) if need: in_flight.update(need) cache_in_queue.put(need) if have: in_flight.update(node_id for node_id, _ in have) # All shards go through shard_out queue to be processed at # shard_out_queue.get(). Whether they come from cache, network, # or for repodata.json we "have" them (already in memory). shard_out_queue.put(have) return len(have) + len(need) def log_timeout(): """ Log timeout information and raise TimeoutError if max timeouts exceeded. """ nonlocal timeouts timeouts += 1 log.debug("Shard timeout %s", timeouts) log.debug("in_flight: %s...", sorted(str(node_id) for node_id in in_flight)[:10]) log.debug("nodes: %d", len(self.nodes)) log.debug("cache_thread.is_alive(): %s", cache_thread.is_alive()) log.debug("network_thread.is_alive(): %s", network_thread.is_alive()) log.debug("shard_out_queue.qsize(): %s", shard_out_queue.qsize()) if network_thread.is_alive() and in_flight: max_timeouts = int( context.remote_read_timeout_secs * (context.remote_max_retries + 1) ) else: max_timeouts = REACHABLE_PIPELINED_MAX_TIMEOUTS if timeouts > max_timeouts: raise TimeoutError("Timeout while fetching repodata shards.") while True: pump() if not in_flight: # pending is empty right after calling pump() log.debug("All shards have finished processing.") break try: new_shards = shard_out_queue.get(timeout=1) if isinstance(new_shards, BaseException): # error propagated from worker thread raise new_shards except queue.Empty: log_timeout() continue timeouts = 0 for node_id, shard in new_shards: in_flight.remove(node_id) # remove_legacy_packages if the ".conda" format is enabled / # conda is not in ".tar.bz2 only" mode. shard = filter_redundant_packages(shard, self._use_only_tar_bz2) # add shard to appropriate ShardLike parent_node = self.nodes[node_id] shardlike = shardlikes_by_url[node_id.channel] shardlike.visit_shard(node_id.package, shard) # ensure solver has "pip" record if add_pip_as_python_dependency: extra = ( ("pip",) if self._add_pip_as_python_dependency and parent_node.package == "python" else () ) pending.update( self.visit_node(parent_node, shard_mentioned_packages(shard, extra=extra)) ) def visit_node(self, parent_node: Node, mentioned_packages: Iterable[str]) -> Iterable[NodeId]: """Broadcast mentioned packages across channels. yield pending NodeId's.""" # NOTE we have visit for Nodes which is used in the graph traversal # algorithm, and a separate visit for ShardBase which means "include # this package in the output repodata". for package in mentioned_packages: for shardlike in self.shardlikes: if package in shardlike: new_node_id = NodeId(package, shardlike.url, shardlike.shard_url(package)) if new_node_id not in self.nodes: new_node = Node( distance=parent_node.distance + 1, package=new_node_id.package, channel=new_node_id.channel, shard_url=new_node_id.shard_url, ) self.nodes[new_node_id] = new_node yield new_node_id parent_node.visited = True def drain_pending( self, pending: set[NodeId], shardlikes_by_url: dict[str, ShardBase] ) -> tuple[list[tuple[NodeId, ShardDict]], list[NodeId]]: """ Check pending for in-memory shards. Clear pending. Return a list of shards we have and shards we need to fetch. """ shards_need = [] shards_have = [] for node_id in pending: # we should already have these nodes. shardlike = shardlikes_by_url[node_id.channel] if shardlike.shard_loaded(node_id.package): # for monolithic repodata shards_have.append((node_id, shardlike.visit_package(node_id.package))) else: if self.nodes[node_id].visited: # pragma: no cover log.debug("Skip visited, should not be reached") continue shards_need.append(node_id) pending.clear() return shards_have, shards_need def build_repodata_subset( root_packages: Iterable[str], channels: dict[str, Channel], algorithm: Literal["bfs", "pipelined"] = RepodataSubset.DEFAULT_STRATEGY, ) -> dict[str, ShardBase] | None: """ Retrieve all necessary information to build a repodata subset. Params: root_packages: iterable of installed and requested package names channels: Channel objects; dict form preferred. algorithm: desired traversal algorithm Return: None if there are no shards available, or a mapping of channel URL's to ShardBase objects where build_repodata() returns the computed subset.. """ channel_data = fetch_channels(channels) if channel_data is not None: subset = RepodataSubset((*channel_data.values(),)) subset.reachable(root_packages, strategy=algorithm) log.debug("%d (channel, package) nodes discovered", len(subset.nodes)) return channel_data # region workers if TYPE_CHECKING: _T = TypeVar("_T") def combine_batches_until_none( in_queue: Queue[Sequence[_T] | None], ) -> Iterator[Sequence[_T]]: """ Combine lists from in_queue until we see None. Yield combined lists. """ running = True while running: try: # Add timeout to prevent indefinite blocking if producer thread fails batch = in_queue.get(timeout=5) if batch is None: break except queue.Empty: # If we timeout, continue waiting - producer might still send data continue node_ids = list(batch) with suppress(queue.Empty): while True: # loop exits with break or queue.Empty exception batch = in_queue.get_nowait() if batch is None: # do the work but then quit running = False break else: node_ids.extend(batch) yield node_ids def exception_to_queue(func): """ Decorator to send unhandled exceptions to the second argument out_queue. """ @functools.wraps(func) def wrapper(in_queue, out_queue, *args, **kwargs): try: return func(in_queue, out_queue, *args, **kwargs) except BaseException as e: # includes KeyboardInterrupt in_queue.put(None) # tell worker that we're done out_queue.put(e) # tell caller that we received an exception return wrapper @exception_to_queue def cache_fetch_thread( in_queue: Queue[Sequence[NodeId] | None], shard_out_queue: Queue[Sequence[tuple[NodeId, ShardDict] | Exception]], network_out_queue: Queue[Sequence[NodeId] | None], cache: ShardCache, ): """ Fetch batches of shards from cache until in_queue sees None. Enqueue found shards to shard_out_queue, and not found shards to network_out_queue. When we see None on in_queue, send None to both out queues and exit. Args: in_queue: NodeId (URLs) to fetch. shard_out_queue: fetched shards sent to queue. network_out_queue: cache misses forwarded to queue. Same queue is network_fetch_thread's in_queue. cache: used to retrieve shards. """ with cache.copy() as cache: for node_ids in combine_batches_until_none(in_queue): cached = cache.retrieve_multiple([node_id.shard_url for node_id in node_ids]) # should we add this into retrieve_multiple? found: list[tuple[NodeId, ShardDict]] = [] not_found: list[NodeId] = [] for node_id in node_ids: if shard := cached.get(node_id.shard_url): found.append((node_id, shard)) else: not_found.append(node_id) # Might wake up the network thread by calling it first: if not_found: network_out_queue.put(not_found) if found: shard_out_queue.put(found) network_out_queue.put(None) # no shard_out_queue.put(None); this is during mainloop shutdown. @exception_to_queue def network_fetch_thread( in_queue: Queue[Sequence[NodeId] | None], shard_out_queue: Queue[list[tuple[NodeId, ShardDict] | Exception]], cache: ShardCache, shardlikes: Sequence[ShardBase], ): """ Fetch shards from the network that are received on in_queue, until we see None. Unhandled exceptions also go to shard_out_queue, and exit this thread. Args: in_queue: NodeId (URLs) to fetch. shard_out_queue: fetched shards sent to queue. cache: once shards are decoded they are stored in cache. shardlikes: list of (network-only) shard index objects. """ dctx = zstandard.ZstdDecompressor(max_window_size=ZSTD_MAX_SHARD_SIZE) shardlikes_by_url = {s.url: s for s in shardlikes} def fetch(s, url: str, node_id: NodeId): timeout = ( context.remote_connect_timeout_secs, context.remote_read_timeout_secs, ) with s.get(url, timeout=timeout) as response: response.raise_for_status() data = response.content return url, node_id, data def submit(node_id: NodeId): # this worker should only receive network node_id's: shardlike = shardlikes_by_url[node_id.channel] if not isinstance(shardlike, Shards): raise TypeError("network_fetch_thread got non-network shardlike") session = shardlike.session url = shardlikes_by_url[node_id.channel].shard_url(node_id.package) return executor.submit(fetch, session, url, node_id) def handle_result(future: Future): url, node_id, data = future.result() log.debug("Fetch thread got %s (%s bytes)", url, len(data)) # Decompress and parse. If it decodes as # msgpack.zst, insert into cache. Then put "known # good" shard into out queue. shard: ShardDict = msgpack.loads( dctx.decompress(data, max_output_size=ZSTD_MAX_SHARD_SIZE) ) # type: ignore[assign] # We could send this back into the cache thread instead to # serialize access to sqlite3 if lock contention becomes an issue. cache.insert(AnnotatedRawShard(url, node_id.package, data)) shard_out_queue.put([(node_id, shard)]) def result_to_in_queue(future: Future): # Simplify waiting by putting responses back into in_queue. This # function is called in the ThreadPoolExecutor's thread, but we want to # serialize result processing in the network_fetch_thread. # Not in our signature; the caller doesn't need to know we are putting # Future in here as well. in_queue.put([future]) # type: ignore with ThreadPoolExecutor(max_workers=_shards_connections()) as executor, cache.copy() as cache: for node_ids_and_results in combine_batches_until_none(in_queue): for node_id_or_result in node_ids_and_results: if isinstance(node_id_or_result, Future): handle_result(node_id_or_result) else: future = submit(node_id_or_result) future.add_done_callback(result_to_in_queue) # TODO call executor.shutdown(cancel_futures=True) on error or otherwise # prevent new HTTP requests from being started e.g. "skip" flag in # fetch() function. Also possible to shutdown(wait=False). @exception_to_queue def offline_nofetch_thread( in_queue: Queue[Sequence[NodeId] | None], shard_out_queue: Queue[list[tuple[NodeId, ShardDict] | Exception]], cache: ShardCache, shardlikes: Sequence[ShardBase], ): """ For offline mode, where network requests are not allowed. Pretend that every network request is an empty shard. Don't save those to the cache. Depending on how many shards are in sqlite3 and which packages were requested, the user may or may not get enough repodata for a solution. Args: in_queue: NodeId (URLs) to fetch. shard_out_queue: fetched shards sent to queue. cache: once shards are decoded they are stored in cache. shardlikes: list of (network-only) shard index objects. """ for node_ids in combine_batches_until_none(in_queue): for node_id in node_ids: shard: ShardDict = {"packages": {}, "packages.conda": {}} shard_out_queue.put([(node_id, shard)]) # endregion ================================================ FILE: conda_libmamba_solver/shards_typing.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ TypedDict declarations for shards. These are helpful for auto-complete, but do not validate at runtime and are not normative. They are intentionally not shared with another project (conda) to reduce coupling. """ from __future__ import annotations from typing import TYPE_CHECKING, TypedDict if TYPE_CHECKING: from typing import NotRequired class PackageRecordDict(TypedDict): """ Basic package attributes that this module cares about. """ name: str version: str build: str build_number: int sha256: NotRequired[str | bytes] md5: NotRequired[str | bytes] depends: list[str] constrains: NotRequired[list[str]] noarch: NotRequired[str] # in this style because "packages.conda" is not a Python identifier ShardDict = TypedDict( "ShardDict", { "packages": dict[str, PackageRecordDict], "packages.conda": dict[str, PackageRecordDict], }, ) class RepodataInfoDict(TypedDict): # noqa: F811 base_url: str # where packages are stored shards_base_url: str # where shards are stored subdir: str class RepodataDict(ShardDict): """ Packages plus info. """ info: RepodataInfoDict repodata_version: int class ShardsIndexDict(TypedDict): """ Shards index as deserialized from repodata_shards.msgpack.zst """ info: RepodataInfoDict version: int # TODO conda-index currently uses 'repodata_version' here shards: dict[str, bytes] ================================================ FILE: conda_libmamba_solver/solver.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause # Copyright (C) 2024 conda # SPDX-License-Identifier: BSD-3-Clause """ This module defines the conda.core.solve.Solver interface and its immediate helpers """ from __future__ import annotations import json import logging import os import re import sys from collections import defaultdict from functools import cache from inspect import stack from itertools import chain from textwrap import dedent from typing import TYPE_CHECKING from conda import __version__ as _conda_version from conda.base.constants import ( REPODATA_FN, UNKNOWN_CHANNEL, ChannelPriority, ) from conda.base.context import context from conda.common.constants import NULL from conda.common.io import time_recorder from conda.common.path import paths_equal from conda.common.url import percent_decode from conda.core.prefix_data import PrefixData from conda.core.solve import Solver from conda.exceptions import ( CondaValueError, PackagesNotFoundError, UnsatisfiableError, ) from conda.models.channel import Channel from conda.models.match_spec import MatchSpec from conda.models.records import PackageRecord from conda.models.version import VersionOrder from conda.reporters import get_spinner from libmambapy.solver import Request, Solution from libmambapy.solver.libsolv import Solver as LibsolvSolver from libmambapy.specs import MatchSpec as LibmambaMatchSpec from libmambapy.specs import NoArchType from . import __version__ from .exceptions import LibMambaUnsatisfiableError from .index import LibMambaIndexHelper from .mamba_utils import ( init_libmamba_context, mamba_version, problems_format_auto, problems_format_nocolor, ) from .state import SolverInputState, SolverOutputState if TYPE_CHECKING: from collections.abc import Iterable, Mapping, Sequence from boltons.setutils import IndexedSet from conda.auxlib import _Null from conda.base.constants import ( DepsModifier, UpdateModifier, ) from conda.common.path import PathType from libmambapy.solver.libsolv import Database, UnSolvable from libmambapy.specs import PackageInfo log = logging.getLogger(f"conda.{__name__}") class LibMambaSolver(Solver): MAX_SOLVER_ATTEMPTS_CAP = 10 _uses_ssc = False @staticmethod @cache def user_agent() -> str: """ Expose this identifier to allow conda to extend its user agent if required """ return f"conda-libmamba-solver/{__version__} libmambapy/{mamba_version()}" def __init__( self, prefix: PathType, channels: Iterable[Channel | str], subdirs: Iterable[str] = (), specs_to_add: Iterable[MatchSpec | str] = (), specs_to_remove: Iterable[MatchSpec | str] = (), repodata_fn: str = REPODATA_FN, command: str | _Null = NULL, ): if specs_to_add and specs_to_remove: raise ValueError( "Only one of `specs_to_add` and `specs_to_remove` can be set at a time" ) if specs_to_remove and command is NULL: command = "remove" super().__init__( os.fspath(prefix), channels, subdirs=subdirs, specs_to_add=specs_to_add, specs_to_remove=specs_to_remove, repodata_fn=repodata_fn, command=command, ) if self.subdirs is NULL or not self.subdirs: self.subdirs = context.subdirs if "noarch" not in self.subdirs: # Problem: Conda build generates a custom index which happens to "forget" about # noarch on purpose when creating the build/host environments, since it merges # both as if they were all in the native subdir. This causes package-not-found # errors because we are not using the patched index. # Fix: just add noarch to subdirs because it should always be there anyway. self.subdirs = (*self.subdirs, "noarch") self._repodata_fn = self._maybe_ignore_current_repodata() self._libmamba_context = init_libmamba_context( channels=tuple(c.canonical_name for c in self.channels), platform=next(s for s in self.subdirs if s != "noarch"), target_prefix=str(self.prefix), ) def solve_final_state( self, update_modifier: UpdateModifier | _Null = NULL, deps_modifier: DepsModifier | _Null = NULL, prune: bool | _Null = NULL, ignore_pinned: bool | _Null = NULL, force_remove: bool | _Null = NULL, should_retry_solve: bool = False, ) -> IndexedSet[PackageRecord]: self._log_info() in_state = SolverInputState( prefix=self.prefix, requested=self.specs_to_add or self.specs_to_remove, update_modifier=update_modifier, deps_modifier=deps_modifier, prune=prune, ignore_pinned=ignore_pinned, force_remove=force_remove, command=self._command, ) out_state = SolverOutputState(solver_input_state=in_state) # These tasks do _not_ require a solver... maybe_final_state = out_state.early_exit() if maybe_final_state is not None: return maybe_final_state channels = self._collect_channel_list(in_state) conda_build_channels = self._collect_channels_subdirs_from_conda_build(seen=set(channels)) with get_spinner( self._collect_all_metadata_spinner_message(channels, conda_build_channels), ): # only called here by c-l-s index = self._collect_all_metadata( channels=channels, conda_build_channels=conda_build_channels, subdirs=self.subdirs, in_state=in_state, ) out_state.check_for_pin_conflicts(index) with get_spinner( self._solving_loop_spinner_message(), ): # This function will copy and mutate `out_state` # Make sure we get the latest copy to return the correct solution below out_state = self._solving_loop(in_state, out_state, index) self.neutered_specs = tuple(out_state.neutered.values()) solution = out_state.current_solution # Check whether conda can be updated; this is normally done in .solve_for_diff() # but we are doing it now so we can reuse the index self._notify_conda_outdated(None, index, solution) return solution # region Metadata collection ############################ def _collect_all_metadata_spinner_message( self, channels: Iterable[Channel], conda_build_channels: Iterable[Channel | str] = (), ) -> str: if self._called_from_conda_build(): msg = "Reloading output folder" if conda_build_channels: names = list( dict.fromkeys([Channel(c).canonical_name for c in conda_build_channels]) ) msg += f" ({', '.join(names)})" return msg canonical_names = list(dict.fromkeys([c.canonical_name for c in channels])) canonical_names_dashed = "\n - ".join(canonical_names) return ( f"Channels:\n" f" - {canonical_names_dashed}\n" f"Platform: {next((s for s in self.subdirs if s != 'noarch'), context.subdir)}\n" f"Collecting package metadata ({self._repodata_fn})" ) def _collect_channel_list(self, in_state: SolverInputState) -> list[Channel]: # Aggregate channels and subdirs deduped_channels = {} for channel in chain( self.channels, in_state.channels_from_specs(), in_state.maybe_free_channel() ): if channel_platform := getattr(channel, "platform", None): if channel_platform not in self.subdirs: log.info( "Channel %s defines platform %s which is not part of subdirs=%s. " "Ignoring platform attribute...", channel, channel_platform, self.subdirs, ) # Remove 'Channel.platform' to avoid missing subdirs. Channel.urls() will ignore # our explicitly passed subdirs if .platform is defined! channel = Channel(**{k: v for k, v in channel.dump().items() if k != "platform"}) deduped_channels[channel] = None return list(deduped_channels) def _collect_channels_subdirs_from_conda_build( self, seen: set[Channel] | None = None, ) -> list[Channel]: if self._called_from_conda_build(): seen = seen or set() # We need to recover the local dirs (conda-build's local, output_folder, etc) # from the index. This is a bit of a hack, but it works. conda_build_channels = {} for record in self._index or {}: if record.channel.scheme == "file": # Remove 'Channel.platform' to avoid missing subdirs. Channel.urls() # will ignore our explicitly passed subdirs if .platform is defined! channel = Channel( **{k: v for k, v in record.channel.dump().items() if k != "platform"} ) if channel not in seen: conda_build_channels.setdefault(channel) return list(conda_build_channels) return [] @time_recorder(module_name=__name__) def _collect_all_metadata( self, channels: Iterable[Channel], conda_build_channels: Iterable[Channel], subdirs: Iterable[str], in_state: SolverInputState | None, ) -> LibMambaIndexHelper: index = LibMambaIndexHelper( channels=[*conda_build_channels, *channels], subdirs=subdirs, repodata_fn=self._repodata_fn, installed_records=( *in_state.installed.values(), *in_state.virtual.values(), ), pkgs_dirs=context.pkgs_dirs if context.offline else (), in_state=in_state, ) for channel in conda_build_channels: index.reload_channel(channel) return index # endregion # region Solving ################ def _solving_loop_spinner_message(self) -> str: """This shouldn't be our responsibility, but the CLI / app's...""" prefix_name = os.path.basename(self.prefix) if self._called_from_conda_build(): if "_env" in prefix_name: env_name = "_".join(prefix_name.split("_")[:3]) return f"Solving environment ({env_name})" else: # https://github.com/conda/conda-build/blob/e0884b626a/conda_build/environ.py#L1035-L1036 return "Getting pinned dependencies" return "Solving environment" @time_recorder(module_name=__name__) def _solving_loop( self, in_state: SolverInputState, out_state: SolverOutputState, index: LibMambaIndexHelper, ) -> IndexedSet[PackageRecord]: for attempt in range(1, self._max_attempts(in_state) + 1): try: solved, outcome = self._solve_attempt(in_state, out_state, index, attempt=attempt) if solved: break except (UnsatisfiableError, PackagesNotFoundError): solved = False break # try with last attempt else: # didn't solve yet, but can retry out_state = SolverOutputState( solver_input_state=in_state, records=dict(out_state.records), for_history=dict(out_state.for_history), neutered=dict(out_state.neutered), conflicts=dict(out_state.conflicts), pins=dict(out_state.pins), ) if not solved: log.debug("Last attempt: reporting all installed as conflicts") out_state.conflicts.update( { name: record.to_match_spec() for name, record in in_state.installed.items() if not record.is_unmanageable } ) solved, outcome = self._solve_attempt(in_state, out_state, index, attempt=attempt + 1) if not solved: message = self._prepare_problems_message(outcome, index.db, out_state) exc = LibMambaUnsatisfiableError(message) exc.allow_retry = False raise exc # We didn't fail? Nice, let's return the calculated state self._export_solution(index, out_state, outcome) # Run post-solve tasks out_state.post_solve(solver=self) return out_state def _solve_attempt( self, in_state: SolverInputState, out_state: SolverOutputState, index: LibMambaIndexHelper, attempt: int = 1, ) -> tuple[bool, Solution | UnSolvable]: log.info("Solver attempt: #%d", attempt) log.debug("Current conflicts (including learnt ones): %r", out_state.conflicts) flags = self._solver_flags(in_state) jobs = self._specs_to_request_jobs(in_state, out_state) request = Request(jobs=jobs, flags=flags) solver = LibsolvSolver() outcome = solver.solve(index.db, request) if isinstance(outcome, Solution): out_state.conflicts.clear() return True, outcome old_conflicts = out_state.conflicts.copy() new_conflicts = self._maybe_raise_for_problems(outcome, index, out_state, old_conflicts) if log.isEnabledFor(logging.DEBUG): problems_as_str = outcome.problems_to_str(index.db) log.debug( "Attempt %d failed with %s conflicts:\n%s", attempt, len(new_conflicts), problems_as_str, ) out_state.conflicts.update(new_conflicts) return False, outcome def _solver_flags(self, in_state: SolverInputState) -> Request.Flags: flags = { "allow_downgrade": True, # About flags.allow_uninstall = True: # We used to set this to False on a global basis and then add jobs # individually with ALLOW_UNINSTALL=True. Libmamba v2 has a Keep job instead now. "allow_uninstall": True, "force_reinstall": in_state.force_reinstall, "keep_dependencies": True, "keep_user_specs": True, # we do the sorting ourselves, but we need it as True anyway to # make test_solver.py::test_pytorch_gpu pass "order_request": True, "strict_repo_priority": context.channel_priority is ChannelPriority.STRICT, } if log.isEnabledFor(logging.DEBUG): log.debug("Using solver flags:\n%s", json.dumps(flags, indent=2)) return Request.Flags(**flags) def _specs_to_request_jobs( self, in_state: SolverInputState, out_state: SolverOutputState, ) -> list[Request.Job]: if in_state.is_removing: jobs = self._specs_to_request_jobs_remove(in_state, out_state) elif self._called_from_conda_build(): jobs = self._specs_to_request_jobs_conda_build(in_state, out_state) else: jobs = self._specs_to_request_jobs_add(in_state, out_state) request_jobs = [] json_friendly = {} for JobType, specs in jobs.items(): for idx, conda_spec in enumerate(specs, 1): libmamba_spec = self._conda_spec_to_libmamba_spec(conda_spec) request_jobs.append(JobType(libmamba_spec)) if log.isEnabledFor(logging.INFO): json_friendly.setdefault(JobType.__name__, []).append(str(conda_spec)) if JobType == Request.Pin: conda_spec = MatchSpec(conda_spec) out_state.pins[f"pin-{idx}"] = conda_spec if log.isEnabledFor(logging.INFO): json_str = json.dumps(json_friendly, indent=2) log.info("The solver will handle these requests:\n%s", json_str) return request_jobs def _specs_to_request_jobs_add( self, in_state: SolverInputState, out_state: SolverOutputState, ) -> dict[Request, list[MatchSpec | str]]: tasks = defaultdict(list) # Protect history and aggressive updates from being uninstalled if possible. From libsolv # docs: "The matching installed packages are considered to be installed by a user, thus not # installed to fulfill some dependency. This is needed input for the calculation of # unneeded packages for jobs that have the SOLVER_CLEANDEPS flag set." user_installed = { pkg for pkg in ( *in_state.history, *in_state.aggressive_updates, *in_state.pinned, *in_state.do_not_remove, ) if pkg in in_state.installed } # Fast-track python version changes (Part 1/2) # ## When the Python version changes, this implies all packages depending on # ## python will be reinstalled too. This can mean that we'll have to try for every # ## installed package to result in a conflict before we get to actually solve everything # ## A workaround is to let all non-noarch python-depending specs to "float" by marking # ## them as a conflict preemptively python_version_might_change = False installed_python = in_state.installed.get("python") to_be_installed_python = out_state.specs.get("python") if installed_python and to_be_installed_python: python_version_might_change = not to_be_installed_python.match(installed_python) for name in out_state.specs: installed: PackageRecord = in_state.installed.get(name) if installed: installed_spec = self._check_spec_compat(installed.to_match_spec()) else: installed_spec = None requested: MatchSpec = self._check_spec_compat(in_state.requested.get(name)) history: MatchSpec = self._check_spec_compat(in_state.history.get(name)) pinned: MatchSpec = self._check_spec_compat(in_state.pinned.get(name)) conflicting: MatchSpec = self._check_spec_compat(out_state.conflicts.get(name)) if name in user_installed and not in_state.prune and not conflicting: tasks[Request.Keep].append(installed_spec) # These specs are explicit in some sort of way if pinned and not pinned.is_name_only_spec: # these are the EXPLICIT pins; conda also uses implicit pinning to # constrain updates too but those can be overridden in case of conflicts. # name-only pins are treated as locks when installed, see below tasks[Request.Pin].append(pinned) # in libmamba, pins and installs are compatible tasks (pin only constrains, # does not 'request' a package). In classic, pins were actually targeted installs # so they were exclusive if requested: if requested.is_name_only_spec and pinned and not pinned.is_name_only_spec: # for name-only specs, this is a no-op; we already added the pin above # but we will constrain it again in the install task to have better # error messages if not solvable spec = pinned else: spec = requested if installed: tasks[Request.Update].append(spec) if name not in (MatchSpec(spec).name for spec in tasks[Request.Keep]): tasks[Request.Keep].append(name) else: tasks[Request.Install].append(spec) elif name in in_state.always_update: tasks[Request.Update].append(name) # These specs are "implicit"; the solver logic massages them for better UX # as long as they don't cause trouble elif in_state.prune: continue elif name == "python" and installed and not pinned: pyver = ".".join(installed.version.split(".")[:2]) tasks[Request.Pin].append(f"python {pyver}.*") elif history: if conflicting and history.strictness == 3: # relax name-version-build (strictness=3) history specs that cause conflicts # this is called neutering and makes test_neutering_of_historic_specs pass version = str(history.version or "") if version.startswith("=="): spec_str = f"{name} {version[2:]}" elif version.startswith(("!=", ">", "<")): spec_str = f"{name} {version}" elif version: spec_str = f"{name} {version}.*" else: spec_str = name tasks[Request.Install].append(spec_str) else: tasks[Request.Install].append(history) elif installed: if conflicting: # NOTE: We don't do anything now with conflicting installed. # We rely on Flags.allow_uninstall = True doing the right thing. # We are protecting important things with Keep or Freeze instead. pass else: # we freeze everything else as installed lock = in_state.update_modifier.FREEZE_INSTALLED if pinned and pinned.is_name_only_spec: # name-only pins are treated as locks when installed lock = True if python_version_might_change and installed.noarch is None: for dep in installed.depends: if MatchSpec(dep).name in ("python", "python_abi"): lock = False break if lock: tasks[Request.Freeze].append(installed_spec) # enabling this else branch makes # conda/conda's tests/core/test_solve.py::test_freeze_deps_1[libmamba] fail # else: # tasks[Request.Keep].append(name) # Sort tasks by priority # This ensures that more important tasks are added to the solver first returned_tasks = {} for task_type in ( Request.Pin, Request.Install, Request.Update, Request.Keep, Request.Freeze, ): if task_type in tasks: returned_tasks[task_type] = tasks[task_type] return returned_tasks def _specs_to_request_jobs_remove( self, in_state: SolverInputState, out_state: SolverOutputState ) -> dict[Request, list[MatchSpec | str]]: # TODO: Consider merging add/remove in a single logic this so there's no split tasks = defaultdict(list) # Protect history and aggressive updates from being uninstalled if possible for name, record in out_state.records.items(): if name in in_state.history or name in in_state.aggressive_updates: # MatchSpecs constructed from PackageRecords get parsed too # strictly if exported via str(). Use .conda_build_form() directly. spec = record.to_match_spec().conda_build_form() tasks[Request.Keep].append(spec) # No complications here: delete requested and their deps # TODO: There are some flags to take care of here, namely: # --all # --no-deps # --deps-only for name, spec in in_state.requested.items(): spec = self._check_spec_compat(spec) tasks[Request.Remove].append(str(spec)) return dict(tasks) def _specs_to_request_jobs_conda_build( self, in_state: SolverInputState, out_state: SolverOutputState ) -> dict[Request, list[MatchSpec | str]]: tasks = defaultdict(list) for name, spec in in_state.requested.items(): if name.startswith("__"): continue spec = self._check_spec_compat(spec) spec = self._fix_version_field_for_conda_build(spec) tasks[Request.Install].append(spec.conda_build_form()) return dict(tasks) # endregion # region Export to conda ######################## def _export_solution( self, index: LibMambaIndexHelper, out_state: SolverOutputState, solution: Solution, ) -> SolverOutputState: for action in solution.actions: record_to_install: PackageInfo = getattr(action, "install", None) record_to_remove: PackageInfo = getattr(action, "remove", None) if record_to_install: if record_to_install.name.startswith("__"): continue record = self._package_info_to_package_record(record_to_install, index) out_state.records[record.name] = record elif record_to_remove: if record_to_remove.name.startswith("__"): continue record = self._package_info_to_package_record(record_to_remove, index) out_state.records.pop(record.name, None) return out_state def _package_info_to_package_record( self, pkg: PackageInfo, index: LibMambaIndexHelper, ) -> PackageRecord: if pkg.noarch == NoArchType.Python: noarch = "python" elif pkg.noarch == NoArchType.Generic: noarch = "generic" else: noarch = None # The package download logic needs the URL with credentials for repo_info in index.repos: if pkg.package_url.startswith(repo_info.url_no_cred): url = pkg.package_url.replace(repo_info.url_no_cred, repo_info.url_w_cred) break else: url = pkg.package_url url = percent_decode(url) # Signature verification requires channel information _with_ subdir data channel = Channel(pkg.channel) if not channel.subdir: # conda caches channels created using single values # Avoid the cache by using keyword arguments channel = Channel( scheme=channel.scheme, auth=channel.auth, location=channel.location, token=channel.token, name=channel.name, platform=pkg.platform, package_filename=channel.package_filename, ) return PackageRecord( name=pkg.name, version=pkg.version, build=pkg.build_string, # NOTE: Different attribute name build_number=pkg.build_number, channel=channel, url=url, subdir=pkg.platform, # NOTE: Different attribute name fn=pkg.filename, # NOTE: Different attribute name license=pkg.license, python_site_packages_path=getattr(pkg, "python_site_packages_path", "") or None, md5=pkg.md5, sha256=pkg.sha256, signatures=pkg.signatures, track_features=pkg.track_features, depends=pkg.dependencies, # NOTE: Different attribute name constrains=pkg.constrains, defaulted_keys=pkg.defaulted_keys, noarch=noarch, size=pkg.size, timestamp=pkg.timestamp, ) # endregion # region Error reporting ######################## @classmethod def _parse_problems(cls, unsolvable: UnSolvable, db: Database) -> Mapping[str, MatchSpec]: """ Problems can signal either unsatisfiability or unavailability. First will raise LibmambaUnsatisfiableError. Second will raise PackagesNotFoundError. Libmamba can return spec strings in two formats: - With dashes, e.g. package-1.2.3-h5487548_0 - à la conda-build, e.g. package 1.2.* * - just names, e.g. package """ conflicts = [] not_found = [] problems = [] has_unsupported = False for problem in unsolvable.problems(db): if problem == "unsupported request": has_unsupported = True else: problems.append(problem) if has_unsupported: # we put it at the end to prioritize other more meaningful problems problems.append("unsupported request") try: explained_problems = unsolvable.explain_problems(db, problems_format_nocolor) except Exception as exc: log.debug("Cannot explain problems", exc_info=exc) explained_problems = "" for line in problems: words = line.split() if "none of the providers can be installed" in line: if words[0] != "package" or words[2] != "requires": raise ValueError(f"Unknown message: {line}") conflicts.append(cls._matchspec_from_error_str(words[1])) end = words.index("but") conflicts.append(cls._matchspec_from_error_str(words[3:end])) elif "nothing provides" in line: start, marker = None, None for i, word in enumerate(words): if word == "needed": marker = i elif word == "provides": start = i + 1 if marker is not None: conflicts.append(cls._matchspec_from_error_str(words[-1])) not_found.append(cls._matchspec_from_error_str(words[start:marker])) elif "has constraint" in line and "conflicting with" in line: # package libzlib-1.2.11-h4e544f5_1014 has constraint zlib 1.2.11 *_1014 # conflicting with zlib-1.2.13-h998d150_0 conflicts.append(cls._matchspec_from_error_str(words[-1])) elif "cannot install both pin-" in line and "and pin-" in line: # a pin is in conflict with another pin pin_a = words[3].rsplit("-", 1)[0] pin_b = words[5].rsplit("-", 1)[0] conflicts.append(MatchSpec(pin_a)) conflicts.append(MatchSpec(pin_b)) elif "is excluded by strict repo priority" in line: # package python-3.7.6-h0371630_2 is excluded by strict repo priority conflicts.append(cls._matchspec_from_error_str(words[1])) elif line == "unsupported request": # libmamba v2 has this message for package not found errors # we need to double check with the explained problem for explained_line in explained_problems.splitlines(): explained_line = explained_line.lstrip("│├└─ ").strip() explained_words = explained_line.split() if "does not exist" in explained_line and "which" not in explained_line: end = explained_words.index("does") not_found.append(cls._matchspec_from_error_str(explained_words[:end])) break else: log.debug("! Problem line not recognized: %s", line) return { "conflicts": {s.name: s for s in conflicts}, "not_found": {s.name: s for s in not_found}, } def _maybe_raise_for_problems( self, unsolvable: UnSolvable, index: LibMambaIndexHelper, out_state: SolverOutputState, previous_conflicts: Mapping[str, MatchSpec] = None, ) -> None: parsed_problems = self._parse_problems(unsolvable, index.db) # We allow conda-build (if present) to process the exception early self._maybe_raise_for_conda_build( {**parsed_problems["conflicts"], **parsed_problems["not_found"]}, message=self._prepare_problems_message(unsolvable, index.db, out_state), ) unsatisfiable = parsed_problems["conflicts"] not_found = parsed_problems["not_found"] if not unsatisfiable and not_found: if log.isEnabledFor(logging.DEBUG): log.debug( "Inferred PackagesNotFoundError %s from conflicts:\n%s", tuple(not_found.keys()), unsolvable.explain_problems(index.db, problems_format_nocolor), ) # This is not a conflict, but a missing package in the channel exc = PackagesNotFoundError(tuple(not_found.values()), tuple(index.channels)) exc.allow_retry = False raise exc previous = previous_conflicts or {} previous_set = set(previous.values()) current_set = set(unsatisfiable.values()) diff = current_set.difference(previous_set) if len(diff) > 1 and "python" in unsatisfiable: # Only report python as conflict if it's the only conflict reported # This helps us prioritize neutering for other dependencies first unsatisfiable.pop("python") if (previous and (previous_set == current_set)) or len(diff) >= 10: # We have same or more (up to 10) unsatisfiable now! Abort to avoid recursion message = self._prepare_problems_message(unsolvable, index.db, out_state) exc = LibMambaUnsatisfiableError(message) # do not allow conda.cli.install to try more things exc.allow_retry = False raise exc return unsatisfiable def _prepare_problems_message( self, unsolvable: UnSolvable, db: Database, out_state: SolverOutputState ) -> str: message = unsolvable.problems_to_str(db) explain = True if " - " not in message: # This makes 'explain_problems()' crash. Anticipate. message = "Failed with empty error message." explain = False elif "is excluded by strict repo priority" in message: # This will cause a lot of warnings until implemented in detail explanations log.info("Skipping error explanation. Excluded by strict repo priority.") explain = False if explain: try: explained_errors = unsolvable.explain_problems(db, problems_format_auto) message += "\n" + explained_errors except Exception as exc: log.warning("Failed to explain problems", exc_info=exc) if out_state.pins and "pin on " in message: # add info about pins for easier debugging pin_message = "Pins seem to be involved in the conflict. Currently pinned specs:\n" for _, spec in out_state.pins.items(): pin_message += f" - {spec}\n" message += f"\n\n{pin_message}" return message def _maybe_raise_for_conda_build( self, conflicting_specs: Mapping[str, MatchSpec], message: str = None, ) -> None: # TODO: Remove this hack for conda-build compatibility >_< # conda-build expects a slightly different exception format # good news is that we don't need to retry much, because all # conda-build envs are fresh - if we found a conflict, we report # right away to let conda build handle it if not self._called_from_conda_build(): return if not conflicting_specs: return from .conda_build_exceptions import ExplainedDependencyNeedsBuildingError # the patched index should contain the arch we are building this env for # if the index is empty, we default to whatever platform we are running on subdir = next((subdir for subdir in self.subdirs if subdir != "noarch"), context.subdir) exc = ExplainedDependencyNeedsBuildingError( packages=list(conflicting_specs.keys()), matchspecs=list(conflicting_specs.values()), subdir=subdir, explanation=message, ) raise exc # endregion # region General helpers ######################## def _log_info(self) -> None: log.info("conda version: %s", _conda_version) log.info("conda-libmamba-solver version: %s", __version__) log.info("libmambapy version: %s", mamba_version()) log.info("Target prefix: %r", self.prefix) log.info("Command: %s", sys.argv) def _called_from_conda_build(self) -> bool: """ conda build calls the solver via `conda.plan.install_actions`, which overrides Solver._index (populated in the classic solver, but empty for us) with a custom index. We can use this to detect whether conda build is in use and apply some compatibility fixes. """ return ( # conda_build.environ.get_install_actions will always pass a custom 'index' # which conda.plan.install_actions uses to override our null Solver._index getattr(self, "_index", None) # Is conda build in use? In that case, it should have been imported and "conda_build" in sys.modules # Confirm conda_build.environ's 'get_install_actions' and conda.plan's # 'install_actions' are in the call stack. We don't check order or # contiguousness, but what are the chances at this point...? # frame[3] contains the name of the function in that frame of the stack and {"install_actions", "get_install_actions"} <= {frame[3] for frame in stack()} ) def _check_spec_compat(self, spec: MatchSpec | None) -> MatchSpec | None: if spec is None: return spec_fields = {} for field in spec.FIELD_NAMES: value = spec.get_raw_value(field) if value: if field == "channel": if str(value) == "": continue if not getattr(value, "name", ""): # channels like http://localhost:8000 don't have a name # this makes mamba choke so we should skip it # however the subdir is still useful information; keep it! if getattr(value, "platform", ""): spec_fields["subdir"] = value.platform continue spec_fields[field] = value return MatchSpec(**spec_fields) def _conda_spec_to_libmamba_spec(self, spec: MatchSpec) -> LibmambaMatchSpec: return LibmambaMatchSpec.parse(str(spec)) @staticmethod def _fix_version_field_for_conda_build(spec: MatchSpec) -> MatchSpec: """Fix taken from mambabuild""" if spec.version: only_dot_or_digit_re = re.compile(r"^[\d\.]+$") version_str = str(spec.version) if re.match(only_dot_or_digit_re, version_str): spec_fields = spec.conda_build_form().split() if version_str.count(".") <= 1: spec_fields[1] = version_str + ".*" else: spec_fields[1] = version_str + "*" return MatchSpec(" ".join(spec_fields)) return spec @staticmethod def _matchspec_from_error_str(spec: str | Sequence[str]) -> MatchSpec: try: if isinstance(spec, str): name, version, build = spec.rsplit("-", 2) return MatchSpec(name=name, version=version, build=build) else: kwargs = {"name": spec[0].rstrip(",")} if len(spec) >= 2 and spec[1] != "=*": if spec[1].startswith("==") or not spec[1].startswith("="): kwargs["version"] = spec[1].rstrip(",") else: kwargs["version"] = spec[1][1:].rstrip(",") + ".*" if len(spec) == 3 and spec[2] != "*": kwargs["build"] = spec[2].rstrip(",") return MatchSpec(**kwargs) except Exception as exc: raise ValueError(f"Could not parse spec: {spec}") from exc def _maybe_ignore_current_repodata(self) -> str: is_repodata_fn_set = False for config in context.collect_all().values(): for key, value in config.items(): if key == "repodata_fns" and value: is_repodata_fn_set = True break if self._repodata_fn == "current_repodata.json" and not is_repodata_fn_set: log.debug( "Ignoring repodata_fn='current_repodata.json', defaulting to %s", REPODATA_FN, ) return REPODATA_FN return self._repodata_fn def _max_attempts(self, in_state: SolverInputState, default: int = 1) -> int: from_env_var = os.environ.get("CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS") installed_count = len(in_state.installed) if from_env_var: try: max_attempts_from_env = int(from_env_var) except ValueError: raise CondaValueError( f"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='{from_env_var}'. Must be int." ) if max_attempts_from_env < 1: raise CondaValueError( f"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='{max_attempts_from_env}'. Must be >=1." ) elif max_attempts_from_env > installed_count: log.warning( "CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='%s' is higher than the number of " "installed packages (%s). Using that one instead.", max_attempts_from_env, installed_count, ) return installed_count else: return max_attempts_from_env elif in_state.update_modifier.FREEZE_INSTALLED and installed_count: # this the default, but can be overriden with --update-specs # we cap at MAX_SOLVER_ATTEMPTS_CAP attempts to avoid things # getting too slow in large environments return min(self.MAX_SOLVER_ATTEMPTS_CAP, installed_count) else: return default def _notify_conda_outdated( self, link_precs: Iterable[PackageRecord], index: LibMambaIndexHelper | None = None, final_state: Iterable[PackageRecord] | None = None, ) -> None: """ We are overriding the base class implementation, which gets called in Solver.solve_for_diff() once 'link_precs' is available. However, we are going to call it before (in .solve_final_state(), right after the solve). That way we can reuse the IndexHelper and SolverOutputState instances we have around, which contains the channel and env information we need, before losing them. """ if index is None and final_state is None: # The parent class 'Solver.solve_for_diff()' method will call this method again # with only 'link_precs' as the argument, because that's the original method signature. # We have added two optional kwargs (index and final_state) so we can call this method # earlier, in .solve_final_state(), while we still have access to the index helper # (which allows us to query the available packages in the channels quickly, without # reloading the channels with conda) and the final_state (which gives the list of # packages to be installed). So, if both index and final_state are None, we return # because that means that the method is being called from .solve_for_diff() and at # that point we will have already called it from .solve_for_state(). return if not context.notify_outdated_conda or context.quiet: # This check can be silenced with a specific option in the context or in quiet mode return prefix_data = PrefixData(context.root_prefix) current_conda_prefix_rec = prefix_data.get("conda", None) if not current_conda_prefix_rec: # We are checking whether conda can be found in the environment conda is # running from. Unless something is really wrong, this should never happen. return channel_name = current_conda_prefix_rec.channel.canonical_name if channel_name in (UNKNOWN_CHANNEL, "@", "", "pypi"): channel_name = "defaults" # only check the loaded index if it contains the channel conda should come from # otherwise ignore index_channels = {getattr(chn, "canonical_name", chn) for chn in index.channels} if channel_name not in index_channels: return # we only want to check if a newer conda is available in the channel we installed it from conda_newer_str = f"{channel_name}::conda>{_conda_version}" conda_newer_spec = MatchSpec(conda_newer_str) # if target prefix is the same conda is running from # maybe the solution we are proposing already contains # an updated conda! in that case, we don't need to check further if paths_equal(self.prefix, context.conda_prefix): if any(conda_newer_spec.match(record) for record in final_state): return # check if the loaded index contains records that match a more recent conda version conda_newer_records = index.search(conda_newer_str) # print instructions to stderr if we found a newer conda if conda_newer_records: newest = max(conda_newer_records, key=lambda x: VersionOrder(x.version)) conda_update_message = f"conda update -n base -c {channel_name} conda" if prefix_data.is_frozen(): if prefix_data.get("conda-self", None): conda_update_message = "conda self update" else: conda_update_message += " --override-frozen" print( dedent( f""" ==> WARNING: A newer version of conda exists. <== current version: {_conda_version} latest version: {newest.version} Please update conda by running $ {conda_update_message} """ ), file=sys.stderr, ) # endregion ================================================ FILE: conda_libmamba_solver/state.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Solver-agnostic logic to compose the requests passed to the solver and accumulate its results. The state exposed to the solver is handled by two objects whose primary function is to serve read-only information to the solver and its other helpers. - ``SolverInputState``: fully solver agnostic. It handles: - The local state on disk, namely the prefix state. This includes the already installed packages in the prefix (if any), the explicit requests made in that prefix in the past (history), its pinned specs, packages configured as aggressive updates and others. - The runtime context, determined by the configuration file(s), `CONDA_*` environment variables, command line flags and the requested specs (if any). - ``IndexHelper``: can be subclassed to add solver-specific logic (e.g. custom index building). It should, provide, at least, a method to query the index for the _explicit pool_ of packages for a given spec (e.g. its potential dependency tree). Note that the IndexHelper might need pieces of ``SolverInputState`` to build the index (e.g. installed packages, configured channels and subdirs...) .. todo:: Embed IndexHelper in SolverInputState? Since ``conda`` follows an iterative approach to solve a request, in addition the _input_ state, the Solver itself can store additional state in a separate helper: the ``SolverOutputState`` object. This is meant to help accumulate the following pieces of data: - ``specs``: a mapping of package names to its corresponding ``MatchSpec`` objects. These objects are passed to the actual Solver, hoping it will return a solution. - ``records``: a mapping of package names to ``PackageRecord`` objects. It will end up containing the list of package records that will compose the final state of the prefix (the _solution_). Its default value is set to the currently installed packages in the prefix. The solver will alter this list as needed to accommodate the final solution. If the algorithm was not iterative, the sole purpose of the solver would be to turn the ``specs`` into ``records``. However, ``conda``'s logic will try to constrain the solution to mimic the initial state as much as possible to reduce the amount of changes in the prefix. Sometimes, the initial request is too constrained, which results in a number of conflicts. These conflicts are then stored in the ``conflicts`` mapping, which will determine which ``specs`` are relaxed in the next attempt. Additionally, ``conda`` stores other solve artifacts: - ``for_history``: The explicitly requested specs in the command-line should end up in the history. Some modifier flags can affect how this mapping is populated (e.g. ``--update-deps``.) - ``neutered``: Pieces of history that were found to be conflicting in the future and were annotated as such to avoid falling in the same conflict again. The mappings stored in ``SolverOutputState`` are backed by ``TrackedMap`` objects, which allow to keep the reasons _why_ those specs or records were added to the mappings, as well as richer logging for each action. """ # TODO: This module could be part of conda-core once if we refactor the classic logic from __future__ import annotations import logging from types import MappingProxyType from typing import TYPE_CHECKING from boltons.setutils import IndexedSet from conda.auxlib import NULL from conda.base.constants import DepsModifier, UpdateModifier from conda.base.context import context from conda.common.path import paths_equal from conda.core.index import Index from conda.core.prefix_data import PrefixData from conda.core.solve import get_pinned_specs from conda.exceptions import PackagesNotFoundError, SpecsConfigurationConflictError from conda.history import History from conda.models.channel import Channel from conda.models.match_spec import MatchSpec from conda.models.prefix_graph import PrefixGraph if TYPE_CHECKING: from collections.abc import Iterable from os import PathLike from typing import Any from conda.core.solve import Solver from conda.models.records import PackageRecord from .index import LibMambaIndexHelper from .utils import EnumAsBools, compatible_specs log = logging.getLogger(f"conda.{__name__}") class SolverInputState: """ Helper object to provide the input data needed to compute the state that will be exposed to the solver. Parameters ---------- prefix Path to the prefix we are operating on. This will be used to expose ``PrefixData``, ``History``, pinned specs, among others. requested The MatchSpec objects required by the user (either in the command line or through the Python API). update_modifier A value of ``UpdateModifier``, which has an effect on which specs are added to the final list. The default value here must match the default value in the ``context`` object. deps_modifier A value of ``DepsModifier``, which has an effect on which specs are added to the final list. The default value here must match the default value in the ``context`` object. ignore_pinned Whether pinned specs can be ignored or not. The default value here must match the default value in the ``context`` object. force_remove Remove the specs without solving the environment (which would also remove their) dependencies. The default value here must match the default value in the ``context`` object. force_reinstall Uninstall and install the computed records even if they were already satisfied in the given prefix. The default value here must match the default value in the ``context`` object. prune Remove dangling dependencies that ended up orphan. The default value here must match the default value in the ``context`` object. command The subcommand used to invoke this operation (e.g. ``create``, ``install``, ``remove``...). It can have an effect on the computed list of records. _pip_interop_enabled Internal only. Whether ``PrefixData`` will also expose packages not installed by ``conda`` (e.g. ``pip`` and others can put Python packages in the prefix). """ _ENUM_STR_MAP = { "NOT_SET": DepsModifier.NOT_SET, "NO_DEPS": DepsModifier.NO_DEPS, "ONLY_DEPS": DepsModifier.ONLY_DEPS, "SPECS_SATISFIED_SKIP_SOLVE": UpdateModifier.SPECS_SATISFIED_SKIP_SOLVE, "FREEZE_INSTALLED": UpdateModifier.FREEZE_INSTALLED, "UPDATE_DEPS": UpdateModifier.UPDATE_DEPS, "UPDATE_SPECS": UpdateModifier.UPDATE_SPECS, "UPDATE_ALL": UpdateModifier.UPDATE_ALL, } _DO_NOT_REMOVE_NAMES = ( "anaconda", "conda", "conda-build", "python.app", "console_shortcut", "powershell_shortcut", ) def __init__( self, prefix: str | bytes | PathLike, requested: Iterable[str | MatchSpec] | None = (), update_modifier: UpdateModifier | None = UpdateModifier.UPDATE_SPECS, deps_modifier: DepsModifier | None = DepsModifier.NOT_SET, ignore_pinned: bool | None = None, force_remove: bool | None = False, force_reinstall: bool | None = False, prune: bool | None = False, command: str | None = None, _pip_interop_enabled: bool | None = None, ): self.prefix = prefix self._prefix_data = PrefixData(prefix, interoperability=_pip_interop_enabled) self._pip_interop_enabled = _pip_interop_enabled self._history = History(prefix).get_requested_specs_map() self._pinned = {spec.name: spec for spec in get_pinned_specs(prefix)} self._aggressive_updates = {spec.name: spec for spec in context.aggressive_update_packages} virtual = Index().system_packages self._virtual = {record.name: record for record in virtual} self._requested = {} for spec in requested: spec = MatchSpec(spec) self._requested[spec.name] = spec self._update_modifier = self._default_to_context_if_null( "update_modifier", update_modifier ) if prune and self._update_modifier == UpdateModifier.FREEZE_INSTALLED: self._update_modifier = UpdateModifier.UPDATE_SPECS # revert to default self._deps_modifier = self._default_to_context_if_null("deps_modifier", deps_modifier) self._ignore_pinned = self._default_to_context_if_null("ignore_pinned", ignore_pinned) self._force_remove = self._default_to_context_if_null("force_remove", force_remove) self._force_reinstall = self._default_to_context_if_null( "force_reinstall", force_reinstall ) self._prune = prune self._command = command # special cases self._do_not_remove = {p: MatchSpec(p) for p in self._DO_NOT_REMOVE_NAMES} def _default_to_context_if_null(self, name, value, context=context) -> Any: "Obtain default value from the context if value is set to NULL; otherwise leave as is" return getattr(context, name) if value is NULL else self._ENUM_STR_MAP.get(value, value) @property def prefix_data(self) -> PrefixData: """ A direct reference to the ``PrefixData`` object for the given ``prefix``. You will usually use this object through the ``installed`` property. """ return self._prefix_data # Prefix state pools @property def installed(self) -> dict[str, PackageRecord]: """ This exposes the installed packages in the prefix. Note that a ``PackageRecord`` can generate an equivalent ``MatchSpec`` object with ``.to_match_spec()``. Records are toposorted. """ return MappingProxyType(dict(sorted(self.prefix_data._prefix_records.items()))) @property def history(self) -> dict[str, MatchSpec]: """ These are the specs that the user explicitly asked for in previous operations on the prefix. See :class:`History` for more details. """ return MappingProxyType(self._history) @property def pinned(self) -> dict[str, MatchSpec]: """ These specs represent hard constrains on what package versions can be installed on the environment. The packages here returned don't need to be already installed. If ``ignore_pinned`` is True, this returns an empty dictionary. """ if self.ignore_pinned: return MappingProxyType({}) return MappingProxyType(self._pinned) @property def virtual(self) -> dict[str, MatchSpec]: """ System properties exposed as virtual packages (e.g. ``__glibc=2.17``). These packages cannot be (un)installed, they only represent constrains for other packages. By convention, their names start with a double underscore. """ return MappingProxyType(dict(sorted(self._virtual.items()))) @property def aggressive_updates(self) -> dict[str, MatchSpec]: """ Packages that the solver will always try to update. As such, they will never have an associated version or build constrain. Note that the packages here returned do not need to be installed. """ return MappingProxyType(self._aggressive_updates) @property def always_update(self) -> dict[str, MatchSpec]: """ Merged lists of packages that should always be updated, depending on the flags, including: - aggressive_updates - conda if auto_update_conda is true and we are on the base env - almost all packages if update_all is true - etc """ installed = self.installed pinned = self.pinned pkgs = {pkg: MatchSpec(pkg) for pkg in self.aggressive_updates if pkg in installed} if context.auto_update_conda and paths_equal(self.prefix, context.root_prefix): pkgs.setdefault("conda", MatchSpec("conda")) if self.update_modifier.UPDATE_ALL: for pkg in installed: if pkg != "python" and pkg not in pinned: pkgs.setdefault(pkg, MatchSpec(pkg)) return MappingProxyType(pkgs) @property def do_not_remove(self) -> dict[str, MatchSpec]: """ Packages that are protected by the solver so they are not accidentally removed. This list is not configurable, but hardcoded for legacy reasons. """ return MappingProxyType(self._do_not_remove) @property def requested(self) -> dict[str, MatchSpec]: """ Packages that the user has explicitly asked for in this operation. """ return MappingProxyType(self._requested) # Types of commands @property def is_installing(self) -> bool: """ True if the used subcommand was ``install``. """ return self._command == "install" @property def is_updating(self) -> bool: """ True if the used subcommand was ``update``. """ return self._command == "update" @property def is_creating(self) -> bool: """ True if the used subcommand was ``create``. """ return self._command == "create" @property def is_removing(self) -> bool: """ True if the used subcommand was ``remove``. """ return self._command == "remove" # modifiers @property def update_modifier(self) -> EnumAsBools: """ Use attribute access to test whether the modifier is set to that value >>> update_modifier = EnumAsBools(context.update_modifier) >>> update_modifier.UPDATE_SPECS True >>> update_modifier.UPDATE_DEPS False """ return EnumAsBools(self._update_modifier) @property def deps_modifier(self) -> EnumAsBools: """ Use attribute access to test whether the modifier is set to that value >>> deps_modifier = EnumAsBools(context.deps_modifier) >>> deps_modifier.NOT_SET True >>> deps_modifier.DEPS_ONLY False """ return EnumAsBools(self._deps_modifier) # Other flags @property def ignore_pinned(self) -> bool: return self._ignore_pinned @property def force_remove(self) -> bool: return self._force_remove @property def force_reinstall(self) -> bool: return self._force_reinstall @property def prune(self) -> bool: return self._prune #  Utility methods def channels_from_specs(self) -> Iterable[Channel]: """ Collect all channels added with the `channel::package=*` syntax. For now, we only collect those specifically requested by the user in the current command (same as conda), but we should investigate whether history keeps channels around too. """ for spec in self.requested.values(): channel = spec.get_exact_value("channel") if channel: if spec.original_spec_str and spec.original_spec_str.startswith("file://"): # Handle MatchSpec roundtrip issue with local channels channel = Channel(spec.original_spec_str.split("::")[0]) yield channel def maybe_free_channel(self) -> Iterable[Channel]: # FUTURE: conda 25.9+ remove restore_free_channel if channel := getattr(context, "_restore_free_channel", None): context.custom_multichannels # force deprecation warning elif channel is None: channel = getattr(context, "restore_free_channel", None) if channel: yield Channel.from_url("https://repo.anaconda.com/pkgs/free") class SolverOutputState: """ This is the main mutable object we will massage before passing the result of the computation (the ``specs`` mapping) to the solver. It will also store the result of the solve (in ``records``). Parameters ---------- solver_input_state This instance provides the initial state for the output. records Dict of package names to ``PackageRecord`` objects. If not provided, it will be initialized from the ``installed`` records in ``solver_input_state``. for_history Dict of package names to ``MatchSpec`` objects. These specs will be written to the prefix history once the solve is complete. Its default initial value is taken from the explicitly requested packages in the ``solver_input_state`` instance. neutered Dict of package names to ``MatchSpec`` objects. These specs are also written to the prefix history, as part of the neutered specs. If not provided, their default value is a blank mapping. conflicts If a solve attempt is not successful, conflicting specs are kept here for further relaxation of the version and build constrains. If not provided, their default value is a blank mapping. pins Packages that ended up being pinned. Mostly used for reporting and debugging. Deprecated. Notes ----- Almost all the attributes in this object map package names (``str``) to ``MatchSpec`` (_specs_ in short) objects. The only mapping with different values is ``records``, which stores ``PackageRecord`` objects. A quick note on these objects: * ``MatchSpec`` objects are a query language for packages, based on the ``PackageRecord`` schema. ``PackageRecord`` objects is how packages that are already installed are represented. This is what you get from ``PrefixData.iter_records()``. Since they are related, ``MatchSpec`` objects can be created from a ``PackageRecord`` with ``.to_match_spec()``. * ``MatchSpec`` objects also feature fields like ``target`` and ``optional``. These are, essentially, used by the low-level classic solver (:class:`conda.resolve.Resolve`) to mark specs as items it can optionally play with to satisfy the solver constrains. A ``target`` marked spec is _soft-pinned_ in the sense that the solver will try to satisfy that but it will stop trying if it gets in the way, so you might end up a different version or build. ``optional`` seems to be in the same lines, but maybe the entire spec can be dropped from the request? The key idea here is that these two fields might not be directly usable by the solver, but it might need some custom adaptation. For example, for ``libmamba`` we might need a separate pool that can be configured as a flexible task. See more details in the first comment of ``conda.core.solve.classic.Solver._add_specs`` """ def __init__( self, *, solver_input_state: SolverInputState, records: dict[str, PackageRecord] | None = None, for_history: dict[str, MatchSpec] | None = None, neutered: dict[str, MatchSpec] | None = None, conflicts: dict[str, MatchSpec] | None = None, pins: dict[str, MatchSpec] | None = None, ): self.solver_input_state: SolverInputState = solver_input_state self.records: dict[str, PackageRecord] = records or dict(solver_input_state.installed) self.for_history: dict[str, MatchSpec] = for_history or dict(solver_input_state.requested) self.neutered: dict[str, MatchSpec] = neutered or {} self.conflicts: dict[str, MatchSpec] = conflicts or {} self.pins: dict[str, MatchSpec] = pins or {} @property def current_solution(self) -> IndexedSet[PackageRecord]: """ Massage currently stored records so they can be returned as the type expected by the solver API. This is what you should return in ``Solver.solve_final_state()``. """ return IndexedSet(PrefixGraph(self.records.values()).graph) @property def specs(self) -> dict[str, MatchSpec]: """ Merge all possible sources of input package specs, sorted by their input category and strictness. It's just meant to be an enumeration of all possible inputs, not a ready-to-use list of specs for a solver. """ sis = self.solver_input_state specs_by_strictness = {} for group in ( "requested", "pinned", "history", "aggressive_updates", ): for name, spec in sorted( getattr(sis, group).items(), key=sort_by_spec_strictness, reverse=True, ): specs_by_strictness.setdefault(name, spec) for record_group in ("installed", "virtual"): for name, record in getattr(sis, record_group).items(): specs_by_strictness.setdefault(name, record.to_match_spec()) return specs_by_strictness @property def real_specs(self) -> dict[str, MatchSpec]: """ Specs that are _not_ virtual. """ return {name: spec for name, spec in self.specs.items() if not name.startswith("__")} @property def virtual_specs(self) -> dict[str, MatchSpec]: """ Specs that are virtual. """ return {name: spec for name, spec in self.specs.items() if name.startswith("__")} def early_exit(self) -> IndexedSet[PackageRecord] | None: """ Operations that do not need a solver and might result in returning early are collected here. """ sis = self.solver_input_state if sis.is_removing: # Make sure that requested packages to be removed match # an installed record. Otherwise, raise an error. # When 'remove --force' is set, remove the package without solving. if sis.force_remove: force_remove_solution = self.current_solution not_installed: list[MatchSpec] = [] for name, spec in sis.requested.items(): for record in sis.installed.values(): if spec.match(record): if sis.force_remove: force_remove_solution.remove(record) break else: not_installed.append(spec) if not_installed: exc = PackagesNotFoundError(not_installed) exc.allow_retry = False raise exc if sis.force_remove: return force_remove_solution elif sis.update_modifier.SPECS_SATISFIED_SKIP_SOLVE: for name, spec in sis.requested.items(): if name not in sis.installed: break if not any(spec.match(record) for record in sis.installed.values()): break else: # All specs match a package in the current environment. # Return early, with the current solution (at this point, .records is set # to the map of installed packages) return self.current_solution def check_for_pin_conflicts(self, index: LibMambaIndexHelper) -> None: """ Last part of the logic, common to addition and removal of packages. Originally, the legacy logic will also minimize the conflicts here by doing a pre-solve analysis, but so far we have opted for a different approach in libmamba: let the solver try, fail with conflicts, and annotate those as such so they are unconstrained. Now, this method only ensures that the pins do not cause conflicts. """ # ## Inconsistency analysis ### # here we would call conda.core.solve.classic.Solver._find_inconsistent_packages() # ## Check pin and requested are compatible sis = self.solver_input_state requested_and_pinned = set(sis.requested).intersection(sis.pinned) for name in requested_and_pinned: requested = sis.requested[name] pin = sis.pinned[name] installed = sis.installed.get(name) if ( # name-only pins lock to installed; requested spec must match it (pin.is_name_only_spec and installed and not requested.match(installed)) # otherwise, the pin needs to be compatible with the requested spec or not compatible_specs(index, (requested, pin)) ): pinned_specs = [ (sis.installed.get(name, pin) if pin.is_name_only_spec else pin) for name, pin in sorted(sis.pinned.items()) ] exc = SpecsConfigurationConflictError( requested_specs=sorted(sis.requested.values(), key=lambda x: x.name), pinned_specs=pinned_specs, prefix=sis.prefix, ) exc.allow_retry = False raise exc def post_solve(self, solver: Solver) -> None: """ These tasks are performed _after_ the solver has done its work. It essentially post-processes the ``records`` mapping. Parameters ---------- solver_cls The class used to instantiate the Solver. If not provided, defaults to the one specified in the context configuration. Notes ----- This method could be solver-agnostic but unfortunately ``--update-deps`` requires a second solve; that's why this method needs a solver class to be passed as an argument. """ # After a solve, we still need to do some refinement sis = self.solver_input_state # ## Record history ### # user requested specs need to be annotated in history # we control that in .for_history self.for_history.update(sis.requested) # ## Neutered ### # annotate overridden history specs so they are written to disk for name, spec in sis.history.items(): record = self.records.get(name) if record and not spec.match(record): self.neutered[name] = MatchSpec(name, version=record.version) # ## Add inconsistent packages back ### # direct result of the inconsistency analysis above # ## Deps modifier ### # handle the different modifiers (NO_DEPS, ONLY_DEPS, UPDATE_DEPS) # this might mean removing different records by hand or even calling # the solver a 2nd time if sis.deps_modifier.NO_DEPS: # In the NO_DEPS case, we need to start with the original list of packages in the # environment, and then only modify packages that match the requested specs # # Help information notes that use of NO_DEPS is expected to lead to broken # environments. original_state = dict(sis.installed) only_change_these = {} for name, spec in sis.requested.items(): for record in self.records.values(): if spec.match(record): only_change_these[name] = record if sis.is_removing: # TODO: This could be a pre-solve task to save time in forced removes? for name in only_change_these: del original_state[name] else: for name, record in only_change_these.items(): original_state[name] = record self.records.clear() self.records.update(original_state) elif sis.deps_modifier.ONLY_DEPS and not sis.update_modifier.UPDATE_DEPS: # Using a special instance of PrefixGraph to remove youngest child nodes that match # the original requested specs. It's important to remove only the *youngest* child # nodes, because a typical use might be `conda install --only-deps python=2 flask`, # and in that case we'd want to keep python. # # What are we supposed to do if flask was already in the environment? # We can't be removing stuff here that's already in the environment. # # What should be recorded for the user-requested specs in this case? Probably all # direct dependencies of flask. graph = PrefixGraph(self.records.values(), sis.requested.values()) # this method below modifies the graph inplace _and_ returns the removed nodes # (like dict.pop()) would_remove = graph.remove_youngest_descendant_nodes_with_specs() # We need to distinguish the behavior between `conda remove` and the rest to_remove = [] if sis.is_removing: for record in would_remove: # do not remove records that were not requested but were installed if record.name not in sis.requested and record.name in sis.installed: continue to_remove.append(record.name) else: for record in would_remove: for dependency in record.depends: spec = MatchSpec(dependency) if spec.name not in self.specs: # following https://github.com/conda/conda/pull/8766 self.for_history[spec.name] = spec to_remove.append(record.name) for name in to_remove: installed = sis.installed.get(name) if installed: self.records[name] = installed else: self.records.pop(name, None) elif sis.update_modifier.UPDATE_DEPS: # Here we have to SAT solve again :( It's only now that we know the dependency # chain of specs_to_add. # # UPDATE_DEPS is effectively making each spec in the dependency chain a # user-requested spec. For all other specs, we drop all information but name, drop # target, and add them to `requested` so it gets recorded in the history file. # # It's like UPDATE_ALL, but only for certain dependency chains. new_specs = {} graph = PrefixGraph(self.records.values()) for name, spec in sis.requested.items(): record = graph.get_node_by_name(name) for ancestor in graph.all_ancestors(record): new_specs[ancestor.name] = MatchSpec(ancestor.name) # Remove pinned_specs for name, spec in sis.pinned.items(): new_specs.pop(name, None) # Follow major-minor pinning business rule for python if "python" in new_specs: record = sis.installed["python"] version = ".".join(record.version.split(".")[:2]) + ".*" new_specs["python"] = MatchSpec(name="python", version=version) # Add in the original `requested` on top. new_specs.update(sis.requested) if sis.is_removing: specs_to_add = () specs_to_remove = list(new_specs.keys()) else: specs_to_add = list(new_specs.values()) specs_to_remove = () with context._override("quiet", False): # Create a new solver instance to perform a 2nd solve with deps added We do it # like this to avoid overwriting state accidentally. Instead, we will import # the needed state bits manually. records = solver.__class__( prefix=solver.prefix, channels=solver.channels, subdirs=solver.subdirs, specs_to_add=specs_to_add, specs_to_remove=specs_to_remove, command="recursive_call_for_update_deps", ).solve_final_state( update_modifier=UpdateModifier.UPDATE_SPECS, # avoid recursion! deps_modifier=sis._deps_modifier, ignore_pinned=sis.ignore_pinned, force_remove=sis.force_remove, prune=sis.prune, ) records = {record.name: record for record in records} self.records.clear() self.records.update(records) self.for_history.clear() self.for_history.update(new_specs) # Disable pruning regardless the original value # TODO: Why? Dive in https://github.com/conda/conda/pull/7719 sis._prune = False # ## Prune ### # remove orphan leaves in the graph if sis.prune: graph = PrefixGraph(list(self.records.values()), list(sis.requested.values())) graph.prune() self.records.clear() self.records.update({record.name: record for record in graph.graph}) def sort_by_spec_strictness(key_value_tuple: tuple[str, MatchSpec]) -> tuple[int, str]: """ Helper function to sort a list of (key, value) tuples by spec strictness """ name, spec = key_value_tuple return getattr(spec, "strictness", 0), name ================================================ FILE: conda_libmamba_solver/utils.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Miscellaneous utilities """ from __future__ import annotations from logging import getLogger from typing import TYPE_CHECKING from urllib.parse import quote from conda.common.compat import on_win from conda.common.url import urlparse from conda.exceptions import PackagesNotFoundError if TYPE_CHECKING: from collections.abc import Iterable from enum import Enum from conda.models.match_spec import MatchSpec from .index import LibMambaIndexHelper log = getLogger(f"conda.{__name__}") def escape_channel_url(channel: str) -> str: if channel.startswith("file:"): if "%" in channel: # it's escaped already return channel if on_win: channel = channel.replace("\\", "/") parts = urlparse(channel) if parts.scheme: components = parts.path.split("/") if on_win: if parts.netloc and len(parts.netloc) == 2 and parts.netloc[1] == ":": # with absolute paths (e.g. C:/something), C:, D:, etc might get parsed as netloc path = "/".join([parts.netloc] + [quote(p) for p in components]) parts = parts.replace(netloc="") else: path = "/".join(components[:2] + [quote(p) for p in components[2:]]) else: path = "/".join([quote(p) for p in components]) parts = parts.replace(path=path) return str(parts) return channel def compatible_specs( index: LibMambaIndexHelper, specs: Iterable[MatchSpec], raise_not_found: bool = True ) -> bool: """ Assess whether the given specs are compatible with each other. This is done by querying the index for each spec and taking the intersection of the results. If the intersection is empty, the specs are incompatible. If raise_not_found is True, a PackagesNotFoundError will be raised when one of the specs is not found. Otherwise, False will be returned because the intersection will be empty. """ if not len(specs) >= 2: raise ValueError("Must specify at least two specs") matched = None for spec in specs: results = set(index.search(spec)) if not results: if raise_not_found: exc = PackagesNotFoundError([spec], index.channels) exc.allow_retry = False raise exc return False if matched is None: # First spec, just set matched to the results matched = results continue # Take the intersection of the results matched &= results if not matched: return False return bool(matched) class EnumAsBools: """ Allows an Enum to be bool-evaluated with attribute access. >>> update_modifier = UpdateModifier("update_deps") >>> update_modifier_as_bools = EnumAsBools(update_modifier) >>> update_modifier == UpdateModifier.UPDATE_DEPS # from this True >>> update_modidier_as_bools.UPDATE_DEPS # to this True >>> update_modifier_as_bools.UPDATE_ALL False """ def __init__(self, enum: Enum): self._enum = enum self._names = {v.name for v in self._enum.__class__.__members__.values()} def __getattr__(self, name: str) -> bool: if name in ("name", "value"): return getattr(self._enum, name) if name in self._names: return self._enum.name == name raise AttributeError(f"'{name}' is not a valid name for {self._enum.__class__.__name__}") def __eq__(self, obj: object) -> bool: return self._enum.__eq__(obj) def _dict(self) -> dict[str, bool]: return {name: self._enum.name == name for name in self._names} ================================================ FILE: dev/requirements.txt ================================================ # build-time pip # run-time boltons>=23.0.0 conda>=26.1 conda-forge::libmamba>=2.0.0 conda-forge::libmambapy>=2.0.0 msgpack-python>=1.1.1 # needed for 'pip install -e conda-libmamba-solver' hatchling hatch-vcs editables ================================================ FILE: dev/scripts/BenchmarkChart.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "e28dc53c-5b9c-453d-a9ef-14dd93b85b46", "metadata": {}, "source": [ "# Benchmark Chart\n", "This notebook reads .codspeed benchmarks generated in the root of conda-libmamba-solver with `pytest -k benchmark --codspeed` e.g. and renders `test_traversal_algorithm_benchmarks` as a plotly chart.\n", "\n", "`jupyter nbconvert --clear-output --inplace .ipynb` clears output from the file for better revision control." ] }, { "cell_type": "code", "execution_count": null, "id": "f50f3e70-fc44-44db-b770-033b3cac9576", "metadata": {}, "outputs": [], "source": [ "import json\n", "import os\n", "from pathlib import Path\n", "\n", "import pandas as pd\n", "import plotly.express as px" ] }, { "cell_type": "code", "execution_count": null, "id": "f410cf7e-344e-4e0b-939c-a7c3836c1c9e", "metadata": {}, "outputs": [], "source": [ "runs = Path(\".codspeed\").glob(\"*.json\")\n", "most_recent = sorted(runs, key=lambda f: os.stat(f).st_mtime)[-1]\n", "print(most_recent)" ] }, { "cell_type": "code", "execution_count": null, "id": "3961cb90-b345-43c1-9e13-d3f5d3cecba5", "metadata": {}, "outputs": [], "source": [ "SCENARIOS = [\n", " \"python\",\n", " \"data_science_basic\",\n", " \"data_science_ml\",\n", " \"web_development\",\n", " \"scientific_computing\",\n", " \"devops_automation\",\n", " \"vaex\",\n", "]\n", "\n", "benchmarks = json.loads(most_recent.read_text())[\"benchmarks\"]\n", "traversal_benchmarks = []\n", "for benchmark in benchmarks:\n", " name = benchmark[\"name\"]\n", " for scenario in SCENARIOS:\n", " name = name.replace(scenario.replace(\"_\", \"-\"), scenario.replace(\"-\", \"_\"))\n", " if \"test_traversal_algorithm_benchmarks\" not in name:\n", " continue\n", " stats = benchmark[\"stats\"]\n", " assert len(name.split(\"[\")[-1].strip(\"]\").split(\"-\")) == 4\n", " facets = dict(\n", " zip([\"main\", \"scenario\", \"alg\", \"cache\"], name.split(\"[\")[-1].strip(\"]\").split(\"-\"))\n", " )\n", " stats[\"min_s\"] = stats[\"min_ns\"] / 1e9\n", " traversal_benchmarks.append(stats | facets)" ] }, { "cell_type": "code", "execution_count": null, "id": "109c7077-b54c-4a0d-b202-e3aba18af10f", "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(traversal_benchmarks)" ] }, { "cell_type": "code", "execution_count": null, "id": "d9f25b8e-9a3d-4ed7-a73b-7d4c042799a5", "metadata": {}, "outputs": [], "source": [ "fig = px.bar(\n", " df,\n", " x=\"main\",\n", " y=\"min_s\",\n", " color=\"alg\",\n", " barmode=\"group\",\n", " facet_row=\"scenario\",\n", " facet_col=\"cache\",\n", " category_orders={\n", " \"cache\": [\"cold\", \"warm\", \"lukewarm\"],\n", " \"alg\": [\"bfs\", \"pipelined\", \"httpx\"],\n", " \"main\": [\"main\"],\n", " },\n", " width=1000,\n", " height=1600,\n", ")\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "a4d02d95-a8c1-46bf-881c-7b6215fc9626", "metadata": {}, "outputs": [], "source": [ "df[df[\"alg\"] == \"pipelined\"].sum()[\"min_ns\"] / df[df[\"alg\"] == \"httpx\"].sum()[\"min_ns\"]" ] }, { "cell_type": "code", "execution_count": null, "id": "e5ed7f9f-eec2-4a66-9f0a-2ac4ed49642d", "metadata": {}, "outputs": [], "source": [ "df[df[\"alg\"] == \"bfs\"].sum()[\"min_ns\"] / df[df[\"alg\"] == \"httpx\"].sum()[\"min_ns\"]" ] }, { "cell_type": "code", "execution_count": null, "id": "f5611550-ca78-407c-9680-1ec27eb7db80", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.9" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: dev/scripts/httpx-fetch-all-shards.py ================================================ #!/usr/bin/env python # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Collect all repodata shards from fast.prefix.dev/conda-forge. Takes about 12.7 seconds, a few requests fail and would need to be re-tried. """ import asyncio import sqlite3 import time import httpx import msgpack import zstandard def connect(dburi="cache.db"): """ Get database connection. dburi: uri-style sqlite database filename; accepts certain ?= parameters. """ conn = sqlite3.connect(dburi, uri=True) conn.row_factory = sqlite3.Row # conn.execute("PRAGMA journal_mode = WAL") # conn.execute("PRAGMA synchronous = 1") # less fsync, good for WAL mode conn.execute("PRAGMA foreign_keys = ON") return conn def to_url(shard): return f"https://fast.prefix.dev/conda-forge/linux-64/shards/{shard.hex()}.msgpack.zst" base_url = "https://fast.prefix.dev/conda-forge/linux-64/repodata_shards.msgpack.zst" conn = connect("conda-forge-shards-httpx.db") conn.execute( "CREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB)" ) # also last-used? def shard_urls(index): for package, hash in index["shards"].items(): yield package, to_url(hash) async def get_one(sem, client, url, package): try: async with sem: response = await client.get(url) return package, url, response except httpx.RemoteProtocolError as err: return package, url, err async def main(): async with httpx.AsyncClient(http2=True, timeout=60) as client: # client._transport._pool._max_connections # is 100, does this have # anything to do with http/2? # See https://github.com/encode/httpx/issues/1171 # Default 5s timeout is bigger issue in request failures. print("Max in-flight", client._transport._pool._max_connections) sem = asyncio.Semaphore(client._transport._pool._max_connections) response = await client.get(base_url) print(response.status_code, response.headers) index = msgpack.loads(zstandard.decompress(response.content)) awaitables = [ get_one(sem, client, shard_url, package) for package, shard_url in shard_urls(index) ] for awaitable in asyncio.as_completed(awaitables): package, url, response = await awaitable if isinstance(response, Exception): print("x", end="") # add (package, url) to retry list? continue data = response.content with conn as c: c.execute( "INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)", (url, package, data), ) print(".", end="") if __name__ == "__main__": begin = time.time_ns() asyncio.run(main()) end = time.time_ns() print(f"Took {(end - begin) / 1e9} seconds") conn.close() ================================================ FILE: dev/scripts/requests-fetch-all-shards.py ================================================ #!/usr/bin/env python # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Collect all repodata shards from fast.prefix.dev/conda-forge. Takes about 23s on a hot CDN cache or 5 minutes on a cold remote cache. """ import concurrent.futures import sqlite3 import time import msgpack import requests import zstandard def connect(dburi="cache.db"): """ Get database connection. dburi: uri-style sqlite database filename; accepts certain ?= parameters. """ conn = sqlite3.connect(dburi, uri=True) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode = WAL") conn.execute("PRAGMA synchronous = 1") # less fsync, good for WAL mode conn.execute("PRAGMA foreign_keys = ON") return conn def to_url(shard): return f"https://fast.prefix.dev/conda-forge/linux-64/shards/{shard.hex()}.msgpack.zst" base_url = "https://fast.prefix.dev/conda-forge/linux-64/repodata_shards.msgpack.zst" s = requests.Session() index = msgpack.loads(zstandard.decompress(s.get(base_url).content)) conn = connect("conda-forge-shards.db") conn.execute("CREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB)") def shard_urls(): for package, hash in index["shards"].items(): yield package, to_url(hash) def fetch(s, package, url): b1 = time.time_ns() data = s.get(url).content e1 = time.time_ns() print(f"{(e1 - b1) / 1e9}s", package, url) return data begin = time.time_ns() # beneficial to have thread pool larger than requests' default 10 max # connections per session with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor: futures = { executor.submit(fetch, s, package, url): (url, package) for package, url in shard_urls() } # May be inconvenient to cancel a large number of futures. Also, ctrl-C doesn't work reliably out of the box. for future in concurrent.futures.as_completed(futures): print(".", futures[future]) data = future.result() url, package = futures[future] with conn as c: c.execute( "INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)", (url, package, data), ) end = time.time_ns() conn.close() print(f"Took {(end - begin) / 1e9} seconds") ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/_static/css/custom.css ================================================ /** * This rule is here to avoid the scrollbar appearing when this * is not hosted on ReadTheDocs */ #rtd-footer-container { display: none; } ================================================ FILE: docs/_templates/navbar_center.html ================================================ ================================================ FILE: docs/conf.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause # Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = html_title = "conda-libmamba-solver" copyright = "2022, conda-libmamba-solver contributors" author = "conda-libmamba-solver contributors" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "myst_parser", "sphinx.ext.napoleon", "sphinx.ext.autosummary", "sphinx.ext.graphviz", "sphinx.ext.ifconfig", "sphinx.ext.inheritance_diagram", "sphinx.ext.viewcode", "sphinxcontrib.mermaid", "sphinx_sitemap", "sphinx_design", "sphinx_copybutton", "sphinx_reredirects", ] myst_heading_anchors = 3 myst_enable_extensions = [ "amsmath", "colon_fence", "deflist", "dollarmath", "html_admonition", "html_image", "linkify", "replacements", "smartquotes", "substitution", "tasklist", ] templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = "conda_sphinx_theme" html_static_path = ["_static"] html_css_files = [ "css/custom.css", ] # Serving the robots.txt since we want to point to the sitemap.xml file html_extra_path = ["robots.txt"] html_theme_options = { "navigation_depth": -1, "use_edit_page_button": True, "navbar_center": ["navbar_center"], "icon_links": [ { "name": "GitHub", "url": "https://github.com/conda/conda-libmamba-solver", "icon": "fa-brands fa-square-github", "type": "fontawesome", }, { "name": "Element", "url": "https://matrix.to/#/#conda-libmamba-solver:matrix.org", "icon": "_static/element_logo.svg", "type": "local", }, { "name": "Discourse", "url": "https://conda.discourse.group/", "icon": "fa-brands fa-discourse", "type": "fontawesome", }, ], } html_context = { "github_user": "conda", "github_repo": "conda-libmamba-solver", "github_version": "main", "doc_path": "docs", } # We don't have a locale set, so we can safely ignore that for the sitemaps. sitemap_locales = [None] # We're hard-coding stable here since that's what we want Google to point to. sitemap_url_scheme = "{link}" # -- For sphinx_reredirects ------------------------------------------------ redirects = { "getting-started": "../user-guide/", "faq": "../user-guide/faq/", "configuration": "../user-guide/configuration/", "libmamba-vs-classic": "../user-guide/libmamba-vs-classic/", "more-resources": "../user-guide/more-resources/", "performance": "../user-guide/performance/", "subcommands": "../user-guide/subcommands/", } ================================================ FILE: docs/dev/future-work.md ================================================ # Future work ```{warning} WIP These will/should be expanded into issues. ``` * `MatchSpec` preparation logic contains too many exceptions for `libmamba` (e.g. differences in `update` vs `install`) * Clean-up `MatchSpec` exchange fixes and workarounds * Channel names and URLs need pre- and post- treatment (e.g. URL escaping) to workaround escaping issues, etc. * Investigate better usage of `libsolv` and `libmamba` flags * Better condense retry logic and conflict handling; we lack the "Optional" feature `classic` has * Investigate ignored tests in `pyproject.toml` * Conversely, investigate which other tests we should ignore in the name of simplifying the logic ================================================ FILE: docs/dev/implementation.md ================================================ # Implementation details This document provides an overview on how the `conda-libmamba-solver` integrations are implemented, both within the `conda_libmamba_solver` package itself, and as a `conda` plugin. ## Repository structure * `.devcontainer`: Configuration for DevContainer development workflows. * `.github/workflows/`: CI pipelines to run unit and upstream tests, as well as linting and performance benchmarks. Some extra workflows might be added by the `conda/infra` settings. * `conda_libmamba_solver/`: The Python package. Check sections below for details. * `recipe/`: The conda-build recipe used for the PR build previews. It should be kept in sync with `conda-forge` and `defaults`. * `dev/`: Supporting configuration files to set up development environments. * `docs/`: Documentation sources. * `tests/`: pytest testing infrastructure. * `pyproject.toml`: Project metadata. See below for details. ## Project metadata The `pyproject.toml` file stores the required packaging metadata, as well as some the configuration for some tools (`black`, `pytest`, etc.). Some peculiarities: * `hatchling` is the chosen backend for the packaging. * The `version` is calculated from the `git` info with `hatchling-vcs`. * `black` uses a line length of 99 characters. ## `conda_libmamba_solver` package The package is a flat namespace: * `conda_libmamba_solver.__init__`: Defines `__version__` and the old-style plugin API. * `conda_libmamba_solver.exceptions`: Subclasses of `conda.exceptions`. * `conda_libmamba_solver.index`: Helper objects to deal with repodata fetching and loading, interfacing with `libmamba` helpers. * `conda_libmamba_solver.mamba_utils`: Utility functions to help set up the `libmamba` objects. * `conda_libmamba_solver.models`: Application-agnostic objects to assist in the metadata collection phases. * `conda_libmamba_solver.plugin`: The `pluggy` registration mechanism in `conda.plugins`. * `conda_libmamba_solver.solver`: The `conda.core.solve.Solver` subclass with all the libmamba-specific logic. * `conda_libmamba_solver.state`: Solver-agnostic objects to assist in the solver state specification and collection. * `conda_libmamba_solver.utils`: Other application-agnostic utility functions. ```{note} Refer to each module docstrings for further details! ``` ### Solver-agnostic parts The idea behind the module separation is to have better logic reusability and separation between the `libmamba` library and the preparation logic `conda` uses. The following paragraphs assume you have read the [Deep Dive guides](https://docs.conda.io/projects/conda/en/stable/dev-guide/deep-dives/solvers.html) in the `conda` documentation, but as a refresher: * The `Solver` class will take a list of `MatchSpec` objects coming from diverse sources, like: * The packages the user requested in the command line or an environment file * The installed packages in the target environment * The explicitly requested packages in previous commands (the history) * ... and some more coming from configured settings * All these `MatchSpecs` are then merged and sorted depending on certain preparation logic. * The final set of `MatchSpec` objects is used to _query_ the so-called _index_ of packages. * The index is a long list of `PackageRecord` objects, loaded from the `repodata.json` files obtained from the configured channels. * The job of the solver is to find the set of `PackageRecord` objects that better satisfies the optimization criteria for the given `MatchSpec` objects. All the preparation steps before the actual SAT solver starts working are conda-specific, and solver-agnostic! In `conda` classic, this logic is spread across the different layers, but in `conda-libmamba-solver` we tried to synthesize it in a single module. This is the `conda_libmamba_solver.state` module, which contains the `SolverInputState` and `SolverOutputState` classes. * `SolverInputState` deals with the collection and management of the `MatchSpec` objects. * `SolverOutputState` will assist the `Solver` class maintain its state through the different solving attempts, and will finally export a list of `PackageRecords`. The early exit and post-solve logics are also expressed here. Both `SolverInputState` and `SolverOutputState` classes are supported by the `TrackedMap` dictionary subclass, which logs its own changes for better debugging and developer experience while analyzing solver problems. ### libmamba-specific parts `conda_libmamba_solver` interfaces with `libmamba` objects through three modules only: * `.solver`, which contains the `conda.core.solve.Solver` subclass. It relies heavily on `conda_libmamba_solver.state` in an effort to only contain the logic necessary to interface with `libmamba`. * `.index`, which deals with the repodata fetching and loading. Initially, it invoked the necessary `libmamba` objects to download and load the repodata JSON files. In later releases, downloading is done with `conda` objects, and we then pass the JSON files to the `libmamba` loaders. * `.mamba_utils`, which contains utility functions borrowed and adapted from `mamba` itself. Its main usage is the initialization of the `libmamba.Context` options from `conda`'s `Context`. ### Sharded Repodata Sharded repodata is implemented by building a repodata subset in Python, and then sending that subset to the solver. See [sharded repodata implementation](sharded). ## Integrations with `conda` ### With the plugin system Once co-installed with `conda`, `conda_libmamba_solver` registers itself via the `conda.plugins.hookimpl`-decorated function in `conda.plugin`, which yields a `CondaSolver` plugin instance. After that, `conda` clients just need to get the configured solver via `context.plugin_manager.get_cached_solver_backend()`. ### Draft integrations (pre-plugin phase) ```{note} This is just here as a historical trivia item. Please check the Plugin implementation section for current details! ``` The first experimental releases of `conda_libmamba_solver` used an ad-hoc mechanism based on `try/except` hooks. On the `conda/conda` side, we had [`conda.core.solve._get_solver_class()`](https://github.com/conda/conda/blob/22.9.0/conda/core/solve.py#L57-L78): ```python def _get_solver_class(key=None): key = key or conda.base.context.Context.experimental_solver if key == "classic": return conda.core.solve.Solver # Classic if key.startswith("libmamba"): try: from conda_libmamba_solver import get_solver_class return get_solver_class(key) except ImportError as exc: raise CondaImportError(...) raise ValueError(...) ``` The `key` values were hard-coded in `conda.base.constants`. Not very extensible! This was only meant to be temporary as we iterated on the `conda-libmamba-solver` side. We had one more `get_solver_class()` function in `conda_libmamba_solver` so we could easily change the `Solver` object import path without changing `conda` itself. The default value for the `key` was set by the `Context` object, which was populated by either: * The environment variable, `CONDA_EXPERIMENTAL_SOLVER`. * The command-line flag, `--experimental-solver`. * A configuration file (e.g. `~/.condarc`). ================================================ FILE: docs/dev/index.md ================================================ # Developer Guide To get started with developing conda-libmamba-solver, please check out the following pages: - [How to set up your environment](setup) - [Typical development workflows](workflows) - [Implementation details](implementation) - [Performance testing](performance-testing) - [Sharded repodata implementation](sharded) - [Future work](future-work) - [Code of conduct](code-of-conduct) - [CHANGELOG](changelog) ```{toctree} :maxdepth: 0 :hidden: setup workflows implementation performance-testing sharded future-work code-of-conduct changelog ``` ================================================ FILE: docs/dev/performance-testing.md ================================================ # Performance testing ## Codspeed Performance testing for this project can be found on codspeed here: - https://codspeed.io/conda/conda-libmamba-solver To run performance tests locally, run the following command in the root of the project: ```shell pytest --codspeed ``` To profile tests, add the following decorator above it: ```python import pytest @pytest.mark.benchmark def test_new_feature(): """Ensure feature performs well""" ``` See the official [codspeed documentation](https://codspeed.io/docs) for more information. ================================================ FILE: docs/dev/setup.md ================================================ # How to set up your development environment ## With `devcontainer` in VS Code The development workflow is streamlined for Linux thanks to the `devcontainer` configuration bundled in this repository. You'll need Docker and VS Code with the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers): 1. Clone `conda/conda`, `mamba-org/mamba` and `conda/conda-libmamba-solver` to your preferred locations (e.g. `~/devel/conda`, `~/devel/mamba` and `~/devel/conda-libmamba-solver`, respectively). The location does not matter as long as all repositories have the same parent directory. 2. Open your `conda-libmamba-solver` clone with VS Code. 3. Connect to the DevContainer image via the bottom-left menu (❱❰) and click on "Reopen in Container". Pick one of the suggested configurations: conda-forge or defaults. The only difference is the base installation (Miniforge and Miniconda, respectively). 4. The image will be built and after a couple minutes, you'll be dropped into a Bash shell. Enjoy! Since the local repositories are mounted, you can make modifications to the source live, and they will be reflected in the Docker instance automatically. Run `pytest` or `conda` as needed, no need to reload Docker! 5. If the development environment breaks, click again on ❱❰ and, this time, choose "Rebuild container". You might need to Retry a couple times. ```{note} Developing libmamba The devcontainer configuration also supports libmamba 1.x development. You just need to have the `mamba-org/mamba` repository (branch `1.x`) cloned next to `conda` and `conda-libmamba-solver`. Once the container has started, run `develop-mamba` to set it up. If you are modifying C++ sources, re-run `develop-mamba` to rebuild the libraries. ``` ## With regular Docker You can reuse the devcontainer scripts with regular Docker too. 1. Clone `conda/conda`, `mamba-org/mamba` and `conda/conda-libmamba-solver` to your preferred locations (e.g. `~/devel/conda`, `~/devel/mamba` and `~/devel/conda-libmamba-solver`, respectively). The location does not matter as long as all repositories have the same parent directory. 2. Start a new Docker instance with this command. Adjust the local mounts as necessary. ```bash # For defaults-based images, use: docker run -it --rm \ -v ~/devel/conda:/workspaces/conda \ -v ~/devel/mamba:/workspaces/mamba \ -v ~/devel/conda-libmamba-solver:/workspaces/conda-libmamba-solver \ continuumio/miniconda3:latest \ bash # For conda-forge-based images, use the following instead: docker run -it --rm \ -v ~/devel/conda:/workspaces/conda \ -v ~/devel/mamba:/workspaces/mamba \ -v ~/devel/conda-libmamba-solver:/workspaces/conda-libmamba-solver \ condaforge/miniforge3:latest \ bash ``` 3. Run the `post_create` and `post_start` scripts: ```bash bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh ``` 4. If you want to develop with mamba in editable mode, run: ```bash source ~/.bashrc develop-mamba ``` ## General workflow We strongly suggest you start with the Docker-based workflow above. It is a better development experience with a fully disposable environment. However, sometimes you might need to debug issues for non-Linux installations. In that case, you can follow these general instructions, but be careful with overwriting your existing `conda` installations, especially when it comes to `shell` initialization! 1. Get yourself familiar with the ["Development environment" guide for `conda` itself][conda_dev]. 2. Fork and clone the `conda-libmamba-solver` repository to your preferred location: ```bash git clone "git@github.com:$YOUR_USERNAME/conda-libmamba-solver" "$REPO_LOCATION" cd "$REPO_LOCATION" ``` 3. Install the required dependencies for `conda-libmamba-solver`: ```bash conda install \ --file "$REPO_LOCATION"/dev/requirements.txt \ --file "$REPO_LOCATION"/tests/requirements.txt ``` 4. Install `conda-libmamba-solver` with `pip`: ```bash cd $REPO_LOCATION python -m pip install --no-deps -e . ``` ## Debugging `conda` and `conda-libmamba-solver` Once you have followed the steps described in the general workflow above you may need to investigate the state in a particular point. Insert a [`breakpoint()`](https://docs.python.org/3/library/pdb.html) within the code and run a test or conda directly to hit the breakpoint. ## Debugging Mamba While debugging the conda workflows only requires modifying python code and running conda. Debugging the mamba code requires recompilation and is not as easy to jump into a debugger to investigate state. 1. Get familiar with the ["Local development" guide for `mamba` itself][mamba_dev]. 2. Fork and clone the `mamba` repository to your preferred location: ```bash git clone "git@github.com:$YOUR_USERNAME/mamba" "$REPO_LOCATION" cd $REPO_LOCATION ``` 3. Use the Docker image for development suggested above and re-run `develop-mamba` whenever you make change to `mamba` in `$REPO_LOCATION`. This should take less than a minute. We recommend debugging via either breakpoints and using `gdb` or `print` statements via `std::cout << ... << std::endl`. The [following](https://github.com/costrouc/mamba/commit/99ac04ee9ca26c9579c67816cfba25bf310c30fb) shows an example of inserting print statements into the `libmamba` source in order to debug the [libsolv](https://github.com/openSUSE/libsolv) state. [conda_dev]: https://docs.conda.io/projects/conda/en/latest/dev-guide/development-environment.html [mamba_dev]: https://mamba.readthedocs.io/en/latest/developer_zone/build_locally.html ================================================ FILE: docs/dev/sharded.md ================================================ # Sharded repodata implementation This document provides an overview on how `conda-libmamba-solver` implements [CEP-16 Sharded Repodata](https://conda.org/learn/ceps/cep-0016). Sharded repodata splits `repodata.json` into an index mapping package names to shard hashes in `repodata_shards.msgpack.zst`. A shard contains repodata for every package with a given name. Since shards are named after a hash of their contents, they can be cached without having to check the server for freshness. Individual shards only need to change when an individual package has changed, so only the much smaller index has to be re-fetched often. ## Sharded Repodata in conda-libmamba-solver For `conda-libmamba-solver`, we wanted a way to implement sharded repodata in Python without having to touch the C++ `libmamba`. We do this by treating all repodata as if it was sharded repodata. Starting with a list of installed packages and to-be-installed packages, we gather all repodata for those packages and look for all package names listed in their dependencies. We repeat the process for every discovered package name that we have not already visited, fetching repodata shards or examining all artifacts with that package name as found in monolithic `repodata.json`. This process gathers all versions of all packages that we might depend on. We do not consider package versions at this stage; that's the solver's job. As of this writing, `conda create -c conda-forge --dry-run python` finds 35 package names; `conda` 137 package names, and `vaex`, a dataframe library with a complex dependency tree, 678 package names. That's a lot less than the 31k packages total according to https://conda-forge.org/, and a manageable number to pre-process in Python before doing a solve with `libmamba`. As long as we can fetch those packages quickly enough, from cache or from the network, we will save RAM, disk space, bandwidth and time compared to parsing every package on the channel every time. ### Threading and concurrency In order to achieve concurrency, our sharded repodata implementation uses the Python [threading module](https://docs.python.org/3/library/threading.html). We have two separate thread workers for fetching cache and network data. These threads communicate to each other via the following queues: - **cache_in_queue** every requested shard goes here first where the cache worker sees if we have a valid cache record. - **cache_miss_queue** for every shard not in cache, we send it this queue where the network worker thread downloads it. - **shard_out_queue** once a shard has been fetched from either the cache or network worker threads, it is placed here so we can gather all needed shards at the end to build our repodata subset. :::{mermaid} sequenceDiagram loop Main ->> Main: "Fetch" in-memory shard Main ->> Cache: Fetch shard Cache ->> Network: Cache miss Cache ->> Main: Cache hit Network ->> Main: Network result Main ->> Main: Find new (channel, package) from shard data end ::: ## Source code The shard handling code is split into `shards.py`, `shards_cache.py`, `shards_subset.py` and `shards_typing.py` in `conda_libmamba_solver/`. Additional code in `conda_libmamba_solver/index.py` calls `build_repodata_subset()` and converts the resulting repodata to `libmamba` objects. ### `shards.py` `shards.py` provides an interface to treat sharded repodata and monolithic `repodata.json` in the same way. It checks a channel for sharded repodata, returning an object that implements the `ShardLike` interface. ### `shards_subset.py` `shards_subset.py` accepts a list of `ShardLike` instances and a list of initial packages to compute a repodata subset. The traversal is simplified thanks to the `ShardLike` interface, so the algorithm doesn't have to worry too much about the type of each channel. ### `shards_cache.py` `shards_cache.py` implements a sqlite3 cache used to store individual shards. When traversing shards, the cache is checked before making a network request. The shards cache is a single database for all channels in `$CONDA_PREFIX/pkgs/cache/repodata_shards.db`. The shards index `repodata_shards.msgpack.zst` is cached in the same way as `repodata.json`, in individual files in `$CONDA_PREFIX/pkgs/cache/` named after URL hashes. A `has_` remembers if a channel has shards, or not. If `has_shards` is `false` then we wait 7 days after `last_checked` to make another request looking for `repodata_shards.msgpack.zst`. The same system remembers whether a channel provides `repodata.json.zst`, and stores `ETag` and `Last-Modified` used to refresh the cache. ``` ... "has_shards": { "last_checked": "2025-10-15T17:19:44.408989Z", "value": true }, ``` ### `shards_typing.py` `shards_typing.py` provides type hints for data structures used in sharded repodata, but it is not normative; it only includes fields used by the sharded repodata system. ### `tests/test_shards.py` The sharded repodata tests maintain 100% code coverage of the shards-related code `shards*.py`. ## Example dependency graph for Python This is what Python's dependencies look like on `conda-forge` as of this writing. If sharded repodata is asked to install Python, we look for `python` in every active channel. The `python` shard(s) tells us we can fetch `bzip2`, `libffi`, `...` in parallel, discovering a third layer including `icu`, `ca-certificates`, and others. `ca-certificates` also depends on some virtual packages, but the traversal quickly determine that these packages don't appear in any channel by checking the `repodata_shards.msgpack.zst` index. The solver will let us know if these missing packages are a problem, virtual or no. The first draft of sharded repodata in `conda-libmamba-solver` literally generated classic `repodata.json` with package subsets to load into the solver, but now we convert each record into `libmamba` `PackageInfo` objects in memory. By giving `libmamba` every possible dependency for a specific request, it has enough information to produce a solution. :::{mermaid} shards_python.mmd ================================================ FILE: docs/dev/shards_python.mmd ================================================ flowchart LR python --> bzip2 python --> libffi python --> libzlib python --> ncurses python --> openssl python --> readline python --> sqlite python --> tk python --> tzdata python --> xz python --> libsqlite python --> libcxx python --> zlib python --> __osx python --> liblzma python --> libexpat python --> libmpdec python --> python_abi python --> zstd python --> _python_rc python --> expat python --> libiconv libsqlite --> icu openssl --> ca-certificates python_abi --> pypy3.6 python_abi --> pypy3.7 python_abi --> pypy3.8 python_abi --> pypy3.9 xz --> liblzma-devel xz --> xz-gpl-tools xz --> xz-tools zstd --> lz4-c ca-certificates --> __win ca-certificates --> __unix ================================================ FILE: docs/dev/workflows.md ================================================ # Typical development workflows ```{note} Check out ["How to set up your development environment"](setup.md) if you haven't yet! ``` ## Testing The solver is a critical part of `conda` as a tool. In addition to unit tests for `conda_libmamba_solver`, our CI also runs the full `conda/conda` integration suite. ### conda-libmamba-solver tests From the properly mounted devcontainer (see ["Development environment setup"](setup.md)): ```bash $ cd /workspaces/conda-libmamba-solver $ pytest ``` Or just use the PyTest integrations in VS Code (flask icon). ### Upstream tests From the properly mounted devcontainer (see ["Development environment setup"](setup.md)): ```bash $ cd /workspaces/conda $ CONDA_SOLVER=libmamba pytest ``` ================================================ FILE: docs/environment.yml ================================================ name: conda-libmamba-solver-docs channels: - conda-forge - defaults dependencies: - accessible-pygments=0.0.4 - alabaster=0.7.12 - babel=2.11.0 - beautifulsoup4=4.11.1 - brotlipy=0.7.0 - bzip2=1.0.8 - ca-certificates=2022.9.24 - certifi=2022.9.24 - cffi=1.15.1 - charset-normalizer=2.1.1 - colorama=0.4.6 - conda-sphinx-theme==0.1.3 - cryptography=38.0.3 - docutils=0.19 - idna=3.4 - imagesize=1.4.1 - importlib-metadata=5.1.0 - jinja2=3.1.2 - libffi=3.4.2 - libsqlite=3.40.0 - libzlib=1.2.13 - linkify-it-py=2.0.0 - markdown-it-py=3.0.0 - markupsafe=2.1.1 - mdit-py-plugins=0.4.0 - mdurl=0.1.0 - myst-parser=2.0.0 - ncurses=6.3 - openssl=3.0.7 - packaging=21.3 - pip=22.3.1 - pycparser=2.21 - pydata-sphinx-theme=0.14.3 - pygments=2.16.1 - pyopenssl=22.1.0 - pyparsing=3.0.9 - pysocks=1.7.1 - python=3.11.0 - python_abi=3.11 - pytz=2022.6 - pyyaml=6.0.1 - readline=8.1.2 - requests=2.28.1 - setuptools=65.5.1 - six=1.16.0 - snowballstemmer=2.2.0 - soupsieve=2.3.2.post1 - sphinx=7.2.6 - sphinx-copybutton=0.5.0 - sphinx-design=0.5.0 - sphinx-sitemap=2.2.1 - sphinx-reredirects=0.1.2 - sphinxcontrib-applehelp=1.0.2 - sphinxcontrib-devhelp=1.0.2 - sphinxcontrib-htmlhelp=2.0.0 - sphinxcontrib-jsmath=1.0.1 - sphinxcontrib-mermaid=0.7.1 - sphinxcontrib-qthelp=1.0.3 - sphinxcontrib-serializinghtml=1.1.9 - tk=8.6.12 - typing-extensions=4.4.0 - typing_extensions=4.4.0 - tzdata=2022f - uc-micro-py=1.0.1 - urllib3=1.26.13 - wheel=0.38.4 - xz=5.2.6 - yaml=0.2.5 - zipp=3.10.0 ================================================ FILE: docs/index.md ================================================ # conda-libmamba-solver Welcome to the conda-libmamba-solver documentation! The conda-libmamba-solver was written to make conda faster and is now the default solver. On this site, you will find information about how to configure and use this solver. ## Learn ::::{grid} 2 :::{grid-item-card} Getting started :link: user-guide/index :link-type: doc New to conda-libmamba-solver? Start here to learn the essentials ::: :::{grid-item-card} Configuration :link: user-guide/configuration :link-type: doc Learn about all available configuration options :::: ## Development ::::{grid} 2 :::{grid-item-card} Development environment :link: dev/setup :link-type: doc Learn how to set up your development environment ::: :::{grid-item-card} Changelog :link: dev/changelog :link-type: doc Recent changes and udpates to the project :::: ```{seealso} Found a bug? [File an issue here](https://github.com/conda/conda-libmamba-solver/issues/new/choose) ``` ```{toctree} :hidden: user-guide/index dev/index ``` ================================================ FILE: docs/robots.txt ================================================ User-agent: * Sitemap: https://conda.github.io/conda-libmamba-solver/sitemap.xml ================================================ FILE: docs/user-guide/configuration.md ================================================ # Configuration ## Basic options conda-libmamba-solver is a _solver plugin_ and can be configured with the same settings as the classic solver. This is usually done via the `conda config` subcommand. Read the [conda configuration docs](https://docs.conda.io/projects/conda/en/stable/configuration.html) and check for the general solver options there. ## Advanced options Additionally, conda-libmamba-solver can be further configured via special environment variables. We do not recomment using these options in production environments. Their behavior might change in the future, or they can be entirely removed without prior notice. * `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS`: Maximum number of attempts to find a solution. By default, this is set to the number of installed packages in the environment. In commands that involve a large number of changes in a large environment, it can take a bit to relax the constraints enough to find a solution. This option can be used to reduce the number of attempts and "give up" earlier. * `CONDA_LIBMAMBA_SOLVER_DEBUG_LIBSOLV`: Enable verbose logging from `libsolv`. Only has an effect if combined with `-vvv` in the CLI. Note that this will incur a big performance overhead. Only use when debugging solver issues. ## Sharded Repodata Sharded repodata is a feature that enables faster repodata fetching and is enabled by default. If you need to disable and only use classic repodata fetching, run the following `conda config` command: ```shell conda config --set plugins.use_sharded_repodata false ``` Alternatively, you can disable it via an environment variable: ```shell export CONDA_PLUGINS_USE_SHARDED_REPODATA=false ``` ================================================ FILE: docs/user-guide/faq.md ================================================ # Frequently Asked Questions ## What's the difference between the available solvers in `conda`? Please refer to the section "Technical differences between `libmamba` and `classic`" in the [`libmamba-vs-classic`](./libmamba-vs-classic.md#technical-differences-between-libmamba-and-classic) docs. ## How do I uninstall it? If you don't want to use the solver anymore, follow these instructions: ```{warning} Please make sure you __follow all steps below__ to uninstall the solver! ``` 1. If you configured it as the default solver, make sure you revert it with: ```bash $ conda config --remove-key solver # You might also need this: $ conda config --remove-key experimental_solver ``` 2. Then, remove the package from `base` with: ```bash $ conda remove -n base conda-libmamba-solver ``` ## How do I configure conda to use the solver permanently? Use the following command to always use `libmamba` as your default solver: ```bash $ conda config --set solver libmamba ``` To undo this change permanently, run: ```bash $ conda config --remove-key solver # You might also need this: $ conda config --remove-key experimental_solver ``` ## I get an error when I try to use the `--solver` flag If you are seeing this error: ``` CondaValueError: Key 'solver' is not a known primitive parameter. ``` It might mean you are using an old version of the conda-libmamba-solver package. You can check which version is installed with `conda list -n base conda-libmamba-solver`. Before version 22.12, the CLI flag was `--experimental-solver`. We recommend you upgrade to `conda` 22.11 or above, and then `conda-libmamba-solver` 22.12 or above. See the [22.12.0 announcement post](https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0) for more details on how to upgrade. (install-older-conda)= ## I have an older `conda` and I can't install `conda-libmamba-solver` Since older `conda` versions only supported the `classic` solver, you might run into solver conflicts or too long installations if your `base` environment is too constrained. This becomes a "chicken-and-egg" problem where you'd need `conda-libmamba-solver` to update to a more recent `conda` with `conda-libmamba-solver`. Fortunately, there's a workaround thanks to the `conda-standalone` project. This is a single binary that bundles recent `conda` versions, with `conda-libmamba-solver` included. It's not a substitute for the full `conda` user experience but it can help bootstrap and rescue conda installations. 1. Download the most recent `conda-standalone` from its [Github Releases page](https://github.com/conda/conda-standalone/releases/latest). Make sure to pick the one for your operating system and platform. Once downloaded, rename it as `conda.exe` on Windows and `conda` on Linux / macOS. 2. Write down the location of your `base` environment: `conda info --root`. 3. Write down the main preconfigured channel in your installation: `conda config --show channels`. This is usually `defaults` or `conda-forge`. 4. Go to the Downloads directory and run this command from your terminal: On Windows: ```console .\conda.exe install -p "[path given by step 2]" -c [channel from step 3] "conda>=23.10" conda-libmamba-solver ``` On Linux or macOS: ```console ./conda install -p "[path given by step 2]" -c [channel from step 3] "conda>=23.10" conda-libmamba-solver ``` Once the command succeeds, you'll have `conda-libmamba-solver` installed in your base environment and will be ready to use it as normal. You can delete the conda-standalone binaries. ================================================ FILE: docs/user-guide/index.md ================================================ # User Guide The `conda-libmamba-solver` plugin allows you to use `libmamba`, the same `libsolv`-powered solver used by `mamba` and `micromamba`, directly in `conda`. ## How to install If you have a recent `conda` (23.10 or later), you don't have to do anything. `conda-libmamba-solver` is already preconfigured as default. For older versions `conda`, we simply recommend updating `conda` to a more recent version: ```console $ conda update -n base conda ``` If this command fails, check this entry in the FAQ section: {ref}`install-older-conda`. ```{admonition} Update from the experimental versions :class: note Please refer to the [v22.12.0 release notes](https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0) for more details on how to update from a previous version if you were already using the experimental builds (conda-libmamba-solver 22.9 and below). ``` ## Usage From `conda` 23.10, `conda-libmamba-solver` is the default solver. You don't have to do anything else. It will just work. ````{admonition} Usage with conda 23.9 and below `conda <23.10` won't use `conda-libmamba-solver` by default. It will still rely on the `classic` solver.
Sporadic use To enable it for one operation, you can use the `--solver` flag, available for `conda create|install|remove|update` commands. ``` $ conda install tensorflow --solver=libmamba ``` Note: The `--solver` flag is also exposed as an environment variable, `CONDA_SOLVER`, in case you need that.
Set as default To enable it permanently, you can add `solver: libmamba` to your `.condarc` file, either manually, or with this command: ``` $ conda config --set solver libmamba ```
```` ## Revert to `classic` If you ever need to use the classic solver temporarily, use `--solver` flag: ``` $ conda install numpy --solver=classic ``` Finally, if you need to revert the default configuration back to `classic`, you can: * Run `conda config --set solver classic` (to make your choice explicit). ```{admonition} Tip If you are unsure what configuration is being used by conda, you can inspect it with `conda config --show-sources`. ``` ```{toctree} :hidden: subcommands configuration faq libmamba-vs-classic performance more-resources ``` ================================================ FILE: docs/user-guide/libmamba-vs-classic.md ================================================ # `libmamba` vs `classic` The `libmamba` solver attempts to be a drop-in replacement for the `classic` solver; however, there are some differences which could not be avoided. These are the three primary reasons: - Fundamental differences between the underlying solver algorithms - Underlying implementation details - Conscious decisions made by developers to improve overall user experience ## Should I use `conda-libmamba-solver`? Use `conda-libmamba-solver` if: * You want a faster solver with low-memory footprint. * Some of your environments do not solve quick enough, or at all, with `classic`. * You are okay with slightly different (but metadata-compliant) solutions. ```{note} Users most often find alternative solutions surprising when they request packages with very few restraints. If the given solution is not fully satisfying, try to restrict your request a bit more. For example, if you run `conda install scipy` and do not get the latest version, try using a more explicit command: `conda install scipy=X.Y`. ``` The classic solver could be important to you if: - Backwards compatibility is important (i.e. environments must be solved exactly as they always have been) - The intentional deviations from the `classic` solver (see below) are not acceptable and you prefer the old behavior These reasons could be especially important if you continue to use long lived environments that were initially created with the `classic` solver. ```{important} You can always use `--solver=classic` to re-enable the `classic` solver temporarily for specific operations, even after setting `libmamba` as default. ``` ## Intentional deviations from `classic` With the release of `conda-libmamba-solver`, we took the opportunity to improve some aspects of the solver experience that were not possible to change in `classic` due to backwards compatibility restraints. The main ones are: * `conda-libmamba-solver` does not use `current_repodata.json` by default. Instead, it always uses the full `repodata.json` files. You can still use it by setting `--repodata-fn current_repodata.json` explicitly. * `conda-libmamba-solver` does not retry with `--freeze-installed` by default. Instead, it has a tighter retry logic that progressively relaxes the constraints on the conflicting packages. * `conda-libmamba-solver` does not allow the user to override the configured [pinned specs](https://docs.conda.io/projects/conda/en/stable/user-guide/tasks/manage-pkgs.html#preventing-packages-from-updating-pinning) by specifying incompatible constraints in the CLI. Instead, it will error early. To override pinned specs, it needs to be done explicitly in the relevant configuration file(s) (e.g. temporarily commenting out the pin spec, or modifying the pin for a more recent version). Note that compatible CLI specs are still allowed, and will be used to select the best solution. For example, having a pinned spec for `python=3.8` will not prevent you from requesting `python=3.8.10`, but `python=3.9` will be rejected. * `conda-libmamba-solver` provides a way to hard-lock a given package to its currently installed version. To do so, specify _only_ the name of the package as a [pinned spec](https://docs.conda.io/projects/conda/en/stable/user-guide/tasks/manage-pkgs.html#preventing-packages-from-updating-pinning). Once installed, the solver will prevent _any_ modifications to the package. Use with care, since this can be a source of conflicts. Adequately constrained pins are a more flexible alternative. ## Technical differences between `libmamba` and `classic` We know `conda-libmamba-solver` brings a faster solver to `conda`, but why is that? And, why couldn't the `classic` solver just become faster? ```{note} The following sections provide deeper technical details about the reasons, both at the implementation and algorithmic level. ``` If you don't care about that much detail, just know that: * Deep within, both `classic` and `conda-libmamba` rely on C-based code to solve the SAT problem. However, `classic` uses Python objects to define and manage the SAT clauses, which incurs a large overhead. `libmamba` lets `libsolv` do the heavy lifting, operating in C++ and C, respectively. `conda-libmamba-solver` tries to delegate to the `libmamba` and `libsolv` compiled libraries as soon as possible to minimize the Python overhead. * `classic` has a more involved retry-logic than can incur in more time-consuming solver attempts, especially for existing environments. * Both options use SAT solvers, but they invoke them differently. `classic` uses a multistep, multi-objective optimization scheme, which resembles a global optimization scheme. `libsolv` opts for a backtracking alternative, closer to a local optimization scheme. This can result in `libmamba` choosing a different member of the whole solution ensemble. ### Implementation differences Let's first analyze how both solvers are implemented. The `classic` solver logic is distributed across several abstraction layers in `conda`. * `conda.cli.install`: This module contains the base implementation for `conda [env] install|remove|update|create`. It eventually delegates to the `Solver` class, after some preparation tasks. This module can run up to 4 solver attempts by default: use `current_repodata.json` first, or retry with `repodata.json`, and with and without the `--freeze-installed` flag. * `conda.core.solve.Solver`: This class provides a three-function API that interfaces with the `Transaction` system. Almost of all the logic falls under the `Solver.solve_final_state()` method. At this step, `classic` downloads the channels metadata, collects information about the target environment and applies the command-line instructions provided by the user. The end result is a list of `MatchSpec` objects; in other words, a list of constraints that underlying solver must use to best select the needed packages from the channels. * `conda.resolve.Resolve`: This class receives the `MatchSpec` instructions from the higher level `Solver` class and transforms them into SAT clauses, as implemented in the `conda.common.logic.Clauses` and `conda.common._logic.Clauses` classes. [`Resolve.solve()`][Resolve.solve] is the method that governs the algorithmic details of "solving the environment". * `conda.common._logic._SatSolver`: Provides the parent class for all three SAT solver wrappers implemented as part of the `classic` logic (PycoSat, PyCryptoSat, PySat). The default one is `PycoSat`, but you can change it with the `sat_solver` option in your configuration. * `conda.common._logic._PycoSatSolver`: This class wraps the `pycosat` bindings to `picosat`, the underlying C library that actually solves the SAT clauses problem. For `conda-libmamba-solver`, we initially tried to provide an implementation at the `_SatSolver` level, but `libsolv` (and hence `libmamba`) didn't expose a SAT-based API. We ended up with an implementation a bit higher up in the abstraction tree: * `conda.cli.install`: We always ignore `current_repodata.json` and implement the `--freeze-installed` attempts closer to the solver so we don't have to re-run the preparation steps. * `conda_libmamba_solver.solver.LibMambaSolver`: A `conda.core.solve.Solver` subclass that completely replaces the `Solver.solve_final_state()` method. We used this opportunity to refactor some of the pre-solver logic (spread across different layers in `classic`) into a solver-agnostic module (`conda_libmamba_solver.state`) with nicer-to-work-with helper objects. Our subclass instantiates the `libmamba` objects. * `libmambapy.Solver`: The `libmambapy` Python package is generated by `pybind11` bindings to the underlying `libmamba` C++ library. Some of the objects we rely on are `Solver` (interfaces with `libsolv`), and the `Database` object (handles the channel metadata and target environment state). * `libsolv`: `libmamba` relies on this C project directly to handle the solving steps. Note that Anaconda's and conda-forge's distributions of `libsolv` come with a set of patches, including one to handle the conda packages' variants' prioritization (which is not present in the upstream `libsolv`). Those patches can be found in the `recipe` folder of [`AnacondaRecipes/libsolv-feedstock`][AnacondaRecipes-libsolv-feedstock] and [`conda-forge/libsolv-feedstock`][conda-forge-libsolv-feedstock], respectively. The implementation details reveal some of the reasons for the performance differences: * `classic` uses many Python layers before it finally reaches the compiled code (`picosat`): * Tens of `MatchSpec` objects reflect the input state: installed packages, system constraints and user-requested packages * The channel index (repodata files) results in tens of thousands of `PackageRecord` objects * The SAT clauses end up being expressed as tens or hundreds of thousands of `logic.Clauses` and `_logic.Clauses` objects. * The optimization algorithm in `Resolve.solve()` invokes picosat several times, switching between Python and C contexts very often, recreating `Clauses` as necessary. * `conda-libmamba-solver`, in contrast, switches to C++ pretty early in the abstraction tree. * Only the `MatchSpec` objects are created in the Python layer, only to be immediately forwarded to its C++ counterparts. * The SAT clauses are built and handled by `libsolv`, using a [very memory-efficient approach based on 32-bit integers only][libsolv-history]. This allows the SAT problem to [be treated in milliseconds][libsolv-ms]. ### Algorithmic details #### Retry logic `classic` tries hard to minimally modify your environment, so by default, the flag `--freeze-installed` will be applied. This means all your installed packages will be constrained to their current installed version. If the SAT solver couldn't find a solution, then `classic` will analyze which packages are causing the conflict. If the conflicting packages were not explicitly requested by the user (in the current or previous operations in the target environment), their version constraint will be relaxed and a new solving attempt will be made. If, despite the progressive constraint relaxation, the SAT solver cannot find a solution, the `Solver` class will raise an exception to the `conda.cli.install` module. This will trigger a second round of attempts, without `--freeze-installed`. In simplified Python: ```python for repodata in ("current_repodata.json", "repodata.json"): solver = Solver(repodata_fn=repodata) for should_freeze in (True, False): success = solver.solve(freeze_installed=True) if success: break else: raise SolverError() class Solver: "Super simplified version. Actual implementation is spread across many layers" def solve(self, *args, **kwargs): index = download_channel(channels, repodata_fn) constraints = collect_metadata(target_environment, user_requested_packages) while True: sat_solver = SATSolver(index) clauses = sat_solver.build_clauses(constraints) # expensive! success = sat_solver.solve(clauses) # multi-step optimization if success: return True else: conflicts = sat_solver.find_conflicts() initial_constraints = constraints.copy() constraints.update(conflicts) if initial_constraints == constraints: return False ``` A similar retry logic is implemented in `conda_libmamba_solver`, but `libsolv` gives us the conflicting packages as part of the solving attempt result for free, which allows us to iterate faster. We don't need a separate attempt to disable `--freeze-installed` because our retry logic handles conflicts and frozen packages in the same way. Additionally, this retry logic can also be disabled or reduced with an environment variable for extreme cases (very large environments). This makes the overall logic simpler and faster, which compounds on top of the lightning-fast `libmamba` implementation. #### SAT algorithms Given a set of `MatchSpec` objects, `classic` will apply a multistep, multi-objective optimization strategy that invokes the actual SAT solver several times: * [`conda.resolve.Resolve.solve()`][Resolve.solve] will optimize several objective metrics. In no particular order, some of these rules are: * Maximize the versions and build numbers of required packages * Minimize the number of `track_features` * Prefer non-`noarch` over `noarch` if both are available * Minimize the number of necessary upgrades and/or removals * `conda.common._logic.Clauses.minimize()`: This is used for each step above, and involves a series of SAT calls per minimization. All of these calls involve, at some point, passing Python objects over to the C context, which incurs some overhead. In contrast, `libmamba` delegates fully to `libsolv`, which has its own logic for conda-specific problems. You can read more about it in the [`mamba-org/mamba` documentation][mamba_libsolv_docs], but the most important part: * `libsolv` is a backtracking SAT solver, [inspired][libsolv-history-sat] by [minisat][minisat]. This means that it explores "branches" of a solution until it finds one that satisfies the input constraints. If we understand `classic`'s approach as a global-like optimization strategy, and one could say `libsolv`'s better resembles a local optimization approach. * This means that in the presence of several compatible solutions, `libsolv` might choose one that is different to the one proposed by `classic`. ```{note} Tip Large conda-forge migrations often rely on multiple coexisting build variants to ease the transition (e.g. `openssl` v1 to v3). This introduces several alternative branches `libsolv` can end up exploring and selecting, perhaps with surprising results. Being more explicit about the requested packages usually helps get obtaining the expected solution; e.g. if you want to install `scipy=1.0` (the latest version), express that explicitly: `conda install scipy=1.0` instead of `conda install scipy`. ``` #### Index reduction `classic` prunes the channel metadata (internally referred to as the "index") in every `Resolve.solve()` call. This reduces the search space by excluding packages that won't ever be needed by the current set of input constraints. Conversely, this performance optimization step can get longer and longer the larger the index gets. In `libsolv`, pruning is part of the filtering, sorting and selection mechanism that informs the solver (see [`policy.c`][policy.c] and [`selection.c`][selection.c]). It runs in C, using memory-efficient data structures. ### IO differences `conda-libmamba-solver` uses the same IO stack as `conda` classic. In the past, we relied on `libmamba`'s IO for repodata fetching, but this is not the case anymore. ## Practical examples of solver differences ### Python 3.11 + very old Pydantic > Case study inspired by [issue #115](https://github.com/conda/conda-libmamba-solver/issues/115) The following environment file will give different solutions with `classic` and `conda-libmamba-solver`. ```yaml name: gmso channels: - conda-forge dependencies: - numpy - sympy - unyt <=2.8 - boltons - lxml - pydantic <1.9.0 - networkx - ele >=0.2.0 - forcefield-utilities ``` - `classic`: `python 3.10` + `pydantic 1.8.2` - `conda-libmamba-solver`: `python 3.11` + `pydantic 0.18.2` This is an example of an underspecified input. There's no `python` dependency (or version) listed in the environment file, so the solver has to figure it out. The solver doesn't necessarily know which dependency is more "important". `classic` will prioritize getting a more recent `pydantic` at the expense of an older `python`, and `conda-libmamba-solver` will prefer having `python 3.11`, even if it means going all the way down to `pydantic 0.18.2` (which was packaged as `noarch`) and thus compatible with _any_ Python version. ### cudatoolkit present in a `cpuonly` environment > Originally reported in [issue #131](https://github.com/conda/conda-libmamba-solver/issues/131) This is an example of a [known limitation in how `libsolv` processes the `track_features` metadata](https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html). `libsolv` will only "see" the first level of `track_features`, which down-prioritize packages. If you depend on 2nd-order dependencies to track prioritized variants (which conda `classic` successfully processes), you will get mixed results. This can be solved at the packaging level, where all the variants rely on the package _mutex_ directly, instead of relying on packages that depend on the mutex. ## More information If you want to read (even more) about this, please check the following resources: * ["Deep dive: solvers" guide in the `conda` documentation][deep-dive] * ["Package resolution" in the `mamba` documentation][mamba-pkg-resolution] * [Libsolv documentation][libsolv-docs] * [Explore ways to use other solvers instead of interacting with SAT solver directly][conda-solvers-issue] (`conda` issue) * [libsolv for conda?][libsolv-issue] (`libsolv` issue) [AnacondaRecipes-libsolv-feedstock]: https://github.com/AnacondaRecipes/libsolv-feedstock/ [conda-forge-libsolv-feedstock]: https://github.com/conda-forge/libsolv-feedstock/ [policy.c]: https://github.com/openSUSE/libsolv/blob/0.7.22/src/policy.c [selection.c]: https://github.com/openSUSE/libsolv/blob/0.7.22/src/selection.c [Resolve.solve]: https://github.com/conda/conda/blob/22.9.0/conda/resolve.py#L1244 [libsolv-history]: https://github.com/openSUSE/libsolv/blob/0.7.22/doc/libsolv-history.txt [libsolv-history-sat]: https://github.com/openSUSE/libsolv/blob/0.7.22/doc/libsolv-history.txt#using-sat-for-solving [libsolv-ms]: https://github.com/openSUSE/libsolv/issues/284#issuecomment-428927641 [mamba_libsolv_docs]: https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html [minisat]: http://minisat.se/ [jlap]: https://github.com/conda/conda/issues/11640 [powerloader]: https://github.com/mamba-org/powerloader [deep-dive]: https://docs.conda.io/projects/conda/en/stable/dev-guide/deep-dives/solvers.html [mamba-pkg-resolution]: https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html [libsolv-docs]: https://github.com/openSUSE/libsolv/tree/master/doc [libsolv-issue]: https://github.com/openSUSE/libsolv/issues/284 [conda-solvers-issue]: https://github.com/conda/conda/issues/7808#issuecomment-429805392 ================================================ FILE: docs/user-guide/more-resources.md ================================================ # More resources If you want to learn more about `conda-libmamba-solver` and `conda`, we have compiled a list of additional material you can check: * ["A Faster Solver for Conda: Libmamba"](https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community) (Blog post) * Anaconda Webinars "Scaling Conda" series: * [A Faster conda for a Growing Community](https://anaconda.cloud/a-faster-conda-for-a-growing-community) * [A Closer Look at conda’s New libmamba Solver](https://anaconda.cloud/closer-look-at-conda-s-new-libmamba-solver) * [Scaling conda: Extending conda with a New Plugin Ecosystem](https://anaconda.cloud/scaling-conda-extending-conda-a-new-plugin-ecosystem) ================================================ FILE: docs/user-guide/performance.md ================================================ # Performance tips and tricks `conda-libmamba-solver` is much faster than classic for [many reasons](./libmamba-vs-classic.md), but there are certain tricks you can use to make it even faster! These tips apply to both solvers: - **Explicit is better**. Instead of letting the solver do all the work, specify target versions for your packages. `conda install python=3.11 numpy` is way better than `conda install python numpy`. * Use `--strict-channel-priority`. Strict channel priority drastically reduces the solver search space when you are mixing channels. Make this decision permanent with `conda config --set channel_priority strict`. * Use `--update-specs`. For existing environments, do not attempt to freeze installed packages by default. ## For `conda-libmamba-solver` * Experimental: `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS=0`. Setting this environment variable will disable the retry loop, making it behave more like `micromamba`. ## For conda `classic` The above tips also apply to `classic`, but you can supplement them with: * `--repodata-fn=repodata.json` to skip using `current_repodata.json`. * `CONDA_UNSATISFIABLE_HINTS_CHECK_DEPTH=1` won't help solves get any faster, but failures will be reported more quickly. ## References - [Understanding and Improving Conda's performance](https://www.anaconda.com/blog/understanding-and-improving-condas-performance) - [How We Made Conda Faster in 4.7](https://www.anaconda.com/blog/how-we-made-conda-faster-4-7) ================================================ FILE: docs/user-guide/subcommands.md ================================================ # Subcommands The conda-libmamba-solver package also provides conda subcommand plugins in addition to the solver plugin. ## `conda repoquery` A conda subcommand plugin that offers the same functionality as `mamba repoquery` and `micromamba repoquery`. It provides three actions: - `conda repoquery search`: Query repodata for packages matching a pattern. - `conda repoquery depends`: Show the dependencies of the requested package. - `conda repoquery whoneeds`: Show the packages that depend on the requested package. Check the `--help` messages for each task for more information. ================================================ FILE: durations/Linux.json ================================================ { "tests/base/test_constants.py::test_ChannelPriority": 0.008545328147680534, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]": 0.0012750831265666137, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]": 0.001525353767928843, "tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]": 0.0026698171060825014, "tests/base/test_constants.py::test_null_is_falsey": 0.007022636098624928, "tests/base/test_context.py::test_aggressive_update_packages": 0.01628141288868955, "tests/base/test_context.py::test_category_map_covers_all_parameters": 0.010024243102299414, "tests/base/test_context.py::test_category_map_is_class_constant": 0.0009877110757574928, "tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]": 0.001139643844744402, "tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]": 0.0011568568943493525, "tests/base/test_context.py::test_channel_priority": 0.011092189481377126, "tests/base/test_context.py::test_channel_settings": 0.010097967555464738, "tests/base/test_context.py::test_channels_defaults_condarc": 0.011565344603087096, "tests/base/test_context.py::test_channels_empty": 0.010144190313022043, "tests/base/test_context.py::test_check_allowlist": 0.006810765876942388, "tests/base/test_context.py::test_check_allowlist_and_denylist": 0.006803423722442263, "tests/base/test_context.py::test_check_denylist": 0.006313420292789785, "tests/base/test_context.py::test_client_ssl_cert": 0.02010221844473759, "tests/base/test_context.py::test_clobber_enum[clobber]": 0.004333887092230296, "tests/base/test_context.py::test_clobber_enum[prevent]": 0.004182682087540101, "tests/base/test_context.py::test_clobber_enum[warn]": 0.0044394001519348514, "tests/base/test_context.py::test_conda_bld_path": 0.007613819105122191, "tests/base/test_context.py::test_conda_build_root_dir": 0.009854785461444391, "tests/base/test_context.py::test_conda_envs_path": 0.016390391754060825, "tests/base/test_context.py::test_context_override_with_reset": 0.004152064750524644, "tests/base/test_context.py::test_context_parameter_map": 0.010023344349447363, "tests/base/test_context.py::test_context_parameters_have_descriptions": 0.028006493167758776, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]": 0.0011125885911494316, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]": 0.001106402947302293, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]": 0.0010862911970171518, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]": 0.0010722117974705985, "tests/base/test_context.py::test_context_stack_push_pop_roundtrip": 0.004530824087646658, "tests/base/test_context.py::test_context_stack_starts_with_single_slot": 0.0010310315805524188, "tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]": 0.0044338138887764405, "tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]": 0.004349389483428491, "tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]": 0.006929862876095088, "tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages": 0.00550498219007516, "tests/base/test_context.py::test_custom_multichannels": 0.011111208809081393, "tests/base/test_context.py::test_custom_multichannels_overrides_default_channels": 0.014052244880268497, "tests/base/test_context.py::test_default_activation_prefix": 0.012710878416026876, "tests/base/test_context.py::test_default_python_validation[-True]": 0.0011244915013786554, "tests/base/test_context.py::test_default_python_validation[3.12-True]": 0.0011442066888013417, "tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']": 0.0011505048092684445, "tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']": 0.001119611662276767, "tests/base/test_context.py::test_default_target_is_root_prefix": 0.009767436962534652, "tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]": 0.0013068403926366284, "tests/base/test_context.py::test_expandvars": 0.0327817026454136, "tests/base/test_context.py::test_export_platforms": 0.013423224279676219, "tests/base/test_context.py::test_local_build_root_custom_rc": 0.017601178527376568, "tests/base/test_context.py::test_local_build_root_default_rc": 0.004354357832939643, "tests/base/test_context.py::test_migrated_custom_channels": 0.02154413861427549, "tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]": 0.0012317508077063703, "tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]": 0.001269789156182852, "tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]": 0.001268250965362663, "tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]": 0.0012538201223767037, "tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]": 0.001237737968771187, "tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]": 0.0012866927915895674, "tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]": 0.0013763687153045049, "tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]": 0.0012789798416503611, "tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]": 0.0012104043644134087, "tests/base/test_context.py::test_old_channel_alias": 0.015759947901977638, "tests/base/test_context.py::test_proxy_servers": 0.010180696577860316, "tests/base/test_context.py::test_signing_metadata_url_base": 0.013432573488557167, "tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels": 0.01378021874946843, "tests/base/test_context.py::test_specify_channels_cli_condarc": 0.011708642025205466, "tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc": 0.011015875316819941, "tests/base/test_context.py::test_specify_different_channels_cli_condarc": 0.011505217880754872, "tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc": 0.012016486868830497, "tests/base/test_context.py::test_subdirs": 0.004213172797224308, "tests/base/test_context.py::test_target_prefix": 0.024563562090197378, "tests/base/test_context.py::test_threads": 0.016505546460199656, "tests/base/test_context.py::test_validate_channels[-expected_channels3]": 0.0012187949923148339, "tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]": 0.0019737435539771706, "tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]": 0.002004817717837793, "tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]": 0.0016945560951852506, "tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]": 0.0012110594818994728, "tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]": 0.0018078386683749806, "tests/cli/test_actions.py::test_null_count_action": 0.0023744280270632267, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]": 0.014660223249995243, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]": 0.015379754249993636, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']": 0.02294904389321528, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']": 0.02061895284046092, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]": 0.02522551535869665, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]": 0.02434073970306966, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]": 0.12188035051157975, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]": 0.029085961204454697, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]": 0.1281702926198137, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]": 0.05343950098894601, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]": 0.046858404163985574, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]": 0.1667435817796424, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]": 0.027340924203803543, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]": 0.12939746902792976, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]": 0.027940171537448363, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]": 0.023946398514491103, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]": 0.022873939708953867, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]": 0.026731951982201903, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]": 0.12339903848608066, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]": 0.02384217111473112, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]": 0.02370906087199074, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]": 0.033485268674908295, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]": 0.026148861695864414, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]": 0.1323865718326767, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]": 0.004014946666486163, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]": 0.0027865261661642686, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]": 0.003466177516815481, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]": 0.003739085791049507, "tests/cli/test_all_commands.py::test_env_spec_deprecation_removal": 0.0023143047412195776, "tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used": 0.0023712413628062916, "tests/cli/test_cli_install.py::test_emscripten_forge[classic]": 10.77327755728952, "tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]": 3.8977212989079546, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]": 59.52933680535066, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]": 0.0078099135842465296, "tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]": 19.747482368562224, "tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]": 10.165522369467704, "tests/cli/test_cli_install.py::test_pre_link_message[classic]": 1.7689705825941886, "tests/cli/test_cli_install.py::test_pre_link_message[libmamba]": 1.5558865368568502, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]": 0.01278914918009649, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]": 0.006939571151545043, "tests/cli/test_common.py::test_check_non_admin_enabled_false": 0.004539166290653608, "tests/cli/test_common.py::test_check_non_admin_enabled_true": 0.004382884385421261, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none": 0.0019491530180702538, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec": 0.002251670120368649, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier": 0.001845968887875701, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both": 0.002191465227019397, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name": 0.0026339924578059897, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix": 0.0020310588138976516, "tests/cli/test_common.py::test_is_active_prefix[-False]": 0.01297377781375857, "tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]": 0.0016206723484763162, "tests/cli/test_common.py::test_print_activate": 0.0016655554393612785, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]": 0.0046915926690141605, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]": 0.004644057792739492, "tests/cli/test_common.py::test_validate_file_exists[/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]": 0.0010915461167242536, "tests/cli/test_common.py::test_validate_file_exists[/home/runner/work/conda/conda/tests/cli/test_common.py-True]": 0.002114113214378876, "tests/cli/test_common.py::test_validate_file_exists[file:///home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]": 0.0009914079184507245, "tests/cli/test_common.py::test_validate_file_exists[file:///home/runner/work/conda/conda/tests/cli/test_common.py-True]": 0.0017693773642039744, "tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]": 0.0014804633106632243, "tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]": 0.0014150079263674112, "tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]": 0.0015833859316943088, "tests/cli/test_common.py::test_validate_subdir_config": 0.002380379139694465, "tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir": 0.0025070790975159044, "tests/cli/test_compare.py::test_compare_fail": 0.5470221528142001, "tests/cli/test_compare.py::test_compare_success": 0.3962104684656505, "tests/cli/test_conda_argparse.py::test_cli_args_as_strings": 0.04680924250500465, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]": 0.0013990625566601017, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-]": 0.0013780635208227687, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]": 0.0013828298810721425, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]": 0.001349789538933461, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]": 0.001500007124165575, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]": 0.0014751767708766283, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]": 0.001421456681749314, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]": 0.0014380991788743502, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]": 0.0014157049293272177, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]": 0.0014055450247399738, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]": 0.0014073219852303144, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]": 0.001408943435614605, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]": 0.0014180357752931851, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]": 0.0013904969718763448, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]": 0.001393147995558589, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]": 0.0013822279095666286, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]": 0.001373994489667377, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]": 0.0013792026566712336, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]": 0.0013950048225033242, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]": 0.001393382911948438, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]": 0.0013932790478557635, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]": 0.0013907143084756852, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]": 0.0013746397104222022, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]": 0.0013624487089067125, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]": 0.0013654508474993277, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]": 0.0013757529835151006, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]": 0.0014185000269627448, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]": 0.0013915507439497146, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]": 0.0013759736878381289, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]": 0.001387420446468036, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]": 0.0013977775393254658, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]": 0.0013868180630514763, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]": 0.00136292045742804, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]": 0.001360469145722367, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]": 0.0013894906176541715, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]": 0.0013662169930599244, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]": 0.0013830870004496662, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]": 0.0013987715679566802, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]": 0.001409165610582675, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-]": 0.00141167296595584, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-]": 0.001427422505257904, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]": 0.0013965099524690257, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]": 0.0013778094335355645, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]": 0.0013705896844315715, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-]": 0.001382725611782279, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-]": 0.001480302918357056, "tests/cli/test_conda_argparse.py::test_parse_clobber": 0.020787212944421207, "tests/cli/test_conda_argparse.py::test_parser_basics": 0.01733518403590464, "tests/cli/test_conda_argparse.py::test_sorted_commands_in_error": 0.0022535844151860074, "tests/cli/test_config.py::test_add_invalid_key": 0.031703425014408454, "tests/cli/test_config.py::test_add_key": 0.038099740451444195, "tests/cli/test_config.py::test_channels_add_duplicate": 0.04140661892881793, "tests/cli/test_config.py::test_channels_add_empty": 0.05817531705208329, "tests/cli/test_config.py::test_channels_add_empty_with_defaults": 0.039157936804331876, "tests/cli/test_config.py::test_channels_append": 0.05758425085261775, "tests/cli/test_config.py::test_channels_append_duplicate": 0.039294209759297656, "tests/cli/test_config.py::test_channels_prepend": 0.048516461762387435, "tests/cli/test_config.py::test_channels_prepend_duplicate": 0.05893999745505817, "tests/cli/test_config.py::test_channels_remove": 0.03598574855114801, "tests/cli/test_config.py::test_channels_remove_duplicate": 0.05783737682491706, "tests/cli/test_config.py::test_conda_config_describe": 0.35823358336515754, "tests/cli/test_config.py::test_conda_config_validate": 0.1078020679897646, "tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore": 0.056262969292058006, "tests/cli/test_config.py::test_create_condarc_on_set": 0.030357358179959146, "tests/cli/test_config.py::test_custom_multichannels_add": 0.036898528467190245, "tests/cli/test_config.py::test_custom_multichannels_add_duplicate": 0.03717597407583287, "tests/cli/test_config.py::test_custom_multichannels_append": 0.03497043997611319, "tests/cli/test_config.py::test_custom_multichannels_append_duplicate": 0.036854835848390166, "tests/cli/test_config.py::test_custom_multichannels_prepend": 0.03580584627626287, "tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate": 0.03174999834150852, "tests/cli/test_config.py::test_get_all": 0.046864517723136496, "tests/cli/test_config.py::test_get_all_inc_maps": 0.04940703813354248, "tests/cli/test_config.py::test_get_boolean_value": 0.033988769846991805, "tests/cli/test_config.py::test_get_channels_list": 0.038716587715526496, "tests/cli/test_config.py::test_get_invalid_key": 0.04159115039474923, "tests/cli/test_config.py::test_get_map_full": 0.03492583688764177, "tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]": 0.04687232145955547, "tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]": 0.03627383567377869, "tests/cli/test_config.py::test_get_multiple_keys": 0.04827043963605968, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_full": 0.04086730725672689, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey": 0.047704310818939465, "tests/cli/test_config.py::test_get_string_value": 0.03359282319739343, "tests/cli/test_config.py::test_get_unconfigured_key": 0.04377833210499351, "tests/cli/test_config.py::test_invalid_yaml": 0.051747757728049265, "tests/cli/test_config.py::test_remove_key": 0.03167421428195741, "tests/cli/test_config.py::test_remove_key_duplicate": 0.0566356304556434, "tests/cli/test_config.py::test_remove_unconfigured_key": 0.03066379863157129, "tests/cli/test_config.py::test_set_and_get_bool": 0.055760056070427604, "tests/cli/test_config.py::test_set_check_types[always_yes-false-False]": 0.029515359863572184, "tests/cli/test_config.py::test_set_check_types[always_yes-no-False]": 0.03774678800128103, "tests/cli/test_config.py::test_set_check_types[always_yes-true-True]": 0.030481905838821436, "tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]": 0.0374263354104847, "tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]": 0.03253871198788293, "tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]": 0.031992544596073605, "tests/cli/test_config.py::test_set_invalid_key": 0.033972848134023154, "tests/cli/test_config.py::test_set_key": 0.039279226983287285, "tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]": 0.04171390437381087, "tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]": 0.0003581898763828016, "tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]": 0.036021110669479835, "tests/cli/test_config.py::test_set_rc_without_user_rc": 0.03223898864719802, "tests/cli/test_config.py::test_set_unconfigured_key": 0.0373969567461184, "tests/cli/test_config.py::test_show_sorts_keys": 0.06888233885279402, "tests/cli/test_config.py::test_ssl_verify_default": 0.0024434813110852573, "tests/cli/test_config.py::test_ssl_verify_set_bool": 0.028014718630012925, "tests/cli/test_config.py::test_ssl_verify_set_filename": 0.0339030824739543, "tests/cli/test_env.py::test_conda_env_create_empty_file[classic]": 0.04509897245240829, "tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]": 0.026872241298299286, "tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]": 1.0492101443451065, "tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]": 1.0594016102186352, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]": 0.03253215852880263, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]": 0.028833257977780136, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]": 0.06536006219150801, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]": 0.03167862151633582, "tests/cli/test_env.py::test_conda_env_create_no_file[classic]": 0.03156111458963271, "tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]": 0.028634880304527925, "tests/cli/test_env.py::test_create_dry_run_json[classic]": 4.679717930706931, "tests/cli/test_env.py::test_create_dry_run_json[libmamba]": 0.7475907833445723, "tests/cli/test_env.py::test_create_dry_run_yaml[classic]": 5.228520651547751, "tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]": 0.9208983983185353, "tests/cli/test_env.py::test_create_unsolvable_env[classic]": 0.25866202571078567, "tests/cli/test_env.py::test_create_unsolvable_env[libmamba]": 0.9710175005176376, "tests/cli/test_env.py::test_create_valid_env[classic]": 4.1288692195671075, "tests/cli/test_env.py::test_create_valid_env[libmamba]": 1.6319111660439773, "tests/cli/test_env.py::test_create_valid_env_json_output[classic]": 0.08706646126822314, "tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]": 0.7270401499285966, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]": 137.57388329238037, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]": 8.331481115876842, "tests/cli/test_env.py::test_create_valid_env_with_variables[classic]": 0.5817753747946132, "tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]": 1.4713510478106524, "tests/cli/test_env.py::test_env_export[classic]": 81.68431650159577, "tests/cli/test_env.py::test_env_export[libmamba]": 3.086066339974149, "tests/cli/test_env.py::test_env_export_json[classic]": 9.56424349446278, "tests/cli/test_env.py::test_env_export_json[libmamba]": 1.7546219382906443, "tests/cli/test_env.py::test_env_export_with_variables[classic]": 78.78493919331754, "tests/cli/test_env.py::test_env_export_with_variables[libmamba]": 2.632689304736499, "tests/cli/test_env.py::test_env_list_size[classic]": 0.6182446737708488, "tests/cli/test_env.py::test_env_list_size[libmamba]": 0.4913898889815707, "tests/cli/test_env.py::test_env_list_size_json[classic]": 0.18465053821750466, "tests/cli/test_env.py::test_env_list_size_json[libmamba]": 0.29543745688561196, "tests/cli/test_env.py::test_export_multi_channel[classic]": 149.6543647259028, "tests/cli/test_env.py::test_export_multi_channel[libmamba]": 14.880061625777778, "tests/cli/test_env.py::test_list[classic]": 1.2832100827401651, "tests/cli/test_env.py::test_list[libmamba]": 3.083470931274662, "tests/cli/test_env.py::test_list_info_envs[classic]": 0.1273442725663899, "tests/cli/test_env.py::test_list_info_envs[libmamba]": 0.11931017138977676, "tests/cli/test_env.py::test_name_override[classic]": 0.6989584006420517, "tests/cli/test_env.py::test_name_override[libmamba]": 1.307438319439482, "tests/cli/test_env.py::test_non_existent_file[classic]": 0.02993996007688365, "tests/cli/test_env.py::test_non_existent_file[libmamba]": 0.025195953545936355, "tests/cli/test_env.py::test_pip_error_is_propagated[classic]": 95.30935310374204, "tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]": 6.982623012739862, "tests/cli/test_env.py::test_remove_dry_run[classic]": 0.5867421094652988, "tests/cli/test_env.py::test_remove_dry_run[libmamba]": 1.2404761393001054, "tests/cli/test_env.py::test_set_unset_env_vars[classic]": 0.6605906444597119, "tests/cli/test_env.py::test_set_unset_env_vars[libmamba]": 1.4602301262251132, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]": 0.04138128059926948, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]": 0.02477239843425207, "tests/cli/test_env.py::test_update[classic]": 116.1392179708031, "tests/cli/test_env.py::test_update[libmamba]": 2.663757672253938, "tests/cli/test_env.py::test_update_env_json_output[classic]": 89.4387153234407, "tests/cli/test_env.py::test_update_env_json_output[libmamba]": 1.5311843111587367, "tests/cli/test_env.py::test_update_env_no_action_json_output[classic]": 181.69655854988812, "tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]": 11.39661838406415, "tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]": 182.70429721468713, "tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]": 11.609533178189407, "tests/cli/test_find_commands.py::test_find_commands[subset0]": 0.0003049400377409962, "tests/cli/test_find_commands.py::test_find_commands[subset1]": 0.008535986429915333, "tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]": 0.00204783581474164, "tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]": 0.005893993396482839, "tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]": 0.00029342214533177943, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]": 0.002380386711795308, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]": 0.0019592624614851468, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]": 0.0018891474611782099, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]": 0.0024093473237103502, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]": 0.001919786842340932, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]": 0.001847788482731351, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]": 0.0016474558097955361, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]": 0.0017141818674340553, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]": 0.0016494977190639301, "tests/cli/test_helpers.py::test_choices_func_exception_propagation": 0.001420251959192064, "tests/cli/test_helpers.py::test_choices_property_evaluation": 0.0013644404915006591, "tests/cli/test_helpers.py::test_choices_setter_ignores_values": 0.0012952367231293346, "tests/cli/test_helpers.py::test_conda_export_format_integration": 0.0017910496549127489, "tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]": 0.002152432862576502, "tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]": 0.005529344388663973, "tests/cli/test_helpers.py::test_empty_choices_behavior": 0.001346355676498844, "tests/cli/test_helpers.py::test_invalid_choice_handling[orange]": 0.0015503158066015065, "tests/cli/test_helpers.py::test_invalid_choice_handling[purple]": 0.0031324357534051176, "tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]": 0.002817543489867106, "tests/cli/test_helpers.py::test_lazy_choices_action_initialization": 0.0013799524023912495, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]": 0.001519328761244242, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]": 0.0015759946647263435, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]": 0.0019470600253722356, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]": 0.0015050132527145766, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]": 0.0014419493202896861, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]": 0.0014354825762216208, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]": 0.001464310936814042, "tests/cli/test_helpers.py::test_valid_choice_handling[blue]": 0.003464064145662483, "tests/cli/test_helpers.py::test_valid_choice_handling[green]": 0.0014756554684518632, "tests/cli/test_helpers.py::test_valid_choice_handling[red]": 0.001463755469711718, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]": 0.021286955804480204, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]": 0.024922550794101758, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]": 0.02981989634615047, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]": 0.022196607627104244, "tests/cli/test_main.py::test_main": 0.023280490305334713, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]": 0.00025813470148616964, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]": 0.00026124706875501236, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]": 0.00025350051701365084, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]": 0.0002505585057913736, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]": 0.0002457781822545424, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]": 0.00025747056139689115, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]": 0.00025492249155168844, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]": 0.00027796790762125864, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]": 0.0002597555739896481, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]": 0.00024507227696842865, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]": 0.000261574559859939, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]": 0.013278112317505558, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]": 0.014067399470498664, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]": 0.004817915717430871, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]": 0.004808499525416186, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]": 0.004814736480949188, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]": 0.007424170728179469, "tests/cli/test_main.py::test_main_subshell_help_exits_cleanly": 0.02208499368692464, "tests/cli/test_main.py::test_main_subshell_no_plugins_flag": 0.026495675366876734, "tests/cli/test_main.py::test_version_fast_path[--version]": 0.0016703596137740678, "tests/cli/test_main.py::test_version_fast_path[-V]": 0.0017705748531328185, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]": 0.0015610048840924878, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]": 0.0015735230046163195, "tests/cli/test_main_clean.py::test_clean_all[False]": 0.30131831899567396, "tests/cli/test_main_clean.py::test_clean_all[True]": 0.3379670599232837, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]": 0.6465957779203984, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]": 0.1448241087726455, "tests/cli/test_main_clean.py::test_clean_and_packages": 0.2943381124233807, "tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs": 0.2627007599437816, "tests/cli/test_main_clean.py::test_clean_index_cache": 0.18134094099932657, "tests/cli/test_main_clean.py::test_clean_logfiles": 0.08306037116663964, "tests/cli/test_main_clean.py::test_clean_tarballs": 0.2078903913004671, "tests/cli/test_main_clean.py::test_clean_tarballs_partial": 0.027502538954247, "tests/cli/test_main_clean.py::test_clean_tempfiles": 0.15653046323374292, "tests/cli/test_main_clean.py::test_get_size": 0.0019512984645857945, "tests/cli/test_main_clean.py::test_get_size_None": 0.001401259311801566, "tests/cli/test_main_clean.py::test_get_size_list": 0.001334716774740655, "tests/cli/test_main_commands.py::test_commands": 0.02488423833690196, "tests/cli/test_main_compare.py::test_compare": 0.025715888607073613, "tests/cli/test_main_compare.py::test_get_packages": 0.11037876279864595, "tests/cli/test_main_config.py::test_config_describe": 0.05789288978722048, "tests/cli/test_main_config.py::test_config_describe_json": 0.05796248554517608, "tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format": 0.024415077035629885, "tests/cli/test_main_config.py::test_config_env_does_not_exist": 0.02188468789560994, "tests/cli/test_main_config.py::test_config_file_context_manager": 0.0024388039586575143, "tests/cli/test_main_config.py::test_config_file_context_manager_exception": 0.001794160778040677, "tests/cli/test_main_config.py::test_config_file_from_env_condarc": 0.0030399994503438276, "tests/cli/test_main_config.py::test_config_file_from_system_condarc": 0.00529344935147241, "tests/cli/test_main_config.py::test_config_file_from_user_condarc": 0.008101596639518736, "tests/cli/test_main_config.py::test_config_get_key": 0.0047658005226618675, "tests/cli/test_main_config.py::test_config_get_missing[get]": 0.038262525957164596, "tests/cli/test_main_config.py::test_config_get_missing[key]": 0.029098251466336374, "tests/cli/test_main_config.py::test_config_get_missing[unknown]": 0.03548996832560876, "tests/cli/test_main_config.py::test_config_get_system[get]": 0.03395126629486536, "tests/cli/test_main_config.py::test_config_get_system[key]": 0.030866187651406893, "tests/cli/test_main_config.py::test_config_get_system[unknown]": 0.02892019872717957, "tests/cli/test_main_config.py::test_config_get_user[get]": 0.033350257638954287, "tests/cli/test_main_config.py::test_config_get_user[key]": 0.03053120845864973, "tests/cli/test_main_config.py::test_config_get_user[unknown]": 0.03460876996760587, "tests/cli/test_main_config.py::test_config_read_rc": 0.0024651968289665527, "tests/cli/test_main_config.py::test_config_remove_item": 0.0029393229362324287, "tests/cli/test_main_config.py::test_config_remove_key": 0.0016599349582044828, "tests/cli/test_main_config.py::test_config_set_and_get_key_for_env": 0.08473603636709837, "tests/cli/test_main_config.py::test_config_set_key": 0.0031157194615354313, "tests/cli/test_main_config.py::test_config_set_keys": 0.007381579875724744, "tests/cli/test_main_config.py::test_config_set_keys_aliases": 0.11935083317797945, "tests/cli/test_main_config.py::test_config_show": 0.041622203702224074, "tests/cli/test_main_config.py::test_config_show_errors": 0.0412618595285597, "tests/cli/test_main_config.py::test_config_show_sources_json": 0.025656929134618436, "tests/cli/test_main_config.py::test_config_write_rc": 0.003007649075609768, "tests/cli/test_main_config.py::test_format_dict_mapping_items": 0.004443118186109608, "tests/cli/test_main_config.py::test_key_exists[False]": 0.0022733381233885092, "tests/cli/test_main_config.py::test_key_exists[True]": 0.0023095484946462214, "tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export": 0.17940874405563428, "tests/cli/test_main_export.py::test_execute_export_no_file_specified": 0.030443175944471525, "tests/cli/test_main_export.py::test_export": 0.0409942791174787, "tests/cli/test_main_export.py::test_export_add_channels": 0.04128187460208976, "tests/cli/test_main_export.py::test_export_explicit_format_validation_errors": 6.0206607352105435, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]": 0.0347119773340486, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]": 0.028586069281986422, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]": 0.02617494261221502, "tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular": 0.12260224752726949, "tests/cli/test_main_export.py::test_export_format_consistency": 0.0017106798279898341, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]": 0.02753663765798278, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]": 0.025220278283033918, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]": 0.02808632213469835, "tests/cli/test_main_export.py::test_export_format_priority_over_extension": 0.028466239160694354, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]": 0.030584772155422848, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]": 0.02974051239902069, "tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]": 0.027523224659700335, "tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]": 0.031025774946472746, "tests/cli/test_main_export.py::test_export_from_history_format": 0.19442821432105475, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]": 0.476321842602096, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]": 0.26930431566952434, "tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast": 0.02336650778590105, "tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast": 0.02627645128135286, "tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast": 0.021861296157074488, "tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility": 0.028619331100794523, "tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error": 0.025102696067567775, "tests/cli/test_main_export.py::test_export_multiple_platforms": 2.175957796463912, "tests/cli/test_main_export.py::test_export_no_builds_format": 0.06849110229425971, "tests/cli/test_main_export.py::test_export_non_pip_env_warnings": 5.741842678933484, "tests/cli/test_main_export.py::test_export_override_channels": 0.044362444657864375, "tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence": 1.1092778943367307, "tests/cli/test_main_export.py::test_export_override_channels_behavior": 0.11665281392502513, "tests/cli/test_main_export.py::test_export_package_alphabetical_ordering": 0.20954150971752894, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]": 0.0346473793033794, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]": 0.06480607329560852, "tests/cli/test_main_export.py::test_export_platform_argument": 0.03643818173845518, "tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages": 0.9823653779601257, "tests/cli/test_main_export.py::test_export_regular_format_consistency": 0.0603805812770029, "tests/cli/test_main_export.py::test_export_single_platform_different_platform": 1.4258261657451983, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]": 0.029502104872843573, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]": 0.03457275157774369, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]": 0.02955102724212093, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]": 0.026108712139263978, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]": 0.02634956142035331, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]": 0.032504491591513314, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]": 0.025025475997659172, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]": 0.028386695159849082, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]": 0.024645851230534907, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]": 0.029160940939365877, "tests/cli/test_main_export.py::test_export_unknown_format_verbose": 0.022553432622005192, "tests/cli/test_main_export.py::test_export_unrecognized_file_extension": 0.055005567555968166, "tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]": 0.02506338714540606, "tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]": 0.020924397904174438, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]": 5.723330870788317, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]": 6.234165820491725, "tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]": 6.248769711816348, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]": 5.75401397337992, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]": 5.7255077411923985, "tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]": 5.677288443359611, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]": 6.722279020407399, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]": 7.388841487092385, "tests/cli/test_main_info.py::test_compute_prefix_size": 1.2346113681241906, "tests/cli/test_main_info.py::test_compute_prefix_size_empty_env": 0.002578937865268624, "tests/cli/test_main_info.py::test_info_all": 0.14101743941857287, "tests/cli/test_main_info.py::test_info_base": 0.05863626231605159, "tests/cli/test_main_info.py::test_info_detail": 0.07238617208290392, "tests/cli/test_main_info.py::test_info_envs": 0.0512045326187908, "tests/cli/test_main_info.py::test_info_envs_frozen": 0.031169126722350535, "tests/cli/test_main_info.py::test_info_envs_json": 0.026437244374671147, "tests/cli/test_main_info.py::test_info_envs_size": 0.790751621870354, "tests/cli/test_main_info.py::test_info_envs_size_json": 0.34288065913484234, "tests/cli/test_main_info.py::test_info_json": 0.03351563961031712, "tests/cli/test_main_info.py::test_info_size_without_envs": 0.02339997737386987, "tests/cli/test_main_info.py::test_info_system": 0.0769793584168995, "tests/cli/test_main_info.py::test_info_unsafe_channels": 0.049614374072190916, "tests/cli/test_main_info.py::test_iter_info_components": 0.0014258977482902895, "tests/cli/test_main_install.py::test_build_version_shows_as_changed": 9.798533087500054, "tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip": 52.22621958266852, "tests/cli/test_main_install.py::test_install_freezes_env_by_default": 1.215044799948502, "tests/cli/test_main_install.py::test_install_from_extracted_package": 4.78551246698889, "tests/cli/test_main_install.py::test_install_revision_revert": 2.2634690685624324, "tests/cli/test_main_install.py::test_too_many_arguments": 0.022422503696631332, "tests/cli/test_main_list.py::test_exit_codes": 1.8939390904732565, "tests/cli/test_main_list.py::test_explicit[--md5]": 0.19293681045449299, "tests/cli/test_main_list.py::test_explicit[--sha256]": 0.14513391854791535, "tests/cli/test_main_list.py::test_explicit[None]": 0.21730576532649618, "tests/cli/test_main_list.py::test_export": 0.20555735309480552, "tests/cli/test_main_list.py::test_fields_all": 1.0281424458335038, "tests/cli/test_main_list.py::test_fields_dependent": 0.45618635894552567, "tests/cli/test_main_list.py::test_fields_invalid": 0.9455899731166598, "tests/cli/test_main_list.py::test_list": 0.08536471920552689, "tests/cli/test_main_list.py::test_list_argument_variations[args0]": 0.9588739571372225, "tests/cli/test_main_list.py::test_list_argument_variations[args10]": 0.5011072303288217, "tests/cli/test_main_list.py::test_list_argument_variations[args11]": 0.9327408457954363, "tests/cli/test_main_list.py::test_list_argument_variations[args12]": 0.03349394392729515, "tests/cli/test_main_list.py::test_list_argument_variations[args13]": 0.029306142603158652, "tests/cli/test_main_list.py::test_list_argument_variations[args14]": 0.028750882167359715, "tests/cli/test_main_list.py::test_list_argument_variations[args15]": 0.03315201270882143, "tests/cli/test_main_list.py::test_list_argument_variations[args1]": 0.9257740210119315, "tests/cli/test_main_list.py::test_list_argument_variations[args2]": 0.53162448089873, "tests/cli/test_main_list.py::test_list_argument_variations[args3]": 0.9432395353225091, "tests/cli/test_main_list.py::test_list_argument_variations[args4]": 0.03731202152977923, "tests/cli/test_main_list.py::test_list_argument_variations[args5]": 0.028808225250929617, "tests/cli/test_main_list.py::test_list_argument_variations[args6]": 0.036966394275316145, "tests/cli/test_main_list.py::test_list_argument_variations[args7]": 0.032474908021460094, "tests/cli/test_main_list.py::test_list_argument_variations[args8]": 0.977500380884719, "tests/cli/test_main_list.py::test_list_argument_variations[args9]": 0.9584821977709018, "tests/cli/test_main_list.py::test_list_explicit": 0.13981580087751283, "tests/cli/test_main_list.py::test_list_full_name": 0.9461252110753718, "tests/cli/test_main_list.py::test_list_full_name_no_results": 0.9577845647995346, "tests/cli/test_main_list.py::test_list_json": 0.9667573795354418, "tests/cli/test_main_list.py::test_list_package": 0.9345880253218344, "tests/cli/test_main_list.py::test_list_reverse": 0.10437885094947377, "tests/cli/test_main_list.py::test_list_revisions": 0.05351870460445887, "tests/cli/test_main_list.py::test_list_size": 0.09490095121548917, "tests/cli/test_main_list.py::test_list_size_empty_paths_data": 0.19293959419474144, "tests/cli/test_main_list.py::test_list_size_json": 0.08796903803393358, "tests/cli/test_main_list.py::test_list_specific_version": 0.11497211387827445, "tests/cli/test_main_list.py::test_list_with_bad_prefix_raises": 0.025931108374018002, "tests/cli/test_main_notices.py::test_cache_names_appear_as_expected": 0.1232964985296608, "tests/cli/test_main_notices.py::test_main_notices[200]": 0.12952774455811975, "tests/cli/test_main_notices.py::test_main_notices[404]": 0.12267686917765983, "tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field": 0.12261730976539867, "tests/cli/test_main_notices.py::test_main_notices_help": 0.018372669458699708, "tests/cli/test_main_notices.py::test_main_notices_json": 0.030837748149478792, "tests/cli/test_main_notices.py::test_main_notices_reads_from_cache": 0.1241304676946902, "tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache": 0.12378240961103269, "tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands": 0.7208561376453325, "tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files": 0.1306070184725078, "tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure": 0.5433928999448978, "tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error": 1.1913453445405098, "tests/cli/test_main_notices.py::test_notices_work_with_s3_channel": 0.13489221048050043, "tests/cli/test_main_remove.py::test_remove_all": 6.079954417066627, "tests/cli/test_main_remove.py::test_remove_all_default_activation_env": 0.025418455399874605, "tests/cli/test_main_remove.py::test_remove_all_keep_env": 5.523530166956355, "tests/cli/test_main_remove.py::test_remove_early_existence_check": 0.030186960687147827, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]": 25.619427586483187, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]": 1.9637700997436929, "tests/cli/test_main_remove.py::test_remove_nonexistent_env": 0.021636169295555837, "tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name": 1.3048744178393308, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name": 0.027407877935290134, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path": 0.02321794422585726, "tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env": 0.03104000995882546, "tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename": 1.280402701890012, "tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error": 1.3543621776206747, "tests/cli/test_main_rename.py::test_rename_by_name_success": 1.6557903976943502, "tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error": 1.2971138627783136, "tests/cli/test_main_rename.py::test_rename_by_path_success": 1.5995605122763408, "tests/cli/test_main_rename.py::test_rename_default_activation_env": 0.02660800473672728, "tests/cli/test_main_rename.py::test_rename_with_dry_run": 1.2872884293761224, "tests/cli/test_main_rename.py::test_rename_with_force": 2.863917333477514, "tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run": 1.3040634029834461, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors": 2.627509072478873, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix": 0.07360145248726038, "tests/cli/test_main_rename.py::test_separator_chars_on_win": 0.0002966515320919665, "tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix": 0.024720023309422672, "tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env": 0.02442049314626486, "tests/cli/test_main_run.py::test_multiline_run_command": 1.1335992541924909, "tests/cli/test_main_run.py::test_no_newline_in_output[stderr]": 5.833814503381338, "tests/cli/test_main_run.py::test_no_newline_in_output[stdout]": 5.720604528768629, "tests/cli/test_main_run.py::test_run_deactivates_environment_unix": 0.0035452037369706067, "tests/cli/test_main_run.py::test_run_deactivates_environment_windows": 0.00027796785374116555, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]": 1.0412998306852725, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]": 0.00026611058900739685, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]": 1.0483718708852947, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]": 0.00027812761206646004, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]": 0.00025998515658891025, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]": 1.0613227871256146, "tests/cli/test_main_run.py::test_run_readonly_env": 1.0497993360146438, "tests/cli/test_main_run.py::test_run_returns_int": 1.0376873528060893, "tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel": 1.0348823616309357, "tests/cli/test_main_run.py::test_run_returns_zero_errorlevel": 1.0505275972332901, "tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]": 1.0464206136001921, "tests/cli/test_main_run.py::test_run_uncaptured[-s]": 1.046812836910578, "tests/cli/test_main_run.py::test_run_with_empty_command_will_raise": 0.02444229027383936, "tests/cli/test_main_run.py::test_run_with_separator[combined option]": 1.0966890947460797, "tests/cli/test_main_run.py::test_run_with_separator[double dash option]": 1.1038235688196811, "tests/cli/test_main_run.py::test_run_with_separator[multiple args]": 1.106991625796728, "tests/cli/test_main_run.py::test_run_with_separator[multiple separators]": 1.0912663088811112, "tests/cli/test_main_run.py::test_run_with_separator[no known args]": 1.107345112323326, "tests/cli/test_main_run.py::test_run_with_separator[no separator]": 1.098114237012359, "tests/cli/test_main_run.py::test_run_with_separator[separator not first]": 1.0984976404319762, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]": 1.1066127884465236, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]": 1.1067676611333988, "tests/cli/test_main_search.py::test_anaconda_token_with_private_package": 9.075599963758043, "tests/cli/test_main_search.py::test_bad_anaconda_token": 0.8021411003858766, "tests/cli/test_main_search.py::test_current_platform_package_missing": 0.04912032956621057, "tests/cli/test_main_search.py::test_different_platform_package_found": 0.038920068403506286, "tests/cli/test_main_search.py::test_mocked_platform_package_found": 0.05521770280716678, "tests/cli/test_main_search.py::test_pretty_record": 0.005294809960961728, "tests/cli/test_main_search.py::test_rpy_search[linux-32]": 3.8559293861945343, "tests/cli/test_main_search.py::test_rpy_search[linux-64]": 9.056217385345024, "tests/cli/test_main_search.py::test_rpy_search[osx-64]": 6.515931528177713, "tests/cli/test_main_search.py::test_rpy_search[win-32]": 3.2762175060187135, "tests/cli/test_main_search.py::test_rpy_search[win-64]": 9.238610025722338, "tests/cli/test_main_search.py::test_search_0": 3.1971127355617837, "tests/cli/test_main_search.py::test_search_1": 0.2616452428284551, "tests/cli/test_main_search.py::test_search_2[exact]": 0.7577833089242066, "tests/cli/test_main_search.py::test_search_2[wildcard]": 3.160494598195495, "tests/cli/test_main_search.py::test_search_3": 0.5570498857459616, "tests/cli/test_main_search.py::test_search_4": 0.04133902334905705, "tests/cli/test_main_search.py::test_search_5": 0.6950713675855688, "tests/cli/test_main_search.py::test_search_envs": 0.18097662377520274, "tests/cli/test_main_search.py::test_search_envs_info": 0.15903781359595595, "tests/cli/test_main_search.py::test_search_envs_json": 0.0438905507063884, "tests/cli/test_main_search.py::test_search_envs_nonexistent": 0.3663164662101128, "tests/cli/test_main_search.py::test_search_envs_nonexistent_info": 0.30240769376367954, "tests/cli/test_main_search.py::test_search_envs_nonexistent_json": 0.08173593800095393, "tests/cli/test_main_search.py::test_search_inflexible": 0.5336191963866287, "tests/cli/test_main_search.py::test_unknown_platform_package_missing": 0.05766467616992172, "tests/cli/test_main_update.py::test_dont_update_explicit_packages": 0.0797284735555102, "tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints": 0.028020813604477043, "tests/cli/test_main_update.py::test_update": 11.111177925288306, "tests/cli/test_startup_benchmarks.py::test_context_init": 0.003247680674011742, "tests/cli/test_startup_benchmarks.py::test_generate_parser": 0.018439682534633704, "tests/cli/test_startup_benchmarks.py::test_import_cli_main": 0.09550218106063485, "tests/cli/test_startup_benchmarks.py::test_import_conda_argparse": 0.2111325769249489, "tests/cli/test_startup_benchmarks.py::test_import_context": 0.1146677361924753, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]": 0.19895484380493958, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]": 0.3946132853100143, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]": 0.3257085231229022, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]": 0.2120875854484185, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]": 0.18282523689480576, "tests/cli/test_startup_benchmarks.py::test_version_main": 0.001253856637251245, "tests/cli/test_subcommands.py::test_clean[classic]": 8.516386247115449, "tests/cli/test_subcommands.py::test_clean[libmamba]": 4.914233228200058, "tests/cli/test_subcommands.py::test_compare[classic]": 0.04429706460924121, "tests/cli/test_subcommands.py::test_compare[libmamba]": 0.033399939667623134, "tests/cli/test_subcommands.py::test_config[classic]": 0.036781984301016916, "tests/cli/test_subcommands.py::test_config[libmamba]": 0.027717656872862213, "tests/cli/test_subcommands.py::test_create[classic]": 0.6350854888613204, "tests/cli/test_subcommands.py::test_create[libmamba]": 2.4980121145944203, "tests/cli/test_subcommands.py::test_doctor[classic]": 1.7321000278278138, "tests/cli/test_subcommands.py::test_doctor[libmamba]": 1.7299327156525972, "tests/cli/test_subcommands.py::test_env_config_vars[classic]": 0.09917672568629202, "tests/cli/test_subcommands.py::test_env_config_vars[libmamba]": 0.09032159400502557, "tests/cli/test_subcommands.py::test_env_create[libmamba]": 1.6857877008954472, "tests/cli/test_subcommands.py::test_env_export[classic]": 0.060069189134308865, "tests/cli/test_subcommands.py::test_env_export[libmamba]": 0.04612151224536438, "tests/cli/test_subcommands.py::test_env_list[classic]": 0.09372017478281526, "tests/cli/test_subcommands.py::test_env_list[libmamba]": 0.12694904920255817, "tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]": 0.039314913503511247, "tests/cli/test_subcommands.py::test_env_remove[classic]": 0.08150357073298589, "tests/cli/test_subcommands.py::test_env_remove[libmamba]": 0.0743540456628117, "tests/cli/test_subcommands.py::test_env_update[libmamba]": 2.225769472910409, "tests/cli/test_subcommands.py::test_info[classic]": 0.05794803328095419, "tests/cli/test_subcommands.py::test_info[libmamba]": 0.03590035949743306, "tests/cli/test_subcommands.py::test_info_json[classic]": 0.09122441383450972, "tests/cli/test_subcommands.py::test_info_json[libmamba]": 0.06417344543932553, "tests/cli/test_subcommands.py::test_init[classic]": 0.057597371140535675, "tests/cli/test_subcommands.py::test_init[libmamba]": 0.0459734140642997, "tests/cli/test_subcommands.py::test_install[libmamba]": 0.9653339288482745, "tests/cli/test_subcommands.py::test_list[libmamba]": 1.38821701289212, "tests/cli/test_subcommands.py::test_notices[classic]": 0.15291492168843987, "tests/cli/test_subcommands.py::test_notices[libmamba]": 0.16839177828900379, "tests/cli/test_subcommands.py::test_package[classic]": 0.03830247861013124, "tests/cli/test_subcommands.py::test_package[libmamba]": 0.04833084518130471, "tests/cli/test_subcommands.py::test_remove[classic-remove]": 0.08180690194073581, "tests/cli/test_subcommands.py::test_remove[classic-uninstall]": 0.08335219542849559, "tests/cli/test_subcommands.py::test_remove[libmamba-remove]": 0.08429164633476131, "tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]": 0.07390516080174997, "tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]": 4.223793883396462, "tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]": 0.3900874947639851, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]": 1.185660247816561, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]": 1.1775345592999864, "tests/cli/test_subcommands.py::test_rename[classic]": 0.4118709291670224, "tests/cli/test_subcommands.py::test_rename[libmamba]": 0.3772800138201831, "tests/cli/test_subcommands.py::test_run[libmamba]": 1.6646085119716132, "tests/cli/test_subcommands.py::test_search[classic]": 0.1395247088788198, "tests/cli/test_subcommands.py::test_search[libmamba]": 4.2347980349935, "tests/cli/test_subcommands.py::test_update[libmamba-update]": 1.61061664216605, "tests/cli/test_subcommands.py::test_update[libmamba-upgrade]": 1.5941650922849275, "tests/common/_os/test_windows.py::test_is_admin_on_windows": 0.0022793063305669645, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]": 0.00024884887647068723, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]": 0.00024265097060612614, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]": 0.0002467027533941657, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]": 0.00025348397904112203, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]": 0.00023915459437412226, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]": 0.00026384634752976764, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]": 0.0002864577611992765, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]": 0.00027266680088125874, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]": 0.0002478775591949129, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]": 0.00025138413517125034, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]": 0.0003629646264365705, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]": 0.00024284291067101825, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]": 0.00024832505024630677, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]": 0.00028715516866012155, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]": 0.0006664620773926018, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]": 0.0002749851411967072, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]": 0.0002450738696231105, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]": 0.00024386828945948237, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]": 0.00023749498040251404, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]": 0.00025314022286231097, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]": 0.00023982039029572875, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]": 0.0002571598560736837, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]": 0.0002491802213637075, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]": 0.00024376991998075633, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]": 0.0002505567741401385, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]": 0.0002482372798927184, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]": 0.00024227171870805546, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]": 0.00023901447175588754, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]": 0.000241281775217931, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]": 0.00023666421858564664, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]": 0.0002372309993223697, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]": 0.00025129690092095576, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]": 0.0002418599835446754, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]": 0.00027770993199515993, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]": 0.00023936482826061563, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]": 0.00024094861043703398, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]": 0.0002501686428581329, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]": 0.00023736437561562698, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]": 0.0003653736554284674, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]": 0.00023945036575949473, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]": 0.00024412524566962411, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]": 0.00024061661847598695, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]": 0.00023628714939969323, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]": 0.0002736082136599114, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]": 0.0002901439363076032, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]": 0.0003655812128596474, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]": 0.0002453608675662109, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]": 0.0002599398985902837, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]": 0.00027818197591432603, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]": 0.00023892337432005294, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]": 0.0002587674605752064, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]": 0.00024520316762937733, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]": 0.0002478953035952793, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]": 0.00024099692477838331, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]": 0.0002731072230334455, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]": 0.00026702577051357693, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]": 0.00025783902355810354, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]": 0.0002492989285972597, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]": 0.00024631401632407043, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]": 0.00025184639826911627, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]": 0.00024964757016326434, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]": 0.000748234388264523, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]": 0.00024420059439402665, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]": 0.0002552744334900409, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]": 0.000253174424256914, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]": 0.0002795573516788551, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]": 0.0002470723088257892, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]": 0.00032437600237666703, "tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file": 0.0013619275799607211, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data": 0.0018811545453128087, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data": 0.0016435103601802076, "tests/common/pkg_formats/test_python.py::test_dist_get_paths": 0.001369426307171277, "tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths": 0.0011914153747126781, "tests/common/pkg_formats/test_python.py::test_evaluate_marker": 0.0016633946295589142, "tests/common/pkg_formats/test_python.py::test_get_default_marker_context": 0.0011212666916657103, "tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link": 0.002445404001322574, "tests/common/pkg_formats/test_python.py::test_get_dist_requirements": 0.0018698427632182885, "tests/common/pkg_formats/test_python.py::test_get_entry_points": 0.0019396249698000493, "tests/common/pkg_formats/test_python.py::test_get_extra_provides": 0.001506586871358521, "tests/common/pkg_formats/test_python.py::test_get_python_distribution_info": 0.0002591171836619002, "tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files": 0.001662807282988134, "tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]": 0.0016630786281895543, "tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]": 0.0017036737967910953, "tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]": 0.0017036909839398759, "tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]": 0.0016385672631520174, "tests/common/pkg_formats/test_python.py::test_metadata_keys": 0.0010197770473445642, "tests/common/pkg_formats/test_python.py::test_metadata_none": 0.0010489241370516859, "tests/common/pkg_formats/test_python.py::test_metadata_process_path": 0.0017240893054713542, "tests/common/pkg_formats/test_python.py::test_metadata_read_metadata": 0.001592991876382735, "tests/common/pkg_formats/test_python.py::test_norm_package_name": 0.0012316084568777955, "tests/common/pkg_formats/test_python.py::test_norm_package_version": 0.004621832897525509, "tests/common/pkg_formats/test_python.py::test_parse_specification": 0.0025364941514476294, "tests/common/pkg_formats/test_python.py::test_pydist_check_files": 0.0016863028854404772, "tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name": 0.0062032626196853275, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath": 0.0012688556733383473, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_path": 0.001309572684441601, "tests/common/pkg_formats/test_python.py::test_python_dist_info": 0.001507575084896992, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies": 0.003188509744229208, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2": 0.0013130335934204535, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3": 0.0012993654147581979, "tests/common/pkg_formats/test_python.py::test_split_spec": 0.0021445959366700818, "tests/common/test_configuration.py::test_commented_map_parameter": 0.0017166693263064405, "tests/common/test_configuration.py::test_config_resets": 0.001472244785344312, "tests/common/test_configuration.py::test_cross_parameter_validation": 0.0010171646358005388, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]": 0.0010910415012015209, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]": 0.00109833013523821, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]": 0.0011057574840462171, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]": 0.0011237691131759868, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]": 0.0012498527072272994, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]": 0.0011059432645977444, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]": 0.0011370275371730737, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]": 0.0011566657312205126, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]": 0.0011080529238527812, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]": 0.0011049490554881846, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]": 0.0010841905266949343, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]": 0.001090013756680482, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]": 0.0010785357225252304, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]": 0.0011088619672899207, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]": 0.00025562426178492856, "tests/common/test_configuration.py::test_default_values": 0.0011847283367343927, "tests/common/test_configuration.py::test_empty_map_parameter": 0.002638123015077455, "tests/common/test_configuration.py::test_env_var_config": 0.001306595148360121, "tests/common/test_configuration.py::test_env_var_config_alias": 0.0012835816661965612, "tests/common/test_configuration.py::test_env_var_config_empty_sequence": 0.001275074466318411, "tests/common/test_configuration.py::test_env_var_config_no_split_sequence": 0.0012978442175978309, "tests/common/test_configuration.py::test_env_var_config_split_sequence": 0.0013178944109921654, "tests/common/test_configuration.py::test_expand_search_path": 0.0016434991047226425, "tests/common/test_configuration.py::test_expanded_variables": 0.00314943750919061, "tests/common/test_configuration.py::test_important_primitive_map_merges": 0.03631010682823531, "tests/common/test_configuration.py::test_invalid_map_parameter": 0.0010966251771698213, "tests/common/test_configuration.py::test_invalid_seq_parameter": 0.0011543855860327492, "tests/common/test_configuration.py::test_list_merges": 0.02852191110350834, "tests/common/test_configuration.py::test_load_raw_configs": 0.009987359064892471, "tests/common/test_configuration.py::test_map_parameter_must_be_map": 0.003731009244780595, "tests/common/test_configuration.py::test_nested": 0.013031804307442591, "tests/common/test_configuration.py::test_object": 0.005644158452233251, "tests/common/test_configuration.py::test_object_defaults_completely_empty": 0.001438130692912824, "tests/common/test_configuration.py::test_object_defaults_partially_empty": 0.0025632441129575735, "tests/common/test_configuration.py::test_parameter": 0.0010512613160343887, "tests/common/test_configuration.py::test_parameter_flag": 0.0010202914181324833, "tests/common/test_configuration.py::test_pretty_list": 0.0013987078811640592, "tests/common/test_configuration.py::test_raise_errors": 0.0010296768811857155, "tests/common/test_configuration.py::test_set_search_path_empty_path": 0.0009956799857000606, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]": 0.00250168899986275, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]": 0.0024341529182730155, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]": 0.002486154954554591, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]": 0.0028419433372061376, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]": 0.0029513288041468615, "tests/common/test_configuration.py::test_set_search_path_reloads_raw_data": 0.0025214427390041895, "tests/common/test_configuration.py::test_set_search_path_result_is_tuple": 0.0022292717155429835, "tests/common/test_configuration.py::test_simple_merges_and_caching": 0.009981507867446988, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates": 0.00211556890498352, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key": 0.0020897296751838483, "tests/common/test_configuration.py::test_validate_all": 0.008447221723083388, "tests/common/test_configuration.py::test_validation": 0.012880907915819953, "tests/common/test_io.py::test_attach_stderr_handler": 0.010432216735820824, "tests/common/test_io.py::test_captured": 0.00314002568990077, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]": 0.10310455902963621, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]": 0.0021639301629385707, "tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts": 0.001162771594146611, "tests/common/test_json.py::test_condajsonencoder_with_dumps": 0.0010665416539533258, "tests/common/test_logic.py::test_ALL": 6.847606735689324, "tests/common/test_logic.py::test_AMONE": 1.1185956828753512, "tests/common/test_logic.py::test_AND": 0.009051235878384875, "tests/common/test_logic.py::test_ANY": 6.650455441762583, "tests/common/test_logic.py::test_ITE": 0.30769679266598343, "tests/common/test_logic.py::test_LinearBound": 6.298315220947145, "tests/common/test_logic.py::test_NOT": 0.0038722315836386746, "tests/common/test_logic.py::test_OR": 0.011959053784241253, "tests/common/test_logic.py::test_XONE": 1.1443882209071556, "tests/common/test_logic.py::test_XOR": 0.010699666346376232, "tests/common/test_logic.py::test_minimal_unsatisfiable_subset": 0.004594634715332892, "tests/common/test_logic.py::test_minimize": 0.0031201726465387484, "tests/common/test_logic.py::test_sat": 0.0014505146007180985, "tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]": 0.0012608937723298374, "tests/common/test_path.py::test_deprecations[is_package_file-TypeError]": 0.0012794936411034499, "tests/common/test_path.py::test_get_major_minor_version_no_dot": 0.0010822408977508044, "tests/common/test_path.py::test_missing_pyc_files_27": 0.0019301712543605166, "tests/common/test_path.py::test_missing_pyc_files_34": 0.0017524043208918614, "tests/common/test_path.py::test_missing_pyc_files_35": 0.0010645324501293658, "tests/common/test_path.py::test_path_conversion[cygpath-PATH0]": 0.0002467828450153306, "tests/common/test_path.py::test_path_conversion[cygpath-PATH10]": 0.0002394971069686272, "tests/common/test_path.py::test_path_conversion[cygpath-PATH11]": 0.00023646710264320624, "tests/common/test_path.py::test_path_conversion[cygpath-PATH1]": 0.00024103710581840264, "tests/common/test_path.py::test_path_conversion[cygpath-PATH2]": 0.0002486943658786954, "tests/common/test_path.py::test_path_conversion[cygpath-PATH3]": 0.00023995140775829297, "tests/common/test_path.py::test_path_conversion[cygpath-PATH4]": 0.0002494109924823536, "tests/common/test_path.py::test_path_conversion[cygpath-PATH5]": 0.00023279846723082653, "tests/common/test_path.py::test_path_conversion[cygpath-PATH6]": 0.00023885331864420266, "tests/common/test_path.py::test_path_conversion[cygpath-PATH7]": 0.00024596392367451695, "tests/common/test_path.py::test_path_conversion[cygpath-PATH8]": 0.00023461146966912403, "tests/common/test_path.py::test_path_conversion[cygpath-PATH9]": 0.00023967954216827639, "tests/common/test_path.py::test_path_conversion[cygpath-UNC0]": 0.0002395500780274169, "tests/common/test_path.py::test_path_conversion[cygpath-UNC1]": 0.00023641502979814132, "tests/common/test_path.py::test_path_conversion[cygpath-UNC2]": 0.00024191295216657526, "tests/common/test_path.py::test_path_conversion[cygpath-UNC3]": 0.0002435632159148956, "tests/common/test_path.py::test_path_conversion[cygpath-UNC4]": 0.0002433068407327665, "tests/common/test_path.py::test_path_conversion[cygpath-UNC5]": 0.00024332059868303676, "tests/common/test_path.py::test_path_conversion[cygpath-UNC6]": 0.0002447978766668415, "tests/common/test_path.py::test_path_conversion[cygpath-UNC7]": 0.00023921110854765223, "tests/common/test_path.py::test_path_conversion[cygpath-cwd0]": 0.00025984251288315417, "tests/common/test_path.py::test_path_conversion[cygpath-cwd1]": 0.0002522408001968971, "tests/common/test_path.py::test_path_conversion[cygpath-cwd2]": 0.000250227257697211, "tests/common/test_path.py::test_path_conversion[cygpath-cwd3]": 0.0002740746055628959, "tests/common/test_path.py::test_path_conversion[cygpath-drive0]": 0.0002427879606702559, "tests/common/test_path.py::test_path_conversion[cygpath-drive10]": 0.0002394307568273516, "tests/common/test_path.py::test_path_conversion[cygpath-drive11]": 0.0002567446705459692, "tests/common/test_path.py::test_path_conversion[cygpath-drive12]": 0.00023828971686832177, "tests/common/test_path.py::test_path_conversion[cygpath-drive13]": 0.00023559288494496265, "tests/common/test_path.py::test_path_conversion[cygpath-drive14]": 0.00023849367656402377, "tests/common/test_path.py::test_path_conversion[cygpath-drive15]": 0.0002516446322953023, "tests/common/test_path.py::test_path_conversion[cygpath-drive1]": 0.0002509869256538445, "tests/common/test_path.py::test_path_conversion[cygpath-drive2]": 0.00024020997370120678, "tests/common/test_path.py::test_path_conversion[cygpath-drive3]": 0.0002378788639722781, "tests/common/test_path.py::test_path_conversion[cygpath-drive4]": 0.00023746413788219088, "tests/common/test_path.py::test_path_conversion[cygpath-drive5]": 0.0002540918765897803, "tests/common/test_path.py::test_path_conversion[cygpath-drive6]": 0.00023346961821789486, "tests/common/test_path.py::test_path_conversion[cygpath-drive7]": 0.0002343874614617371, "tests/common/test_path.py::test_path_conversion[cygpath-drive8]": 0.00024462874220207605, "tests/common/test_path.py::test_path_conversion[cygpath-drive9]": 0.00027403957822397083, "tests/common/test_path.py::test_path_conversion[cygpath-relative0]": 0.00023622587076214092, "tests/common/test_path.py::test_path_conversion[cygpath-relative1]": 0.0002394877804234468, "tests/common/test_path.py::test_path_conversion[cygpath-relative2]": 0.0002416203838393566, "tests/common/test_path.py::test_path_conversion[cygpath-root0]": 0.00024702160829893937, "tests/common/test_path.py::test_path_conversion[cygpath-root10]": 0.0038821826542102937, "tests/common/test_path.py::test_path_conversion[cygpath-root11]": 0.00024719229297739807, "tests/common/test_path.py::test_path_conversion[cygpath-root12]": 0.00023914921944554355, "tests/common/test_path.py::test_path_conversion[cygpath-root13]": 0.000251806376043041, "tests/common/test_path.py::test_path_conversion[cygpath-root14]": 0.00023970695593950977, "tests/common/test_path.py::test_path_conversion[cygpath-root1]": 0.00024328476463584227, "tests/common/test_path.py::test_path_conversion[cygpath-root2]": 0.0002446849076613119, "tests/common/test_path.py::test_path_conversion[cygpath-root3]": 0.00024813116332176867, "tests/common/test_path.py::test_path_conversion[cygpath-root4]": 0.00023997407346132484, "tests/common/test_path.py::test_path_conversion[cygpath-root5]": 0.0002442384400107865, "tests/common/test_path.py::test_path_conversion[cygpath-root6]": 0.0002437212157281349, "tests/common/test_path.py::test_path_conversion[cygpath-root7]": 0.00025551501261683466, "tests/common/test_path.py::test_path_conversion[cygpath-root8]": 0.00024740296334489325, "tests/common/test_path.py::test_path_conversion[cygpath-root9]": 0.0002498225478642402, "tests/common/test_path.py::test_path_conversion[fallback-PATH0]": 0.005028961751227978, "tests/common/test_path.py::test_path_conversion[fallback-PATH10]": 0.005822691231199701, "tests/common/test_path.py::test_path_conversion[fallback-PATH11]": 0.008381471925802984, "tests/common/test_path.py::test_path_conversion[fallback-PATH1]": 0.005975995391436663, "tests/common/test_path.py::test_path_conversion[fallback-PATH2]": 0.005842301783045298, "tests/common/test_path.py::test_path_conversion[fallback-PATH3]": 0.004811543619271321, "tests/common/test_path.py::test_path_conversion[fallback-PATH4]": 0.00832819103131894, "tests/common/test_path.py::test_path_conversion[fallback-PATH5]": 0.005886841201537025, "tests/common/test_path.py::test_path_conversion[fallback-PATH6]": 0.00482657490729548, "tests/common/test_path.py::test_path_conversion[fallback-PATH7]": 0.005841938621526616, "tests/common/test_path.py::test_path_conversion[fallback-PATH8]": 0.008069080671974151, "tests/common/test_path.py::test_path_conversion[fallback-PATH9]": 0.004836915941694595, "tests/common/test_path.py::test_path_conversion[fallback-UNC0]": 0.008436207170236337, "tests/common/test_path.py::test_path_conversion[fallback-UNC1]": 0.008217764647773332, "tests/common/test_path.py::test_path_conversion[fallback-UNC2]": 0.008337940098694614, "tests/common/test_path.py::test_path_conversion[fallback-UNC3]": 0.004760199745917455, "tests/common/test_path.py::test_path_conversion[fallback-UNC4]": 0.005930308305339487, "tests/common/test_path.py::test_path_conversion[fallback-UNC5]": 0.00813254477034929, "tests/common/test_path.py::test_path_conversion[fallback-UNC6]": 0.004701557446289404, "tests/common/test_path.py::test_path_conversion[fallback-UNC7]": 0.00588367018534266, "tests/common/test_path.py::test_path_conversion[fallback-cwd0]": 0.011093642253385503, "tests/common/test_path.py::test_path_conversion[fallback-cwd1]": 0.002488469386519537, "tests/common/test_path.py::test_path_conversion[fallback-cwd2]": 0.0025422842322065393, "tests/common/test_path.py::test_path_conversion[fallback-cwd3]": 0.009733447641554562, "tests/common/test_path.py::test_path_conversion[fallback-drive0]": 0.0059100487220031285, "tests/common/test_path.py::test_path_conversion[fallback-drive10]": 0.010459758067732434, "tests/common/test_path.py::test_path_conversion[fallback-drive11]": 0.0070867323361993965, "tests/common/test_path.py::test_path_conversion[fallback-drive12]": 0.007118131617588151, "tests/common/test_path.py::test_path_conversion[fallback-drive13]": 0.006988093140155602, "tests/common/test_path.py::test_path_conversion[fallback-drive14]": 0.010382765213913004, "tests/common/test_path.py::test_path_conversion[fallback-drive15]": 0.007012359206953517, "tests/common/test_path.py::test_path_conversion[fallback-drive1]": 0.005845603924724629, "tests/common/test_path.py::test_path_conversion[fallback-drive2]": 0.007192636119829384, "tests/common/test_path.py::test_path_conversion[fallback-drive3]": 0.007126919557599856, "tests/common/test_path.py::test_path_conversion[fallback-drive4]": 0.010771635774948786, "tests/common/test_path.py::test_path_conversion[fallback-drive5]": 0.005786926355355946, "tests/common/test_path.py::test_path_conversion[fallback-drive6]": 0.005864773883206502, "tests/common/test_path.py::test_path_conversion[fallback-drive7]": 0.005830501452055883, "tests/common/test_path.py::test_path_conversion[fallback-drive8]": 0.00703026783400341, "tests/common/test_path.py::test_path_conversion[fallback-drive9]": 0.0072152028644003425, "tests/common/test_path.py::test_path_conversion[fallback-relative0]": 0.008085761676737323, "tests/common/test_path.py::test_path_conversion[fallback-relative1]": 0.008038126254979934, "tests/common/test_path.py::test_path_conversion[fallback-relative2]": 0.008040731661244123, "tests/common/test_path.py::test_path_conversion[fallback-root0]": 0.011951891425637805, "tests/common/test_path.py::test_path_conversion[fallback-root10]": 0.004741914080117789, "tests/common/test_path.py::test_path_conversion[fallback-root11]": 0.0059635703491111875, "tests/common/test_path.py::test_path_conversion[fallback-root12]": 0.00819367177286632, "tests/common/test_path.py::test_path_conversion[fallback-root13]": 0.004721163880064471, "tests/common/test_path.py::test_path_conversion[fallback-root14]": 0.005907491468359114, "tests/common/test_path.py::test_path_conversion[fallback-root1]": 0.004843297804050482, "tests/common/test_path.py::test_path_conversion[fallback-root2]": 0.00471514468595782, "tests/common/test_path.py::test_path_conversion[fallback-root3]": 0.0062154914694549515, "tests/common/test_path.py::test_path_conversion[fallback-root4]": 0.00841540113687171, "tests/common/test_path.py::test_path_conversion[fallback-root5]": 0.00467891776044009, "tests/common/test_path.py::test_path_conversion[fallback-root6]": 0.0046589420407410695, "tests/common/test_path.py::test_path_conversion[fallback-root7]": 0.005865668190357153, "tests/common/test_path.py::test_path_conversion[fallback-root8]": 0.008224524543622712, "tests/common/test_path.py::test_path_conversion[fallback-root9]": 0.004884088795702275, "tests/common/test_path.py::test_path_conversion_falsy[None]": 0.001175794124036467, "tests/common/test_path.py::test_path_conversion_falsy[empty dict]": 0.0011514111689393163, "tests/common/test_path.py::test_path_conversion_falsy[empty list]": 0.0011819203568145765, "tests/common/test_path.py::test_path_conversion_falsy[empty set]": 0.001141648361211595, "tests/common/test_path.py::test_path_conversion_falsy[empty tuple]": 0.001165484122178521, "tests/common/test_path.py::test_path_identity": 0.001614874181924951, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]": 0.0012709968126013338, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]": 0.0012984385170681553, "tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]": 0.001250586660300439, "tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]": 0.0013155427287529855, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]": 0.0012527316917055708, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]": 0.0012861534676042736, "tests/common/test_path.py::test_url_to_path_unix": 0.001107236191323422, "tests/common/test_path.py::test_url_to_path_windows_local": 0.0013180262825208148, "tests/common/test_path.py::test_url_to_path_windows_unc": 0.0011213253199752202, "tests/common/test_path.py::test_win_path_backout": 0.0010443791373048515, "tests/common/test_serialize.py::test_comment_round_trip": 0.004338914064490182, "tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]": 0.00139549700129963, "tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]": 0.0013538882399900117, "tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]": 0.001193339144947799, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]": 0.0012158484843292389, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]": 0.0012065219177700888, "tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]": 0.0012234153726784615, "tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]": 0.0011882815828806747, "tests/common/test_serialize.py::test_encode_enum[value0- - disabled\\n-write]": 0.0021530434908220066, "tests/common/test_serialize.py::test_encode_enum[value1- - warn\\n-write]": 0.00147538074782714, "tests/common/test_serialize.py::test_encode_enum[value2- - enabled\\n-write]": 0.00145630744571161, "tests/common/test_serialize.py::test_encode_enum[value3-[\\n \"disabled\"\\n]-write]": 0.0012242091399816855, "tests/common/test_serialize.py::test_encode_enum[value4-[\\n \"warn\"\\n]-write]": 0.0012187284437179058, "tests/common/test_serialize.py::test_encode_enum[value5-[\\n \"enabled\"\\n]-write]": 0.0012553546093906486, "tests/common/test_serialize.py::test_read_write[obj0-{\\n \"a_map\": {\\n \"a_key\": \"a_value\"\\n },\\n \"a_seq\": [\\n 1,\\n 2,\\n 3\\n ]\\n}-read-write0]": 0.0021310650189946866, "tests/common/test_serialize.py::test_read_write[obj1-{\\n \"a_map\": {\\n \"field1\": true,\\n \"field2\": \"yes\"\\n },\\n \"a_seq_1\": [\\n 1,\\n 2,\\n 3\\n ],\\n \"a_seq_2\": [\\n 1,\\n {\\n \"two\": 2\\n },\\n 3\\n ],\\n \"single_bool\": false,\\n \"single_str\": \"no\"\\n}-read-write1]": 0.002217984836105258, "tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\n - 1\\n - 2\\n - 3\\na_map:\\n a_key: a_value\\n-read-write]": 0.00652428345733032, "tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\nsingle_str: no\\na_seq_1:\\n - 1\\n - 2\\n - 3\\na_seq_2:\\n - 1\\n - two: 2\\n - 3\\na_map:\\n field1: true\\n field2: yes\\n-read-write]": 0.011109305097388897, "tests/common/test_toposort.py::test_cycle": 0.0020388428386587387, "tests/common/test_toposort.py::test_cycle_best_effort": 0.001340114296144572, "tests/common/test_toposort.py::test_degenerate": 0.0010393964096396247, "tests/common/test_toposort.py::test_pop_key": 0.0015967238846259135, "tests/common/test_toposort.py::test_python_is_prioritized": 0.0010576016974435962, "tests/common/test_toposort.py::test_simple": 0.002076775081641707, "tests/common/test_url.py::test_add_username_and_pass_to_url": 0.001086949141298883, "tests/common/test_url.py::test_is_ip_address": 0.003467774750786846, "tests/common/test_url.py::test_is_ipv6_address": 0.0011095169999555928, "tests/common/test_url.py::test_is_url": 0.0023003210202181233, "tests/common/test_url.py::test_maybe_add_auth": 0.0032758032868657116, "tests/common/test_url.py::test_split_scheme_auth_token": 0.0010386530194065493, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]": 0.001160087878649354, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]": 0.0011891710317514298, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]": 0.001164811722904094, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]": 0.0011297069203602683, "tests/common/test_url.py::test_url_to_s3_info": 0.0010995540681037245, "tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]": 0.0011980537772875507, "tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]": 0.001185736469761705, "tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]": 0.0012316716004211008, "tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]": 0.0011701589460872475, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error": 0.005887358057833262, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error": 0.009866472452791725, "tests/core/test_envs_manager.py::test_prefix_cli_flag": 0.001984366607644347, "tests/core/test_envs_manager.py::test_register_env_directory_creation_error": 0.0028979123936251345, "tests/core/test_envs_manager.py::test_register_unregister_location_env": 0.006984018778873299, "tests/core/test_envs_manager.py::test_rewrite_environments_txt_file": 0.003728579736355777, "tests/core/test_index.py::TestIndex::test_cache_entries[False]": 0.08427672972730678, "tests/core/test_index.py::TestIndex::test_cache_entries[True]": 0.13593945185500683, "tests/core/test_index.py::TestIndex::test_contains_invalid[False]": 0.07654288333292814, "tests/core/test_index.py::TestIndex::test_contains_invalid[True]": 0.12480844409458727, "tests/core/test_index.py::TestIndex::test_contains_valid[False]": 0.07764470854735617, "tests/core/test_index.py::TestIndex::test_contains_valid[True]": 0.12237411857330933, "tests/core/test_index.py::TestIndex::test_copy[False]": 0.16126036150960943, "tests/core/test_index.py::TestIndex::test_copy[True]": 0.12364995701796602, "tests/core/test_index.py::TestIndex::test_getitem_cache[False]": 0.07677623070886275, "tests/core/test_index.py::TestIndex::test_getitem_cache[True]": 0.12226249576199641, "tests/core/test_index.py::TestIndex::test_getitem_channel[False]": 0.08365111044478851, "tests/core/test_index.py::TestIndex::test_getitem_channel[True]": 0.1324437232964267, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]": 0.09004984664722251, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]": 0.12152451724230505, "tests/core/test_index.py::TestIndex::test_getitem_feature[False]": 0.07560014427703034, "tests/core/test_index.py::TestIndex::test_getitem_feature[True]": 0.12631622532140963, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]": 0.07904093006734868, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]": 0.12289447464030538, "tests/core/test_index.py::TestIndex::test_getitem_prefix[False]": 0.07811727760121367, "tests/core/test_index.py::TestIndex::test_getitem_prefix[True]": 0.17984356901313048, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]": 0.08408512707418599, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]": 0.12395446134005829, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]": 0.08118172891015968, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]": 0.12429899965060794, "tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs": 0.022046557391898865, "tests/core/test_index.py::TestIndex::test_init_prefix_data": 0.02385168407173896, "tests/core/test_index.py::TestIndex::test_init_prefix_path": 0.021734155361632514, "tests/core/test_index.py::TestIndex::test_init_use_local": 0.021176702588521185, "tests/core/test_index.py::TestIndex::test_reduced_index[False]": 0.12523643067525736, "tests/core/test_index.py::TestIndex::test_reduced_index[True]": 0.16771999184179315, "tests/core/test_index.py::test_calculate_channel_urls": 0.0318424189756169, "tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]": 0.022141007303050787, "tests/core/test_index.py::test_dist_str_in_index": 0.043466549735572436, "tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]": 6.347113202533505, "tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]": 0.03384052119938428, "tests/core/test_index.py::test_get_index_platform[linux-64]": 0.0712968774440801, "tests/core/test_index.py::test_get_index_platform[osx-64]": 0.055708989431277556, "tests/core/test_index.py::test_get_index_platform[win-64]": 0.059890909337492575, "tests/core/test_index.py::test_supplement_index_with_system": 0.06601288155510267, "tests/core/test_index.py::test_supplement_index_with_system_archspec": 0.02858659151285032, "tests/core/test_index.py::test_supplement_index_with_system_cuda": 0.0583249060544735, "tests/core/test_index.py::test_supplement_index_with_system_glibc": 0.022389999402441692, "tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]": 0.16640702656105263, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]": 0.07094869752157715, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]": 0.13387037503458513, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]": 0.02588887842221901, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]": 0.02307001034580932, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]": 0.022349295662819593, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]": 0.02402029636597118, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]": 0.02246583227706219, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]": 0.022569576999914985, "tests/core/test_index.py::test_supplement_index_with_system_osx": 0.0002697956601060261, "tests/core/test_initialize.py::test__get_python_info": 0.003777291994494121, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]": 0.005653061429216117, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]": 0.00568129620379955, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]": 0.006515387794383853, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]": 0.006371392122555119, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]": 0.006007910511560375, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]": 0.010748859641547667, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]": 0.005403978687164071, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]": 0.0056644551494338885, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]": 0.005838037447788106, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]": 0.005598645969380118, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]": 0.0057455983429457414, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]": 0.00564257378603824, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]": 0.005618932012526421, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]": 0.005766025878412857, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]": 0.005672568441540328, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]": 0.006230771414230946, "tests/core/test_initialize.py::test_conda_init_dry_run": 0.0299227158020043, "tests/core/test_initialize.py::test_get_python_info": 0.005688945071636156, "tests/core/test_initialize.py::test_init_all": 0.23378676218713382, "tests/core/test_initialize.py::test_init_cmd_exe_registry": 0.0002828220818746247, "tests/core/test_initialize.py::test_init_condabin[init_fish_user]": 0.003995283758302082, "tests/core/test_initialize.py::test_init_condabin[init_powershell_user]": 0.0024762164664460483, "tests/core/test_initialize.py::test_init_condabin[init_sh_system]": 0.0026838532894069584, "tests/core/test_initialize.py::test_init_condabin[init_sh_user]": 0.0030472414498477875, "tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]": 0.002841547194581569, "tests/core/test_initialize.py::test_init_enable_long_path": 0.0002726539671539158, "tests/core/test_initialize.py::test_init_sh_system": 0.047324860678674585, "tests/core/test_initialize.py::test_init_sh_user_tcsh_unix": 0.047302786808613634, "tests/core/test_initialize.py::test_init_sh_user_unix": 0.04991506232554658, "tests/core/test_initialize.py::test_init_sh_user_windows": 0.0002771201561491995, "tests/core/test_initialize.py::test_initialize_dev_bash": 0.062290735184649386, "tests/core/test_initialize.py::test_initialize_dev_cmd_exe": 0.058972437327281954, "tests/core/test_initialize.py::test_install_1": 0.05150812026358905, "tests/core/test_initialize.py::test_install_conda_csh": 0.047015378708083054, "tests/core/test_initialize.py::test_install_conda_fish": 0.04716006465769168, "tests/core/test_initialize.py::test_install_conda_sh": 0.04866767152586647, "tests/core/test_initialize.py::test_install_conda_xsh": 0.047427171348563855, "tests/core/test_initialize.py::test_install_condabin_conda_bat": 0.04658225281557674, "tests/core/test_initialize.py::test_make_entry_point": 0.0496508538779064, "tests/core/test_initialize.py::test_make_entry_point_exe": 0.0025060225183341227, "tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh": 0.0493989534360131, "tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe": 0.04780593243836438, "tests/core/test_initialize.py::test_make_install_plan": 0.002367094428325719, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes": 0.005174055024020417, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes": 0.004980695229317781, "tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes": 0.004742315867081968, "tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes": 0.004833932212965817, "tests/core/test_link.py::test_calculate_change_report_downgrade": 0.003993749484305657, "tests/core/test_link.py::test_calculate_change_report_revised_variant": 0.005238625275394366, "tests/core/test_link.py::test_calculate_change_report_superseded": 0.0018656769598249532, "tests/core/test_link.py::test_calculate_change_report_update": 0.0019810638644914853, "tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format": 0.015732139330443668, "tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2": 0.08599327890183624, "tests/core/test_package_cache_data.py::test_cover_extract_bad_package": 0.05078673245140128, "tests/core/test_package_cache_data.py::test_cover_fetch_not_exists": 6.05322507702741, "tests/core/test_package_cache_data.py::test_cover_get_entry_to_link": 0.004110668023223233, "tests/core/test_package_cache_data.py::test_cover_reverse": 0.0012047611438490752, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata": 0.002661698575093458, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2": 0.0017686827143172325, "tests/core/test_package_cache_data.py::test_download_filename_from_url_basename": 0.003837696869273958, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist": 0.01955018760962429, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only": 0.05504002092282757, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist": 0.012294660789133932, "tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted": 0.09654871243210073, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg": 0.09162792346021166, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg": 0.027094332448026136, "tests/core/test_path_actions.py::test_CompileMultiPycAction_generic": 0.0019365685776182387, "tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python": 1.0748035329793177, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic": 0.001873799315989843, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python": 0.003801898808094305, "tests/core/test_path_actions.py::test_create_file_link_actions": 0.0026386761609881937, "tests/core/test_path_actions.py::test_simple_LinkPathAction_copy": 0.002656948734453513, "tests/core/test_path_actions.py::test_simple_LinkPathAction_directory": 0.002000886163524567, "tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink": 0.0027371410127039002, "tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink": 0.0033508621302734388, "tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang": 0.0018370135939169594, "tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix": 0.0011021252506620996, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space": 0.0010680148720922584, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python": 0.0010810464826748578, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space": 0.0010087391567825139, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python": 0.001020105373955093, "tests/core/test_portability.py::test_replace_simple_shebang_no_replacement": 0.0010555408614081397, "tests/core/test_portability.py::test_shebang_regex_matches": 0.0010500471871304669, "tests/core/test_prefix_data.py::test_api_consistency[conda]": 0.05319772024606215, "tests/core/test_prefix_data.py::test_api_consistency[python]": 0.054687206376234934, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]": 0.0002575006137425727, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]": 0.0002791241821401367, "tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json": 0.0027219054450912305, "tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json": 0.001587979741354511, "tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored": 0.0028778343913073035, "tests/core/test_prefix_data.py::test_empty_environment_package_methods": 0.0024683668975633705, "tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records": 0.001940251200082656, "tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list": 0.08057304002131885, "tests/core/test_prefix_data.py::test_get_environment_env_vars": 0.00245158141154825, "tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability": 6.2157266609406, "tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality": 0.06584177805590828, "tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability": 0.06339442127537011, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]": 0.0020975958258053254, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]": 0.002059903821086175, "tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]": 0.0020275361815053922, "tests/core/test_prefix_data.py::test_method_consistency": 0.055591595409072006, "tests/core/test_prefix_data.py::test_no_tokens_dumped[False]": 0.0037655345122079302, "tests/core/test_prefix_data.py::test_no_tokens_dumped[True]": 0.0039980426176955425, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]": 0.34334709219241966, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]": 0.15699725409522303, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]": 0.006231060944565551, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]": 0.0797557341522702, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]": 1.11353760792081, "tests/core/test_prefix_data.py::test_package_methods_with_mock_data": 0.002341139785014413, "tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages": 0.0024069332922925283, "tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned": 0.004250039449459969, "tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]": 0.31458332285025126, "tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]": 0.0002533621398144787, "tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]": 0.22380303889106437, "tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]": 0.3323006259916676, "tests/core/test_prefix_data.py::test_pip_interop[envpy37win]": 0.00026094243861458227, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]": 0.0018771430608009333, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]": 0.0019421304864403466, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]": 0.001913655938619566, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]": 0.0018383736226962812, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]": 0.001911133168915345, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]": 0.0019001770785558553, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]": 0.0025819053598343817, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]": 0.002580244124215357, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]": 0.002547661771226666, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]": 0.002545953043709068, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]": 0.0025483125965512134, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]": 0.002513343979001191, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]": 0.002560638287866807, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]": 0.0025739912035539292, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]": 0.0025603236486254214, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]": 0.0025303868990624993, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]": 0.0026352558073911244, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]": 0.0025319859386510107, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]": 0.002584457958572013, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]": 0.00270768622765554, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]": 0.0030576982421475856, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]": 0.00269632283837227, "tests/core/test_prefix_data.py::test_prefix_insertion_error": 0.10586809892791366, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars": 0.006824685797565244, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist": 0.0037650575820116065, "tests/core/test_prefix_data.py::test_timestamps": 0.5836487221932606, "tests/core/test_prefix_data.py::test_unset_reserved_env_vars": 0.0040542766288327965, "tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars": 0.0031217950348499932, "tests/core/test_solve.py::test_aggressive_update_packages[classic]": 5.463164036233992, "tests/core/test_solve.py::test_aggressive_update_packages[libmamba]": 4.089878340603789, "tests/core/test_solve.py::test_archspec_call[classic]": 1.604779301274601, "tests/core/test_solve.py::test_archspec_call[libmamba]": 0.8974471082898733, "tests/core/test_solve.py::test_auto_update_conda[classic]": 3.3591081999095507, "tests/core/test_solve.py::test_auto_update_conda[libmamba]": 2.3613152020467085, "tests/core/test_solve.py::test_broken_install[classic]": 4.015334328559323, "tests/core/test_solve.py::test_broken_install[libmamba]": 0.005426304103858004, "tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]": 6.939331247590708, "tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]": 0.7563069573336354, "tests/core/test_solve.py::test_conda_downgrade[classic]": 18.854351140890657, "tests/core/test_solve.py::test_conda_downgrade[libmamba]": 2.4837167030836147, "tests/core/test_solve.py::test_cuda_1[classic]": 0.7711176483631728, "tests/core/test_solve.py::test_cuda_1[libmamba]": 0.630260192145664, "tests/core/test_solve.py::test_cuda_2[classic]": 0.7916783424420836, "tests/core/test_solve.py::test_cuda_2[libmamba]": 0.6526228048737104, "tests/core/test_solve.py::test_cuda_constrain_absent[classic]": 0.7886511165273256, "tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]": 0.5847116565856708, "tests/core/test_solve.py::test_cuda_constrain_sat[classic]": 0.00029987284116154387, "tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]": 0.00028312288514506414, "tests/core/test_solve.py::test_cuda_constrain_unsat[classic]": 0.00030333177176315485, "tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]": 0.0002732610081574025, "tests/core/test_solve.py::test_cuda_fail_1[classic]": 0.8225207166130934, "tests/core/test_solve.py::test_cuda_fail_1[libmamba]": 0.6044817801222215, "tests/core/test_solve.py::test_cuda_fail_2[classic]": 0.7956436779031387, "tests/core/test_solve.py::test_cuda_fail_2[libmamba]": 0.5852334565544951, "tests/core/test_solve.py::test_cuda_glibc_sat[classic]": 0.7831253152497674, "tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]": 0.5740099632049732, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]": 0.0002864067934572796, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]": 0.00025214757085675844, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]": 0.00030416089499044627, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]": 0.00028477461085843383, "tests/core/test_solve.py::test_current_repodata_fallback[classic]": 0.21453615263620224, "tests/core/test_solve.py::test_current_repodata_fallback[libmamba]": 0.21291293833679864, "tests/core/test_solve.py::test_current_repodata_usage[classic]": 0.21972373050562138, "tests/core/test_solve.py::test_current_repodata_usage[libmamba]": 0.21642919224483903, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]": 0.008510455245462088, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]": 0.008105725836918539, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]": 0.008398764645732745, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]": 0.008086972615518205, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]": 0.008746178790305818, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]": 0.0080845263796607, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]": 0.008097219457431826, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]": 0.00787820157978529, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]": 0.008400838431260866, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]": 0.007953027977691717, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]": 0.008315765609421454, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]": 0.008054985701606007, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]": 0.008301891903926538, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]": 0.007870664809988574, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]": 3.7735128460982295, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]": 1.7788649399313883, "tests/core/test_solve.py::test_explicit_conda_downgrade[classic]": 3.364720430965009, "tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]": 2.3367208751826483, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]": 1.1479152586777204, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]": 0.7054068304530164, "tests/core/test_solve.py::test_features_solve_1[classic]": 3.3163024726731316, "tests/core/test_solve.py::test_features_solve_1[libmamba]": 0.2862460466879884, "tests/core/test_solve.py::test_force_reinstall_1[classic]": 1.7668720202451222, "tests/core/test_solve.py::test_force_reinstall_1[libmamba]": 1.590379514133121, "tests/core/test_solve.py::test_force_reinstall_2[classic]": 0.7763146949963409, "tests/core/test_solve.py::test_force_reinstall_2[libmamba]": 0.6019154436627064, "tests/core/test_solve.py::test_force_remove_1[classic]": 3.8713371692519676, "tests/core/test_solve.py::test_force_remove_1[libmamba]": 1.5806330015892402, "tests/core/test_solve.py::test_freeze_deps_1[classic]": 21.20646073943225, "tests/core/test_solve.py::test_freeze_deps_1[libmamba]": 2.8364110439295502, "tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]": 2.2517970592062424, "tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]": 1.2139638482030362, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]": 2.267189862192044, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]": 1.5493138262021857, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]": 4.175970970492058, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]": 1.2529729160526555, "tests/core/test_solve.py::test_no_channels_error[classic]": 0.0076342495509803265, "tests/core/test_solve.py::test_no_channels_error[libmamba]": 0.005811103336073372, "tests/core/test_solve.py::test_no_deps_1[classic]": 3.424682703936342, "tests/core/test_solve.py::test_no_deps_1[libmamba]": 1.727098802327369, "tests/core/test_solve.py::test_no_update_deps_1[classic]": 3.3058815326421147, "tests/core/test_solve.py::test_no_update_deps_1[libmamba]": 2.332363715985464, "tests/core/test_solve.py::test_only_deps_1[classic]": 1.0690079233120566, "tests/core/test_solve.py::test_only_deps_1[libmamba]": 0.5820044731103261, "tests/core/test_solve.py::test_only_deps_2[classic]": 5.11845952102764, "tests/core/test_solve.py::test_only_deps_2[libmamba]": 2.3338855697902328, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]": 0.008235313857493001, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]": 0.008261233962163737, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]": 0.00786044777963537, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]": 0.00794035731412624, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]": 0.008203931298026356, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]": 0.007707012298841572, "tests/core/test_solve.py::test_pinned_1[classic]": 9.953524415543127, "tests/core/test_solve.py::test_pinned_1[libmamba]": 5.7632474620547285, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]": 0.011074638882106113, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]": 0.007677597893080702, "tests/core/test_solve.py::test_pinned_specs_all[classic]": 0.04836664619689635, "tests/core/test_solve.py::test_pinned_specs_all[libmamba]": 0.03652936881528146, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]": 0.00843223730168137, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]": 0.008730221882298349, "tests/core/test_solve.py::test_pinned_specs_condarc[classic]": 0.04746097797575776, "tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]": 0.03687819142680255, "tests/core/test_solve.py::test_priority_1[classic]": 12.4620143209121, "tests/core/test_solve.py::test_priority_1[libmamba]": 1.7122284643826162, "tests/core/test_solve.py::test_prune_1[classic]": 2.0864565171694864, "tests/core/test_solve.py::test_prune_1[libmamba]": 0.7806793787421206, "tests/core/test_solve.py::test_python2_update[classic]": 3.016375784123932, "tests/core/test_solve.py::test_python2_update[libmamba]": 0.828736678717794, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]": 3.899461036715651, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]": 0.4572390191414932, "tests/core/test_solve.py::test_solve_1[libmamba]": 0.8379703755861404, "tests/core/test_solve.py::test_solve_2[classic]": 12.115966523118757, "tests/core/test_solve.py::test_solve_2[libmamba]": 0.005240657952375816, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]": 0.778671750057053, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]": 0.6343420423860602, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]": 0.007933428378236847, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]": 13.0348261068567, "tests/core/test_solve.py::test_timestamps_1[classic]": 0.3001335064895276, "tests/core/test_solve.py::test_timestamps_1[libmamba]": 0.2155627960055313, "tests/core/test_solve.py::test_unfreeze_when_required[classic]": 0.6324188487986628, "tests/core/test_solve.py::test_unfreeze_when_required[libmamba]": 0.7379986587902643, "tests/core/test_solve.py::test_update_all_1[classic]": 3.4963629533652765, "tests/core/test_solve.py::test_update_all_1[libmamba]": 1.7584168292459224, "tests/core/test_solve.py::test_update_deps_1[classic]": 6.432218269755801, "tests/core/test_solve.py::test_update_deps_1[libmamba]": 3.335858601375506, "tests/core/test_solve.py::test_update_deps_2[classic]": 9.487464204567482, "tests/core/test_solve.py::test_update_deps_2[libmamba]": 1.0831413203967273, "tests/core/test_solve.py::test_update_prune_1[classic]": 2.0468445391802494, "tests/core/test_solve.py::test_update_prune_1[libmamba]": 1.163613301126815, "tests/core/test_solve.py::test_update_prune_2[classic]": 2.0118469692219416, "tests/core/test_solve.py::test_update_prune_2[libmamba]": 0.5922585177706494, "tests/core/test_solve.py::test_update_prune_3[classic]": 2.2012343845481412, "tests/core/test_solve.py::test_update_prune_3[libmamba]": 0.5845424134954543, "tests/core/test_solve.py::test_update_prune_4[classic]": 1.9728424780254634, "tests/core/test_solve.py::test_update_prune_4[libmamba]": 1.1750672721514928, "tests/core/test_solve.py::test_update_prune_5[classic-False]": 2.2476843365455785, "tests/core/test_solve.py::test_update_prune_5[classic-True]": 1.892974246501924, "tests/core/test_solve.py::test_update_prune_5[libmamba-False]": 1.1798250190235677, "tests/core/test_solve.py::test_update_prune_5[libmamba-True]": 1.1490075072879211, "tests/core/test_solve.py::test_virtual_package_solver[classic]": 0.7758248279890697, "tests/core/test_solve.py::test_virtual_package_solver[libmamba]": 0.0052380743156958355, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com": 0.0010472456373333294, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io": 0.0010992581384842999, "tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache": 11.190339571457494, "tests/core/test_subdir_data.py::test_metadata_cache_clearing": 0.008518490483622897, "tests/core/test_subdir_data.py::test_metadata_cache_works": 3.0091003237873357, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]": 0.04378858927189704, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]": 0.04643514567971389, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]": 0.136602463114246, "tests/core/test_subdir_data.py::test_repodata_version_error": 0.2812551639117334, "tests/core/test_subdir_data.py::test_search_by_packagerecord": 0.008060681913656892, "tests/core/test_subdir_data.py::test_state_is_not_json": 0.007575715536270585, "tests/core/test_subdir_data.py::test_subdir_data_coverage": 0.015243548938368972, "tests/core/test_subdir_data.py::test_subdir_data_dict_state": 0.0024643260415600486, "tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2": 0.008182183807814039, "tests/core/test_subdir_data.py::test_use_only_tar_bz2": 0.014534707883606522, "tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs": 0.002855280906215675, "tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit": 0.12542178296590706, "tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit": 0.00456389657069817, "tests/env/specs/test_explicit.py::test_can_handle_explicit": 0.0012734830902294103, "tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt": 0.0011586865414013091, "tests/env/specs/test_explicit.py::test_environment": 0.07846647575986768, "tests/env/specs/test_explicit.py::test_no_environment_file": 0.0013192790594654593, "tests/env/specs/test_requirements.py::test_can_not_handle_explicit": 0.0012570422051872468, "tests/env/specs/test_requirements.py::test_environment": 0.0016749965656336382, "tests/env/specs/test_requirements.py::test_no_environment_file": 0.0012130625363388672, "tests/env/specs/test_requirements.py::test_no_name": 0.0012429248804000984, "tests/env/specs/test_requirements.py::test_req_file_and_name": 0.0011420179462102655, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]": 0.001956549782654835, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]": 0.0022259152382552, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]": 0.0014673960211891237, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]": 0.0015121027796587672, "tests/env/specs/test_yaml_file.py::test_filename": 0.001752209157919112, "tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]": 0.001986523770262982, "tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]": 0.0021057949165444985, "tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]": 0.0011258948138393905, "tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]": 0.0017358887969745687, "tests/env/test_create.py::test_create_advanced_pip": 24.71964830860579, "tests/env/test_create.py::test_create_empty_env": 2.7679694881800776, "tests/env/test_create.py::test_create_env_custom_platform": 0.5483160607281969, "tests/env/test_create.py::test_create_env_default_packages": 15.35827871405378, "tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning": 1.2098753560224536, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/env_with_dependencies.yml]": 6.806714372655322, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/home/runner/work/conda/conda/tests/env/support/env_with_dependencies.yml]": 7.891193518413473, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/explicit.txt]": 0.42526147106155376, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/home/runner/work/conda/conda/tests/env/support/explicit.txt]": 0.5124000686674924, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/requirements.txt]": 5.233998648546648, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/home/runner/work/conda/conda/tests/env/support/requirements.txt]": 8.446025306834285, "tests/env/test_create.py::test_create_env_from_non_existent_plugin": 0.034012931040143586, "tests/env/test_create.py::test_create_env_json[example/environment.yml]": 8.53759315966844, "tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]": 8.659128098390426, "tests/env/test_create.py::test_create_env_no_default_packages": 11.941304420644505, "tests/env/test_create.py::test_create_host_port": 0.0003775466701350014, "tests/env/test_create.py::test_create_update": 12.720530294860403, "tests/env/test_create.py::test_create_update_remote_env_file": 9.175706621521648, "tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]": 2.0699679646712155, "tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]": 1.8486617677349768, "tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]": 1.8196686930762083, "tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]": 1.6627954192930594, "tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon": 0.02337427856707321, "tests/env/test_create.py::test_protected_dirs_error_for_env_create": 0.027887417247675787, "tests/env/test_env.py::test_add_channels": 0.0010055958402105155, "tests/env/test_env.py::test_add_pip": 0.002467163680671609, "tests/env/test_env.py::test_args_are_wildcarded": 0.0010433469184142033, "tests/env/test_env.py::test_builds_spec_from_line_raw_dependency": 0.0011442971860068682, "tests/env/test_env.py::test_can_add_dependencies_to_environment": 0.002448911502786478, "tests/env/test_env.py::test_channels_are_provided_by_kwarg": 0.0009973173615181255, "tests/env/test_env.py::test_channels_default_to_empty_list": 0.001002784463698904, "tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']": 0.0013143207283274297, "tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]": 0.0013365792906199106, "tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]": 0.0012115660148396001, "tests/env/test_env.py::test_channels_validation[channels3-None]": 0.0011431400496162427, "tests/env/test_env.py::test_create_and_update_env_with_just_vars": 1.2227501961301361, "tests/env/test_env.py::test_creates_file_on_save": 0.0023471166098150806, "tests/env/test_env.py::test_dependencies_are_empty_by_default": 0.0009927289248358494, "tests/env/test_env.py::test_dependencies_update_after_adding": 0.0018176127288234358, "tests/env/test_env.py::test_dependency_validation[dependencies0]": 0.0011101804427005814, "tests/env/test_env.py::test_dependency_validation[dependencies1]": 0.0010796138936282082, "tests/env/test_env.py::test_dependency_validation[dependencies2]": 0.00109470030956803, "tests/env/test_env.py::test_dependency_validation[dependencies3]": 0.003518799047646534, "tests/env/test_env.py::test_dependency_validation[dependencies4]": 0.0010666251691231977, "tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]": 0.001484895055155662, "tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']": 0.002272347312856946, "tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']": 0.0017071116805264734, "tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]": 0.0013617219207451964, "tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']": 0.001388125098835194, "tests/env/test_env.py::test_empty_deps": 0.001956157224386285, "tests/env/test_env.py::test_env_advanced_pip": 7.197935803972998, "tests/env/test_env.py::test_environment_deprecated": 0.0010082838240885249, "tests/env/test_env.py::test_envvars": 0.00236590355156083, "tests/env/test_env.py::test_from_history": 0.0024747052542163014, "tests/env/test_env.py::test_has_empty_filename_by_default": 0.0010224533135825132, "tests/env/test_env.py::test_has_empty_name_by_default": 0.0010094689305814389, "tests/env/test_env.py::test_has_filename_if_provided": 0.001039690850741311, "tests/env/test_env.py::test_has_name_if_provided": 0.0010006257786775417, "tests/env/test_env.py::test_http": 0.08229468303697184, "tests/env/test_env.py::test_http_raises": 0.0729565776326104, "tests/env/test_env.py::test_invalid_keys": 0.0025460804450826925, "tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']": 0.001238095359134403, "tests/env/test_env.py::test_name_validation[name-None]": 0.0011364434645515613, "tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']": 0.0012738096357875176, "tests/env/test_env.py::test_other_tips_of_dependencies_are_supported": 0.0010497494100377427, "tests/env/test_env.py::test_parses_dependencies_from_raw_file": 0.00175608426610166, "tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']": 0.0011878043612059401, "tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]": 0.0011570731091369777, "tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']": 0.0012804062931471485, "tests/env/test_env.py::test_remove_channels": 0.001009816398287359, "tests/env/test_env.py::test_retains_full_filename": 0.0018687335558067943, "tests/env/test_env.py::test_returns_Environment": 0.001961981759305411, "tests/env/test_env.py::test_to_dict_returns_dictionary_of_data": 0.0012950605135108027, "tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present": 0.0010251517952097771, "tests/env/test_env.py::test_to_yaml_returns_proper_yaml": 0.001619166510100647, "tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string": 0.0025648112519230607, "tests/env/test_env.py::test_to_yaml_takes_stream": 0.0015856593332358687, "tests/env/test_env.py::test_valid_keys": 0.002566117203893796, "tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']": 0.001322096649436941, "tests/env/test_env.py::test_variables_validation[variables1-None]": 0.0011946606036695256, "tests/env/test_env.py::test_variables_validation[variables2-None]": 0.0011287795729781652, "tests/env/test_env.py::test_with_pip": 0.0022873684047224493, "tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]": 0.001620943227577399, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting attrs\\n Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\nInstalling collected packages: attrs\\nSuccessfully installed attrs-19.1.0\\n-expected1]": 0.0012465717962182158, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nCollecting itsdangerous>=0.24 (from flask)\\n Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\nCollecting click>=5.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\nCollecting Werkzeug>=0.15 (from flask)\\n Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\nCollecting Jinja2>=2.10.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\n Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\n-expected2]": 0.0011498356339722413, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\nInstalling collected packages: flask\\nSuccessfully installed flask-1.1.1\\n-expected3]": 0.001172644592940921, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\n]": 0.0010828544273056948, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]": 0.0010945648330170686, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]": 0.001085277428085332, "tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]": 0.0013986394641156477, "tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]": 0.0015927666253414794, "tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]": 0.0013225182046585067, "tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]": 0.0012573172015592439, "tests/gateways/disk/test_delete.py::test_backoff_unlink": 0.046055173196388674, "tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist": 0.0013457862488760776, "tests/gateways/disk/test_delete.py::test_remove_dir": 0.046335725995053395, "tests/gateways/disk/test_delete.py::test_remove_file": 0.0019889283676391054, "tests/gateways/disk/test_delete.py::test_remove_link_to_dir": 0.04680384608275095, "tests/gateways/disk/test_delete.py::test_remove_link_to_file": 0.0016907635481685202, "tests/gateways/disk/test_delete.py::test_rm_rf": 0.046246087194122334, "tests/gateways/disk/test_delete.py::test_rm_rf_couldnt": 0.0013986804997528197, "tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks": 0.09168626985492938, "tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist": 0.04607698195078128, "tests/gateways/disk/test_link.py::test_hard_link": 0.0019330006314231096, "tests/gateways/disk/test_link.py::test_soft_link": 0.002133645000468846, "tests/gateways/disk/test_lock.py::test_LockError_raised": 0.0024773983114817905, "tests/gateways/disk/test_lock.py::test_double_locking_fails": 1.1085114723501615, "tests/gateways/disk/test_lock.py::test_lock_acquired_success": 0.0017549335276479741, "tests/gateways/disk/test_permissions.py::test_make_executable": 0.0013360055253282248, "tests/gateways/disk/test_permissions.py::test_make_writable": 0.003862476015336505, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES": 0.0014951982478031344, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM": 0.0017650148948434665, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS": 0.0014905567545451773, "tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist": 0.0011277443404247524, "tests/gateways/disk/test_permissions.py::test_recursive_make_writable": 0.0071235430177841105, "tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary": 0.022980600080279426, "tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl": 0.029844834292281023, "tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary": 0.0060309734292816, "tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl": 0.005480943894737518, "tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary": 0.038062387726139554, "tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl": 0.04206478308459821, "tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable": 0.0024620937286891484, "tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary": 0.048502201274051325, "tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl": 0.06765131880599798, "tests/gateways/test_connection.py::test_accept_range_none": 0.33580621071492406, "tests/gateways/test_connection.py::test_add_binstar_token": 0.039858977143380776, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]": 0.004918643134444383, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]": 0.005010947605607784, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]": 0.0052448886116076045, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]": 0.005713435446887632, "tests/gateways/test_connection.py::test_get_session_returns_default": 0.0023986121547226995, "tests/gateways/test_connection.py::test_get_session_with_channel_settings": 0.009637213894844591, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple": 0.0051324776833103995, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler": 0.0024412787938638005, "tests/gateways/test_connection.py::test_get_session_with_request_headers": 0.0048865272667685325, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]": 0.006938076821057614, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]": 0.002880637895523879, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]": 0.00523544773141708, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]": 0.003871642791757242, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]": 0.002611912109460186, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]": 0.008984164036751395, "tests/gateways/test_connection.py::test_local_file_adapter_200": 0.01322075887278569, "tests/gateways/test_connection.py::test_local_file_adapter_404": 0.023411153493382048, "tests/gateways/test_connection.py::test_offline[False]": 0.005911878938818698, "tests/gateways/test_connection.py::test_offline[True]": 0.0044275044784096145, "tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers": 0.003544090840726049, "tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers": 0.003093895714772416, "tests/gateways/test_connection.py::test_s3_download_uses_direct_path": 0.10194329620246062, "tests/gateways/test_connection.py::test_s3_server": 0.00030202191741867686, "tests/gateways/test_connection.py::test_s3_server_with_mock": 0.000283497035282789, "tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive": 0.0011203046156084736, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]": 0.0012509762644891888, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]": 0.0011782071938910821, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]": 0.0011956681222687927, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]": 0.001203566347313856, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]": 0.0011802412315945197, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]": 0.0012350338551870706, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]": 0.0011820269911378403, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]": 0.0011456055189061859, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]": 0.001134147808517131, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]": 0.001195419911423012, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]": 0.0011688372562324544, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]": 0.0011586334860938226, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]": 0.0011615042466817124, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]": 0.001158639648962438, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]": 0.001138571146481722, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]": 0.0011307044042954885, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]": 0.0011629138569855394, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]": 0.0011745504240828967, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]": 0.0011205604678774126, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]": 0.0011355259794283, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]": 0.0012482183777602993, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]": 0.0011711181618697078, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]": 0.001155104905819916, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]": 0.0011437231858272248, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]": 0.0011558347801105605, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]": 0.0011489183812755733, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]": 0.0012849442267038101, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]": 0.0012574831748841137, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]": 0.001257003550543072, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]": 0.0012830052345357572, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]": 0.0013196500296469968, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]": 0.001365519124222811, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]": 0.0013262679262830627, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]": 0.001296117559913249, "tests/gateways/test_logging.py::test_token_not_present_in_conda_create": 2.068497941433168, "tests/gateways/test_logging.py::test_token_replace_big_string": 0.001472110931896797, "tests/gateways/test_logging.py::test_token_replace_individual_strings": 0.0011152050950641152, "tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers": 0.0016485086695572442, "tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]": 0.0012427439988850124, "tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]": 0.0013647496740854497, "tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]": 0.0013805146201215255, "tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]": 0.00123866914454442, "tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors": 0.022697833139805276, "tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age": 0.0010854986534304853, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]": 0.006025513737977695, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]": 0.1980557764467702, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]": 0.004247969140913675, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]": 0.006186271988152769, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats": 0.14425147190822815, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror": 0.0027999217306377403, "tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format": 0.0023027758999024117, "tests/gateways/test_repodata_gateway.py::test_save": 0.10366175724084209, "tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message": 0.0013540105079150459, "tests/gateways/test_repodata_gateway.py::test_stale": 0.0168321894202686, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]": 9.390141259127196, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]": 0.39139642601487973, "tests/gateways/test_repodata_lock.py::test_lock_rename": 0.007053410957221837, "tests/gateways/test_repodata_shards.py::test_bytes_cache": 0.0032455768758740803, "tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter": 0.001167432532782116, "tests/gateways/test_streams.py::test_stderr_writes_redacted_text": 0.001333133912602913, "tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output": 0.3151487549381664, "tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output": 0.3152690016833357, "tests/gateways/test_zstd.py::test_download_repodata": 0.014044060475716784, "tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror": 0.07154220145955474, "tests/gateways/test_zstd.py::test_repodata_state": 0.024285666984720594, "tests/gateways/test_zstd.py::test_repodata_use_zst[False]": 0.004449382256109897, "tests/gateways/test_zstd.py::test_repodata_use_zst[True]": 0.004501502616605131, "tests/gateways/test_zstd.py::test_server_available": 0.004507921418597217, "tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd": 0.008591236980708707, "tests/gateways/test_zstd.py::test_zstd_not_404": 0.0036261068858904205, "tests/models/test_channel.py::test_bare_channel_file": 0.0018856327021546735, "tests/models/test_channel.py::test_bare_channel_http": 0.0017289735165227907, "tests/models/test_channel.py::test_basic_multichannel": 0.0017790650246492306, "tests/models/test_channel.py::test_canonicalized_url_gets_correct_token": 0.005593361910250022, "tests/models/test_channel.py::test_channel_alias": 0.007436301445725345, "tests/models/test_channel.py::test_channel_alias_channels": 0.0018265403441800967, "tests/models/test_channel.py::test_channel_alias_w_conda_path": 0.0052194922305203615, "tests/models/test_channel.py::test_channel_alias_w_subhcnnale": 0.005174725779039115, "tests/models/test_channel.py::test_channel_cache": 0.001594603914003044, "tests/models/test_channel.py::test_channel_equality_respects_platform": 0.0019696389413703806, "tests/models/test_channel.py::test_channel_host_port": 0.0016676635548374939, "tests/models/test_channel.py::test_channel_mangles_urls": 0.0018703053243213832, "tests/models/test_channel.py::test_channel_name_subdir_only": 0.001692777843505158, "tests/models/test_channel.py::test_channels_with_dashes": 0.006098213005333299, "tests/models/test_channel.py::test_custom_channels": 0.008223592920102635, "tests/models/test_channel.py::test_custom_channels_port_token_auth": 0.008024140081953608, "tests/models/test_channel.py::test_custom_token_in_channel": 0.005033436051944423, "tests/models/test_channel.py::test_default_channel[None]": 0.001819966750216909, "tests/models/test_channel.py::test_default_channel[win-32]": 0.0017451776316719887, "tests/models/test_channel.py::test_default_channels": 0.007414405354950298, "tests/models/test_channel.py::test_defaults_channel": 0.007433027531478029, "tests/models/test_channel.py::test_env_var_file_urls": 0.0025918216526672573, "tests/models/test_channel.py::test_expanded_variables": 0.0038160870606070824, "tests/models/test_channel.py::test_file_channel": 0.007829272645438043, "tests/models/test_channel.py::test_file_url_with_backslashes": 0.0018024863594307988, "tests/models/test_channel.py::test_file_urls": 0.0017392762775737182, "tests/models/test_channel.py::test_local_channel": 0.05615719613973107, "tests/models/test_channel.py::test_migrated_custom_channels": 0.008262259827252165, "tests/models/test_channel.py::test_multichannel_priority": 0.0018541888396418496, "tests/models/test_channel.py::test_named_custom_channel": 0.007228037455467556, "tests/models/test_channel.py::test_named_custom_channel_w_subchan": 0.007054399610150405, "tests/models/test_channel.py::test_old_channel_alias": 0.00813905999369421, "tests/models/test_channel.py::test_pkgs_main": 0.008626565503786904, "tests/models/test_channel.py::test_pkgs_pro": 0.00858678007205098, "tests/models/test_channel.py::test_ppc64le_vs_ppc64": 0.002126691285891024, "tests/models/test_channel.py::test_prioritize_channels": 0.0018997378742721233, "tests/models/test_channel.py::test_regression_against_unknown_none": 0.0019317911710406183, "tests/models/test_channel.py::test_subdir_env_var": 0.005913783393782711, "tests/models/test_channel.py::test_subdirs_env_var": 0.006407718626503337, "tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform": 0.0018324732033865286, "tests/models/test_channel.py::test_token_in_custom_channel": 0.0020649578328430737, "tests/models/test_channel.py::test_unexpanded_variables": 0.003707770195541935, "tests/models/test_channel.py::test_url_channel_w_platform": 0.0017302202152830828, "tests/models/test_channel.py::test_url_custom_channel": 0.006994971934120516, "tests/models/test_channel.py::test_url_custom_channel_w_subchan": 0.007126012063663551, "tests/models/test_dist.py::test_channel[.conda]": 0.0035216125685162704, "tests/models/test_dist.py::test_channel[.tar.bz2]": 0.002170659649294046, "tests/models/test_dist.py::test_dist[.conda]": 0.010771182899301821, "tests/models/test_dist.py::test_dist[.tar.bz2]": 0.003753964597962999, "tests/models/test_dist.py::test_dist_with_channel_url[.conda]": 0.05520733195698013, "tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]": 0.055731013061261256, "tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]": 0.002236644402681594, "tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]": 0.002087395897274431, "tests/models/test_enums.py::test_noarch_type_coercion[-None]": 0.001188350359427121, "tests/models/test_enums.py::test_noarch_type_coercion[0-None]": 0.0011794742769406909, "tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]": 0.0011444630927702128, "tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]": 0.001223317209867271, "tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]": 0.001123388866021589, "tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]": 0.0011961585047944939, "tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]": 0.0012343231067384092, "tests/models/test_enums.py::test_noarch_type_coercion[False-None0]": 0.0012774877075373357, "tests/models/test_enums.py::test_noarch_type_coercion[False-None1]": 0.0011976918459846643, "tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]": 0.0013647903328050462, "tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]": 0.0012687049161482018, "tests/models/test_enums.py::test_noarch_type_coercion[N-None]": 0.0011355517258187643, "tests/models/test_enums.py::test_noarch_type_coercion[NO-None]": 0.0012154054227753567, "tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]": 0.0012016601711228553, "tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]": 0.0011986562666687621, "tests/models/test_enums.py::test_noarch_type_coercion[No-None]": 0.0012603974809257648, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]": 0.0013201958134044986, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]": 0.0012668999172613972, "tests/models/test_enums.py::test_noarch_type_coercion[Non-None]": 0.001143455263639176, "tests/models/test_enums.py::test_noarch_type_coercion[None-None]": 0.0011924912324101373, "tests/models/test_enums.py::test_noarch_type_coercion[Null-None]": 0.0011784938723686789, "tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]": 0.0011215093119831413, "tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]": 0.001260883896128997, "tests/models/test_enums.py::test_noarch_type_coercion[Off-None]": 0.001130446261838798, "tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]": 0.0011900782230926754, "tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]": 0.0011783410621610294, "tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]": 0.001135869303688962, "tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]": 0.0011523804512831128, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]": 0.0013196185374538452, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]": 0.001225064507984634, "tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]": 0.0011979003606606227, "tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]": 0.001207073936361071, "tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]": 0.0012358185982337872, "tests/models/test_enums.py::test_noarch_type_coercion[\\x00-None]": 0.001253496113803221, "tests/models/test_enums.py::test_noarch_type_coercion[false-None]": 0.0011378535440570564, "tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]": 0.001664331324310089, "tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]": 0.0012161230907867162, "tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]": 0.001575056196896936, "tests/models/test_enums.py::test_noarch_type_coercion[n-None]": 0.001109695907036263, "tests/models/test_enums.py::test_noarch_type_coercion[no-None]": 0.0012630949231465167, "tests/models/test_enums.py::test_noarch_type_coercion[non-None]": 0.0013691099062572507, "tests/models/test_enums.py::test_noarch_type_coercion[none-None]": 0.0011785843752285866, "tests/models/test_enums.py::test_noarch_type_coercion[null-None]": 0.0012635963730431323, "tests/models/test_enums.py::test_noarch_type_coercion[off-None]": 0.0011964683307826556, "tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]": 0.001190679965529735, "tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]": 0.001491126146338867, "tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]": 0.001279130693539364, "tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]": 0.0012844898402146379, "tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]": 0.001474465524566341, "tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]": 0.001232434760402527, "tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]": 0.0012844666865375514, "tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]": 0.0011399778962919687, "tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]": 0.0012680950223528382, "tests/models/test_enums.py::test_noarch_type_coercion[~-None]": 0.0012114565458188158, "tests/models/test_environment.py::test_config_from_cli_channels_behaviors": 0.0017636846375870103, "tests/models/test_environment.py::test_config_from_cli_channels_empty": 0.0010738129416743847, "tests/models/test_environment.py::test_create_environment_missing_required_fields": 0.0010358149677488456, "tests/models/test_environment.py::test_create_invalid_platform": 0.0011276433173445675, "tests/models/test_environment.py::test_create_missing_explicit_package": 0.0018788665721940782, "tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages": 0.0018119191713568507, "tests/models/test_environment.py::test_environment_config_channels_basic": 0.0011626655202902467, "tests/models/test_environment.py::test_environment_config_from_context": 0.011554079575169593, "tests/models/test_environment.py::test_environments_merge": 0.0023404479516338783, "tests/models/test_environment.py::test_environments_merge_colliding_name": 0.0010532422130719256, "tests/models/test_environment.py::test_environments_merge_colliding_platform": 0.0011663039975264395, "tests/models/test_environment.py::test_environments_merge_colliding_prefix": 0.0011457627466065726, "tests/models/test_environment.py::test_environments_merge_explicit_packages": 0.0018304275927540888, "tests/models/test_environment.py::test_explicit_packages": 0.2834034274119459, "tests/models/test_environment.py::test_extrapolate": 5.051077739992068, "tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current": 0.0035028430911843373, "tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli": 0.004747582070417815, "tests/models/test_environment.py::test_from_cli_empty": 0.0020671352039062937, "tests/models/test_environment.py::test_from_cli_empty_with_default_packages": 0.006796887335456601, "tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file": 0.006525490367832846, "tests/models/test_environment.py::test_from_cli_inject_default_packages_override": 0.010608529853683853, "tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs": 0.001987116715464457, "tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels": 0.003144519788404609, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]": 0.002236819130926515, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]": 0.0025545294997366018, "tests/models/test_environment.py::test_from_cli_with_explicit_specs": 0.0029875239495090757, "tests/models/test_environment.py::test_from_cli_with_files": 0.0031017482439928243, "tests/models/test_environment.py::test_from_cli_with_specs": 0.002259460648914824, "tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability": 6.969321062358857, "tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages": 0.8461094059820397, "tests/models/test_environment.py::test_from_prefix_package_population_semantics": 0.9731861313045316, "tests/models/test_environment.py::test_merge_channel_settings": 0.0012316860063347318, "tests/models/test_environment.py::test_merge_configs_channel_order_last_wins": 0.0010739885226338686, "tests/models/test_environment.py::test_merge_configs_deduplicate_values": 0.0011873381601969302, "tests/models/test_environment.py::test_merge_configs_primitive_none_values_order": 0.0011022771328172154, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_one": 0.0010741497622002532, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_two": 0.0010780289908221006, "tests/models/test_match_spec.py::test_bracket_matches": 0.007631039752649479, "tests/models/test_match_spec.py::test_build_glob_merge": 0.009649425066823298, "tests/models/test_match_spec.py::test_build_glob_merge_channel": 0.0049528573704435384, "tests/models/test_match_spec.py::test_build_merge": 0.002066865964889208, "tests/models/test_match_spec.py::test_build_number_and_filename": 0.005165534920954972, "tests/models/test_match_spec.py::test_build_number_merge": 0.0026813541137506, "tests/models/test_match_spec.py::test_canonical_string_forms": 0.0054946540685879616, "tests/models/test_match_spec.py::test_catch_invalid_regexes": 0.00209835628249401, "tests/models/test_match_spec.py::test_channel_matching": 0.0020959518196808813, "tests/models/test_match_spec.py::test_channel_merge": 0.0023322341546776486, "tests/models/test_match_spec.py::test_comment": 0.0016652084768115174, "tests/models/test_match_spec.py::test_conda_build_form[build_only]": 0.0013695826971500884, "tests/models/test_match_spec.py::test_conda_build_form[build_version]": 0.0013640410339391888, "tests/models/test_match_spec.py::test_conda_build_form[name_only]": 0.0012715422532089805, "tests/models/test_match_spec.py::test_conda_build_form[version_only]": 0.0012310230777524151, "tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.0017962173234052697, "tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]": 0.0013078328654891832, "tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.00132684220574754, "tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]": 0.001742918146253377, "tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]": 0.0012829140482552416, "tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]": 0.0013455606956442154, "tests/models/test_match_spec.py::test_conda_env_form_comprehensive": 0.001977769060601742, "tests/models/test_match_spec.py::test_conda_style": 0.0022032324121858265, "tests/models/test_match_spec.py::test_dist": 0.0021468592709332993, "tests/models/test_match_spec.py::test_dist_str": 0.0031549726799826477, "tests/models/test_match_spec.py::test_exact_values": 0.0014692618782695499, "tests/models/test_match_spec.py::test_hash": 0.0013571427410755724, "tests/models/test_match_spec.py::test_hash_merge_with_name[md5]": 0.002097845748239464, "tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]": 0.0021641118649748862, "tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]": 0.0013140806826807533, "tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]": 0.0012933930439236463, "tests/models/test_match_spec.py::test_index_record": 0.002624655340387412, "tests/models/test_match_spec.py::test_invalid": 0.002437659922976938, "tests/models/test_match_spec.py::test_invalid_match_spec": 0.0011407364632144796, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]": 0.001255403167929633, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0=0.13.0,<1.0.0>=py312]": 0.0033811036813599002, "tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms": 0.0002720796414246821, "tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms": 0.001135578070276389, "tests/models/test_match_spec.py::test_license_match": 0.00404720661827428, "tests/models/test_match_spec.py::test_match_1": 0.005097025556734639, "tests/models/test_match_spec.py::test_matchspec_errors": 0.0019379480647320488, "tests/models/test_match_spec.py::test_merge_multiple_name": 0.002263618331546121, "tests/models/test_match_spec.py::test_merge_single_name": 0.003051019036235484, "tests/models/test_match_spec.py::test_no_name_match_spec": 0.0011789564411251825, "tests/models/test_match_spec.py::test_no_triple_equals_roundtrip": 0.0011880692086485393, "tests/models/test_match_spec.py::test_openssl_match": 0.0020346176596650633, "tests/models/test_match_spec.py::test_parse_build_number_brackets": 0.001234969506782882, "tests/models/test_match_spec.py::test_parse_channel_subdir": 0.0017717158836248429, "tests/models/test_match_spec.py::test_parse_equal_equal": 0.0011807527116991766, "tests/models/test_match_spec.py::test_parse_errors": 0.001099822351131231, "tests/models/test_match_spec.py::test_parse_hard": 0.001333503649040598, "tests/models/test_match_spec.py::test_parse_parens": 0.0015517502201905348, "tests/models/test_match_spec.py::test_parse_spec_str_no_brackets": 0.001883184613658706, "tests/models/test_match_spec.py::test_parse_spec_str_tarball_url": 0.0022037434608916336, "tests/models/test_match_spec.py::test_parse_spec_str_with_brackets": 0.0020101931156122146, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]": 0.0018231196168279672, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]": 0.001348389662589374, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]": 0.001216690748837907, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]": 0.0013394040816266117, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]": 0.001329869682707751, "tests/models/test_match_spec.py::test_pip_style2": 0.0015837765695525894, "tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]": 0.0012639971739375909, "tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]": 0.00124841555304496, "tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]": 0.0013073985759341313, "tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]": 0.0012403704216592453, "tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]": 0.001292610549356668, "tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]": 0.001294029216832568, "tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]": 0.0012953861636288862, "tests/models/test_match_spec.py::test_simple[python-python]": 0.0012660374424975755, "tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]": 0.0013174580265015916, "tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]": 0.0012577868375028315, "tests/models/test_match_spec.py::test_star_name": 0.0011006611732323653, "tests/models/test_match_spec.py::test_strictness": 0.00195468565416734, "tests/models/test_match_spec.py::test_subdir_merge": 0.002362609586821895, "tests/models/test_match_spec.py::test_tarball_match_specs": 0.0038733070162251773, "tests/models/test_match_spec.py::test_to_filename": 0.008844162888621629, "tests/models/test_match_spec.py::test_track_features_match": 0.00322936336900154, "tests/models/test_match_spec.py::test_url_percent_encoding": 0.0026997996678087477, "tests/models/test_match_spec.py::test_version_wildcard_serialization": 0.0021138712201484657, "tests/models/test_package_info.py::test_package_info": 0.001826638146688942, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]": 0.9700671281573736, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]": 0.3342801504507547, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]": 0.011395973561961313, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]": 0.007942681209047288, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]": 0.009308500009755328, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]": 0.0068375442541106545, "tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]": 3.3821482581273377, "tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]": 0.2576096388214039, "tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]": 3.433632883157648, "tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]": 0.24562438406583, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]": 3.4625399575866886, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]": 0.2386750516203252, "tests/models/test_prefix_graph.py::test_sort_without_prep[classic]": 4.2508242150309465, "tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]": 1.0853450488597578, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]": 4.51196200495672, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]": 1.2519456934207036, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]": 4.277840556432116, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]": 1.1499360552229463, "tests/models/test_records.py::test_package_record_feature": 0.0018632895029709968, "tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]": 0.001962366737302077, "tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]": 0.0019774268356170343, "tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]": 0.0019583524452810737, "tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]": 0.001964633937234233, "tests/models/test_records.py::test_package_record_spec_strings_vs_str": 0.0017044144536818902, "tests/models/test_records.py::test_package_record_timestamp": 0.0038490166107046715, "tests/models/test_records.py::test_package_virtual_package[123-testbuild]": 0.0019957756433332387, "tests/models/test_records.py::test_package_virtual_package[None-None]": 0.0020167624050878856, "tests/models/test_records.py::test_package_virtual_package[None-testbuild]": 0.002013467605720122, "tests/models/test_records.py::test_prefix_record_no_channel": 0.004774914215046048, "tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]": 0.0017227289184839508, "tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]": 0.00172890746083964, "tests/models/test_records.py::test_requested_spec": 0.09002961571480086, "tests/models/test_version.py::test_compatible_release_versions": 0.0012584565629434677, "tests/models/test_version.py::test_compound_versions": 0.0012380896272872746, "tests/models/test_version.py::test_hexrd": 0.0010385748517334752, "tests/models/test_version.py::test_invalid_version_specs": 0.0013195293596711143, "tests/models/test_version.py::test_local_identifier": 0.0011154151361951385, "tests/models/test_version.py::test_match": 0.002481186715685292, "tests/models/test_version.py::test_not_eq_star": 0.0011944125554996814, "tests/models/test_version.py::test_openssl_convention": 0.0013832059138244375, "tests/models/test_version.py::test_pep440": 0.0018316390108170286, "tests/models/test_version.py::test_pep_440_arbitrary_equality_operator": 0.0010743376901686987, "tests/models/test_version.py::test_ver_eval": 0.0014313007910117103, "tests/models/test_version.py::test_ver_eval_errors": 0.0011195671944863247, "tests/models/test_version.py::test_version_order": 0.002210327334270852, "tests/models/test_version.py::test_version_spec_1": 0.0011639982071573417, "tests/models/test_version.py::test_version_spec_2": 0.0012129030374997437, "tests/models/test_version.py::test_version_spec_3": 0.0010431786955562945, "tests/models/test_version.py::test_version_spec_4": 0.0011609742555367282, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]": 0.003140796023810302, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]": 0.004890813495110545, "tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches": 0.0030013157776178166, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]": 0.002842242237761559, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]": 0.002659566944029237, "tests/notices/test_core.py::test__conda_user_story__disable_notices": 0.007237358545139486, "tests/notices/test_core.py::test__conda_user_story__more_notices_message": 0.11296187601534852, "tests/notices/test_core.py::test__conda_user_story__only_see_once": 0.1110418648282137, "tests/notices/test_core.py::test_display_notices_happy_path[200]": 0.2158778222507555, "tests/notices/test_core.py::test_display_notices_happy_path[404]": 0.2104485847340403, "tests/notices/test_core.py::test_display_notices_happy_path[500]": 0.21139688732371242, "tests/notices/test_core.py::test_notices_decorator": 0.11089697854008608, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]": 0.21003291648376907, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]": 0.20909027677981595, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]": 0.20725342961671742, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]": 0.20858429350341004, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]": 0.2069850379234252, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests": 0.20867685504930353, "tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json": 0.1050747096511451, "tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error": 0.10498633233554262, "tests/notices/test_fetch.py::test_notice_response_cache_expired": 0.0018458645198368192, "tests/notices/test_types.py::test_channel_notice_response": 0.0011864921426525856, "tests/notices/test_types.py::test_channel_notice_response_date_parse_error": 0.0016782509197090026, "tests/notices/test_types.py::test_channel_notice_response_integer_id": 0.0010432724323510168, "tests/notices/test_types.py::test_channel_notice_undefined_id": 0.0011162445755155837, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer": 0.0017796650641840382, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list": 0.0028551965252876974, "tests/plugins/reporter_backends/test_console.py::test_prompt": 0.0016252179944359821, "tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option": 0.0016701477847717871, "tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin": 0.0024748742906752228, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner": 0.0012693130701389077, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error": 0.001243961377112522, "tests/plugins/reporter_backends/test_console.py::test_spinner": 0.102102247473099, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_error": 0.10205817289541702, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe": 0.00773251814772371, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error": 0.003131643221081877, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno": 0.007568242940185624, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error": 0.0023479985899808415, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe": 0.0022279899125284596, "tests/plugins/reporter_backends/test_json.py::test_json_handler": 0.001180370335157165, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled": 0.0020899152784734257, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled": 0.0017456398167361685, "tests/plugins/reporter_backends/test_json.py::test_json_spinner": 0.0012440408520653086, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]": 0.008657165350999776, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]": 0.009535203323473431, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]": 0.00329124028981593, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]": 0.002989412466809571, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]": 0.0034835805058713357, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]": 0.0068658262953970265, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]": 0.002404846060003521, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]": 0.002390883091900536, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]": 0.002696293475756652, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]": 0.005175069120142177, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]": 0.0024127461060171724, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]": 0.003526401979717731, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]": 0.002715992455724104, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]": 0.0027614702361047766, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]": 0.0026665530110683055, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]": 0.0027120541254639845, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]": 0.002518502269037275, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]": 0.0032277136441688703, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails": 0.10369569948895721, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose": 0.30205653070714944, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes": 0.6060071524827679, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met": 0.20432586090696925, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]": 0.003999230504615518, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]": 0.0030188409399960624, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]": 0.003455769376845879, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]": 0.003493574077095047, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]": 0.0030534400942262814, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]": 0.0032164976672391953, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]": 0.002977075260048618, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]": 0.00316204194772559, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported": 1.5834779630765463, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]": 1.8839667481772173, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]": 1.7906944134812508, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]": 0.002485425979830969, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]": 0.0026256022773942906, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]": 0.0028063491479998746, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]": 0.002732391388065334, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]": 0.0027981753619838175, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]": 0.002776869362710711, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]": 0.0025855736623510554, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]": 0.0025824403132809035, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]": 0.002673883339139183, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]": 0.002627767127002577, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]": 0.0026905438914511955, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]": 0.002670397049400674, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\"conda\"-\\u274c]": 0.029009019421978678, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\u2705]": 0.03400912484595205, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\u274c]": 0.028414016202444034, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\u2705]": 0.028718231849728187, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\u274c]": 0.029400772331914134, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]": 6.08718435587324, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]": 6.080610206520864, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]": 0.0030513809349132265, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]": 0.003055997891788264, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]": 0.003800630607112685, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]": 0.0038822840957120153, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run": 0.03403644917143552, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes": 0.03172615619961557, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path": 1.5633273283077638, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help": 0.020589761175228285, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose": 1.569635404950127, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list": 0.02555695708653377, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check": 0.025697788871249846, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment": 0.035590945104814246, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment": 0.027588303934239188, "tests/plugins/test_auth_handlers.py::test_duplicated": 0.003958440011922613, "tests/plugins/test_auth_handlers.py::test_get_auth_handler": 0.0035395353783516667, "tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple": 0.004830092936640934, "tests/plugins/test_config.py::test_plugin_config_data_env_var_source": 0.0010884816020480372, "tests/plugins/test_config.py::test_plugin_config_data_file_source": 0.0029164880356924335, "tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values": 0.0010841272117510317, "tests/plugins/test_config.py::test_plugin_config_from_file": 0.0038196879286863136, "tests/plugins/test_config.py::test_plugin_describe_parameters": 0.0018777387309314047, "tests/plugins/test_config.py::test_plugins_config_from_environment": 0.0020441270889845365, "tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect": 0.002807879675082664, "tests/plugins/test_env_specs.py::test_alias_normalization": 0.0012365894306605783, "tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]": 0.001142300137945055, "tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]": 0.0011252822399544376, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]": 0.002548484570623421, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]": 0.0025654582378851205, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]": 0.002916148735165392, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]": 0.002532312558263442, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]": 0.004008450048033137, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]": 0.00422019490515826, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]": 0.003572096227254564, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]": 0.0036735052805150193, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]": 0.0036319349901541417, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error": 0.004140297463677919, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard": 0.00506857196120218, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback": 0.0036586177277967, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents": 0.005128553647310562, "tests/plugins/test_env_specs.py::test_detect_spec_with_aliases": 0.004665990260126761, "tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered": 0.002475282937189776, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]": 0.0011854625241260323, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]": 0.0011538724697177127, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]": 0.001246185874671146, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]": 0.0012434651611783903, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]": 0.0011351324114890833, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]": 0.0011450908273881715, "tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin": 0.002394680503881988, "tests/plugins/test_env_specs.py::test_get_spec_by_aliases": 0.002506990563662402, "tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection": 0.0026697749883478807, "tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors": 0.0027472794996696932, "tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers": 0.0028560634486724727, "tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename": 0.004011444259338756, "tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable": 0.006783942253477301, "tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled": 0.0025628666892703123, "tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found": 0.002344776600940683, "tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist": 0.002368201317589712, "tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection": 0.001137195057386121, "tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls": 0.007702124130126209, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]": 0.007073762814142505, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]": 0.007233274840786645, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]": 0.006939301857703403, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]": 0.00709932848999239, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]": 0.007165048719285125, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]": 0.007345312487532369, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]": 0.008255164162565474, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]": 0.007137328017199476, "tests/plugins/test_environment_export.py::test_builtin_requirements_exporter": 0.007145751654147254, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]": 0.007374304548130625, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]": 0.008985113753476048, "tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]": 0.2952677794926692, "tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]": 0.34812802864279, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]": 0.007330674701836435, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]": 0.00720165735263874, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]": 0.007048724710085001, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]": 0.007003445498711079, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]": 0.00689125237091269, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]": 0.0072331648202266195, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]": 0.00704304957479446, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]": 0.0070208163982552856, "tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern": 0.007680056498828682, "tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error": 0.007855610157522626, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]": 0.007169175505589483, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]": 0.007843462298440478, "tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility": 0.007221001427813763, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]": 0.007033773391748141, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]": 0.007061152285404759, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]": 0.006925040359045739, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]": 0.006958747535891723, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]": 0.007019096620561143, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]": 0.0072312329283756496, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]": 0.007984607569834538, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]": 0.007218060241993214, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]": 0.0069860185479953575, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]": 0.0069258761325215615, "tests/plugins/test_environment_export.py::test_get_environment_exporters": 0.007074213662117938, "tests/plugins/test_environment_export.py::test_multi_platform_export": 0.009470886913899697, "tests/plugins/test_environment_export.py::test_only_one_export[both]": 0.0014438220576413188, "tests/plugins/test_environment_export.py::test_only_one_export[export]": 0.0012961390884347588, "tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]": 0.001269917906620938, "tests/plugins/test_environment_export.py::test_only_one_export[none]": 0.001539914769866601, "tests/plugins/test_environment_export.py::test_single_platform_export": 0.008414334384876798, "tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format": 0.014872226984112879, "tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name": 0.00783972543323287, "tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env": 0.008132858101480678, "tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning": 0.024089170876621883, "tests/plugins/test_health_checks.py::test_health_check_not_ran": 0.031085204751653203, "tests/plugins/test_health_checks.py::test_health_check_ran": 0.024948907153475655, "tests/plugins/test_hookspec.py::test_deprecations[spec_name]": 0.001248463239831092, "tests/plugins/test_manager.py::test_custom_plugin_name_validation": 0.0033152718439218454, "tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]": 0.003059067386415095, "tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]": 0.0023359902803887886, "tests/plugins/test_manager.py::test_get_canonical_name_class": 0.0019486435594184134, "tests/plugins/test_manager.py::test_get_canonical_name_instance": 0.005196697434954729, "tests/plugins/test_manager.py::test_get_canonical_name_module": 0.0027550128956217806, "tests/plugins/test_manager.py::test_get_canonical_name_object": 0.0023748077132736824, "tests/plugins/test_manager.py::test_get_hook_results": 0.003015771010526702, "tests/plugins/test_manager.py::test_get_request_headers": 0.0022268811317900524, "tests/plugins/test_manager.py::test_get_session_headers": 0.002038151608910729, "tests/plugins/test_manager.py::test_get_solvers": 0.0021083556266642553, "tests/plugins/test_manager.py::test_get_virtual_package_records": 0.0031434409123704014, "tests/plugins/test_manager.py::test_known_solver": 0.002109662714618995, "tests/plugins/test_manager.py::test_load_entrypoints_blocked": 0.006863841008557089, "tests/plugins/test_manager.py::test_load_entrypoints_importerror": 0.00833052864416706, "tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror": 0.009917473537223706, "tests/plugins/test_manager.py::test_load_entrypoints_success": 0.008641454316930062, "tests/plugins/test_manager.py::test_load_plugins_error": 0.0023175647741179813, "tests/plugins/test_manager.py::test_load_two_plugins_one_impls": 0.0022292107889819515, "tests/plugins/test_manager.py::test_load_without_plugins": 0.0020415803554087726, "tests/plugins/test_manager.py::test_plugin_bad_names[42]": 0.0034127478525186675, "tests/plugins/test_manager.py::test_plugin_bad_names[False]": 0.001148867007035155, "tests/plugins/test_manager.py::test_plugin_bad_names[None]": 0.006170085738694474, "tests/plugins/test_manager.py::test_plugin_bad_names[True]": 0.0012135779047493809, "tests/plugins/test_manager.py::test_plugin_bad_names[name4]": 0.0011153240422426493, "tests/plugins/test_manager.py::test_plugin_bad_names[name5]": 0.0011108055061223045, "tests/plugins/test_manager.py::test_plugin_name": 0.0010508518258242933, "tests/plugins/test_manager.py::test_unknown_solver": 0.0020810363539942897, "tests/plugins/test_package_extractors.py::test_extract_package": 0.005541769725609265, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]": 0.0012250787063778374, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]": 0.0012411320324378242, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]": 0.00123821853301981, "tests/plugins/test_package_extractors.py::test_get_package_extractors": 0.0027374832041621873, "tests/plugins/test_package_extractors.py::test_has_package_extension[-None]": 0.0028376806629606967, "tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]": 0.008039652400118615, "tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]": 0.0029931738701622773, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]": 0.0027596656358788297, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]": 0.0029258320792655986, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]": 0.0027573898498289007, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]": 0.0028928308552200947, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]": 0.0031275876249067507, "tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor": 0.0036253138571618834, "tests/plugins/test_post_commands.py::test_post_command_action_raises_exception": 0.0261281986198382, "tests/plugins/test_post_commands.py::test_post_command_invoked": 0.02917311909433356, "tests/plugins/test_post_commands.py::test_post_command_not_invoked": 0.027783524447364625, "tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception": 4.813503484367214, "tests/plugins/test_post_solves.py::test_post_solve_invoked": 6.501516248409027, "tests/plugins/test_post_solves.py::test_post_solve_not_invoked": 0.03481313893802338, "tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception": 0.023157563208427386, "tests/plugins/test_pre_commands.py::test_pre_command_invoked": 0.03409303570354869, "tests/plugins/test_pre_commands.py::test_pre_command_not_invoked": 0.028443418560671632, "tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception": 0.026555750380309304, "tests/plugins/test_pre_solves.py::test_pre_solve_invoked": 2.140591070266868, "tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked": 0.036218044107685456, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\n test : something\\n\\n]": 0.002608380977922479, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\n \"test\": \"something\"\\n}]": 0.002635872646253533, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\n]": 0.0033070115136033785, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\"test\"]": 0.0024891659416664026, "tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered": 0.002760552666995777, "tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered": 0.004062902716276539, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]": 0.002341090371731184, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]": 0.0024193562921693084, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com]": 0.0023024275329028183, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]": 0.002812841844347929, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com]": 0.0023168042387762943, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]": 0.00237568770246913, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]": 0.002435435771244816, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com]": 0.002483146624452604, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]": 0.0026630815254310067, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com]": 0.0023484983218261934, "tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings": 0.06280620111759669, "tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins": 0.06150207685389442, "tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting": 0.025686365735369754, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]": 0.03336052165365844, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]": 0.032180724383257274, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]": 0.03084897454377199, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\n map_parameter: {}\\n]": 0.050714658117211264, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]": 0.060060256313357624, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\n seq_parameter: []\\n]": 0.05529893393584578, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\n string_parameter: value_one\\n]": 0.061058587872314864, "tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings": 0.10591635695869958, "tests/plugins/test_settings.py::test_conda_config_with_invalid_setting": 0.024066861436837263, "tests/plugins/test_settings.py::test_conda_config_with_map_settings": 0.08401385478322333, "tests/plugins/test_settings.py::test_conda_config_with_sequence_settings": 0.07894639002214182, "tests/plugins/test_settings.py::test_conda_config_with_string_settings": 0.07007965609249633, "tests/plugins/test_settings.py::test_get_settings": 0.002285742243511066, "tests/plugins/test_settings.py::test_load_configuration_parameters": 0.002570390449441786, "tests/plugins/test_settings.py::test_load_plugin_config_with_env_var": 0.005572524150508117, "tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc": 0.006329172338350969, "tests/plugins/test_solvers.py::test_duplicated": 0.0025405875447330204, "tests/plugins/test_solvers.py::test_get_cached_solver_backend": 0.004473316646839541, "tests/plugins/test_solvers.py::test_get_conflicting_solvers": 0.0025506340833145974, "tests/plugins/test_solvers.py::test_get_no_solver": 0.0020285879393753094, "tests/plugins/test_solvers.py::test_get_one_solver": 0.002166555514487892, "tests/plugins/test_solvers.py::test_get_solver_backend": 0.005605648721941495, "tests/plugins/test_solvers.py::test_get_solver_backend_multiple": 0.005902774925234382, "tests/plugins/test_solvers.py::test_get_two_solvers": 0.0022912429451301844, "tests/plugins/test_solvers.py::test_solver_user_agent": 0.005535777211275141, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]": 0.04090860562093447, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]": 0.029239857030719685, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]": 0.021219656367344984, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]": 0.02146773666402869, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]": 0.02264419689764268, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]": 0.02485319633020946, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]": 0.022310556697069345, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]": 0.021218287533595892, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]": 0.021525559798109196, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]": 0.021674298291066582, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]": 0.023564641365331387, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]": 0.02685619244883999, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]": 0.023358364379417948, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]": 0.03007034224790643, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]": 0.02204998172395464, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]": 0.028534670080703015, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]": 0.026295076767960692, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]": 0.02103226333620565, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]": 0.022663573778118278, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]": 0.028418654573657453, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]": 0.03662696164296597, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]": 0.029659630445542692, "tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser": 0.024534630247124607, "tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser": 0.023394260799787955, "tests/plugins/test_subcommands.py::test_duplicated": 0.002430373592859174, "tests/plugins/test_subcommands.py::test_help": 0.03603987856955913, "tests/plugins/test_subcommands.py::test_invoked": 0.02772845107365046, "tests/plugins/test_subcommands.py::test_parser_no_plugins": 0.031735806154415194, "tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception": 0.3582841457529259, "tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception": 0.3186288046498971, "tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked": 0.3136877111971196, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields": 0.0010763206002121933, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name": 0.0010373985466732986, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved": 0.001040049005830144, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields": 0.0011260399216404245, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name": 0.0011626107967821421, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved": 0.0010806877617636032, "tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]": 0.30853914204056454, "tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]": 0.19699790159362893, "tests/plugins/test_virtual_packages.py::test_conda_virtual_package": 0.002785902361122927, "tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]": 0.0041169997457802905, "tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]": 0.0025591935939598526, "tests/plugins/test_virtual_packages.py::test_cuda_detection": 0.3032272908410466, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]": 0.004762836460576934, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]": 0.005601453355753958, "tests/plugins/test_virtual_packages.py::test_duplicated": 4.839832046939496, "tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]": 0.0066675930606491995, "tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]": 0.006539210956964426, "tests/plugins/test_virtual_packages.py::test_invoked": 5.9452894973323005, "tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]": 0.006899805019821287, "tests/plugins/test_virtual_packages.py::test_linux_override[None-True]": 0.1193853779737216, "tests/plugins/test_virtual_packages.py::test_linux_value": 0.0065598474596888735, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda": 0.6063622050082899, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched": 0.0011821964347124253, "tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]": 0.007003104492070285, "tests/plugins/test_virtual_packages.py::test_osx_override[None-False]": 0.006151386429709699, "tests/plugins/test_virtual_packages.py::test_osx_value": 0.006143281335484862, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]": 0.002327003566119434, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]": 0.0023701068928524186, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]": 0.004142371984564389, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]": 0.00307509161610191, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override]": 0.002373248363613671, "tests/plugins/test_virtual_packages.py::test_override_package_values[no override]": 0.002791916193666639, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]": 0.0023226687852042484, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override]": 0.002405317751067874, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]": 0.0016767975296044474, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]": 0.001700063374864316, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]": 0.002355188420014896, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]": 0.0017770220904296575, "tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]": 0.006334335584197665, "tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]": 0.006398686527003692, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]": 0.0062925977417356066, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]": 0.006291737597333288, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]": 0.0061584190247832475, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]": 0.006178857331186172, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]": 0.006232094885345593, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]": 0.006425255412689165, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]": 0.006154646136678037, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]": 0.006130153114370423, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]": 0.006212856676634051, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]": 0.00646282830653868, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]": 0.007269957525050506, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]": 0.006160455773267385, "tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]": 0.0058837849499934645, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]": 0.006552387319234924, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]": 0.006421763449775233, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]": 0.006408226686590777, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]": 0.006292570758195753, "tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]": 0.005910035487778591, "tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]": 0.0022638765499623896, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]": 0.002267747711924836, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]": 0.0021945885122941957, "tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]": 0.006255189395149984, "tests/plugins/test_virtual_packages.py::test_win_override[None-False]": 0.006177566314961039, "tests/plugins/test_virtual_packages.py::test_win_value": 0.006140888888268016, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]": 0.0002757190412895318, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]": 0.00025838875186655813, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]": 0.0002832489308187234, "tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]": 0.0002705915251375697, "tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]": 0.0002100938148262062, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]": 0.0002476156592806238, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]": 0.00024767330531057756, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]": 0.00025088142546866995, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]": 0.0002528342474169891, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]": 0.00025104378611371585, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]": 0.0002450238883538847, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]": 0.00024753792932958994, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]": 0.00024695537275057426, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]": 0.00024811070809053863, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]": 0.00024230523124972803, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]": 0.0002433672548136881, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]": 0.00026109494242533495, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]": 0.00024363986609416313, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]": 0.00024142377764380045, "tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]": 0.0002492265876684566, "tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]": 0.00034765167343097806, "tests/shell/test_csh.py::test_basic_integration[csh]": 0.00026606820987754525, "tests/shell/test_csh.py::test_basic_integration[tcsh]": 4.699908986279592, "tests/shell/test_csh.py::test_shell_available[csh]": 0.00025060446887427895, "tests/shell/test_csh.py::test_shell_available[tcsh]": 0.001651443656605567, "tests/shell/test_fish.py::test_fish_basic_integration[fish]": 3.935855452088874, "tests/shell/test_fish.py::test_fish_disable_prompt": 0.007372131926298451, "tests/shell/test_fish.py::test_fish_prompt_functions_in_hook": 0.010246625259295447, "tests/shell/test_fish.py::test_shell_available[fish]": 0.0014935453450713103, "tests/shell/test_posix.py::test_bash_activate_error[ash]": 2.9750617333485665, "tests/shell/test_posix.py::test_bash_activate_error[bash]": 2.9861894456572036, "tests/shell/test_posix.py::test_bash_activate_error[dash]": 2.996701037908551, "tests/shell/test_posix.py::test_bash_activate_error[zsh]": 2.987968679812541, "tests/shell/test_posix.py::test_basic_integration[ash]": 11.658359650516354, "tests/shell/test_posix.py::test_basic_integration[bash]": 11.801596251834567, "tests/shell/test_posix.py::test_basic_integration[dash]": 11.736583497798055, "tests/shell/test_posix.py::test_basic_integration[zsh]": 11.730960503499771, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]": 0.0003074748927198717, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]": 4.184030042596123, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]": 0.00028503156073865775, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]": 4.182428865787616, "tests/shell/test_posix.py::test_shell_available[ash]": 0.0013666134315093539, "tests/shell/test_posix.py::test_shell_available[bash]": 0.0013848119969013901, "tests/shell/test_posix.py::test_shell_available[dash]": 0.0014527073033926705, "tests/shell/test_posix.py::test_shell_available[zsh]": 0.0014686696766583699, "tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]": 6.718555618370897, "tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]": 10.738129188602004, "tests/shell/test_powershell.py::test_shell_available[powershell]": 0.0016986388569618374, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]": 3.115387239814177, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]": 2.8898112117362484, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]": 0.0003132335716917123, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]": 2.908230849850572, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]": 3.240766943324675, "tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]": 4.9600775339760235, "tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]": 4.93731091753176, "tests/shell/test_shell.py::test_stacking[0-None-not-sys]": 4.164443413529032, "tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]": 4.080903008686615, "tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]": 4.3601758982140835, "tests/shell/test_shell.py::test_stacking[0-base-not-sys]": 4.194962187123114, "tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]": 4.0339091281648765, "tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]": 4.025143777449183, "tests/shell/test_shell.py::test_stacking[0-has-not-sys]": 4.026235856045398, "tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]": 4.026024007172485, "tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]": 4.0312394049302736, "tests/shell/test_shell.py::test_stacking[0-not-not-sys]": 4.021571663660164, "tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,base,sys]": 4.407488425479541, "tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]": 4.4149899020132874, "tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]": 4.43313697703368, "tests/shell/test_shell.py::test_stacking[5-base,not-base-base,base,sys]": 4.45043732585711, "tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]": 4.424022261452375, "tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]": 4.41510036626028, "tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]": 4.00402932244562, "tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]": 4.028904493164292, "tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]": 4.037864627066369, "tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]": 4.021456022334337, "tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]": 4.048229010648598, "tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]": 4.006034742105938, "tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]": 3.999007177292978, "tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]": 4.024649452762144, "tests/shell/test_shell.py::test_stacking[5-not-not-sys]": 4.027052465729626, "tests/shell/test_xonsh.py::test_basic_integration[xonsh]": 6.768625867986829, "tests/shell/test_xonsh.py::test_shell_available[xonsh]": 0.0014010592556677878, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]": 0.00037560305398327, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]": 0.00029509809083560985, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]": 0.0002517524953495725, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]": 0.00026915956592870455, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]": 0.0002669085214057023, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]": 0.0027662931274000037, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]": 0.00024617956347299967, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]": 0.0002512659174695968, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]": 0.00028147543153198435, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]": 0.0002567493429967707, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]": 0.0002527314147512803, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]": 0.0003626737309965369, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]": 0.00025865057569770264, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]": 0.00026511763348026476, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]": 0.00024775526780844957, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]": 0.0002538737180401641, "tests/test_activate.py::test_PS1": 0.01257637144100282, "tests/test_activate.py::test_PS1_no_changeps1": 0.00986341999616107, "tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env": 0.06580752272534651, "tests/test_activate.py::test_activate_default_env[CmdExeActivator]": 1.2217187317888216, "tests/test_activate.py::test_activate_default_env[CshActivator]": 1.209510349036802, "tests/test_activate.py::test_activate_default_env[FishActivator]": 1.2091160206730813, "tests/test_activate.py::test_activate_default_env[PosixActivator]": 1.217969950150427, "tests/test_activate.py::test_activate_default_env[PowerShellActivator]": 1.2063337446156217, "tests/test_activate.py::test_activate_default_env[XonshActivator]": 1.2116621335721431, "tests/test_activate.py::test_activate_environment_not_found": 0.005603471233807239, "tests/test_activate.py::test_activate_same_environment": 0.0068309284502825855, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]": 0.004931348635818913, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]": 0.00490800366124057, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\n\\\\['env-one', 'env-two'\\\\]\\n]": 0.004892130398672467, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\nremainder_args: \\\\['env-one']\\n]": 0.004841350732439253, "tests/test_activate.py::test_add_prefix_to_path_cmdexe": 0.000275128564505309, "tests/test_activate.py::test_add_prefix_to_path_posix": 0.0044025462068980215, "tests/test_activate.py::test_build_activate_dont_activate_unset_var": 0.006947657436790896, "tests/test_activate.py::test_build_activate_dont_use_PATH": 0.006617192105197718, "tests/test_activate.py::test_build_activate_restore_unset_env_vars": 0.007720130086511404, "tests/test_activate.py::test_build_activate_shlvl_0": 0.006682712353841829, "tests/test_activate.py::test_build_activate_shlvl_1": 0.00852596766826539, "tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars": 0.007081175283984594, "tests/test_activate.py::test_build_deactivate_dont_use_PATH": 0.0073770535363994905, "tests/test_activate.py::test_build_deactivate_shlvl_1": 0.006547875390013069, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate": 0.0073018133379556234, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack": 0.0073430594517387045, "tests/test_activate.py::test_build_stack_shlvl_1": 0.008413003405107788, "tests/test_activate.py::test_cmd_exe_basic[False]": 0.00026051166801541105, "tests/test_activate.py::test_cmd_exe_basic[True]": 0.00027432360648541705, "tests/test_activate.py::test_csh_basic[False]": 0.014299691431751107, "tests/test_activate.py::test_csh_basic[True]": 0.015241886273125184, "tests/test_activate.py::test_default_env": 0.005257179891366992, "tests/test_activate.py::test_fish_basic[False]": 0.013929954346395565, "tests/test_activate.py::test_fish_basic[True]": 0.013989380172300215, "tests/test_activate.py::test_force_uppercase[False]": 0.007737206699364419, "tests/test_activate.py::test_force_uppercase[True]": 0.008033648832415126, "tests/test_activate.py::test_get_env_vars_big_whitespace": 0.0057596095654869435, "tests/test_activate.py::test_get_env_vars_empty_file": 0.005647867085822008, "tests/test_activate.py::test_get_export_unset_vars[False]": 0.009792097798477662, "tests/test_activate.py::test_get_export_unset_vars[True]": 0.015757541480591733, "tests/test_activate.py::test_json_basic[False]": 0.014619591666521495, "tests/test_activate.py::test_json_basic[True]": 0.014724928308399516, "tests/test_activate.py::test_metavars_force_uppercase[False]": 0.008004573512074406, "tests/test_activate.py::test_metavars_force_uppercase[True]": 0.00794952795226384, "tests/test_activate.py::test_msys2_shell_line_endings[ash]": 0.00023695118508538455, "tests/test_activate.py::test_msys2_shell_line_endings[bash]": 0.00024100851791814494, "tests/test_activate.py::test_msys2_shell_line_endings[dash]": 0.0002397086264109911, "tests/test_activate.py::test_msys2_shell_line_endings[posix]": 0.000255466893673744, "tests/test_activate.py::test_msys2_shell_line_endings[zsh]": 0.0002469206276776454, "tests/test_activate.py::test_msys2_shell_stdout_reconfiguration": 0.0003662958634356398, "tests/test_activate.py::test_posix_basic[False]": 0.014374061463549293, "tests/test_activate.py::test_posix_basic[True]": 0.015021176727394654, "tests/test_activate.py::test_powershell_basic[False]": 0.013986991810592767, "tests/test_activate.py::test_powershell_basic[True]": 0.014125797381503678, "tests/test_activate.py::test_pre_post_command_invoked[activate]": 0.007429519855396486, "tests/test_activate.py::test_pre_post_command_invoked[deactivate]": 0.007017591091701769, "tests/test_activate.py::test_pre_post_command_invoked[hook]": 0.006822139797026211, "tests/test_activate.py::test_pre_post_command_invoked[reactivate]": 0.00689673331051069, "tests/test_activate.py::test_pre_post_command_raises[activate]": 0.007041152957090806, "tests/test_activate.py::test_pre_post_command_raises[deactivate]": 0.006752211780069286, "tests/test_activate.py::test_pre_post_command_raises[hook]": 0.007089156723747949, "tests/test_activate.py::test_pre_post_command_raises[reactivate]": 0.00894642081017698, "tests/test_activate.py::test_remove_prefix_from_path_1": 0.004398256587737678, "tests/test_activate.py::test_remove_prefix_from_path_2": 0.004449895845175167, "tests/test_activate.py::test_replace_prefix_in_path_1": 0.004467268719880712, "tests/test_activate.py::test_replace_prefix_in_path_2": 0.000271204478085099, "tests/test_activate.py::test_xonsh_basic[False]": 0.013859434120802644, "tests/test_activate.py::test_xonsh_basic[True]": 0.013999406343415935, "tests/test_api.py::test_DepsModifier_contract": 0.001165945921243211, "tests/test_api.py::test_PackageCacheData_contract": 0.0013387573573271094, "tests/test_api.py::test_PackageCacheData_return_value_contract": 0.009109349485400526, "tests/test_api.py::test_PrefixData_contract": 0.0012634629625047074, "tests/test_api.py::test_PrefixData_return_value_contract": 0.07129769978705276, "tests/test_api.py::test_Solver_inputs_contract": 0.0015129402627274044, "tests/test_api.py::test_Solver_return_value_contract": 6.098430470238697, "tests/test_api.py::test_SubdirData_contract": 0.0012906627085571306, "tests/test_api.py::test_SubdirData_return_value_contract": 3.5914924481837542, "tests/test_api.py::test_UpdateModifier_contract": 0.0010845977040302916, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]": 0.0002746500370168306, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]": 0.000250469234977922, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]": 0.0002632414451179064, "tests/test_create.py::test_allow_softlinks[classic]": 0.6362527874714633, "tests/test_create.py::test_allow_softlinks[libmamba]": 0.6070236385859891, "tests/test_create.py::test_channel_usage_replacing_python[classic]": 132.9994430013175, "tests/test_create.py::test_channel_usage_replacing_python[libmamba]": 99.01489563284825, "tests/test_create.py::test_clone_env_with_conda[classic]": 121.88180088810869, "tests/test_create.py::test_clone_env_with_conda[libmamba]": 19.654123979310498, "tests/test_create.py::test_clone_offline_simple[classic]": 0.9093205019895563, "tests/test_create.py::test_clone_offline_simple[libmamba]": 0.3703806231035762, "tests/test_create.py::test_clone_offline_with_untracked[classic]": 1.0601484052061323, "tests/test_create.py::test_clone_offline_with_untracked[libmamba]": 0.9065446717636978, "tests/test_create.py::test_compile_pyc[classic-False]": 13.402671090285844, "tests/test_create.py::test_compile_pyc[classic-True]": 1.2171723669253574, "tests/test_create.py::test_compile_pyc[libmamba-False]": 6.190363895184335, "tests/test_create.py::test_compile_pyc[libmamba-True]": 1.180388474264244, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]": 23.451853133197517, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]": 6.965816801888319, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]": 22.839180540827105, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]": 15.683014856773257, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]": 24.711771624253366, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]": 10.230250710535937, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]": 0.03916039323419066, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]": 0.04245599441364435, "tests/test_create.py::test_conda_update_package_not_installed[classic]": 0.05033758441054148, "tests/test_create.py::test_conda_update_package_not_installed[libmamba]": 0.10780151352580454, "tests/test_create.py::test_create_default_packages[classic]": 0.73172375464921, "tests/test_create.py::test_create_default_packages[libmamba]": 0.7323067952907562, "tests/test_create.py::test_create_default_packages_no_default_packages[classic]": 0.7513976870385545, "tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]": 0.4921666771602693, "tests/test_create.py::test_create_download_only_without_prefix[classic]": 0.2600972660206114, "tests/test_create.py::test_create_download_only_without_prefix[libmamba]": 0.2563801717872074, "tests/test_create.py::test_create_dry_run[classic]": 9.967774089711227, "tests/test_create.py::test_create_dry_run[libmamba]": 2.510865624306749, "tests/test_create.py::test_create_dry_run_json[classic]": 9.684707116299672, "tests/test_create.py::test_create_dry_run_json[libmamba]": 1.3609356321721193, "tests/test_create.py::test_create_dry_run_without_prefix[classic]": 0.2515811364728348, "tests/test_create.py::test_create_dry_run_without_prefix[libmamba]": 0.1823583348701695, "tests/test_create.py::test_create_dry_run_yes_safety[classic]": 0.030683450026713823, "tests/test_create.py::test_create_dry_run_yes_safety[libmamba]": 0.02457753551151973, "tests/test_create.py::test_create_empty_env[classic]": 0.22516078872615386, "tests/test_create.py::test_create_empty_env[libmamba]": 0.9780833190153897, "tests/test_create.py::test_create_env_different_platform[classic-cli]": 0.8395169977673624, "tests/test_create.py::test_create_env_different_platform[classic-env]": 0.804140444870648, "tests/test_create.py::test_create_env_different_platform[libmamba-cli]": 0.5345572422694747, "tests/test_create.py::test_create_env_different_platform[libmamba-env]": 0.7121381269620648, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]": 0.04054401986812093, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]": 0.028706579109290992, "tests/test_create.py::test_create_install_update_remove_smoketest[classic]": 296.8856950580569, "tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]": 37.1486312782521, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]": 0.04565333112684195, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]": 0.027158544501761153, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]": 0.7687519964915255, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]": 0.6714977812599114, "tests/test_create.py::test_create_name_overrides_file[classic]": 0.7500367977858964, "tests/test_create.py::test_create_name_overrides_file[libmamba]": 0.6803922164812448, "tests/test_create.py::test_create_no_deps_flag[classic]": 0.36019438488769245, "tests/test_create.py::test_create_no_deps_flag[libmamba]": 0.21826476902798667, "tests/test_create.py::test_create_only_deps_flag[classic]": 1.5996671126913575, "tests/test_create.py::test_create_only_deps_flag[libmamba]": 1.698710185213726, "tests/test_create.py::test_create_override_channels_enabled[classic]": 0.8731051065264152, "tests/test_create.py::test_create_override_channels_enabled[libmamba]": 1.5440090081512219, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]": 0.043131870573961964, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]": 0.033172431375867194, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]": 0.06039938848048421, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]": 0.027046853423474067, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]": 0.7333193004052442, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]": 0.6745285042041927, "tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]": 0.0369622113494182, "tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]": 0.027215994362467785, "tests/test_create.py::test_cross_channel_incompatibility[classic]": 100.40833434683691, "tests/test_create.py::test_cross_channel_incompatibility[libmamba]": 4.33149511169624, "tests/test_create.py::test_directory_not_a_conda_environment[classic]": 0.03464717964814406, "tests/test_create.py::test_directory_not_a_conda_environment[libmamba]": 0.02703930772106069, "tests/test_create.py::test_disallowed_packages[classic]": 17.541150721490826, "tests/test_create.py::test_disallowed_packages[libmamba]": 1.7333829029572199, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]": 0.0368733649345548, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]": 0.03663041440503563, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]": 0.035880332288755756, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]": 0.030225995159575875, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]": 0.029886811924251307, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]": 0.02921932403593447, "tests/test_create.py::test_dont_remove_conda_1[classic]": 210.86017730000833, "tests/test_create.py::test_dont_remove_conda_1[libmamba]": 20.402659282645768, "tests/test_create.py::test_dont_remove_conda_2[classic]": 209.7348954034826, "tests/test_create.py::test_dont_remove_conda_2[libmamba]": 13.94685412038798, "tests/test_create.py::test_dont_remove_conda_3[classic]": 160.8997120479734, "tests/test_create.py::test_dont_remove_conda_3[libmamba]": 28.484435295508526, "tests/test_create.py::test_download_only_flag[classic]": 8.28113184464552, "tests/test_create.py::test_download_only_flag[libmamba]": 2.3867672227988463, "tests/test_create.py::test_force_remove[classic]": 53.89722672965113, "tests/test_create.py::test_force_remove[libmamba]": 3.0559650067180337, "tests/test_create.py::test_install_bound_virtual_package[classic]": 0.5446476999825896, "tests/test_create.py::test_install_bound_virtual_package[libmamba]": 1.2442438494393775, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]": 1.997780107185512, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]": 2.1728853280257927, "tests/test_create.py::test_install_force_reinstall_flag[classic]": 0.31709206220336417, "tests/test_create.py::test_install_force_reinstall_flag[libmamba]": 0.2812009577388183, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]": 1.307602774955734, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]": 1.2370681511393509, "tests/test_create.py::test_install_only_deps_flag[classic]": 0.7169924441198129, "tests/test_create.py::test_install_only_deps_flag[libmamba]": 0.6596789025276522, "tests/test_create.py::test_install_prune_flag[classic]": 81.50841869615132, "tests/test_create.py::test_install_prune_flag[libmamba]": 9.626034455647746, "tests/test_create.py::test_install_python_and_search[classic]": 78.43490727618291, "tests/test_create.py::test_install_python_and_search[libmamba]": 17.086344897399016, "tests/test_create.py::test_install_tarball_from_file_based_channel[classic]": 0.5843234596504333, "tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]": 1.49095331466977, "tests/test_create.py::test_install_update_deps_flag[classic]": 1.2809596313297202, "tests/test_create.py::test_install_update_deps_flag[libmamba]": 1.0177977101794111, "tests/test_create.py::test_install_update_deps_only_deps_flags[classic]": 1.4115278929655928, "tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]": 1.3937301303665557, "tests/test_create.py::test_install_virtual_packages[classic-__glibc-True]": 0.24456715084884545, "tests/test_create.py::test_install_virtual_packages[classic-__linux-True]": 0.24347737013425674, "tests/test_create.py::test_install_virtual_packages[classic-__osx-False]": 1.5922913889101393, "tests/test_create.py::test_install_virtual_packages[classic-__unix-True]": 0.44504438901758275, "tests/test_create.py::test_install_virtual_packages[classic-__win-False]": 0.7828461885198973, "tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-True]": 0.9880426482283977, "tests/test_create.py::test_install_virtual_packages[libmamba-__linux-True]": 0.9567938929291093, "tests/test_create.py::test_install_virtual_packages[libmamba-__osx-False]": 0.9264361308735889, "tests/test_create.py::test_install_virtual_packages[libmamba-__unix-True]": 0.9649324114499144, "tests/test_create.py::test_install_virtual_packages[libmamba-__win-False]": 0.9760822860310012, "tests/test_create.py::test_json_create_install_update_remove[classic]": 102.89431382583017, "tests/test_create.py::test_json_create_install_update_remove[libmamba]": 9.366707822095833, "tests/test_create.py::test_list_with_pip_no_binary[classic]": 13.63465441709785, "tests/test_create.py::test_list_with_pip_no_binary[libmamba]": 6.7847447500155855, "tests/test_create.py::test_list_with_pip_wheel[classic]": 24.750846646212352, "tests/test_create.py::test_list_with_pip_wheel[libmamba]": 13.141381511707594, "tests/test_create.py::test_menuinst_v2[classic]": 2.61299045489916, "tests/test_create.py::test_menuinst_v2[libmamba]": 2.5543993300472794, "tests/test_create.py::test_mix_explicit_and_packages[classic-create]": 0.08635883349569608, "tests/test_create.py::test_mix_explicit_and_packages[classic-install]": 0.03973940942143419, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]": 0.0763036931832976, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]": 0.0316982620666756, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]": 0.32464640490079044, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]": 0.24975715603577514, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]": 0.31754420400317923, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]": 0.2632110433724596, "tests/test_create.py::test_must_provide_args_to_install[classic]": 0.041418917807928855, "tests/test_create.py::test_must_provide_args_to_install[libmamba]": 0.024411007973580947, "tests/test_create.py::test_neutering_of_historic_specs[classic]": 124.43172329737241, "tests/test_create.py::test_neutering_of_historic_specs[libmamba]": 12.7485280136003, "tests/test_create.py::test_no_channels[classic]": 0.039469680366812476, "tests/test_create.py::test_no_channels[libmamba]": 0.03238131307740386, "tests/test_create.py::test_noarch_generic_package[classic]": 0.35180956406065395, "tests/test_create.py::test_noarch_generic_package[libmamba]": 0.24567798603006946, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]": 24.388155506733415, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]": 10.9322982036311, "tests/test_create.py::test_noarch_python_package_with_entry_points[classic]": 67.86975205611739, "tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]": 8.424052819119554, "tests/test_create.py::test_noarch_python_package_without_entry_points[classic]": 64.01923474767578, "tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]": 7.407020314261999, "tests/test_create.py::test_nonadmin_file_untouched[classic]": 1.2929956761971035, "tests/test_create.py::test_nonadmin_file_untouched[libmamba]": 1.2738949469683483, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]": 0.04049421088791392, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]": 0.03253048719863208, "tests/test_create.py::test_offline_with_empty_index_cache[classic]": 8.776932744556227, "tests/test_create.py::test_offline_with_empty_index_cache[libmamba]": 4.874281120790956, "tests/test_create.py::test_override_channels_disabled[classic]": 0.09742053323417003, "tests/test_create.py::test_override_channels_disabled[libmamba]": 0.08744609334074838, "tests/test_create.py::test_package_cache_regression[classic]": 0.5597425565108113, "tests/test_create.py::test_package_cache_regression[libmamba]": 0.3634330723959988, "tests/test_create.py::test_package_optional_pinning[classic]": 1.2834309364959995, "tests/test_create.py::test_package_optional_pinning[libmamba]": 1.1982888863273502, "tests/test_create.py::test_package_pinning[classic]": 1.498916586329335, "tests/test_create.py::test_package_pinning[libmamba]": 1.7132631215199305, "tests/test_create.py::test_packages_not_found[classic]": 0.43974999975083134, "tests/test_create.py::test_packages_not_found[libmamba]": 1.827228623543867, "tests/test_create.py::test_pinned_override_with_explicit_spec[classic]": 1.3351376235995343, "tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]": 0.5555809172131673, "tests/test_create.py::test_post_link_run_in_env[classic]": 1.5891120701973407, "tests/test_create.py::test_post_link_run_in_env[libmamba]": 1.63174321289306, "tests/test_create.py::test_python_site_packages_path[classic]": 1.8913823412648478, "tests/test_create.py::test_python_site_packages_path[libmamba]": 1.7598507900692542, "tests/test_create.py::test_remove_empty_env[classic]": 0.6211746056225124, "tests/test_create.py::test_remove_empty_env[libmamba]": 1.26537102143661, "tests/test_create.py::test_remove_force_remove_flag[classic]": 14.282933545901104, "tests/test_create.py::test_remove_force_remove_flag[libmamba]": 6.419412667575489, "tests/test_create.py::test_remove_ignore_nonenv[classic]": 0.04810432889069138, "tests/test_create.py::test_remove_ignore_nonenv[libmamba]": 0.033685267139389054, "tests/test_create.py::test_remove_spellcheck[classic]": 0.7666477789790757, "tests/test_create.py::test_remove_spellcheck[libmamba]": 0.6911626503595206, "tests/test_create.py::test_repodata_v2_base_url[classic]": 0.8529722797993181, "tests/test_create.py::test_repodata_v2_base_url[libmamba]": 0.785309774088213, "tests/test_create.py::test_rm_rf[classic]": 11.970094328326411, "tests/test_create.py::test_rm_rf[libmamba]": 5.839943331961613, "tests/test_create.py::test_run_preserves_arguments[classic]": 16.048945192182988, "tests/test_create.py::test_run_preserves_arguments[libmamba]": 6.729138616679156, "tests/test_create.py::test_run_script_called[classic]": 7.008054362125925, "tests/test_create.py::test_run_script_called[libmamba]": 1.8286937233535647, "tests/test_create.py::test_safety_checks_disabled[classic]": 11.878295766370817, "tests/test_create.py::test_safety_checks_disabled[libmamba]": 5.892576524397501, "tests/test_create.py::test_safety_checks_enabled[classic]": 13.408637843292805, "tests/test_create.py::test_safety_checks_enabled[libmamba]": 4.297221334386333, "tests/test_create.py::test_safety_checks_warn[classic]": 14.470353189621965, "tests/test_create.py::test_safety_checks_warn[libmamba]": 7.690238217132217, "tests/test_create.py::test_search_override_channels_enabled[classic]": 0.22019135382359956, "tests/test_create.py::test_search_override_channels_enabled[libmamba]": 1.389706531386132, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]": 11.782742806830777, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]": 6.106753581687685, "tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]": 11.859174454806725, "tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]": 6.6626524574923245, "tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]": 6.468277337879668, "tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]": 4.561394507548745, "tests/test_create.py::test_strict_channel_priority[classic]": 0.0002986111014582571, "tests/test_create.py::test_strict_channel_priority[libmamba]": 0.0002793379734296068, "tests/test_create.py::test_strict_resolve_get_reduced_index[classic]": 81.1065168095887, "tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]": 86.16046670069221, "tests/test_create.py::test_tarball_install[classic]": 0.7971455770525714, "tests/test_create.py::test_tarball_install[libmamba]": 0.828829392713241, "tests/test_create.py::test_tarball_install_and_bad_metadata[classic]": 1.7290193186808431, "tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]": 1.6490688555222628, "tests/test_create.py::test_transactional_rollback_simple[classic]": 0.8373156817562833, "tests/test_create.py::test_transactional_rollback_simple[libmamba]": 0.7862462076812379, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]": 1.387069031515136, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]": 1.3026857400616474, "tests/test_create.py::test_update_all_updates_pip_pkg[classic]": 23.804767199966484, "tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]": 10.045726994192933, "tests/test_create.py::test_update_deps_flag_absent[classic]": 0.9324543441949442, "tests/test_create.py::test_update_deps_flag_absent[libmamba]": 0.818102411171926, "tests/test_create.py::test_update_deps_flag_present[classic]": 1.358425709046792, "tests/test_create.py::test_update_deps_flag_present[libmamba]": 1.1111067345005006, "tests/test_create.py::test_update_with_pinned_packages[classic]": 1.3215395803815073, "tests/test_create.py::test_update_with_pinned_packages[libmamba]": 0.754255521066721, "tests/test_create.py::test_use_index_cache[classic]": 12.00366169214669, "tests/test_create.py::test_use_index_cache[libmamba]": 9.75929402297513, "tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json": 0.18385264800898793, "tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json": 0.18276703473572956, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]": 0.0013594267177738008, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]": 0.0013687286426143062, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]": 0.0012310663283474448, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]": 0.001193663523207003, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]": 0.0012017280615997212, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]": 0.001228097515949055, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]": 0.0012316536456956047, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]": 0.0011807334138213505, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]": 0.0011869366017488274, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]": 0.0012086379494095799, "tests/test_deprecations.py::test_action[future]": 0.001951680351877933, "tests/test_deprecations.py::test_action[pending]": 0.00186819438494026, "tests/test_deprecations.py::test_action[remove]": 0.001508952903872643, "tests/test_deprecations.py::test_arguments[deprecated]": 0.0013414415141226551, "tests/test_deprecations.py::test_arguments[pending]": 0.001364644135903357, "tests/test_deprecations.py::test_arguments[remove]": 0.0012452954849139614, "tests/test_deprecations.py::test_class[deprecated]": 0.0013725908783650104, "tests/test_deprecations.py::test_class[pending]": 0.0013629770142683285, "tests/test_deprecations.py::test_class[remove]": 0.0012474614552823741, "tests/test_deprecations.py::test_constant[deprecated]": 0.003824201816891203, "tests/test_deprecations.py::test_constant[pending]": 0.0019520072705944342, "tests/test_deprecations.py::test_constant[remove]": 0.002748004943235504, "tests/test_deprecations.py::test_constant_factory": 0.001669677051723554, "tests/test_deprecations.py::test_constant_factory_rejects_non_callable": 0.0011527545293274564, "tests/test_deprecations.py::test_constant_multiple_same_module": 0.0017269996746247917, "tests/test_deprecations.py::test_constant_rejects_value_and_factory_together": 0.0011265590784347212, "tests/test_deprecations.py::test_constant_requires_value_or_factory": 0.001139429825316688, "tests/test_deprecations.py::test_function[deprecated]": 0.0014116915409727391, "tests/test_deprecations.py::test_function[pending]": 0.0013540560883107268, "tests/test_deprecations.py::test_function[remove]": 0.0013330738860553388, "tests/test_deprecations.py::test_get_module": 0.002172845194315878, "tests/test_deprecations.py::test_method[deprecated]": 0.0013426937746068514, "tests/test_deprecations.py::test_method[pending]": 0.0014123335564439662, "tests/test_deprecations.py::test_method[remove]": 0.0012442760049616143, "tests/test_deprecations.py::test_module[deprecated]": 0.0019829801448504815, "tests/test_deprecations.py::test_module[pending]": 0.002747057982712382, "tests/test_deprecations.py::test_module[remove]": 0.0019920613907067008, "tests/test_deprecations.py::test_topic[deprecated]": 0.0012858053021901918, "tests/test_deprecations.py::test_topic[pending]": 0.0013302015897744168, "tests/test_deprecations.py::test_topic[remove]": 0.0012522467494950544, "tests/test_deprecations.py::test_version_fallback": 0.001129827833353508, "tests/test_exceptions.py::test_BasicClobberError": 0.00500050634934583, "tests/test_exceptions.py::test_BinaryPrefixReplacementError": 0.008716825564811884, "tests/test_exceptions.py::test_CommandNotFoundError_conda_build": 0.008265238739824989, "tests/test_exceptions.py::test_CommandNotFoundError_simple": 0.029820469861969547, "tests/test_exceptions.py::test_CondaFileNotFoundError": 0.008796014316923877, "tests/test_exceptions.py::test_CondaHTTPError": 0.008383344430526383, "tests/test_exceptions.py::test_CondaKeyError": 0.007978475628303953, "tests/test_exceptions.py::test_DirectoryNotFoundError": 0.008616493764969594, "tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]": 0.0013163561845453019, "tests/test_exceptions.py::test_KnownPackageClobberError": 0.007386238227241242, "tests/test_exceptions.py::test_MD5MismatchError": 0.009743789943429186, "tests/test_exceptions.py::test_PackageNotFoundError": 0.008265259510522286, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]": 0.0044752446810955, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]": 0.004598777359863722, "tests/test_exceptions.py::test_SharedLinkPathClobberError": 0.007436421158284298, "tests/test_exceptions.py::test_TooManyArgumentsError": 0.011039170454447038, "tests/test_exceptions.py::test_UnknownPackageClobberError": 0.004833708490605936, "tests/test_exceptions.py::test_http_error_custom_reason_code": 0.011126628881913233, "tests/test_exceptions.py::test_http_error_rfc_9457": 0.008324140302510427, "tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error": 0.0010403047766844344, "tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]": 0.0012208365481425718, "tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]": 0.0012556340340347937, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1": 0.013826900905473049, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2": 0.010497507915213209, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_1": 0.019888872585710593, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_2": 0.01166331711206555, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_3": 0.01692765774834819, "tests/test_exceptions.py::test_proxy_error_custom_message": 0.0011450756615380517, "tests/test_exceptions.py::test_proxy_error_default_message": 0.001101482262709252, "tests/test_exports.py::test_deprecations[CondaError-TypeError]": 0.0012367991911902594, "tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]": 0.0012341943033027404, "tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]": 0.0011854615767351703, "tests/test_exports.py::test_deprecations[CondaOSError-TypeError]": 0.001241534462896001, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]": 0.0012552512883025643, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]": 0.0012657015238916108, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]": 0.0012126293628452792, "tests/test_exports.py::test_deprecations[EntityEncoder-None]": 0.0012557248683909461, "tests/test_exports.py::test_deprecations[LinkError-TypeError]": 0.0012367200602508334, "tests/test_exports.py::test_deprecations[LockError-TypeError]": 0.0012109688058237731, "tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]": 0.0012004456996151372, "tests/test_exports.py::test_deprecations[PY3-TypeError]": 0.001248418186329263, "tests/test_exports.py::test_deprecations[PaddingError-TypeError]": 0.001278227590095189, "tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]": 0.0012215128453140892, "tests/test_exports.py::test_deprecations[StringIO-None]": 0.001218989291923924, "tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]": 0.0012531747047438944, "tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]": 0.0012853580490238424, "tests/test_exports.py::test_deprecations[input-OSError]": 0.0012246762206145128, "tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]": 0.0012485754893622157, "tests/test_exports.py::test_deprecations[string_types-None]": 0.0011702921284098662, "tests/test_exports.py::test_deprecations[text_type-None]": 0.0012118471538620354, "tests/test_features.py::test_install_track_features_downgrade": 1.4913815926364995, "tests/test_features.py::test_install_track_features_upgrade": 1.6475245790547959, "tests/test_features.py::test_remove_features_downgrade": 0.48611922765592974, "tests/test_features.py::test_remove_features_upgrade": 1.049132136866968, "tests/test_fetch.py::test_checksum_checks_bytes[bad-type]": 0.007135722738789537, "tests/test_fetch.py::test_checksum_checks_bytes[gibberish]": 0.00698897043373475, "tests/test_fetch.py::test_checksum_checks_bytes[original]": 0.007984665908060613, "tests/test_fetch.py::test_checksum_checks_bytes[upper]": 0.006813544549053761, "tests/test_fetch.py::test_download_connectionerror": 2.0173590373027146, "tests/test_fetch.py::test_download_http_errors": 0.0059724906244315555, "tests/test_fetch.py::test_download_httperror": 0.0066472893491211615, "tests/test_fetch.py::test_download_size_none": 0.00430314818494254, "tests/test_fetch.py::test_download_text": 0.004206727101046705, "tests/test_fetch.py::test_download_when_ranges_not_supported": 0.01641639658146603, "tests/test_fetch.py::test_fetchrepodate_connectionerror": 2.015572089134926, "tests/test_fetch.py::test_resume_bad_partial": 0.007553551129135906, "tests/test_fetch.py::test_resume_download": 0.02318644687798858, "tests/test_fetch.py::test_resume_partial": 0.023068209795741982, "tests/test_fetch.py::test_tmpDownload": 0.14577164342972465, "tests/test_history.py::test_calls_update_on_exit": 0.0033917777972768044, "tests/test_history.py::test_comment_parsing[conda 4.5.1]": 0.0012339879922121373, "tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]": 0.001189162079776198, "tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]": 0.001199857100073388, "tests/test_history.py::test_comment_parsing[post 4.4, install spec]": 0.001234167247285096, "tests/test_history.py::test_comment_parsing[post 4.4, update spec]": 0.0012138250249246016, "tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]": 0.00200665311012055, "tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]": 0.004608811951119226, "tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]": 0.0027280023918389495, "tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]": 0.0012299876071993488, "tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]": 0.0012448064049767596, "tests/test_history.py::test_empty_history_check_on_empty_env": 0.003247031282938138, "tests/test_history.py::test_history_malformed": 0.0025576918082707866, "tests/test_history.py::test_parse_on_empty_env": 0.003269002326459423, "tests/test_history.py::test_returns_history_object_as_context_object": 0.0023867249632967043, "tests/test_history.py::test_user_requests[0]": 0.0015168414993902406, "tests/test_history.py::test_user_requests[1]": 0.001502056466493687, "tests/test_history.py::test_user_requests[2]": 0.0016390858868868755, "tests/test_history.py::test_user_requests[3]": 0.0021582507953025014, "tests/test_history.py::test_user_requests[4]": 0.02364351840255347, "tests/test_history.py::test_user_requests[5]": 0.0014478958407040691, "tests/test_history.py::test_works_as_context_manager": 0.0019399139791264307, "tests/test_install.py::test_binary[linux-64]": 0.0034328175221953476, "tests/test_install.py::test_binary[noarch]": 0.0030184549447651106, "tests/test_install.py::test_binary[win-64]": 0.002465400389328127, "tests/test_install.py::test_default_text": 0.0023449816028029338, "tests/test_install.py::test_ends_with_newl[linux-64]": 0.0013160734429759307, "tests/test_install.py::test_ends_with_newl[noarch]": 0.0013985631752256543, "tests/test_install.py::test_ends_with_newl[win-64]": 0.0014463272746499329, "tests/test_install.py::test_long_default_text": 0.0022604454652154896, "tests/test_install.py::test_multiple[linux-64]": 0.0011609939841286526, "tests/test_install.py::test_multiple[noarch]": 0.0011630203508010317, "tests/test_install.py::test_multiple[win-64]": 0.0013906653990285063, "tests/test_install.py::test_no_extra[linux-64]": 0.0011646696328209672, "tests/test_install.py::test_no_extra[noarch]": 0.0011612702367098451, "tests/test_install.py::test_no_extra[win-64]": 0.0014140409990956223, "tests/test_install.py::test_read_no_link": 0.002269889407039675, "tests/test_install.py::test_shorter[linux-64]": 0.001238526542477109, "tests/test_install.py::test_shorter[noarch]": 0.0011885054434565025, "tests/test_install.py::test_shorter[win-64]": 0.001505173223910184, "tests/test_install.py::test_simple[linux-64]": 0.0020087868997298096, "tests/test_install.py::test_simple[noarch]": 0.001451908873801657, "tests/test_install.py::test_simple[win-64]": 0.0015341697659304056, "tests/test_install.py::test_spaces[linux-64]": 0.0012733759871040985, "tests/test_install.py::test_spaces[noarch]": 0.0012608983108205179, "tests/test_install.py::test_spaces[win-64]": 0.0014042932630534907, "tests/test_install.py::test_too_long[linux-64]": 0.001184691588698825, "tests/test_install.py::test_too_long[noarch]": 0.0011844494651007031, "tests/test_install.py::test_too_long[win-64]": 0.0012679188154451322, "tests/test_install.py::test_trash_outside_prefix": 0.09093295357564295, "tests/test_install.py::test_two[linux-64]": 0.001150568424708745, "tests/test_install.py::test_two[noarch]": 0.0011368111956346775, "tests/test_install.py::test_two[win-64]": 0.0014186462628597877, "tests/test_install.py::test_windows_entry_point": 0.0002908392797472934, "tests/test_install.py::test_yield_lines": 0.002311601178644088, "tests/test_instructions.py::test_check_files_in_tarball_files_exist": 0.001796143327687281, "tests/test_instructions.py::test_check_files_in_tarball_files_not_exist": 0.001492193551958071, "tests/test_instructions.py::test_expected_operation_order": 0.0010521802276993997, "tests/test_link_order.py::test_link_order_post_link_actions": 1.7533998790774978, "tests/test_link_order.py::test_link_order_post_link_depend": 1.7714337248722107, "tests/test_misc.py::test_Utf8NamedTemporaryFile": 0.0012323123937263416, "tests/test_misc.py::test_cache_fn_url": 0.0010511403569360377, "tests/test_misc.py::test_deprecations[url_pat-TypeError]": 0.0012770085495955531, "tests/test_misc.py::test_explicit_missing_cache_entries": 0.9575383186100838, "tests/test_misc.py::test_explicit_no_cache": 0.005566445586773974, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]": 0.0014407355375339178, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.002184603583311534, "tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.0021349693555357875, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.002172589350576418, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]": 0.001387152914403897, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]": 0.0014671705477254666, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.0022855253749042865, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.0021798445471877454, "tests/test_misc.py::test_url_pat_1": 0.0011192089111479928, "tests/test_misc.py::test_url_pat_2": 0.0010886092157913016, "tests/test_misc.py::test_url_pat_3": 0.0011212895907069817, "tests/test_misc.py::test_walk_prefix": 0.0028167460467326227, "tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]": 1.7965950479204758, "tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]": 1.4679640001290906, "tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]": 1.637502081752641, "tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]": 1.7762734395038327, "tests/test_reporters.py::test_confirm_yn_always_yes": 0.004246246486094675, "tests/test_reporters.py::test_confirm_yn_dry_run_exit": 0.0043296539304581464, "tests/test_reporters.py::test_confirm_yn_no": 0.004548582839136222, "tests/test_reporters.py::test_confirm_yn_yes": 0.004783571090566317, "tests/test_reporters.py::test_get_progress_bar": 0.0016503043175684887, "tests/test_reporters.py::test_get_progress_bar_context_managers": 0.0011559215151534202, "tests/test_reporters.py::test_render": 0.00212085055726072, "tests/test_resolve.py::test_Resolve_make_channel_priorities": 0.0016941953716712343, "tests/test_resolve.py::test_specs_by_name_copy_is_independent": 0.0011951358083656482, "tests/test_solvers.py::TestClassicSolver::test_accelerate": 1.4854248329640571, "tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl": 0.9052922531928532, "tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.2063157350897281, "tests/test_solvers.py::TestClassicSolver::test_channel_priority_1": 0.007103266400260317, "tests/test_solvers.py::TestClassicSolver::test_circular_dependencies": 0.6891548318233547, "tests/test_solvers.py::TestClassicSolver::test_empty": 0.613960835507398, "tests/test_solvers.py::TestClassicSolver::test_get_dists": 0.9436893838614594, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution": 0.20711189227906296, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.2067180512724322, "tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature": 0.2947467405751498, "tests/test_solvers.py::TestClassicSolver::test_iopro_mkl": 0.8741149842475059, "tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl": 0.4504873656298597, "tests/test_solvers.py::TestClassicSolver::test_irrational_version": 0.23188914923259654, "tests/test_solvers.py::TestClassicSolver::test_mkl": 1.1741652261051918, "tests/test_solvers.py::TestClassicSolver::test_no_features": 1.572051455598629, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater": 0.2059964742232421, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.21653538027567595, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater": 0.22630372074366567, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.21191053730803164, "tests/test_solvers.py::TestClassicSolver::test_nonexistent": 0.408832244243095, "tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps": 2.8410391091829053, "tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean": 0.8790745433708443, "tests/test_solvers.py::TestClassicSolver::test_remove": 1.6449689621101615, "tests/test_solvers.py::TestClassicSolver::test_scipy_mkl": 0.44542497446547274, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_1": 0.20661195958309705, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_2": 0.20631219457123115, "tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps": 1.584052116682157, "tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade": 0.6564175777884432, "tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three": 0.8249980823767314, "tests/test_solvers.py::TestClassicSolver::test_unsat_chain": 0.20670202393139753, "tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority": 0.4168423299839758, "tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single": 0.2067352426217935, "tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1": 1.6844574189889026, "tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep": 0.20626101159636048, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1": 0.20855857157753993, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2": 0.21836936329166917, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3": 0.2072960506582411, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4": 0.2065172914362773, "tests/test_solvers.py::TestClassicSolver::test_unsat_simple": 0.2112250164943341, "tests/test_solvers.py::TestLibMambaSolver::test_accelerate": 0.001005557108371779, "tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl": 0.2856203907262676, "tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.20982248930486141, "tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1": 0.00680256747622624, "tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies": 0.6861220496468662, "tests/test_solvers.py::TestLibMambaSolver::test_empty": 0.2308663316278762, "tests/test_solvers.py::TestLibMambaSolver::test_get_dists": 0.23269229723212057, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution": 0.2106534887611145, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.20944689981325695, "tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature": 0.23231684853707946, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl": 0.001171357546899694, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl": 0.0010657041577128749, "tests/test_solvers.py::TestLibMambaSolver::test_irrational_version": 0.231294947554887, "tests/test_solvers.py::TestLibMambaSolver::test_mkl": 0.0011486641116055015, "tests/test_solvers.py::TestLibMambaSolver::test_no_features": 0.0011587812456853425, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater": 0.2096161772216255, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.20951576884610468, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater": 0.20956674744864753, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.21001353890511532, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent": 0.4140599639108838, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps": 2.6091750068223227, "tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean": 0.0011571380163542834, "tests/test_solvers.py::TestLibMambaSolver::test_remove": 0.001169021315212918, "tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl": 0.0010037651749208677, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1": 0.0010342676608281485, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2": 0.0010260418753083608, "tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps": 1.5993362200702201, "tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade": 0.0011859698671873318, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three": 0.831760263545154, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain": 0.20980517189784048, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority": 0.4173299959567365, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single": 0.20960552956380285, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1": 0.6988121203435781, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep": 0.20955587336721596, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1": 0.20983423923544803, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2": 0.20968584377577368, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3": 0.20988854470314938, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4": 0.20937438305306136, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple": 0.20992670320073603, "tests/test_utils.py::test_ensure_dir": 0.0034334725251515545, "tests/test_utils.py::test_ensure_dir_errors": 0.005050051508941156, "tests/test_utils.py::test_quote_for_shell[!-'!']": 0.0012020316617267982, "tests/test_utils.py::test_quote_for_shell[\"-'\"']": 0.0013698219933603862, "tests/test_utils.py::test_quote_for_shell[#-'#']": 0.0011465114726927805, "tests/test_utils.py::test_quote_for_shell[$-'$']": 0.0011399032411687736, "tests/test_utils.py::test_quote_for_shell[%-%]": 0.0011525376269018, "tests/test_utils.py::test_quote_for_shell[&-'&']": 0.0011156487677420114, "tests/test_utils.py::test_quote_for_shell['-''\"'\"'']": 0.0011462006891165832, "tests/test_utils.py::test_quote_for_shell[(-'(']": 0.0011270732128446674, "tests/test_utils.py::test_quote_for_shell[)-')']": 0.0011495622405237995, "tests/test_utils.py::test_quote_for_shell[*-'*']": 0.0011721344625445845, "tests/test_utils.py::test_quote_for_shell[+-+]": 0.0011323184965110263, "tests/test_utils.py::test_quote_for_shell[,-,]": 0.0011709576924836666, "tests/test_utils.py::test_quote_for_shell[---]": 0.0011676487875822298, "tests/test_utils.py::test_quote_for_shell[.-.]": 0.0011107755537210471, "tests/test_utils.py::test_quote_for_shell[/-/]": 0.001144018657383892, "tests/test_utils.py::test_quote_for_shell[1>/dev/null-'1>/dev/null']": 0.0011546259756296635, "tests/test_utils.py::test_quote_for_shell[1>NUL-'1>NUL']": 0.0011590866757292537, "tests/test_utils.py::test_quote_for_shell[2>&1-'2>&1']": 0.0011569317445003348, "tests/test_utils.py::test_quote_for_shell[2>/dev/null-'2>/dev/null']": 0.001126457160314575, "tests/test_utils.py::test_quote_for_shell[2>NUL-'2>NUL']": 0.0011818860272380036, "tests/test_utils.py::test_quote_for_shell[:-:]": 0.0011414995617600758, "tests/test_utils.py::test_quote_for_shell[;-';']": 0.001139692788193643, "tests/test_utils.py::test_quote_for_shell[<-'<']": 0.0011380843310746002, "tests/test_utils.py::test_quote_for_shell[=-=]": 0.0011639442672291324, "tests/test_utils.py::test_quote_for_shell[>-'>']": 0.0011421837458089204, "tests/test_utils.py::test_quote_for_shell[>/dev/null-'>/dev/null']": 0.0011960934933837415, "tests/test_utils.py::test_quote_for_shell[>NUL-'>NUL']": 0.0011283314648877342, "tests/test_utils.py::test_quote_for_shell[?-'?']": 0.0011252385492464486, "tests/test_utils.py::test_quote_for_shell[@-@]": 0.0011621297961564522, "tests/test_utils.py::test_quote_for_shell[C:\\\\temp\\\\some ^%file^% > nul-\"C:\\\\temp\\\\some ^%%file^%% > nul\"]": 0.00024152824793190165, "tests/test_utils.py::test_quote_for_shell[None-'']": 0.001157073831452727, "tests/test_utils.py::test_quote_for_shell[[-'[']": 0.0011192632882533798, "tests/test_utils.py::test_quote_for_shell[\\\\-'\\\\']": 0.0011470140212733306, "tests/test_utils.py::test_quote_for_shell[]-']']": 0.0012469723939917778, "tests/test_utils.py::test_quote_for_shell[^-'^']": 0.0011638393086814748, "tests/test_utils.py::test_quote_for_shell[arg1 and 2-'arg1 and 2']": 0.0011888539351900779, "tests/test_utils.py::test_quote_for_shell[arg1-arg1]": 0.0013017222334274492, "tests/test_utils.py::test_quote_for_shell[arg1\\nand\\n2-'arg1\\nand\\n2']": 0.0011435319917836608, "tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\"&whoami-\"malicious argument\\\\\"\"&whoami\"]": 0.00025415904695953544, "tests/test_utils.py::test_quote_for_shell[numpy<1.22-'numpy<1.22']": 0.001321554446609676, "tests/test_utils.py::test_quote_for_shell[numpy>=1.0-'numpy>=1.0']": 0.001143064055275357, "tests/test_utils.py::test_quote_for_shell[one|two-'one|two']": 0.0011734210584034702, "tests/test_utils.py::test_quote_for_shell[{-'{']": 0.0011941505766447473, "tests/test_utils.py::test_quote_for_shell[|-'|']": 0.0011648817027047713, "tests/test_utils.py::test_quote_for_shell[}-'}']": 0.0011502786797055943, "tests/test_utils.py::test_quote_for_shell[~-'~']": 0.0011328139733516685, "tests/testing/test_fixtures.py::test_conda_cli": 0.03835852429236285, "tests/testing/test_fixtures.py::test_empty_env": 0.002462008847296486, "tests/testing/test_fixtures.py::test_env": 0.0712106795468332, "tests/testing/test_fixtures.py::test_monkeypatch": 0.004378880124256906, "tests/testing/test_fixtures.py::test_path_factory": 0.0020294544814371835, "tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity": 0.0020620454469301485, "tests/testing/test_fixtures.py::test_path_factory_name_mode": 0.0019677067910993614, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]": 0.002083960590567722, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]": 0.0021441183501081517, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]": 0.0021341731355786603, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]": 0.0021507140286857935, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]": 0.0021109501906637898, "tests/testing/test_fixtures.py::test_path_factory_uniqueness": 0.0019892316439961044, "tests/testing/test_fixtures.py::test_session_conda_cli": 0.03891682337084565, "tests/testing/test_fixtures.py::test_session_tmp_env": 0.001971980501019808, "tests/testing/test_fixtures.py::test_tmp_channel": 0.9340203478105968, "tests/testing/test_fixtures.py::test_tmp_env": 0.0024742439975287234, "tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity": 0.002263617490247121, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]": 0.0026828501820427564, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]": 0.0026916263798589316, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]": 0.0026999851220088703, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]": 0.002730265326535604, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]": 0.0026881185889609614, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]": 0.0026866333184784146, "tests/testing/test_fixtures.py::test_tmp_envs_dir": 0.0037242918963740533, "tests/testing/test_fixtures.py::test_tmp_pkgs_dir": 0.002581669025758968, "tests/testing/test_http_test_server.py::test_dynamic_content_pattern": 0.534497439825416, "tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]": 0.5052138441159715, "tests/testing/test_http_test_server.py::test_http_server_directory_attribute": 0.5070718545562675, "tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]": 0.5033846521588384, "tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]": 0.503748880218358, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]": 0.5457292900197918, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]": 0.5741356832372151, "tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]": 0.5088771539721336, "tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]": 0.5051418575680585, "tests/testing/test_http_test_server.py::test_http_server_without_marker": 0.505374640367536, "tests/testing/test_http_test_server.py::test_marker_validation_directory_type": 0.17729983640670266 } ================================================ FILE: durations/Windows.json ================================================ { "tests/base/test_constants.py::test_ChannelPriority": 0.02008503432274582, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]": 0.002172532398686549, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]": 0.002016759240971079, "tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]": 0.0048811924750486934, "tests/base/test_constants.py::test_null_is_falsey": 0.016220867431980094, "tests/base/test_context.py::test_aggressive_update_packages": 0.03994107138961314, "tests/base/test_context.py::test_category_map_covers_all_parameters": 0.013192631887506157, "tests/base/test_context.py::test_category_map_is_class_constant": 0.0013668959934016924, "tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]": 0.0015773795653144245, "tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]": 0.0016266502315228906, "tests/base/test_context.py::test_channel_priority": 0.0156799149246327, "tests/base/test_context.py::test_channel_settings": 0.013513541642199435, "tests/base/test_context.py::test_channels_defaults_condarc": 0.01536795777298963, "tests/base/test_context.py::test_channels_empty": 0.013500110922059935, "tests/base/test_context.py::test_check_allowlist": 0.009579307959887495, "tests/base/test_context.py::test_check_allowlist_and_denylist": 0.00871330278456115, "tests/base/test_context.py::test_check_denylist": 0.008758742357801557, "tests/base/test_context.py::test_client_ssl_cert": 0.025778987535790998, "tests/base/test_context.py::test_clobber_enum[clobber]": 0.005764685501574919, "tests/base/test_context.py::test_clobber_enum[prevent]": 0.006018747139224657, "tests/base/test_context.py::test_clobber_enum[warn]": 0.005902630714730332, "tests/base/test_context.py::test_conda_bld_path": 0.023009061131751597, "tests/base/test_context.py::test_conda_build_root_dir": 0.013166968649496815, "tests/base/test_context.py::test_conda_envs_path": 0.02402605831262046, "tests/base/test_context.py::test_context_override_with_reset": 0.005644317500789171, "tests/base/test_context.py::test_context_parameter_map": 0.01367483987290339, "tests/base/test_context.py::test_context_parameters_have_descriptions": 0.04737147036398847, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]": 0.0015625355037143726, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]": 0.001550879471625371, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]": 0.0015267195550257764, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]": 0.0015090926348983167, "tests/base/test_context.py::test_context_stack_push_pop_roundtrip": 0.006773572784108932, "tests/base/test_context.py::test_context_stack_starts_with_single_slot": 0.00145452187723352, "tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]": 0.00616782525736815, "tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]": 0.00620713299100899, "tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]": 0.012335984022441095, "tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages": 0.008146736479393133, "tests/base/test_context.py::test_custom_multichannels": 0.015341399434602016, "tests/base/test_context.py::test_custom_multichannels_overrides_default_channels": 0.019173808067718005, "tests/base/test_context.py::test_default_activation_prefix": 0.027483356198299388, "tests/base/test_context.py::test_default_python_validation[-True]": 0.0015745805188979156, "tests/base/test_context.py::test_default_python_validation[3.12-True]": 0.001571514976397707, "tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']": 0.0016004415550622659, "tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']": 0.0015613779112623664, "tests/base/test_context.py::test_default_target_is_root_prefix": 0.013127956208348661, "tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]": 0.001754488871786548, "tests/base/test_context.py::test_expandvars": 0.06932168691975865, "tests/base/test_context.py::test_export_platforms": 0.018624631380323442, "tests/base/test_context.py::test_local_build_root_custom_rc": 0.02855335888284219, "tests/base/test_context.py::test_local_build_root_default_rc": 0.006582163386569403, "tests/base/test_context.py::test_migrated_custom_channels": 0.03158089294515278, "tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]": 0.001693992277083133, "tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]": 0.0017658350698155072, "tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]": 0.0018324964574573958, "tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]": 0.0017506872195979573, "tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]": 0.0016848211958628446, "tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]": 0.0017224973161267464, "tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]": 0.0018394609971669209, "tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]": 0.0017370578727618875, "tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]": 0.0017045340519678343, "tests/base/test_context.py::test_old_channel_alias": 0.017709241350959023, "tests/base/test_context.py::test_proxy_servers": 0.014128154886769242, "tests/base/test_context.py::test_signing_metadata_url_base": 0.017655502423107393, "tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels": 0.018321972175477895, "tests/base/test_context.py::test_specify_channels_cli_condarc": 0.015468781693237232, "tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc": 0.014993397248606882, "tests/base/test_context.py::test_specify_different_channels_cli_condarc": 0.015110230052536559, "tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc": 0.015380307373503791, "tests/base/test_context.py::test_subdirs": 0.005781325422316666, "tests/base/test_context.py::test_target_prefix": 0.05511267904542218, "tests/base/test_context.py::test_threads": 0.023593717970861478, "tests/base/test_context.py::test_validate_channels[-expected_channels3]": 0.0016873080377221795, "tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]": 0.00267907695037227, "tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]": 0.002749001245733327, "tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]": 0.0023092533750965053, "tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]": 0.0016630256124443238, "tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]": 0.0022226044113875004, "tests/cli/test_actions.py::test_null_count_action": 0.003851688788895637, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]": 0.023372958333363652, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]": 0.022774191666651216, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']": 0.030606701151500455, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']": 0.027179822331406554, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]": 0.03146945751293211, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]": 0.032818950401078024, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]": 0.07210441706862077, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]": 0.04216569725554107, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]": 0.1433005441322856, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]": 0.10877661719156585, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]": 0.08366679059698208, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]": 0.23833473665849902, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]": 0.04623151709941916, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]": 0.1462384079013125, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]": 0.03667784834697835, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]": 0.04521488257622254, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]": 0.03409770808428267, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]": 0.038045109655558296, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]": 0.1304083524911909, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]": 0.029431477103538804, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]": 0.030048892513790722, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]": 0.1638829062854216, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]": 0.036429295287490435, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]": 0.13993619754881453, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]": 0.0032428105457649437, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]": 0.0033297278342693504, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]": 0.008203668582006893, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]": 0.009526337312594783, "tests/cli/test_all_commands.py::test_env_spec_deprecation_removal": 0.0028269648976392155, "tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used": 0.0030772565216805508, "tests/cli/test_cli_install.py::test_emscripten_forge[classic]": 12.05788081541932, "tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]": 6.78121039315721, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]": 265.184700165698, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]": 0.02821387115826457, "tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]": 17.37632381973308, "tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]": 20.161018380690745, "tests/cli/test_cli_install.py::test_pre_link_message[classic]": 1.4895810274428407, "tests/cli/test_cli_install.py::test_pre_link_message[libmamba]": 2.254621349951882, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]": 0.009298713422044197, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]": 0.008613972003385742, "tests/cli/test_common.py::test_check_non_admin_enabled_false": 0.006605416046468127, "tests/cli/test_common.py::test_check_non_admin_enabled_true": 0.006000115185456527, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none": 0.0026920917852008472, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec": 0.002522832174220611, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier": 0.002422324592511147, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both": 0.003232535558232778, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name": 0.0029456414299723435, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix": 0.0029483090783804142, "tests/cli/test_common.py::test_is_active_prefix[-False]": 0.007561539929711804, "tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]": 0.0022654580770366814, "tests/cli/test_common.py::test_print_activate": 0.0021543901570411097, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]": 0.006307516270922264, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]": 0.006407741336401112, "tests/cli/test_common.py::test_validate_file_exists[D:\\\\a\\\\conda-libmamba-solver\\\\conda-libmamba-solver\\\\conda\\\\tests\\\\cli\\\\test_common.py-True]": 0.0017860203720907507, "tests/cli/test_common.py::test_validate_file_exists[D:\\\\a\\\\conda\\\\conda\\\\tests\\\\cli\\\\test_common.py-True]": 0.003079978557991429, "tests/cli/test_common.py::test_validate_file_exists[file://D:\\\\a\\\\conda-libmamba-solver\\\\conda-libmamba-solver\\\\conda\\\\tests\\\\cli\\\\test_common.py-True]": 0.0017342701667739638, "tests/cli/test_common.py::test_validate_file_exists[file://D:\\\\a\\\\conda\\\\conda\\\\tests\\\\cli\\\\test_common.py-True]": 0.0023296644826645762, "tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]": 0.0020926313026091723, "tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]": 0.0018791747115748914, "tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]": 0.0023495014819405135, "tests/cli/test_common.py::test_validate_subdir_config": 0.003346845981503496, "tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir": 0.004251599598723583, "tests/cli/test_compare.py::test_compare_fail": 0.646915720409091, "tests/cli/test_compare.py::test_compare_success": 0.4564431742336265, "tests/cli/test_conda_argparse.py::test_cli_args_as_strings": 0.0964263415350338, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]": 0.0019373464890162144, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-]": 0.0019239098747018814, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]": 0.0019143028602484167, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]": 0.0019073974390949662, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]": 0.0020569019219611366, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]": 0.002033155098440173, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]": 0.002011587536366154, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]": 0.0019672711298076473, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]": 0.0019468315147603177, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]": 0.0019211455986108221, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]": 0.0019225580473388325, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]": 0.0019394959264403152, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]": 0.0019099211122260093, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]": 0.001957381365162698, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]": 0.0019264614079455645, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]": 0.0018866367009292766, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]": 0.0018768045788199366, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]": 0.001964794704197213, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]": 0.001914398492750503, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]": 0.0019082331259114055, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]": 0.001912943723489368, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]": 0.0020169573450588563, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]": 0.0019713341342152348, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]": 0.001855793053087349, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]": 0.0019173866292728145, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]": 0.0018741808699832673, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]": 0.0018879557696470804, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]": 0.001858660893942156, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]": 0.0018974287694203033, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]": 0.0019000311501397422, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]": 0.0018719274696878201, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]": 0.0018746979573247074, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]": 0.0018856397082245805, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]": 0.00188459026117913, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]": 0.0018897862612079505, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]": 0.001896421307406921, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]": 0.0018763641805466023, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]": 0.001974448873617626, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]": 0.0018837836764831588, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-]": 0.0019031429455822475, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-]": 0.0019495793568767151, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]": 0.0019150881695349279, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]": 0.001897182946168945, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]": 0.0018884371199682668, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-]": 0.0018622474612565317, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-]": 0.0018651939638267229, "tests/cli/test_conda_argparse.py::test_parse_clobber": 0.032085599667938794, "tests/cli/test_conda_argparse.py::test_parser_basics": 0.02268586960962208, "tests/cli/test_conda_argparse.py::test_sorted_commands_in_error": 0.002751919397850856, "tests/cli/test_config.py::test_add_invalid_key": 0.03763187325958694, "tests/cli/test_config.py::test_add_key": 0.050226743772683956, "tests/cli/test_config.py::test_channels_add_duplicate": 0.04715242175408796, "tests/cli/test_config.py::test_channels_add_empty": 0.04807413414754547, "tests/cli/test_config.py::test_channels_add_empty_with_defaults": 0.04870177916473515, "tests/cli/test_config.py::test_channels_append": 0.05827270392471409, "tests/cli/test_config.py::test_channels_append_duplicate": 0.043173820612578774, "tests/cli/test_config.py::test_channels_prepend": 0.09494259222829081, "tests/cli/test_config.py::test_channels_prepend_duplicate": 0.04510624911653562, "tests/cli/test_config.py::test_channels_remove": 0.04154496326819218, "tests/cli/test_config.py::test_channels_remove_duplicate": 0.06487911634371507, "tests/cli/test_config.py::test_conda_config_describe": 0.47030319341030935, "tests/cli/test_config.py::test_conda_config_validate": 0.13870445413681157, "tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore": 0.07499812408409084, "tests/cli/test_config.py::test_create_condarc_on_set": 0.03947952335591725, "tests/cli/test_config.py::test_custom_multichannels_add": 0.0475143707827911, "tests/cli/test_config.py::test_custom_multichannels_add_duplicate": 0.039341415527606394, "tests/cli/test_config.py::test_custom_multichannels_append": 0.043717324486571306, "tests/cli/test_config.py::test_custom_multichannels_append_duplicate": 0.04059255385415236, "tests/cli/test_config.py::test_custom_multichannels_prepend": 0.039701602218456165, "tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate": 0.04311741276837651, "tests/cli/test_config.py::test_get_all": 0.045378440504328, "tests/cli/test_config.py::test_get_all_inc_maps": 0.05986518069202752, "tests/cli/test_config.py::test_get_boolean_value": 0.04086752071847566, "tests/cli/test_config.py::test_get_channels_list": 0.04164297726410584, "tests/cli/test_config.py::test_get_invalid_key": 0.03993682552334972, "tests/cli/test_config.py::test_get_map_full": 0.04158176161421835, "tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]": 0.04585499530370937, "tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]": 0.04280450929894071, "tests/cli/test_config.py::test_get_multiple_keys": 0.05943138313213537, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_full": 0.04416606597150471, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey": 0.051390367787264225, "tests/cli/test_config.py::test_get_string_value": 0.049625411110790156, "tests/cli/test_config.py::test_get_unconfigured_key": 0.04157815410809636, "tests/cli/test_config.py::test_invalid_yaml": 0.046331430416751945, "tests/cli/test_config.py::test_remove_key": 0.04613276902933956, "tests/cli/test_config.py::test_remove_key_duplicate": 0.06524304861947958, "tests/cli/test_config.py::test_remove_unconfigured_key": 0.043471754705796124, "tests/cli/test_config.py::test_set_and_get_bool": 0.06679373094808848, "tests/cli/test_config.py::test_set_check_types[always_yes-false-False]": 0.0470134823941893, "tests/cli/test_config.py::test_set_check_types[always_yes-no-False]": 0.035024455243029974, "tests/cli/test_config.py::test_set_check_types[always_yes-true-True]": 0.03533278573523237, "tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]": 0.041155751452874596, "tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]": 0.04284426211306903, "tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]": 0.03632776490091404, "tests/cli/test_config.py::test_set_invalid_key": 0.033389863367748206, "tests/cli/test_config.py::test_set_key": 0.04351305328950049, "tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]": 0.03994794122696967, "tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]": 0.0006919782841106402, "tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]": 0.0395199840708629, "tests/cli/test_config.py::test_set_rc_without_user_rc": 0.03994325145595869, "tests/cli/test_config.py::test_set_unconfigured_key": 0.04115131842541718, "tests/cli/test_config.py::test_show_sorts_keys": 0.093212871055917, "tests/cli/test_config.py::test_ssl_verify_default": 0.003673694796149975, "tests/cli/test_config.py::test_ssl_verify_set_bool": 0.03639202331788563, "tests/cli/test_config.py::test_ssl_verify_set_filename": 0.03679179894219541, "tests/cli/test_env.py::test_conda_env_create_empty_file[classic]": 0.0793475320689119, "tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]": 0.04135427470347783, "tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]": 1.1649081568557391, "tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]": 1.1416174705327717, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]": 0.03584153576382204, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]": 0.03460585346817756, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]": 0.03849298112993652, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]": 0.06375279523874214, "tests/cli/test_env.py::test_conda_env_create_no_file[classic]": 0.04497348896237803, "tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]": 0.03416792306231333, "tests/cli/test_env.py::test_create_dry_run_json[classic]": 0.09785181383818178, "tests/cli/test_env.py::test_create_dry_run_json[libmamba]": 1.7866801414984697, "tests/cli/test_env.py::test_create_dry_run_yaml[classic]": 0.26585862942277316, "tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]": 1.989522307748828, "tests/cli/test_env.py::test_create_unsolvable_env[classic]": 2.8797077322821596, "tests/cli/test_env.py::test_create_unsolvable_env[libmamba]": 2.508705554688837, "tests/cli/test_env.py::test_create_valid_env[classic]": 5.211913638963513, "tests/cli/test_env.py::test_create_valid_env[libmamba]": 2.5267600513324227, "tests/cli/test_env.py::test_create_valid_env_json_output[classic]": 0.11585650348654769, "tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]": 1.9040358647752196, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]": 50.44502375496486, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]": 15.690282145814427, "tests/cli/test_env.py::test_create_valid_env_with_variables[classic]": 3.829708281430574, "tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]": 2.1842938826306346, "tests/cli/test_env.py::test_env_export[classic]": 17.51256192350097, "tests/cli/test_env.py::test_env_export[libmamba]": 5.299332570118136, "tests/cli/test_env.py::test_env_export_json[classic]": 0.8352262527827975, "tests/cli/test_env.py::test_env_export_json[libmamba]": 2.0258115617570347, "tests/cli/test_env.py::test_env_export_with_variables[classic]": 12.533091116830363, "tests/cli/test_env.py::test_env_export_with_variables[libmamba]": 4.738137276871894, "tests/cli/test_env.py::test_env_list_size[classic]": 0.3599444988954539, "tests/cli/test_env.py::test_env_list_size[libmamba]": 1.241127713701296, "tests/cli/test_env.py::test_env_list_size_json[classic]": 0.16125866748291195, "tests/cli/test_env.py::test_env_list_size_json[libmamba]": 0.5097747905303056, "tests/cli/test_env.py::test_export_multi_channel[classic]": 45.446572721831984, "tests/cli/test_env.py::test_export_multi_channel[libmamba]": 26.09088021339509, "tests/cli/test_env.py::test_list[classic]": 1.3117298045903618, "tests/cli/test_env.py::test_list[libmamba]": 5.0987601200736705, "tests/cli/test_env.py::test_list_info_envs[classic]": 0.21569782897943668, "tests/cli/test_env.py::test_list_info_envs[libmamba]": 0.17424474984693628, "tests/cli/test_env.py::test_name_override[classic]": 1.7302735290276945, "tests/cli/test_env.py::test_name_override[libmamba]": 2.351711416020419, "tests/cli/test_env.py::test_non_existent_file[classic]": 0.038207260390068463, "tests/cli/test_env.py::test_non_existent_file[libmamba]": 0.031210696732545746, "tests/cli/test_env.py::test_pip_error_is_propagated[classic]": 35.9717546209846, "tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]": 13.983223544549624, "tests/cli/test_env.py::test_remove_dry_run[classic]": 0.626626573053452, "tests/cli/test_env.py::test_remove_dry_run[libmamba]": 2.2476210969609265, "tests/cli/test_env.py::test_set_unset_env_vars[classic]": 0.7488399927601989, "tests/cli/test_env.py::test_set_unset_env_vars[libmamba]": 2.324623968328157, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]": 0.04462239115317644, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]": 0.04834910990580913, "tests/cli/test_env.py::test_update[classic]": 30.383099830308137, "tests/cli/test_env.py::test_update[libmamba]": 4.726437055244338, "tests/cli/test_env.py::test_update_env_json_output[classic]": 29.944346388267846, "tests/cli/test_env.py::test_update_env_json_output[libmamba]": 3.6861295171740247, "tests/cli/test_env.py::test_update_env_no_action_json_output[classic]": 66.5414619212645, "tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]": 20.399003720053322, "tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]": 65.1834737995854, "tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]": 19.164404642519635, "tests/cli/test_find_commands.py::test_find_commands[subset0]": 0.030013835984507353, "tests/cli/test_find_commands.py::test_find_commands[subset1]": 0.000494774852080235, "tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]": 0.016509361776139982, "tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]": 0.015518035554233835, "tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]": 0.007895074184705603, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]": 0.002628912313475717, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]": 0.002720893880612938, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]": 0.0026510250487233205, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]": 0.0024549276699192017, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]": 0.00241951735797544, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]": 0.0023176188244213645, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]": 0.002182418294841626, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]": 0.0021209908130978504, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]": 0.002150827357124129, "tests/cli/test_helpers.py::test_choices_func_exception_propagation": 0.0018879397699340101, "tests/cli/test_helpers.py::test_choices_property_evaluation": 0.0018839243548982735, "tests/cli/test_helpers.py::test_choices_setter_ignores_values": 0.001804942058271521, "tests/cli/test_helpers.py::test_conda_export_format_integration": 0.0023251253291318333, "tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]": 0.0026446352875026105, "tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]": 0.002673329352077976, "tests/cli/test_helpers.py::test_empty_choices_behavior": 0.005297240211597726, "tests/cli/test_helpers.py::test_invalid_choice_handling[orange]": 0.0030421882586579223, "tests/cli/test_helpers.py::test_invalid_choice_handling[purple]": 0.008319693992790242, "tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]": 0.003175145724170709, "tests/cli/test_helpers.py::test_lazy_choices_action_initialization": 0.0019432236635056905, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]": 0.0020792774673186304, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]": 0.0020597537395483484, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]": 0.0020748517261977256, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]": 0.0020529848672171096, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]": 0.002036237734230545, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]": 0.002086389325480489, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]": 0.0020384632707300928, "tests/cli/test_helpers.py::test_valid_choice_handling[blue]": 0.0019072600269362547, "tests/cli/test_helpers.py::test_valid_choice_handling[green]": 0.0019985117225625472, "tests/cli/test_helpers.py::test_valid_choice_handling[red]": 0.0028187364347358776, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]": 0.025559474621758258, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]": 0.02869262914943383, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]": 0.025102861621566233, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]": 0.02634273582396251, "tests/cli/test_main.py::test_main": 0.0621281732104826, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]": 0.006599551114492763, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]": 0.020491042242785966, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]": 0.006439739374284045, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]": 0.006666819674293975, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]": 0.00667170099871109, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]": 0.052027559797503266, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]": 0.0065253427335755605, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]": 0.025837049996691713, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]": 0.0062805785044490565, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]": 0.006747150828795793, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]": 0.007051185478518428, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]": 0.0005574184666758122, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]": 0.00038030346788519215, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]": 0.000388014416610909, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]": 0.00037029057648027525, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]": 0.0003707624968573403, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]": 0.0003979793687371136, "tests/cli/test_main.py::test_main_subshell_help_exits_cleanly": 0.025943134269658143, "tests/cli/test_main.py::test_main_subshell_no_plugins_flag": 0.026137748506182473, "tests/cli/test_main.py::test_version_fast_path[--version]": 0.0023125159371476162, "tests/cli/test_main.py::test_version_fast_path[-V]": 0.0028497847030985817, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]": 0.0022465110107693234, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]": 0.002369568138971435, "tests/cli/test_main_clean.py::test_clean_all[False]": 0.5810928633699849, "tests/cli/test_main_clean.py::test_clean_all[True]": 0.7955419682949687, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]": 0.6949240736544319, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]": 0.23148759539187677, "tests/cli/test_main_clean.py::test_clean_and_packages": 0.44610685934446864, "tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs": 0.25339369273414925, "tests/cli/test_main_clean.py::test_clean_index_cache": 0.15753295006792958, "tests/cli/test_main_clean.py::test_clean_logfiles": 0.151340904675909, "tests/cli/test_main_clean.py::test_clean_tarballs": 0.14387178459677216, "tests/cli/test_main_clean.py::test_clean_tarballs_partial": 0.05171572686760658, "tests/cli/test_main_clean.py::test_clean_tempfiles": 0.14383301309860702, "tests/cli/test_main_clean.py::test_get_size": 0.0036322741312046275, "tests/cli/test_main_clean.py::test_get_size_None": 0.0019289509001957383, "tests/cli/test_main_clean.py::test_get_size_list": 0.0019268045336288486, "tests/cli/test_main_commands.py::test_commands": 0.03314198008804817, "tests/cli/test_main_compare.py::test_compare": 0.04891454666517175, "tests/cli/test_main_compare.py::test_get_packages": 0.12592868539560675, "tests/cli/test_main_config.py::test_config_describe": 0.07307154163388903, "tests/cli/test_main_config.py::test_config_describe_json": 0.09019689516695224, "tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format": 0.02958949184053286, "tests/cli/test_main_config.py::test_config_env_does_not_exist": 0.03580509249128878, "tests/cli/test_main_config.py::test_config_file_context_manager": 0.00440945516867122, "tests/cli/test_main_config.py::test_config_file_context_manager_exception": 0.00580436232868434, "tests/cli/test_main_config.py::test_config_file_from_env_condarc": 0.005405483308635969, "tests/cli/test_main_config.py::test_config_file_from_system_condarc": 0.01565689963116928, "tests/cli/test_main_config.py::test_config_file_from_user_condarc": 0.010559992006885772, "tests/cli/test_main_config.py::test_config_get_key": 0.006665757744387369, "tests/cli/test_main_config.py::test_config_get_missing[get]": 0.03898623089909637, "tests/cli/test_main_config.py::test_config_get_missing[key]": 0.04286106378772123, "tests/cli/test_main_config.py::test_config_get_missing[unknown]": 0.04043483665309243, "tests/cli/test_main_config.py::test_config_get_system[get]": 0.03668296799737685, "tests/cli/test_main_config.py::test_config_get_system[key]": 0.03756769717003646, "tests/cli/test_main_config.py::test_config_get_system[unknown]": 0.03587516129738777, "tests/cli/test_main_config.py::test_config_get_user[get]": 0.04097168482898109, "tests/cli/test_main_config.py::test_config_get_user[key]": 0.03902239828898885, "tests/cli/test_main_config.py::test_config_get_user[unknown]": 0.04028087086336948, "tests/cli/test_main_config.py::test_config_read_rc": 0.004460314327495347, "tests/cli/test_main_config.py::test_config_remove_item": 0.011490682407936999, "tests/cli/test_main_config.py::test_config_remove_key": 0.002161728013049357, "tests/cli/test_main_config.py::test_config_set_and_get_key_for_env": 0.11726586783725798, "tests/cli/test_main_config.py::test_config_set_key": 0.003922206036517678, "tests/cli/test_main_config.py::test_config_set_keys": 0.014832010782912972, "tests/cli/test_main_config.py::test_config_set_keys_aliases": 0.15948241919381076, "tests/cli/test_main_config.py::test_config_show": 0.06541660903840524, "tests/cli/test_main_config.py::test_config_show_errors": 0.055338574819246394, "tests/cli/test_main_config.py::test_config_show_sources_json": 0.03389010102678965, "tests/cli/test_main_config.py::test_config_write_rc": 0.007352148578139808, "tests/cli/test_main_config.py::test_format_dict_mapping_items": 0.011003892336655871, "tests/cli/test_main_config.py::test_key_exists[False]": 0.0031884438461568416, "tests/cli/test_main_config.py::test_key_exists[True]": 0.0031860574218884503, "tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export": 0.4319409529735544, "tests/cli/test_main_export.py::test_execute_export_no_file_specified": 0.05026089983990225, "tests/cli/test_main_export.py::test_export": 0.07040627147527675, "tests/cli/test_main_export.py::test_export_add_channels": 0.05724100356750937, "tests/cli/test_main_export.py::test_export_explicit_format_validation_errors": 11.949529104704887, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]": 0.04648917784639039, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]": 0.05628573428397149, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]": 0.03740156179350389, "tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular": 0.1352211397398661, "tests/cli/test_main_export.py::test_export_format_consistency": 0.0024009535194150335, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]": 0.04341880103198647, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]": 0.050234702088114085, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]": 0.040961691478441954, "tests/cli/test_main_export.py::test_export_format_priority_over_extension": 0.04043581955618763, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]": 0.04455526090819791, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]": 0.04029354787109658, "tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]": 0.039979668000531335, "tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]": 0.04310511294913458, "tests/cli/test_main_export.py::test_export_from_history_format": 0.17129780715879653, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]": 0.3598108198211083, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]": 0.17460092164119942, "tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast": 0.031212148954931525, "tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast": 0.032593343898547296, "tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast": 0.0280893007827886, "tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility": 0.05039904788989798, "tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error": 0.052905506045606024, "tests/cli/test_main_export.py::test_export_multiple_platforms": 6.302409045145668, "tests/cli/test_main_export.py::test_export_no_builds_format": 0.6053025397613098, "tests/cli/test_main_export.py::test_export_non_pip_env_warnings": 11.155919630952381, "tests/cli/test_main_export.py::test_export_override_channels": 0.0946836443210192, "tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence": 1.2587326749126673, "tests/cli/test_main_export.py::test_export_override_channels_behavior": 0.13447551393682874, "tests/cli/test_main_export.py::test_export_package_alphabetical_ordering": 0.23299703758549595, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]": 0.04426086476617793, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]": 0.07222959117787825, "tests/cli/test_main_export.py::test_export_platform_argument": 0.05816368661139101, "tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages": 1.2048698164706142, "tests/cli/test_main_export.py::test_export_regular_format_consistency": 0.07559659526331278, "tests/cli/test_main_export.py::test_export_single_platform_different_platform": 2.4182016999941904, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]": 0.04493146690054887, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]": 0.04552719414901927, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]": 0.04262343391532437, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]": 0.04771576668822327, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]": 0.03549454186125994, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]": 0.03714276647807055, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]": 0.03580777193745307, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]": 0.035605555468377285, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]": 0.037372665503412346, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]": 0.035228589538637466, "tests/cli/test_main_export.py::test_export_unknown_format_verbose": 0.02584570151823846, "tests/cli/test_main_export.py::test_export_unrecognized_file_extension": 0.10270341680177694, "tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]": 0.02823987795079705, "tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]": 0.02896634788146908, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]": 13.983080142857188, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]": 12.941020869642864, "tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]": 14.338687571428538, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]": 11.497560495833358, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]": 11.710451597619072, "tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]": 12.199653759523807, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]": 14.122413640636816, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]": 16.15655264973953, "tests/cli/test_main_info.py::test_compute_prefix_size": 1.9548707623924886, "tests/cli/test_main_info.py::test_compute_prefix_size_empty_env": 0.005076848868779968, "tests/cli/test_main_info.py::test_info_all": 0.20937789245990274, "tests/cli/test_main_info.py::test_info_base": 0.07200658656912297, "tests/cli/test_main_info.py::test_info_detail": 0.08200670814619954, "tests/cli/test_main_info.py::test_info_envs": 0.06671899355111707, "tests/cli/test_main_info.py::test_info_envs_frozen": 0.04491065567161266, "tests/cli/test_main_info.py::test_info_envs_json": 0.03392485341050157, "tests/cli/test_main_info.py::test_info_envs_size": 0.7814424340985323, "tests/cli/test_main_info.py::test_info_envs_size_json": 0.12798568109460987, "tests/cli/test_main_info.py::test_info_json": 0.05893954171662267, "tests/cli/test_main_info.py::test_info_size_without_envs": 0.029767085244384123, "tests/cli/test_main_info.py::test_info_system": 0.11565061475852464, "tests/cli/test_main_info.py::test_info_unsafe_channels": 0.06718347714533651, "tests/cli/test_main_info.py::test_iter_info_components": 0.0019074793941733594, "tests/cli/test_main_install.py::test_build_version_shows_as_changed": 24.738934227202275, "tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip": 70.6933758954071, "tests/cli/test_main_install.py::test_install_freezes_env_by_default": 1.2983010695109438, "tests/cli/test_main_install.py::test_install_from_extracted_package": 8.141238705009817, "tests/cli/test_main_install.py::test_install_revision_revert": 2.4734263527484757, "tests/cli/test_main_install.py::test_too_many_arguments": 0.02871777126210872, "tests/cli/test_main_list.py::test_exit_codes": 2.183495421020423, "tests/cli/test_main_list.py::test_explicit[--md5]": 0.3007708001246806, "tests/cli/test_main_list.py::test_explicit[--sha256]": 0.2686146831818438, "tests/cli/test_main_list.py::test_explicit[None]": 0.2804877780490606, "tests/cli/test_main_list.py::test_export": 0.2469284983947776, "tests/cli/test_main_list.py::test_fields_all": 1.1790961537845326, "tests/cli/test_main_list.py::test_fields_dependent": 0.2702138928076613, "tests/cli/test_main_list.py::test_fields_invalid": 1.0477902411539846, "tests/cli/test_main_list.py::test_list": 0.1468448353907264, "tests/cli/test_main_list.py::test_list_argument_variations[args0]": 1.043220062809822, "tests/cli/test_main_list.py::test_list_argument_variations[args10]": 0.645606492315819, "tests/cli/test_main_list.py::test_list_argument_variations[args11]": 1.0880992178033406, "tests/cli/test_main_list.py::test_list_argument_variations[args12]": 0.04376379405268496, "tests/cli/test_main_list.py::test_list_argument_variations[args13]": 0.03598671640285277, "tests/cli/test_main_list.py::test_list_argument_variations[args14]": 0.07211349738379659, "tests/cli/test_main_list.py::test_list_argument_variations[args15]": 0.03606986925186966, "tests/cli/test_main_list.py::test_list_argument_variations[args1]": 1.072541304409034, "tests/cli/test_main_list.py::test_list_argument_variations[args2]": 0.8520120688286047, "tests/cli/test_main_list.py::test_list_argument_variations[args3]": 1.0512861259232595, "tests/cli/test_main_list.py::test_list_argument_variations[args4]": 0.05517095706938936, "tests/cli/test_main_list.py::test_list_argument_variations[args5]": 0.05141327989834144, "tests/cli/test_main_list.py::test_list_argument_variations[args6]": 0.04406865749104926, "tests/cli/test_main_list.py::test_list_argument_variations[args7]": 0.03578419390239062, "tests/cli/test_main_list.py::test_list_argument_variations[args8]": 1.1204182405023113, "tests/cli/test_main_list.py::test_list_argument_variations[args9]": 1.059383880868218, "tests/cli/test_main_list.py::test_list_explicit": 0.2586440470155035, "tests/cli/test_main_list.py::test_list_full_name": 1.096370703374097, "tests/cli/test_main_list.py::test_list_full_name_no_results": 1.0412726634432332, "tests/cli/test_main_list.py::test_list_json": 1.18484474582103, "tests/cli/test_main_list.py::test_list_package": 1.0480736941094375, "tests/cli/test_main_list.py::test_list_reverse": 0.19372498733255025, "tests/cli/test_main_list.py::test_list_revisions": 0.06773375406486393, "tests/cli/test_main_list.py::test_list_size": 0.1699194192449363, "tests/cli/test_main_list.py::test_list_size_empty_paths_data": 0.25595254722506294, "tests/cli/test_main_list.py::test_list_size_json": 0.172485165009209, "tests/cli/test_main_list.py::test_list_specific_version": 0.16501024227355, "tests/cli/test_main_list.py::test_list_with_bad_prefix_raises": 0.035840855115794615, "tests/cli/test_main_notices.py::test_cache_names_appear_as_expected": 0.13053129194627724, "tests/cli/test_main_notices.py::test_main_notices[200]": 0.14626563671079373, "tests/cli/test_main_notices.py::test_main_notices[404]": 0.1423976222806757, "tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field": 0.1664096463051091, "tests/cli/test_main_notices.py::test_main_notices_help": 0.0292288271574261, "tests/cli/test_main_notices.py::test_main_notices_json": 0.03451654334677318, "tests/cli/test_main_notices.py::test_main_notices_reads_from_cache": 0.16222468037387666, "tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache": 0.14488749134049103, "tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands": 0.7450284042974004, "tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files": 0.14116996681003727, "tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure": 0.591865241338977, "tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error": 1.2206516371122391, "tests/cli/test_main_notices.py::test_notices_work_with_s3_channel": 0.14515349130842578, "tests/cli/test_main_remove.py::test_remove_all": 13.43562935299967, "tests/cli/test_main_remove.py::test_remove_all_default_activation_env": 0.06339311346061462, "tests/cli/test_main_remove.py::test_remove_all_keep_env": 15.932475643255156, "tests/cli/test_main_remove.py::test_remove_early_existence_check": 0.03585351871412371, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]": 30.771809522683178, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]": 3.1438214381742187, "tests/cli/test_main_remove.py::test_remove_nonexistent_env": 0.027677172639425308, "tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name": 2.3045273993660853, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name": 0.041656649507043765, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path": 0.03155922764833262, "tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env": 0.03186398844525943, "tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename": 2.3187874436688203, "tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error": 2.261753817988095, "tests/cli/test_main_rename.py::test_rename_by_name_success": 2.7155233884416248, "tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error": 2.3019897704054193, "tests/cli/test_main_rename.py::test_rename_by_path_success": 2.593887118926201, "tests/cli/test_main_rename.py::test_rename_default_activation_env": 0.10410871979094657, "tests/cli/test_main_rename.py::test_rename_with_dry_run": 2.309437700515927, "tests/cli/test_main_rename.py::test_rename_with_force": 4.813578872988506, "tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run": 2.3007716768557454, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors": 4.554774216277073, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix": 0.048110930329406845, "tests/cli/test_main_rename.py::test_separator_chars_on_win": 2.294319493791486, "tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix": 0.03281237463860582, "tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env": 0.03189724747196883, "tests/cli/test_main_run.py::test_multiline_run_command": 1.1442018634334452, "tests/cli/test_main_run.py::test_no_newline_in_output[stderr]": 11.376765911763806, "tests/cli/test_main_run.py::test_no_newline_in_output[stdout]": 10.373106764937098, "tests/cli/test_main_run.py::test_run_deactivates_environment_unix": 0.0004314569183606774, "tests/cli/test_main_run.py::test_run_deactivates_environment_windows": 0.008289099479925493, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]": 0.00042859506931541353, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]": 1.0259302970450754, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]": 0.00041206875680794154, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]": 1.1486234651631844, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]": 1.047880214049078, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]": 0.0004356353375077881, "tests/cli/test_main_run.py::test_run_readonly_env": 1.036476675330843, "tests/cli/test_main_run.py::test_run_returns_int": 1.7105773989889903, "tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel": 1.3653839566725043, "tests/cli/test_main_run.py::test_run_returns_zero_errorlevel": 1.1324314079267337, "tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]": 1.0374450211527853, "tests/cli/test_main_run.py::test_run_uncaptured[-s]": 1.0246050542983962, "tests/cli/test_main_run.py::test_run_with_empty_command_will_raise": 0.032164998249165626, "tests/cli/test_main_run.py::test_run_with_separator[combined option]": 1.0938863095863771, "tests/cli/test_main_run.py::test_run_with_separator[double dash option]": 1.059594809411288, "tests/cli/test_main_run.py::test_run_with_separator[multiple args]": 1.098236271868779, "tests/cli/test_main_run.py::test_run_with_separator[multiple separators]": 1.1078209932986143, "tests/cli/test_main_run.py::test_run_with_separator[no known args]": 1.195221515071654, "tests/cli/test_main_run.py::test_run_with_separator[no separator]": 1.2684687236029162, "tests/cli/test_main_run.py::test_run_with_separator[separator not first]": 1.1608275900087117, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]": 1.0762658308109636, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]": 1.2280074297027685, "tests/cli/test_main_search.py::test_anaconda_token_with_private_package": 14.488441562785306, "tests/cli/test_main_search.py::test_bad_anaconda_token": 0.8255422877460843, "tests/cli/test_main_search.py::test_current_platform_package_missing": 0.05305907551448997, "tests/cli/test_main_search.py::test_different_platform_package_found": 0.053637894864498, "tests/cli/test_main_search.py::test_mocked_platform_package_found": 0.061637458550970615, "tests/cli/test_main_search.py::test_pretty_record": 0.012935106388217453, "tests/cli/test_main_search.py::test_rpy_search[linux-32]": 6.991785435136736, "tests/cli/test_main_search.py::test_rpy_search[linux-64]": 9.109086926429335, "tests/cli/test_main_search.py::test_rpy_search[osx-64]": 11.135407914149088, "tests/cli/test_main_search.py::test_rpy_search[win-32]": 3.732935330361652, "tests/cli/test_main_search.py::test_rpy_search[win-64]": 9.178945278599745, "tests/cli/test_main_search.py::test_search_0": 6.198899973274575, "tests/cli/test_main_search.py::test_search_1": 0.7743256286243038, "tests/cli/test_main_search.py::test_search_2[exact]": 0.8555794940014138, "tests/cli/test_main_search.py::test_search_2[wildcard]": 3.2311530147506256, "tests/cli/test_main_search.py::test_search_3": 2.175715264062453, "tests/cli/test_main_search.py::test_search_4": 0.07752495543205046, "tests/cli/test_main_search.py::test_search_5": 0.791564732945201, "tests/cli/test_main_search.py::test_search_envs": 0.16340797888532763, "tests/cli/test_main_search.py::test_search_envs_info": 0.14300636864013608, "tests/cli/test_main_search.py::test_search_envs_json": 0.049882581028627825, "tests/cli/test_main_search.py::test_search_envs_nonexistent": 0.6616369212494987, "tests/cli/test_main_search.py::test_search_envs_nonexistent_info": 0.14401343544129103, "tests/cli/test_main_search.py::test_search_envs_nonexistent_json": 0.5101832492222989, "tests/cli/test_main_search.py::test_search_inflexible": 2.0895590674352893, "tests/cli/test_main_search.py::test_unknown_platform_package_missing": 0.07956717022579937, "tests/cli/test_main_update.py::test_dont_update_explicit_packages": 0.10760012982191773, "tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints": 0.033550171527604915, "tests/cli/test_main_update.py::test_update": 23.09400127637558, "tests/cli/test_startup_benchmarks.py::test_context_init": 0.00554798569940629, "tests/cli/test_startup_benchmarks.py::test_generate_parser": 0.036017943437547606, "tests/cli/test_startup_benchmarks.py::test_import_cli_main": 0.2922650704762061, "tests/cli/test_startup_benchmarks.py::test_import_conda_argparse": 0.47063561316964275, "tests/cli/test_startup_benchmarks.py::test_import_context": 0.2988706953124783, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]": 0.4646291854238553, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]": 0.8673114740786515, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]": 0.7134603681151573, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]": 0.5684990398403719, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]": 0.45837917382085785, "tests/cli/test_startup_benchmarks.py::test_version_main": 0.002059388794650848, "tests/cli/test_subcommands.py::test_clean[classic]": 11.900434457586353, "tests/cli/test_subcommands.py::test_clean[libmamba]": 8.45426372781164, "tests/cli/test_subcommands.py::test_compare[classic]": 0.05722558509104522, "tests/cli/test_subcommands.py::test_compare[libmamba]": 0.051304332101470576, "tests/cli/test_subcommands.py::test_config[classic]": 0.039488109256375185, "tests/cli/test_subcommands.py::test_config[libmamba]": 0.0374990580692868, "tests/cli/test_subcommands.py::test_create[classic]": 0.568061004071611, "tests/cli/test_subcommands.py::test_create[libmamba]": 2.9745349750171632, "tests/cli/test_subcommands.py::test_doctor[classic]": 6.183094467419308, "tests/cli/test_subcommands.py::test_doctor[libmamba]": 5.052146979699961, "tests/cli/test_subcommands.py::test_env_config_vars[classic]": 0.11309888315534382, "tests/cli/test_subcommands.py::test_env_config_vars[libmamba]": 0.11236784907585234, "tests/cli/test_subcommands.py::test_env_create[libmamba]": 2.943734434774811, "tests/cli/test_subcommands.py::test_env_export[classic]": 0.07015482628977761, "tests/cli/test_subcommands.py::test_env_export[libmamba]": 0.057493380626371236, "tests/cli/test_subcommands.py::test_env_list[classic]": 0.08842706141066446, "tests/cli/test_subcommands.py::test_env_list[libmamba]": 0.07735375761107753, "tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]": 0.031026040112545436, "tests/cli/test_subcommands.py::test_env_remove[classic]": 0.061249502019394046, "tests/cli/test_subcommands.py::test_env_remove[libmamba]": 0.05539045258649485, "tests/cli/test_subcommands.py::test_env_update[libmamba]": 3.2729517059958884, "tests/cli/test_subcommands.py::test_info[classic]": 0.09261106879504064, "tests/cli/test_subcommands.py::test_info[libmamba]": 0.055714173709681, "tests/cli/test_subcommands.py::test_info_json[classic]": 0.1458183172677246, "tests/cli/test_subcommands.py::test_info_json[libmamba]": 0.0874439796399456, "tests/cli/test_subcommands.py::test_init[classic]": 0.590945349357933, "tests/cli/test_subcommands.py::test_init[libmamba]": 0.6454897282281243, "tests/cli/test_subcommands.py::test_install[libmamba]": 2.483893431173535, "tests/cli/test_subcommands.py::test_list[libmamba]": 1.1998611948439022, "tests/cli/test_subcommands.py::test_notices[classic]": 0.426125928303606, "tests/cli/test_subcommands.py::test_notices[libmamba]": 0.22776807905899402, "tests/cli/test_subcommands.py::test_package[classic]": 0.05278154123589017, "tests/cli/test_subcommands.py::test_package[libmamba]": 0.05541442716366858, "tests/cli/test_subcommands.py::test_remove[classic-remove]": 0.05923575431698758, "tests/cli/test_subcommands.py::test_remove[classic-uninstall]": 0.05963813207956206, "tests/cli/test_subcommands.py::test_remove[libmamba-remove]": 0.08211797221551026, "tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]": 0.05286699551604659, "tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]": 1.4214809454516597, "tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]": 1.4199856794815537, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]": 2.1348880318421037, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]": 1.7799441223293142, "tests/cli/test_subcommands.py::test_rename[classic]": 0.3650016311063988, "tests/cli/test_subcommands.py::test_rename[libmamba]": 0.3685821167429257, "tests/cli/test_subcommands.py::test_run[libmamba]": 2.64906842824942, "tests/cli/test_subcommands.py::test_search[classic]": 2.5736149283636056, "tests/cli/test_subcommands.py::test_search[libmamba]": 3.518990228300445, "tests/cli/test_subcommands.py::test_update[libmamba-update]": 2.732436282411962, "tests/cli/test_subcommands.py::test_update[libmamba-upgrade]": 2.9433258676010365, "tests/common/_os/test_windows.py::test_is_admin_on_windows": 0.002025271524066165, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]": 0.00481117304144203, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]": 2.77821698775147, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]": 2.799436096014501, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]": 4.102407231833347, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]": 5.460751602492717, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]": 0.023815464531399613, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]": 0.024153346896911093, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]": 0.024331981275834403, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]": 0.004792913174453751, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]": 0.004670620430401157, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]": 0.023148458552562205, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]": 0.02234287693409256, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]": 0.023719186274239055, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]": 0.023015794445733137, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]": 5.541263183592465, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]": 0.022388159428596722, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]": 0.023523910065366048, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]": 0.037345373775007164, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]": 0.024131000190918028, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]": 0.02297270939906749, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]": 0.02255894583548972, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]": 0.023942817279004998, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]": 0.023299869063919166, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]": 0.024492470767851146, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]": 0.024063929171993497, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]": 0.02360427576068029, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]": 4.148837260456061, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]": 0.004668268716518769, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]": 0.013731870292029333, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]": 0.00782656259194305, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]": 0.00702377550158604, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]": 0.012674254280817573, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]": 0.008093208248293486, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]": 0.007754247604931273, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]": 0.008199259417671302, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]": 0.005125450990839132, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]": 0.005029011024774424, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]": 0.007466331287312506, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]": 0.008478862717689776, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]": 0.007793694076894739, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]": 0.007300269293526478, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]": 0.00812006257985629, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]": 0.007183013922524475, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]": 0.0071171424263871165, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]": 0.00802049304159037, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]": 0.007144357959631333, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]": 0.0070512874966778775, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]": 0.007211395213922519, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]": 0.00787049266549069, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]": 0.008154024116872691, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]": 0.007424624227325627, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]": 0.007168612954315248, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]": 0.009885398150454233, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]": 0.007089327936585328, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]": 0.0023778286716951568, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]": 0.001980067385209012, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]": 0.002177020117732575, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]": 0.02106056859510103, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]": 0.021394396011514466, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]": 0.02179035772742395, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]": 0.02108475218351191, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]": 0.0025094828834529904, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]": 0.0023774394547198983, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]": 0.0025465283748032537, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]": 0.006561952280607159, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]": 0.005565311407702466, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]": 0.01180574835457754, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]": 0.01179753108276758, "tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file": 0.0035253791414646763, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data": 0.006235541722376284, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data": 0.003239174679661504, "tests/common/pkg_formats/test_python.py::test_dist_get_paths": 0.0027153465566342244, "tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths": 0.001922945487192194, "tests/common/pkg_formats/test_python.py::test_evaluate_marker": 0.005311362858413549, "tests/common/pkg_formats/test_python.py::test_get_default_marker_context": 0.0018798598177435723, "tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link": 0.014628705951534768, "tests/common/pkg_formats/test_python.py::test_get_dist_requirements": 0.003514743969371717, "tests/common/pkg_formats/test_python.py::test_get_entry_points": 0.007348326775246727, "tests/common/pkg_formats/test_python.py::test_get_extra_provides": 0.0033417538347052236, "tests/common/pkg_formats/test_python.py::test_get_python_distribution_info": 0.00044042310778073373, "tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files": 0.042885235961183335, "tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]": 0.004432548911648392, "tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]": 0.00238278303843218, "tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]": 0.002657096808896422, "tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]": 0.0023841465165786585, "tests/common/pkg_formats/test_python.py::test_metadata_keys": 0.0014939713274331752, "tests/common/pkg_formats/test_python.py::test_metadata_none": 0.0015046575201252592, "tests/common/pkg_formats/test_python.py::test_metadata_process_path": 0.0029252324217559538, "tests/common/pkg_formats/test_python.py::test_metadata_read_metadata": 0.003516880872026975, "tests/common/pkg_formats/test_python.py::test_norm_package_name": 0.001917188361613624, "tests/common/pkg_formats/test_python.py::test_norm_package_version": 0.014141071589215721, "tests/common/pkg_formats/test_python.py::test_parse_specification": 0.007801368198918283, "tests/common/pkg_formats/test_python.py::test_pydist_check_files": 0.003816268798244886, "tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name": 0.014520304049017928, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath": 0.002375653551101969, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_path": 0.002609223286358543, "tests/common/pkg_formats/test_python.py::test_python_dist_info": 0.003520747169052816, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies": 0.010285967941403797, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2": 0.002510638174198326, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3": 0.0025116305565507317, "tests/common/pkg_formats/test_python.py::test_split_spec": 0.002216549517539846, "tests/common/test_configuration.py::test_commented_map_parameter": 0.0022734411418949695, "tests/common/test_configuration.py::test_config_resets": 0.0019724170016077397, "tests/common/test_configuration.py::test_cross_parameter_validation": 0.0014228256300273959, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]": 0.00039287361556552625, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]": 0.001579075520039178, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]": 0.0015332679200797757, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]": 0.0015917802470371393, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]": 0.001661989970691418, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]": 0.0017944810427932216, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]": 0.0015698125470150629, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]": 0.0016740382530829286, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]": 0.0016067572105589248, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]": 0.00038483060553441814, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]": 0.0015697507924747822, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]": 0.0016096623303073817, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]": 0.0015441155212632099, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]": 0.0016005772949540052, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]": 0.0016361329094571114, "tests/common/test_configuration.py::test_default_values": 0.001618699745380018, "tests/common/test_configuration.py::test_empty_map_parameter": 0.005874108404496204, "tests/common/test_configuration.py::test_env_var_config": 0.0018391315972617283, "tests/common/test_configuration.py::test_env_var_config_alias": 0.0018195133902597625, "tests/common/test_configuration.py::test_env_var_config_empty_sequence": 0.001690034650536032, "tests/common/test_configuration.py::test_env_var_config_no_split_sequence": 0.0018334815099694507, "tests/common/test_configuration.py::test_env_var_config_split_sequence": 0.0017892619929708218, "tests/common/test_configuration.py::test_expand_search_path": 0.0003825868022627954, "tests/common/test_configuration.py::test_expanded_variables": 0.004195898644910995, "tests/common/test_configuration.py::test_important_primitive_map_merges": 0.04245011012668418, "tests/common/test_configuration.py::test_invalid_map_parameter": 0.0016492939153189652, "tests/common/test_configuration.py::test_invalid_seq_parameter": 0.001781763752749909, "tests/common/test_configuration.py::test_list_merges": 0.036833349639108975, "tests/common/test_configuration.py::test_load_raw_configs": 0.020101892903169744, "tests/common/test_configuration.py::test_map_parameter_must_be_map": 0.002716891375236345, "tests/common/test_configuration.py::test_nested": 0.008151761823132191, "tests/common/test_configuration.py::test_object": 0.00922974539570842, "tests/common/test_configuration.py::test_object_defaults_completely_empty": 0.002079755466228667, "tests/common/test_configuration.py::test_object_defaults_partially_empty": 0.0046364693578908435, "tests/common/test_configuration.py::test_parameter": 0.0015191147671088563, "tests/common/test_configuration.py::test_parameter_flag": 0.0014395130222156828, "tests/common/test_configuration.py::test_pretty_list": 0.0018577572603688916, "tests/common/test_configuration.py::test_raise_errors": 0.0014828662735534692, "tests/common/test_configuration.py::test_set_search_path_empty_path": 0.0014206744048049728, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]": 0.004853878571453374, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]": 0.007697730357119239, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]": 0.005180653571454199, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]": 0.0063240214285657645, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]": 0.006497604761904763, "tests/common/test_configuration.py::test_set_search_path_reloads_raw_data": 0.015783927380983272, "tests/common/test_configuration.py::test_set_search_path_result_is_tuple": 0.004580311904836284, "tests/common/test_configuration.py::test_simple_merges_and_caching": 0.011883982098339527, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates": 0.003287324643939744, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key": 0.003021629373022278, "tests/common/test_configuration.py::test_validate_all": 0.02416435424631761, "tests/common/test_configuration.py::test_validation": 0.040968085600276705, "tests/common/test_io.py::test_attach_stderr_handler": 0.004993254211144522, "tests/common/test_io.py::test_captured": 0.005614826570425419, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]": 0.10780769750286966, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]": 0.0027476598809254597, "tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts": 0.0014911554444852102, "tests/common/test_json.py::test_condajsonencoder_with_dumps": 0.0015346247217125012, "tests/common/test_logic.py::test_ALL": 7.273458358530974, "tests/common/test_logic.py::test_AMONE": 1.2673295434850353, "tests/common/test_logic.py::test_AND": 0.012746162109701153, "tests/common/test_logic.py::test_ANY": 7.041791856184803, "tests/common/test_logic.py::test_ITE": 0.3881401406068086, "tests/common/test_logic.py::test_LinearBound": 6.604732597932649, "tests/common/test_logic.py::test_NOT": 0.005959777732569133, "tests/common/test_logic.py::test_OR": 0.009685104490821843, "tests/common/test_logic.py::test_XONE": 1.247045900728231, "tests/common/test_logic.py::test_XOR": 0.014016158811119601, "tests/common/test_logic.py::test_minimal_unsatisfiable_subset": 0.010033599862351982, "tests/common/test_logic.py::test_minimize": 0.0074247181414860775, "tests/common/test_logic.py::test_sat": 0.0019154875409592988, "tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]": 0.0017942947969711864, "tests/common/test_path.py::test_deprecations[is_package_file-TypeError]": 0.0017686271350262571, "tests/common/test_path.py::test_get_major_minor_version_no_dot": 0.0015432268496243396, "tests/common/test_path.py::test_missing_pyc_files_27": 0.0037735727548505868, "tests/common/test_path.py::test_missing_pyc_files_34": 0.003056770081827792, "tests/common/test_path.py::test_missing_pyc_files_35": 0.0020692060608911806, "tests/common/test_path.py::test_path_conversion[cygpath-PATH0]": 0.061370394020379145, "tests/common/test_path.py::test_path_conversion[cygpath-PATH10]": 0.059016752153465156, "tests/common/test_path.py::test_path_conversion[cygpath-PATH11]": 0.0939766160149069, "tests/common/test_path.py::test_path_conversion[cygpath-PATH1]": 0.0566952240495416, "tests/common/test_path.py::test_path_conversion[cygpath-PATH2]": 0.05853037369556517, "tests/common/test_path.py::test_path_conversion[cygpath-PATH3]": 0.040141452143115895, "tests/common/test_path.py::test_path_conversion[cygpath-PATH4]": 0.09471567602919227, "tests/common/test_path.py::test_path_conversion[cygpath-PATH5]": 0.057983743855863475, "tests/common/test_path.py::test_path_conversion[cygpath-PATH6]": 0.04065684627705218, "tests/common/test_path.py::test_path_conversion[cygpath-PATH7]": 0.05765295910194, "tests/common/test_path.py::test_path_conversion[cygpath-PATH8]": 0.09444430166733883, "tests/common/test_path.py::test_path_conversion[cygpath-PATH9]": 0.04113785931963068, "tests/common/test_path.py::test_path_conversion[cygpath-UNC0]": 0.0942773840229679, "tests/common/test_path.py::test_path_conversion[cygpath-UNC1]": 5.615680097976043, "tests/common/test_path.py::test_path_conversion[cygpath-UNC2]": 5.5585425168043345, "tests/common/test_path.py::test_path_conversion[cygpath-UNC3]": 5.512123594030973, "tests/common/test_path.py::test_path_conversion[cygpath-UNC4]": 0.05965732952169969, "tests/common/test_path.py::test_path_conversion[cygpath-UNC5]": 5.590491519473199, "tests/common/test_path.py::test_path_conversion[cygpath-UNC6]": 5.530495788651429, "tests/common/test_path.py::test_path_conversion[cygpath-UNC7]": 0.05856525773768405, "tests/common/test_path.py::test_path_conversion[cygpath-cwd0]": 0.09356096510122165, "tests/common/test_path.py::test_path_conversion[cygpath-cwd1]": 0.0038921397462683104, "tests/common/test_path.py::test_path_conversion[cygpath-cwd2]": 0.0036402623977691367, "tests/common/test_path.py::test_path_conversion[cygpath-cwd3]": 0.09446828343882757, "tests/common/test_path.py::test_path_conversion[cygpath-drive0]": 0.0402009213992465, "tests/common/test_path.py::test_path_conversion[cygpath-drive10]": 0.11182407326458597, "tests/common/test_path.py::test_path_conversion[cygpath-drive11]": 0.05890652397363005, "tests/common/test_path.py::test_path_conversion[cygpath-drive12]": 0.06072147765785332, "tests/common/test_path.py::test_path_conversion[cygpath-drive13]": 0.058725232083753603, "tests/common/test_path.py::test_path_conversion[cygpath-drive14]": 0.09441392195993395, "tests/common/test_path.py::test_path_conversion[cygpath-drive15]": 0.058031864146957206, "tests/common/test_path.py::test_path_conversion[cygpath-drive1]": 0.04196088275876506, "tests/common/test_path.py::test_path_conversion[cygpath-drive2]": 0.05780519854057337, "tests/common/test_path.py::test_path_conversion[cygpath-drive3]": 0.058185204813161036, "tests/common/test_path.py::test_path_conversion[cygpath-drive4]": 0.09469750967081018, "tests/common/test_path.py::test_path_conversion[cygpath-drive5]": 0.040739939798299506, "tests/common/test_path.py::test_path_conversion[cygpath-drive6]": 0.04081529492852114, "tests/common/test_path.py::test_path_conversion[cygpath-drive7]": 0.04090500433642125, "tests/common/test_path.py::test_path_conversion[cygpath-drive8]": 0.05932878343444171, "tests/common/test_path.py::test_path_conversion[cygpath-drive9]": 0.05795762904707799, "tests/common/test_path.py::test_path_conversion[cygpath-relative0]": 0.09284617539380507, "tests/common/test_path.py::test_path_conversion[cygpath-relative1]": 0.09455000555332221, "tests/common/test_path.py::test_path_conversion[cygpath-relative2]": 0.09327291151558477, "tests/common/test_path.py::test_path_conversion[cygpath-root0]": 0.09494716937009416, "tests/common/test_path.py::test_path_conversion[cygpath-root10]": 0.040289792727232925, "tests/common/test_path.py::test_path_conversion[cygpath-root11]": 0.057711085502824416, "tests/common/test_path.py::test_path_conversion[cygpath-root12]": 0.09439775156632159, "tests/common/test_path.py::test_path_conversion[cygpath-root13]": 0.039414358933162315, "tests/common/test_path.py::test_path_conversion[cygpath-root14]": 0.05927556234486717, "tests/common/test_path.py::test_path_conversion[cygpath-root1]": 0.039180949716485454, "tests/common/test_path.py::test_path_conversion[cygpath-root2]": 0.040815690232765385, "tests/common/test_path.py::test_path_conversion[cygpath-root3]": 0.057477942094034846, "tests/common/test_path.py::test_path_conversion[cygpath-root4]": 0.09326311927804913, "tests/common/test_path.py::test_path_conversion[cygpath-root5]": 0.04030724938502975, "tests/common/test_path.py::test_path_conversion[cygpath-root6]": 0.0407662126466926, "tests/common/test_path.py::test_path_conversion[cygpath-root7]": 0.05824751168053019, "tests/common/test_path.py::test_path_conversion[cygpath-root8]": 0.091853780113783, "tests/common/test_path.py::test_path_conversion[cygpath-root9]": 0.03959122569343383, "tests/common/test_path.py::test_path_conversion[fallback-PATH0]": 0.009435734743068904, "tests/common/test_path.py::test_path_conversion[fallback-PATH10]": 0.012368376828772787, "tests/common/test_path.py::test_path_conversion[fallback-PATH11]": 0.03382787068230028, "tests/common/test_path.py::test_path_conversion[fallback-PATH1]": 0.012015735433098116, "tests/common/test_path.py::test_path_conversion[fallback-PATH2]": 0.01182978996412602, "tests/common/test_path.py::test_path_conversion[fallback-PATH3]": 0.012804620973668879, "tests/common/test_path.py::test_path_conversion[fallback-PATH4]": 0.026847837075263743, "tests/common/test_path.py::test_path_conversion[fallback-PATH5]": 0.012781787995470298, "tests/common/test_path.py::test_path_conversion[fallback-PATH6]": 0.010138256887277274, "tests/common/test_path.py::test_path_conversion[fallback-PATH7]": 0.012167302404991379, "tests/common/test_path.py::test_path_conversion[fallback-PATH8]": 0.01776262720328973, "tests/common/test_path.py::test_path_conversion[fallback-PATH9]": 0.009390646132968326, "tests/common/test_path.py::test_path_conversion[fallback-UNC0]": 0.01704782128381423, "tests/common/test_path.py::test_path_conversion[fallback-UNC1]": 0.02256328406668057, "tests/common/test_path.py::test_path_conversion[fallback-UNC2]": 0.017440278298802715, "tests/common/test_path.py::test_path_conversion[fallback-UNC3]": 0.010003152825125816, "tests/common/test_path.py::test_path_conversion[fallback-UNC4]": 0.014765111643182505, "tests/common/test_path.py::test_path_conversion[fallback-UNC5]": 0.017134800788545526, "tests/common/test_path.py::test_path_conversion[fallback-UNC6]": 0.009708169107038657, "tests/common/test_path.py::test_path_conversion[fallback-UNC7]": 0.012625758628973678, "tests/common/test_path.py::test_path_conversion[fallback-cwd0]": 0.01747876998223013, "tests/common/test_path.py::test_path_conversion[fallback-cwd1]": 0.004370502424352387, "tests/common/test_path.py::test_path_conversion[fallback-cwd2]": 0.004439433284986222, "tests/common/test_path.py::test_path_conversion[fallback-cwd3]": 0.016908993148712866, "tests/common/test_path.py::test_path_conversion[fallback-drive0]": 0.012095931148264046, "tests/common/test_path.py::test_path_conversion[fallback-drive10]": 0.022860377157880786, "tests/common/test_path.py::test_path_conversion[fallback-drive11]": 0.015252958636048692, "tests/common/test_path.py::test_path_conversion[fallback-drive12]": 0.014377543331602866, "tests/common/test_path.py::test_path_conversion[fallback-drive13]": 0.014684821069068283, "tests/common/test_path.py::test_path_conversion[fallback-drive14]": 0.02240901334795413, "tests/common/test_path.py::test_path_conversion[fallback-drive15]": 0.014680283724326185, "tests/common/test_path.py::test_path_conversion[fallback-drive1]": 0.012245619285605564, "tests/common/test_path.py::test_path_conversion[fallback-drive2]": 0.0150298457342301, "tests/common/test_path.py::test_path_conversion[fallback-drive3]": 0.014365465359065379, "tests/common/test_path.py::test_path_conversion[fallback-drive4]": 0.022287713959424506, "tests/common/test_path.py::test_path_conversion[fallback-drive5]": 0.012086739550780212, "tests/common/test_path.py::test_path_conversion[fallback-drive6]": 0.01217725922809143, "tests/common/test_path.py::test_path_conversion[fallback-drive7]": 0.012314368054950689, "tests/common/test_path.py::test_path_conversion[fallback-drive8]": 0.014895452250372122, "tests/common/test_path.py::test_path_conversion[fallback-drive9]": 0.01486199432211928, "tests/common/test_path.py::test_path_conversion[fallback-relative0]": 0.01705349793410775, "tests/common/test_path.py::test_path_conversion[fallback-relative1]": 0.017705688650698916, "tests/common/test_path.py::test_path_conversion[fallback-relative2]": 0.017036382209861506, "tests/common/test_path.py::test_path_conversion[fallback-root0]": 0.017365605617299138, "tests/common/test_path.py::test_path_conversion[fallback-root10]": 0.009852912303680862, "tests/common/test_path.py::test_path_conversion[fallback-root11]": 0.012310165681761588, "tests/common/test_path.py::test_path_conversion[fallback-root12]": 0.01762713263249368, "tests/common/test_path.py::test_path_conversion[fallback-root13]": 0.009445797874357805, "tests/common/test_path.py::test_path_conversion[fallback-root14]": 0.012540828990756443, "tests/common/test_path.py::test_path_conversion[fallback-root1]": 0.010335087743263487, "tests/common/test_path.py::test_path_conversion[fallback-root2]": 0.009541366278855833, "tests/common/test_path.py::test_path_conversion[fallback-root3]": 0.01361363123042273, "tests/common/test_path.py::test_path_conversion[fallback-root4]": 0.016697786786357964, "tests/common/test_path.py::test_path_conversion[fallback-root5]": 0.009709299857845312, "tests/common/test_path.py::test_path_conversion[fallback-root6]": 0.014137349038450433, "tests/common/test_path.py::test_path_conversion[fallback-root7]": 0.012490379930643555, "tests/common/test_path.py::test_path_conversion[fallback-root8]": 0.017353210969621596, "tests/common/test_path.py::test_path_conversion[fallback-root9]": 0.009775898620307201, "tests/common/test_path.py::test_path_conversion_falsy[None]": 0.0016135013537124326, "tests/common/test_path.py::test_path_conversion_falsy[empty dict]": 0.001598707561189717, "tests/common/test_path.py::test_path_conversion_falsy[empty list]": 0.0016008266799292612, "tests/common/test_path.py::test_path_conversion_falsy[empty set]": 0.0017052946090431649, "tests/common/test_path.py::test_path_conversion_falsy[empty tuple]": 0.0016257251563507778, "tests/common/test_path.py::test_path_identity": 0.0032441563357008987, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]": 0.0017175724637704848, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]": 0.0018749656423186897, "tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]": 0.0017970364686353537, "tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]": 0.0017351154652543892, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]": 0.001760252738619182, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]": 0.0018638481925330446, "tests/common/test_path.py::test_url_to_path_unix": 0.0016560165199112622, "tests/common/test_path.py::test_url_to_path_windows_local": 0.0017567702234362447, "tests/common/test_path.py::test_url_to_path_windows_unc": 0.0015263002749042699, "tests/common/test_path.py::test_win_path_backout": 0.00145050345839239, "tests/common/test_serialize.py::test_comment_round_trip": 0.00601494515521574, "tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]": 0.0023609242511134585, "tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]": 0.00193545375110656, "tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]": 0.0017064950351334221, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]": 0.0017904120506606292, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]": 0.0016924492427309553, "tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]": 0.001752962123134422, "tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]": 0.0017270738613186787, "tests/common/test_serialize.py::test_encode_enum[value0- - disabled\\n-write]": 0.003672703372492772, "tests/common/test_serialize.py::test_encode_enum[value1- - warn\\n-write]": 0.001996353789418425, "tests/common/test_serialize.py::test_encode_enum[value2- - enabled\\n-write]": 0.0019949231597280776, "tests/common/test_serialize.py::test_encode_enum[value3-[\\n \"disabled\"\\n]-write]": 0.001739334737103684, "tests/common/test_serialize.py::test_encode_enum[value4-[\\n \"warn\"\\n]-write]": 0.0017465592988491594, "tests/common/test_serialize.py::test_encode_enum[value5-[\\n \"enabled\"\\n]-write]": 0.0018091525676542002, "tests/common/test_serialize.py::test_read_write[obj0-{\\n \"a_map\": {\\n \"a_key\": \"a_value\"\\n },\\n \"a_seq\": [\\n 1,\\n 2,\\n 3\\n ]\\n}-read-write0]": 0.004242415305152597, "tests/common/test_serialize.py::test_read_write[obj1-{\\n \"a_map\": {\\n \"field1\": true,\\n \"field2\": \"yes\"\\n },\\n \"a_seq_1\": [\\n 1,\\n 2,\\n 3\\n ],\\n \"a_seq_2\": [\\n 1,\\n {\\n \"two\": 2\\n },\\n 3\\n ],\\n \"single_bool\": false,\\n \"single_str\": \"no\"\\n}-read-write1]": 0.004559308941617265, "tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\n - 1\\n - 2\\n - 3\\na_map:\\n a_key: a_value\\n-read-write]": 0.018615561280636333, "tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\nsingle_str: no\\na_seq_1:\\n - 1\\n - 2\\n - 3\\na_seq_2:\\n - 1\\n - two: 2\\n - 3\\na_map:\\n field1: true\\n field2: yes\\n-read-write]": 0.016396343474042546, "tests/common/test_toposort.py::test_cycle": 0.0035707316482800288, "tests/common/test_toposort.py::test_cycle_best_effort": 0.002674389321014283, "tests/common/test_toposort.py::test_degenerate": 0.0014710265212759125, "tests/common/test_toposort.py::test_pop_key": 0.002865969032431496, "tests/common/test_toposort.py::test_python_is_prioritized": 0.0015253976047122839, "tests/common/test_toposort.py::test_simple": 0.004590731241203843, "tests/common/test_url.py::test_add_username_and_pass_to_url": 0.001600714695103655, "tests/common/test_url.py::test_is_ip_address": 0.00284239901287118, "tests/common/test_url.py::test_is_ipv6_address": 0.005632682269021635, "tests/common/test_url.py::test_is_url": 0.0017367417807529835, "tests/common/test_url.py::test_maybe_add_auth": 0.007073737657027203, "tests/common/test_url.py::test_split_scheme_auth_token": 0.001547246820444725, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]": 0.0015874024303381249, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]": 0.001704290697716086, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]": 0.002115349616737303, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]": 0.001650179930361139, "tests/common/test_url.py::test_url_to_s3_info": 0.0016536524211574867, "tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]": 0.0017264558778408577, "tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]": 0.0017043368574437417, "tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]": 0.001703347095149378, "tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]": 0.0016736464184325343, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error": 0.00042366398491177487, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error": 0.023825627655742906, "tests/core/test_envs_manager.py::test_prefix_cli_flag": 0.003809529819374631, "tests/core/test_envs_manager.py::test_register_env_directory_creation_error": 0.004367284122726498, "tests/core/test_envs_manager.py::test_register_unregister_location_env": 0.022178849350096317, "tests/core/test_envs_manager.py::test_rewrite_environments_txt_file": 0.010890442964462956, "tests/core/test_index.py::TestIndex::test_cache_entries[False]": 0.5228593480284665, "tests/core/test_index.py::TestIndex::test_cache_entries[True]": 0.5706264503283008, "tests/core/test_index.py::TestIndex::test_contains_invalid[False]": 0.12165325014118875, "tests/core/test_index.py::TestIndex::test_contains_invalid[True]": 0.2885233037532366, "tests/core/test_index.py::TestIndex::test_contains_valid[False]": 0.18855175079424236, "tests/core/test_index.py::TestIndex::test_contains_valid[True]": 0.1978647684221942, "tests/core/test_index.py::TestIndex::test_copy[False]": 0.2738598748984932, "tests/core/test_index.py::TestIndex::test_copy[True]": 0.21308741849792692, "tests/core/test_index.py::TestIndex::test_getitem_cache[False]": 0.11477865315678279, "tests/core/test_index.py::TestIndex::test_getitem_cache[True]": 0.17078375648240665, "tests/core/test_index.py::TestIndex::test_getitem_channel[False]": 0.14915373633642914, "tests/core/test_index.py::TestIndex::test_getitem_channel[True]": 0.17243342813027768, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]": 0.13279492225700945, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]": 0.1718398335564235, "tests/core/test_index.py::TestIndex::test_getitem_feature[False]": 0.14092762075050377, "tests/core/test_index.py::TestIndex::test_getitem_feature[True]": 0.1721005636211838, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]": 0.1621954410552972, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]": 0.21311568763459837, "tests/core/test_index.py::TestIndex::test_getitem_prefix[False]": 0.16510442336594058, "tests/core/test_index.py::TestIndex::test_getitem_prefix[True]": 0.16841754245628376, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]": 0.15670733104770732, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]": 0.19371005668444077, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]": 0.1097931523422471, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]": 0.18257859507154775, "tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs": 0.03351908796359579, "tests/core/test_index.py::TestIndex::test_init_prefix_data": 0.028721482216027983, "tests/core/test_index.py::TestIndex::test_init_prefix_path": 0.028592194434193478, "tests/core/test_index.py::TestIndex::test_init_use_local": 0.026009289145616833, "tests/core/test_index.py::TestIndex::test_reduced_index[False]": 0.1692954098309695, "tests/core/test_index.py::TestIndex::test_reduced_index[True]": 0.23125576161848538, "tests/core/test_index.py::test_calculate_channel_urls": 0.02938851697683273, "tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]": 0.04089183040951994, "tests/core/test_index.py::test_dist_str_in_index": 0.06559025326135906, "tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]": 9.145245903376816, "tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]": 0.17414520928686167, "tests/core/test_index.py::test_get_index_platform[linux-64]": 0.21474301128594162, "tests/core/test_index.py::test_get_index_platform[osx-64]": 0.21220625880592053, "tests/core/test_index.py::test_get_index_platform[win-64]": 0.026667910765975668, "tests/core/test_index.py::test_supplement_index_with_system": 0.20533098714502146, "tests/core/test_index.py::test_supplement_index_with_system_archspec": 0.1789162585037473, "tests/core/test_index.py::test_supplement_index_with_system_cuda": 0.050473055652040924, "tests/core/test_index.py::test_supplement_index_with_system_glibc": 0.0003717800861527121, "tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]": 0.0003839569328445948, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]": 0.0003834648976224929, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]": 0.0003857777905309825, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]": 0.0003720276139863638, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]": 0.0003896985902830577, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]": 0.0003802926306527818, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]": 0.0003950383539694143, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]": 0.00038759982442090993, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]": 0.00039894549179064, "tests/core/test_index.py::test_supplement_index_with_system_osx": 0.00040450275905133784, "tests/core/test_initialize.py::test__get_python_info": 0.011510535573145611, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]": 0.00830365801372877, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]": 0.012261479289157275, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]": 0.009594269926786626, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]": 0.009229605366934731, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]": 0.007619816471086761, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]": 0.007515393688019186, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]": 0.007749359828058734, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]": 0.007806904171266775, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]": 0.008009201946045595, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]": 0.0076797048242687625, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]": 0.0078061597262188325, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]": 0.007956980374145583, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]": 0.007975811816310976, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]": 0.007943762660501367, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]": 0.008018647448420242, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]": 0.007893533062949215, "tests/core/test_initialize.py::test_conda_init_dry_run": 0.07747719178050637, "tests/core/test_initialize.py::test_get_python_info": 0.012918076020586582, "tests/core/test_initialize.py::test_init_all": 0.60679252202347, "tests/core/test_initialize.py::test_init_cmd_exe_registry": 0.011823210170496486, "tests/core/test_initialize.py::test_init_condabin[init_fish_user]": 0.04266753462385162, "tests/core/test_initialize.py::test_init_condabin[init_powershell_user]": 0.004665491178007828, "tests/core/test_initialize.py::test_init_condabin[init_sh_system]": 0.04168562184278108, "tests/core/test_initialize.py::test_init_condabin[init_sh_user]": 0.07799164069199185, "tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]": 0.042855014098310565, "tests/core/test_initialize.py::test_init_enable_long_path": 0.0029937643214550374, "tests/core/test_initialize.py::test_init_sh_system": 0.037647150860338145, "tests/core/test_initialize.py::test_init_sh_user_tcsh_unix": 0.000396743298465099, "tests/core/test_initialize.py::test_init_sh_user_unix": 0.00039997586121930014, "tests/core/test_initialize.py::test_init_sh_user_windows": 0.056398085365136436, "tests/core/test_initialize.py::test_initialize_dev_bash": 0.06706271107002583, "tests/core/test_initialize.py::test_initialize_dev_cmd_exe": 0.053921821389168505, "tests/core/test_initialize.py::test_install_1": 0.024511498976668353, "tests/core/test_initialize.py::test_install_conda_csh": 0.017216462022059408, "tests/core/test_initialize.py::test_install_conda_fish": 0.018412015561674336, "tests/core/test_initialize.py::test_install_conda_sh": 0.019987540983712058, "tests/core/test_initialize.py::test_install_conda_xsh": 0.017503751730492588, "tests/core/test_initialize.py::test_install_condabin_conda_bat": 0.017107832924180336, "tests/core/test_initialize.py::test_make_entry_point": 0.019059750120502636, "tests/core/test_initialize.py::test_make_entry_point_exe": 0.007022623560368308, "tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh": 0.02123527461831529, "tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe": 0.022467287848815003, "tests/core/test_initialize.py::test_make_install_plan": 0.0033009223699666007, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes": 0.006873535347141135, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes": 0.006836349675594759, "tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes": 0.006609204922047753, "tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes": 0.0066539066518798914, "tests/core/test_link.py::test_calculate_change_report_downgrade": 0.005356068856066863, "tests/core/test_link.py::test_calculate_change_report_revised_variant": 0.005753356581737454, "tests/core/test_link.py::test_calculate_change_report_superseded": 0.0025035512647481203, "tests/core/test_link.py::test_calculate_change_report_update": 0.0027953108728475994, "tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format": 0.018943531594601805, "tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2": 0.18051370506967188, "tests/core/test_package_cache_data.py::test_cover_extract_bad_package": 0.019740228960782997, "tests/core/test_package_cache_data.py::test_cover_fetch_not_exists": 22.29017822120814, "tests/core/test_package_cache_data.py::test_cover_get_entry_to_link": 0.009412217878760624, "tests/core/test_package_cache_data.py::test_cover_reverse": 0.0019069867826535685, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata": 0.006472037262746848, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2": 0.004224164400082847, "tests/core/test_package_cache_data.py::test_download_filename_from_url_basename": 0.004842990946022767, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist": 0.11520582590622895, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only": 0.08853310876626813, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist": 0.046762846263192055, "tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted": 0.22382925234027212, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg": 0.18941211568497712, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg": 0.09203810869139319, "tests/core/test_path_actions.py::test_CompileMultiPycAction_generic": 0.003829980963677451, "tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python": 2.396305032761291, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic": 0.003742019518668386, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python": 0.01695762285980521, "tests/core/test_path_actions.py::test_create_file_link_actions": 0.012100846808345703, "tests/core/test_path_actions.py::test_simple_LinkPathAction_copy": 0.007557867620226038, "tests/core/test_path_actions.py::test_simple_LinkPathAction_directory": 0.004337695528485622, "tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink": 0.015425282050066087, "tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink": 0.007939939083291013, "tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang": 0.0005062815932588835, "tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix": 0.001537800516214247, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space": 0.0023162864325891376, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python": 0.0042275548483513906, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space": 0.0016261773893059312, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python": 0.0015828594998086596, "tests/core/test_portability.py::test_replace_simple_shebang_no_replacement": 0.005418110596879519, "tests/core/test_portability.py::test_shebang_regex_matches": 0.001828410455246461, "tests/core/test_prefix_data.py::test_api_consistency[conda]": 0.07516087692527333, "tests/core/test_prefix_data.py::test_api_consistency[python]": 0.0759613421536228, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]": 0.014209776635159236, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]": 0.014158354100576455, "tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json": 0.0024357361724939813, "tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json": 0.002078154273472368, "tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored": 0.00996373271107411, "tests/core/test_prefix_data.py::test_empty_environment_package_methods": 0.005190850989334738, "tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records": 0.002450357457411981, "tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list": 0.10458797369494434, "tests/core/test_prefix_data.py::test_get_environment_env_vars": 0.005451318343518338, "tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability": 16.9500938164913, "tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality": 0.12316351094248788, "tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability": 0.1316607904787867, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]": 0.004235336425141577, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]": 0.004311646072819182, "tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]": 0.004444461599645982, "tests/core/test_prefix_data.py::test_method_consistency": 0.0767443058795458, "tests/core/test_prefix_data.py::test_no_tokens_dumped[False]": 0.007633115876762675, "tests/core/test_prefix_data.py::test_no_tokens_dumped[True]": 0.009595888518350254, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]": 0.1167749930343917, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]": 0.12474951496008561, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]": 0.01005148734787483, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]": 0.11540320482716596, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]": 2.244414687005669, "tests/core/test_prefix_data.py::test_package_methods_with_mock_data": 0.003106146413343934, "tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages": 0.0031589959013179005, "tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned": 0.008838939489844311, "tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]": 0.00040259036903057154, "tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]": 0.3316528667038255, "tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]": 0.0004037015320592607, "tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]": 0.0004132357865048956, "tests/core/test_prefix_data.py::test_pip_interop[envpy37win]": 0.24480092332880155, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]": 0.003636126449015548, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]": 0.004138624165511963, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]": 0.0037562064872100997, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]": 0.005301876774969224, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]": 0.003607054058665129, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]": 0.005367146818628399, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]": 0.005790309083927572, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]": 0.005616348835612057, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]": 0.005604083476885631, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]": 0.005508487324978462, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]": 0.005724809536623055, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]": 0.008094782057128503, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]": 0.005782783559358418, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]": 0.005702993319510156, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]": 0.005810155698375031, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]": 0.005530197956725947, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]": 0.005683287155145565, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]": 0.005649540518400783, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]": 0.00586601156982377, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]": 0.005839774748381183, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]": 0.006040515946559131, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]": 0.005419918496279868, "tests/core/test_prefix_data.py::test_prefix_insertion_error": 0.1291386561466167, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars": 0.012362475656807098, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist": 0.005510199495877885, "tests/core/test_prefix_data.py::test_timestamps": 0.6192886784961226, "tests/core/test_prefix_data.py::test_unset_reserved_env_vars": 0.006720733256095049, "tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars": 0.02193496721717141, "tests/core/test_solve.py::test_aggressive_update_packages[classic]": 5.785165411909119, "tests/core/test_solve.py::test_aggressive_update_packages[libmamba]": 5.025217860685358, "tests/core/test_solve.py::test_archspec_call[classic]": 1.9519020726465752, "tests/core/test_solve.py::test_archspec_call[libmamba]": 1.4214354189058889, "tests/core/test_solve.py::test_auto_update_conda[classic]": 3.630504045321438, "tests/core/test_solve.py::test_auto_update_conda[libmamba]": 2.834495927164877, "tests/core/test_solve.py::test_broken_install[classic]": 4.035652920207734, "tests/core/test_solve.py::test_broken_install[libmamba]": 0.008785413034405406, "tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]": 7.3432064089097935, "tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]": 1.00287902370312, "tests/core/test_solve.py::test_conda_downgrade[classic]": 26.247754897909882, "tests/core/test_solve.py::test_conda_downgrade[libmamba]": 7.133735577033545, "tests/core/test_solve.py::test_cuda_1[classic]": 0.7976895303602242, "tests/core/test_solve.py::test_cuda_1[libmamba]": 0.7397433891749879, "tests/core/test_solve.py::test_cuda_2[classic]": 0.8200148218223476, "tests/core/test_solve.py::test_cuda_2[libmamba]": 0.7424505671902746, "tests/core/test_solve.py::test_cuda_constrain_absent[classic]": 0.8381584728833755, "tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]": 0.7749689552161663, "tests/core/test_solve.py::test_cuda_constrain_sat[classic]": 0.00041592179204149227, "tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]": 0.00042670993062486265, "tests/core/test_solve.py::test_cuda_constrain_unsat[classic]": 0.0003913612741371404, "tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]": 0.00040561017890837107, "tests/core/test_solve.py::test_cuda_fail_1[classic]": 0.8186401545528605, "tests/core/test_solve.py::test_cuda_fail_1[libmamba]": 0.683169748827291, "tests/core/test_solve.py::test_cuda_fail_2[classic]": 0.8176687681073253, "tests/core/test_solve.py::test_cuda_fail_2[libmamba]": 0.6862268228720487, "tests/core/test_solve.py::test_cuda_glibc_sat[classic]": 0.00038623989540611115, "tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]": 0.00040805741941631605, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]": 0.00039396842892124126, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]": 0.00037436211727815907, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]": 0.0003870113849715068, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]": 0.00037867053671423903, "tests/core/test_solve.py::test_current_repodata_fallback[classic]": 0.21688864426049287, "tests/core/test_solve.py::test_current_repodata_fallback[libmamba]": 0.22288044531705972, "tests/core/test_solve.py::test_current_repodata_usage[classic]": 0.22324701552980056, "tests/core/test_solve.py::test_current_repodata_usage[libmamba]": 0.22702968473924418, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]": 0.010781610743662302, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]": 0.012781466836857682, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]": 0.011111270197162224, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]": 0.012312127369412666, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]": 0.011479250600837706, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]": 0.01468016726060475, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]": 0.010314002861241147, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]": 0.012097356652563205, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]": 0.01102206498916803, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]": 0.012539666422852236, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]": 0.011041838112937435, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]": 0.012427972730113033, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]": 0.010606875372871895, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]": 0.012166882098104133, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]": 3.8640551390247335, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]": 2.106893779127608, "tests/core/test_solve.py::test_explicit_conda_downgrade[classic]": 3.535379095642423, "tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]": 3.1111252194413668, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]": 1.252692944233295, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]": 0.7204361120529894, "tests/core/test_solve.py::test_features_solve_1[classic]": 3.8619086433031917, "tests/core/test_solve.py::test_features_solve_1[libmamba]": 0.33493720211258354, "tests/core/test_solve.py::test_force_reinstall_1[classic]": 1.8811588002992163, "tests/core/test_solve.py::test_force_reinstall_1[libmamba]": 1.8447218967724897, "tests/core/test_solve.py::test_force_reinstall_2[classic]": 0.8789213317979261, "tests/core/test_solve.py::test_force_reinstall_2[libmamba]": 0.6993538734200467, "tests/core/test_solve.py::test_force_remove_1[classic]": 4.2342917265531534, "tests/core/test_solve.py::test_force_remove_1[libmamba]": 1.9207757291075536, "tests/core/test_solve.py::test_freeze_deps_1[classic]": 20.949997518807052, "tests/core/test_solve.py::test_freeze_deps_1[libmamba]": 3.248128153201874, "tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]": 2.343105124353692, "tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]": 1.3758498201942846, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]": 2.2833997208855887, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]": 1.9739260885412784, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]": 4.404674060643235, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]": 1.5385376076703883, "tests/core/test_solve.py::test_no_channels_error[classic]": 0.034648800764917706, "tests/core/test_solve.py::test_no_channels_error[libmamba]": 0.00912085697258189, "tests/core/test_solve.py::test_no_deps_1[classic]": 3.566583515972037, "tests/core/test_solve.py::test_no_deps_1[libmamba]": 2.3178051437356277, "tests/core/test_solve.py::test_no_update_deps_1[classic]": 3.3845486660373294, "tests/core/test_solve.py::test_no_update_deps_1[libmamba]": 2.8226326835531967, "tests/core/test_solve.py::test_only_deps_1[classic]": 1.163411248948184, "tests/core/test_solve.py::test_only_deps_1[libmamba]": 0.795489579660307, "tests/core/test_solve.py::test_only_deps_2[classic]": 5.373064155814227, "tests/core/test_solve.py::test_only_deps_2[libmamba]": 2.9238854458755053, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]": 0.010459642546355797, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]": 0.01256599172886656, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]": 0.010249920231797783, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]": 0.013714692355778418, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]": 0.010272627861853734, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]": 0.012362064842210552, "tests/core/test_solve.py::test_pinned_1[classic]": 10.219708165151449, "tests/core/test_solve.py::test_pinned_1[libmamba]": 6.91059692009724, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]": 0.013152598131927668, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]": 0.010797028340824997, "tests/core/test_solve.py::test_pinned_specs_all[classic]": 0.05603562006928066, "tests/core/test_solve.py::test_pinned_specs_all[libmamba]": 0.04865693361643889, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]": 0.010685232623808489, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]": 0.016975010348781603, "tests/core/test_solve.py::test_pinned_specs_condarc[classic]": 0.05842574069958707, "tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]": 0.051489030380280736, "tests/core/test_solve.py::test_priority_1[classic]": 12.071298765502151, "tests/core/test_solve.py::test_priority_1[libmamba]": 5.6450108593024, "tests/core/test_solve.py::test_prune_1[classic]": 2.2406026475236005, "tests/core/test_solve.py::test_prune_1[libmamba]": 1.1042408355436297, "tests/core/test_solve.py::test_python2_update[classic]": 3.1512764363540224, "tests/core/test_solve.py::test_python2_update[libmamba]": 1.5066484846382342, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]": 4.261798654494604, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]": 0.5010301506407874, "tests/core/test_solve.py::test_solve_1[libmamba]": 1.4547503050571624, "tests/core/test_solve.py::test_solve_2[classic]": 13.135038063975909, "tests/core/test_solve.py::test_solve_2[libmamba]": 0.008241374677935618, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]": 0.9567184777591462, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]": 0.8234166746360487, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]": 0.01013999993643604, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]": 27.64982476066358, "tests/core/test_solve.py::test_timestamps_1[classic]": 0.29889622720034675, "tests/core/test_solve.py::test_timestamps_1[libmamba]": 0.22817499163504884, "tests/core/test_solve.py::test_unfreeze_when_required[classic]": 0.6408372686157178, "tests/core/test_solve.py::test_unfreeze_when_required[libmamba]": 0.8652390674572075, "tests/core/test_solve.py::test_update_all_1[classic]": 3.6147169276530304, "tests/core/test_solve.py::test_update_all_1[libmamba]": 2.2615236383143693, "tests/core/test_solve.py::test_update_deps_1[classic]": 7.111402601340048, "tests/core/test_solve.py::test_update_deps_1[libmamba]": 4.150028290026261, "tests/core/test_solve.py::test_update_deps_2[classic]": 5.821072409390356, "tests/core/test_solve.py::test_update_deps_2[libmamba]": 3.189061932726807, "tests/core/test_solve.py::test_update_prune_1[classic]": 2.042872703880443, "tests/core/test_solve.py::test_update_prune_1[libmamba]": 1.4358326451587513, "tests/core/test_solve.py::test_update_prune_2[classic]": 2.08841053690561, "tests/core/test_solve.py::test_update_prune_2[libmamba]": 0.8142708133447855, "tests/core/test_solve.py::test_update_prune_3[classic]": 2.6869216438359156, "tests/core/test_solve.py::test_update_prune_3[libmamba]": 0.6979652647019657, "tests/core/test_solve.py::test_update_prune_4[classic]": 2.0762596566727307, "tests/core/test_solve.py::test_update_prune_4[libmamba]": 1.43066431049708, "tests/core/test_solve.py::test_update_prune_5[classic-False]": 2.4801490224538094, "tests/core/test_solve.py::test_update_prune_5[classic-True]": 2.0036398428394535, "tests/core/test_solve.py::test_update_prune_5[libmamba-False]": 1.4912532535292569, "tests/core/test_solve.py::test_update_prune_5[libmamba-True]": 1.4128228959407918, "tests/core/test_solve.py::test_virtual_package_solver[classic]": 0.833116954154052, "tests/core/test_solve.py::test_virtual_package_solver[libmamba]": 0.010519014327461773, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com": 0.001506218443936329, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io": 0.001525380234094944, "tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache": 13.361288147991454, "tests/core/test_subdir_data.py::test_metadata_cache_clearing": 0.013932453282370614, "tests/core/test_subdir_data.py::test_metadata_cache_works": 3.014485435732623, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]": 0.10552470531732967, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]": 0.3127369107458474, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]": 0.021554151898897835, "tests/core/test_subdir_data.py::test_repodata_version_error": 0.3947948860968585, "tests/core/test_subdir_data.py::test_search_by_packagerecord": 0.011218353237319574, "tests/core/test_subdir_data.py::test_state_is_not_json": 0.018217688118847164, "tests/core/test_subdir_data.py::test_subdir_data_coverage": 0.01757456159763399, "tests/core/test_subdir_data.py::test_subdir_data_dict_state": 0.003910381054637135, "tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2": 0.014139051586644436, "tests/core/test_subdir_data.py::test_use_only_tar_bz2": 0.04437749805226519, "tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs": 0.007068035811982151, "tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit": 0.2365331925320047, "tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit": 0.009406547553248873, "tests/env/specs/test_explicit.py::test_can_handle_explicit": 0.0018682867279601288, "tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt": 0.001817239724507096, "tests/env/specs/test_explicit.py::test_environment": 0.12647520171985285, "tests/env/specs/test_explicit.py::test_no_environment_file": 0.0020282035560218216, "tests/env/specs/test_requirements.py::test_can_not_handle_explicit": 0.0020123187515378913, "tests/env/specs/test_requirements.py::test_environment": 0.003503621849917764, "tests/env/specs/test_requirements.py::test_no_environment_file": 0.0016659074502603818, "tests/env/specs/test_requirements.py::test_no_name": 0.0018021410618728024, "tests/env/specs/test_requirements.py::test_req_file_and_name": 0.0027196702930741257, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]": 0.004020391929915287, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]": 0.0034253257627911544, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]": 0.002113788255925403, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]": 0.002623372598141207, "tests/env/specs/test_yaml_file.py::test_filename": 0.0030065029667203486, "tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]": 0.005243986434409689, "tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]": 0.0033361091459079427, "tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]": 0.002259298956095825, "tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]": 0.005975888262087703, "tests/env/test_create.py::test_create_advanced_pip": 40.07276341698381, "tests/env/test_create.py::test_create_empty_env": 4.529116470773554, "tests/env/test_create.py::test_create_env_custom_platform": 0.5756672011161093, "tests/env/test_create.py::test_create_env_default_packages": 28.507430537825176, "tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning": 2.251034066473239, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-D:\\\\a\\\\conda-libmamba-solver\\\\conda-libmamba-solver\\\\conda\\\\tests\\\\env\\\\support\\\\env_with_dependencies.yml]": 10.704709249476013, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-D:\\\\a\\\\conda\\\\conda\\\\tests\\\\env\\\\support\\\\env_with_dependencies.yml]": 16.808002250572965, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-D:\\\\a\\\\conda-libmamba-solver\\\\conda-libmamba-solver\\\\conda\\\\tests\\\\env\\\\support\\\\explicit.txt]": 0.509147039584191, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-D:\\\\a\\\\conda\\\\conda\\\\tests\\\\env\\\\support\\\\explicit.txt]": 0.6480857148048423, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-D:\\\\a\\\\conda-libmamba-solver\\\\conda-libmamba-solver\\\\conda\\\\tests\\\\env\\\\support\\\\requirements.txt]": 17.229480995546638, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-D:\\\\a\\\\conda\\\\conda\\\\tests\\\\env\\\\support\\\\requirements.txt]": 11.517996756465303, "tests/env/test_create.py::test_create_env_from_non_existent_plugin": 0.060094123031199674, "tests/env/test_create.py::test_create_env_json[example/environment.yml]": 19.138239261621848, "tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]": 16.40221263683371, "tests/env/test_create.py::test_create_env_no_default_packages": 15.549729934676176, "tests/env/test_create.py::test_create_host_port": 0.0006920309061561156, "tests/env/test_create.py::test_create_update": 17.536505665576524, "tests/env/test_create.py::test_create_update_remote_env_file": 18.05753825973067, "tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]": 4.046272312469788, "tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]": 3.841393087838179, "tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]": 3.5974536599836986, "tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]": 3.9603712770938717, "tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon": 0.00040787266616253506, "tests/env/test_create.py::test_protected_dirs_error_for_env_create": 0.04104244254851573, "tests/env/test_env.py::test_add_channels": 0.001422860683473671, "tests/env/test_env.py::test_add_pip": 0.0034986947076906527, "tests/env/test_env.py::test_args_are_wildcarded": 0.0014834651212027928, "tests/env/test_env.py::test_builds_spec_from_line_raw_dependency": 0.0015392362964248994, "tests/env/test_env.py::test_can_add_dependencies_to_environment": 0.003227034977997289, "tests/env/test_env.py::test_channels_are_provided_by_kwarg": 0.0016292044479074004, "tests/env/test_env.py::test_channels_default_to_empty_list": 0.0014246833667857929, "tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']": 0.0017742742276279293, "tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]": 0.0018156147079076443, "tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]": 0.0016791237416113507, "tests/env/test_env.py::test_channels_validation[channels3-None]": 0.0015875292761350949, "tests/env/test_env.py::test_create_and_update_env_with_just_vars": 2.324318362599131, "tests/env/test_env.py::test_creates_file_on_save": 0.004952912045735025, "tests/env/test_env.py::test_dependencies_are_empty_by_default": 0.001409075191002596, "tests/env/test_env.py::test_dependencies_update_after_adding": 0.0024786738181603813, "tests/env/test_env.py::test_dependency_validation[dependencies0]": 0.0016527188113520373, "tests/env/test_env.py::test_dependency_validation[dependencies1]": 0.0015772768327902828, "tests/env/test_env.py::test_dependency_validation[dependencies2]": 0.0015477719247984497, "tests/env/test_env.py::test_dependency_validation[dependencies3]": 0.0015840298805270966, "tests/env/test_env.py::test_dependency_validation[dependencies4]": 0.0015294444810769576, "tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]": 0.0019632299830933454, "tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']": 0.003948942500989108, "tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']": 0.002216345125916087, "tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]": 0.0023369595604529375, "tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']": 0.0018609593821202598, "tests/env/test_env.py::test_empty_deps": 0.002843476198010756, "tests/env/test_env.py::test_env_advanced_pip": 14.2704160051243, "tests/env/test_env.py::test_environment_deprecated": 0.0014798256489448234, "tests/env/test_env.py::test_envvars": 0.003422019445825432, "tests/env/test_env.py::test_from_history": 0.004020136973858134, "tests/env/test_env.py::test_has_empty_filename_by_default": 0.0014447722743635544, "tests/env/test_env.py::test_has_empty_name_by_default": 0.0014964251846789462, "tests/env/test_env.py::test_has_filename_if_provided": 0.0014261873928239916, "tests/env/test_env.py::test_has_name_if_provided": 0.001457130742973821, "tests/env/test_env.py::test_http": 0.0864776405308535, "tests/env/test_env.py::test_http_raises": 0.09726276113706007, "tests/env/test_env.py::test_invalid_keys": 0.0037459515393399416, "tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']": 0.0016328303747419847, "tests/env/test_env.py::test_name_validation[name-None]": 0.0016422807017784711, "tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']": 0.0017622090352645548, "tests/env/test_env.py::test_other_tips_of_dependencies_are_supported": 0.001475063721242931, "tests/env/test_env.py::test_parses_dependencies_from_raw_file": 0.002424668727211255, "tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']": 0.001703619015837453, "tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]": 0.0016567744575818233, "tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']": 0.0017524144929566107, "tests/env/test_env.py::test_remove_channels": 0.0014773275788882547, "tests/env/test_env.py::test_retains_full_filename": 0.0025632161647342836, "tests/env/test_env.py::test_returns_Environment": 0.0027004451143658958, "tests/env/test_env.py::test_to_dict_returns_dictionary_of_data": 0.0021695205974008357, "tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present": 0.0017457677058028518, "tests/env/test_env.py::test_to_yaml_returns_proper_yaml": 0.0022838491479487103, "tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string": 0.003563136819856, "tests/env/test_env.py::test_to_yaml_takes_stream": 0.0022317029896379904, "tests/env/test_env.py::test_valid_keys": 0.0034964154676946487, "tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']": 0.0017329849240897944, "tests/env/test_env.py::test_variables_validation[variables1-None]": 0.0016072324593712096, "tests/env/test_env.py::test_variables_validation[variables2-None]": 0.0015950739086322166, "tests/env/test_env.py::test_with_pip": 0.00325715958877218, "tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]": 0.002271252582355519, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting attrs\\n Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\nInstalling collected packages: attrs\\nSuccessfully installed attrs-19.1.0\\n-expected1]": 0.0019592193456927716, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nCollecting itsdangerous>=0.24 (from flask)\\n Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\nCollecting click>=5.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\nCollecting Werkzeug>=0.15 (from flask)\\n Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\nCollecting Jinja2>=2.10.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\n Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\n-expected2]": 0.0019231037864152001, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\nInstalling collected packages: flask\\nSuccessfully installed flask-1.1.1\\n-expected3]": 0.0017138754345176978, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\n]": 0.0016634652414983476, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]": 0.0015953297142807647, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]": 0.0015664420425527945, "tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]": 0.002060667272716542, "tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]": 0.0024246374995865504, "tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]": 0.0017992425487566492, "tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]": 0.0019667070516179897, "tests/gateways/disk/test_delete.py::test_backoff_unlink": 0.015379472204917559, "tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist": 0.002504888414464747, "tests/gateways/disk/test_delete.py::test_remove_dir": 0.01652666943651486, "tests/gateways/disk/test_delete.py::test_remove_file": 0.004368709638380541, "tests/gateways/disk/test_delete.py::test_remove_link_to_dir": 0.01750818082154915, "tests/gateways/disk/test_delete.py::test_remove_link_to_file": 0.0129104096056557, "tests/gateways/disk/test_delete.py::test_rm_rf": 0.015464448159941234, "tests/gateways/disk/test_delete.py::test_rm_rf_couldnt": 0.0027526003064684695, "tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks": 0.029124777774140083, "tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist": 0.020363744512942622, "tests/gateways/disk/test_link.py::test_hard_link": 0.0043904248734572575, "tests/gateways/disk/test_link.py::test_soft_link": 0.005145160496895293, "tests/gateways/disk/test_lock.py::test_LockError_raised": 0.006233836944728784, "tests/gateways/disk/test_lock.py::test_double_locking_fails": 12.839456904084292, "tests/gateways/disk/test_lock.py::test_lock_acquired_success": 0.003785876718377488, "tests/gateways/disk/test_permissions.py::test_make_executable": 0.003269212359712965, "tests/gateways/disk/test_permissions.py::test_make_writable": 0.003749129953301872, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES": 0.002258070223843057, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM": 0.0028326029330467007, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS": 0.0025827532481499287, "tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist": 0.001624875505012505, "tests/gateways/disk/test_permissions.py::test_recursive_make_writable": 0.0045269193290295405, "tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary": 0.02193855212530333, "tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl": 0.03353962133935971, "tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary": 0.006784311300208272, "tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl": 0.007660454886815904, "tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary": 0.05404238851752166, "tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl": 0.07356501832715824, "tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable": 0.0036919674770125852, "tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary": 0.07037965675876783, "tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl": 0.0708998966008614, "tests/gateways/test_connection.py::test_accept_range_none": 0.8546771672468261, "tests/gateways/test_connection.py::test_add_binstar_token": 0.04961104105187576, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]": 0.006969980597036922, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]": 0.007011563154972855, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]": 0.007342479374351276, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]": 0.007230386746400256, "tests/gateways/test_connection.py::test_get_session_returns_default": 0.0030651073738441835, "tests/gateways/test_connection.py::test_get_session_with_channel_settings": 0.006903723886402241, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple": 0.0033683870950795996, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler": 0.0033762313846806683, "tests/gateways/test_connection.py::test_get_session_with_request_headers": 0.004761713626384914, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]": 0.004577729096124677, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]": 0.0035966932795392747, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]": 0.005137205384127162, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]": 0.005015336901500958, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]": 0.00354790081243874, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]": 0.0035415990193495774, "tests/gateways/test_connection.py::test_local_file_adapter_200": 0.032473458805526205, "tests/gateways/test_connection.py::test_local_file_adapter_404": 0.05515630598609483, "tests/gateways/test_connection.py::test_offline[False]": 0.01037429329924976, "tests/gateways/test_connection.py::test_offline[True]": 0.00935953343561712, "tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers": 0.0049813526861995664, "tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers": 0.004157118164655621, "tests/gateways/test_connection.py::test_s3_download_uses_direct_path": 0.16877642769539494, "tests/gateways/test_connection.py::test_s3_server": 0.0005197792844437502, "tests/gateways/test_connection.py::test_s3_server_with_mock": 0.00040050264697454095, "tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive": 0.0015412146806528812, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]": 0.001620362300763896, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]": 0.0016698726856723297, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]": 0.0016305606720355015, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]": 0.001695713800091543, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]": 0.0016729420541589425, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]": 0.0016233459242851562, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]": 0.0016276613089747452, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]": 0.0016510959504294864, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]": 0.0015661880221643824, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]": 0.0016857295358366088, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]": 0.0016254762774914134, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]": 0.0015548536208031564, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]": 0.0016083438368758713, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]": 0.0015770604077533841, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]": 0.001611622171820571, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]": 0.0015802063469201313, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]": 0.0016615722182431302, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]": 0.0015963514109611598, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]": 0.0016459435672183823, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]": 0.0015892316176035718, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]": 0.001579700319794963, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]": 0.001648590140617363, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]": 0.0015764342704105995, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]": 0.001589620228944621, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]": 0.0017799464549817573, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]": 0.0016363855740805595, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]": 0.0017490077701111052, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]": 0.0017722437135133473, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]": 0.0018201538187390658, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]": 0.0017626802660766286, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]": 0.001699899159422026, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]": 0.001740781803244602, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]": 0.0018373497371275693, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]": 0.001926580811927607, "tests/gateways/test_logging.py::test_token_not_present_in_conda_create": 3.7255620935715617, "tests/gateways/test_logging.py::test_token_replace_big_string": 0.0020946459584524034, "tests/gateways/test_logging.py::test_token_replace_individual_strings": 0.001519419740903176, "tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers": 0.0020635155008092957, "tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]": 0.0018733072342525098, "tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]": 0.0019758480078635606, "tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]": 0.0017821926757525127, "tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]": 0.0019559028519362336, "tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors": 0.0318015818448593, "tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age": 0.0016340596828054606, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]": 0.01478340034451995, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]": 0.29520211248534645, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]": 0.009208311153521654, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]": 0.12722372099994292, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats": 0.49238360031298006, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror": 0.004835373014027421, "tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format": 0.004485077426778568, "tests/gateways/test_repodata_gateway.py::test_save": 0.10891863274818114, "tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message": 0.0017852393876590675, "tests/gateways/test_repodata_gateway.py::test_stale": 0.01605619803527753, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]": 9.88803526895255, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]": 0.8501024604396681, "tests/gateways/test_repodata_lock.py::test_lock_rename": 0.00044653218761946865, "tests/gateways/test_repodata_shards.py::test_bytes_cache": 0.010720186070033862, "tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter": 0.0015883990223276685, "tests/gateways/test_streams.py::test_stderr_writes_redacted_text": 0.0018384436046066383, "tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output": 0.33769771679251426, "tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output": 0.34145684553432015, "tests/gateways/test_zstd.py::test_download_repodata": 0.09095936883870154, "tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror": 0.0705323503266045, "tests/gateways/test_zstd.py::test_repodata_state": 0.037851536028758626, "tests/gateways/test_zstd.py::test_repodata_use_zst[False]": 0.00653388185021853, "tests/gateways/test_zstd.py::test_repodata_use_zst[True]": 0.006594446389377719, "tests/gateways/test_zstd.py::test_server_available": 0.005999537314403852, "tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd": 0.04280469180629315, "tests/gateways/test_zstd.py::test_zstd_not_404": 0.005328687954716939, "tests/models/test_channel.py::test_bare_channel_file": 0.0025350649246318907, "tests/models/test_channel.py::test_bare_channel_http": 0.002426750467087641, "tests/models/test_channel.py::test_basic_multichannel": 0.002486029546932133, "tests/models/test_channel.py::test_canonicalized_url_gets_correct_token": 0.007675927171795456, "tests/models/test_channel.py::test_channel_alias": 0.009980425327581073, "tests/models/test_channel.py::test_channel_alias_channels": 0.0026386700565507928, "tests/models/test_channel.py::test_channel_alias_w_conda_path": 0.007273002524411882, "tests/models/test_channel.py::test_channel_alias_w_subhcnnale": 0.007146711782770537, "tests/models/test_channel.py::test_channel_cache": 0.0023617792731296045, "tests/models/test_channel.py::test_channel_equality_respects_platform": 0.0025955877210081927, "tests/models/test_channel.py::test_channel_host_port": 0.0025869571432148852, "tests/models/test_channel.py::test_channel_mangles_urls": 0.002513093750571165, "tests/models/test_channel.py::test_channel_name_subdir_only": 0.0022362865386907965, "tests/models/test_channel.py::test_channels_with_dashes": 0.008079653680561818, "tests/models/test_channel.py::test_custom_channels": 0.011706133611850833, "tests/models/test_channel.py::test_custom_channels_port_token_auth": 0.010740949420457956, "tests/models/test_channel.py::test_custom_token_in_channel": 0.007113220164672199, "tests/models/test_channel.py::test_default_channel[None]": 0.002406180258056207, "tests/models/test_channel.py::test_default_channel[win-32]": 0.00255700670537331, "tests/models/test_channel.py::test_default_channels": 0.010076207715079308, "tests/models/test_channel.py::test_defaults_channel": 0.01067638228371336, "tests/models/test_channel.py::test_env_var_file_urls": 0.003399868783475035, "tests/models/test_channel.py::test_expanded_variables": 0.004959194717216496, "tests/models/test_channel.py::test_file_channel": 0.010739888757380179, "tests/models/test_channel.py::test_file_url_with_backslashes": 0.0024518252150881013, "tests/models/test_channel.py::test_file_urls": 0.0024439332778126216, "tests/models/test_channel.py::test_local_channel": 0.029495751043331596, "tests/models/test_channel.py::test_migrated_custom_channels": 0.011088011104938029, "tests/models/test_channel.py::test_multichannel_priority": 0.0026455664853802497, "tests/models/test_channel.py::test_named_custom_channel": 0.009828098287142682, "tests/models/test_channel.py::test_named_custom_channel_w_subchan": 0.009594138150420943, "tests/models/test_channel.py::test_old_channel_alias": 0.011157368461593273, "tests/models/test_channel.py::test_pkgs_main": 0.011788348829134827, "tests/models/test_channel.py::test_pkgs_pro": 0.011884627693312813, "tests/models/test_channel.py::test_ppc64le_vs_ppc64": 0.00299002279430017, "tests/models/test_channel.py::test_prioritize_channels": 0.0025061929961636854, "tests/models/test_channel.py::test_regression_against_unknown_none": 0.002838164616249625, "tests/models/test_channel.py::test_subdir_env_var": 0.007745805991502514, "tests/models/test_channel.py::test_subdirs_env_var": 0.008274239310337352, "tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform": 0.0025474538818716997, "tests/models/test_channel.py::test_token_in_custom_channel": 0.0027115466301707025, "tests/models/test_channel.py::test_unexpanded_variables": 0.004654571371833802, "tests/models/test_channel.py::test_url_channel_w_platform": 0.002360985418018755, "tests/models/test_channel.py::test_url_custom_channel": 0.009697245869908748, "tests/models/test_channel.py::test_url_custom_channel_w_subchan": 0.009586756959321888, "tests/models/test_dist.py::test_channel[.conda]": 0.0090684796628616, "tests/models/test_dist.py::test_channel[.tar.bz2]": 0.005099324911162339, "tests/models/test_dist.py::test_dist[.conda]": 0.011830193998743455, "tests/models/test_dist.py::test_dist[.tar.bz2]": 0.003892498122235486, "tests/models/test_dist.py::test_dist_with_channel_url[.conda]": 0.029791821329502075, "tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]": 0.028566963359211, "tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]": 0.003434637011595627, "tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]": 0.0035728198198965657, "tests/models/test_enums.py::test_noarch_type_coercion[-None]": 0.001791430220834064, "tests/models/test_enums.py::test_noarch_type_coercion[0-None]": 0.001816538172250626, "tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]": 0.0016801975448637984, "tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]": 0.0017498911084437008, "tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]": 0.0017144803382397205, "tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]": 0.001710889982762014, "tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]": 0.001682973188102352, "tests/models/test_enums.py::test_noarch_type_coercion[False-None0]": 0.0017331707475813792, "tests/models/test_enums.py::test_noarch_type_coercion[False-None1]": 0.0016610453452983631, "tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]": 0.0017757468594917828, "tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]": 0.0017360441588562697, "tests/models/test_enums.py::test_noarch_type_coercion[N-None]": 0.0017005876596929324, "tests/models/test_enums.py::test_noarch_type_coercion[NO-None]": 0.001653063203665132, "tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]": 0.0017397605878390382, "tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]": 0.0016612185431677572, "tests/models/test_enums.py::test_noarch_type_coercion[No-None]": 0.0018299385640600599, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]": 0.0017281387283657524, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]": 0.0017567538735217773, "tests/models/test_enums.py::test_noarch_type_coercion[Non-None]": 0.0017728835540381186, "tests/models/test_enums.py::test_noarch_type_coercion[None-None]": 0.0017424490385419124, "tests/models/test_enums.py::test_noarch_type_coercion[Null-None]": 0.0032189202858095055, "tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]": 0.0017468553502444225, "tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]": 0.0016675001265093218, "tests/models/test_enums.py::test_noarch_type_coercion[Off-None]": 0.0017801094882995854, "tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]": 0.0016825237329483325, "tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]": 0.0017445746875510944, "tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]": 0.001984347141123574, "tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]": 0.0016694159927942368, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]": 0.0017643366503802787, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]": 0.001664170528958248, "tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]": 0.0017115763736641235, "tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]": 0.001695241109022238, "tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]": 0.0017203147397433448, "tests/models/test_enums.py::test_noarch_type_coercion[\\x00-None]": 0.0017370322105503312, "tests/models/test_enums.py::test_noarch_type_coercion[false-None]": 0.001688956769265555, "tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]": 0.001976835272321325, "tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]": 0.0017071987657006399, "tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]": 0.002044797628669657, "tests/models/test_enums.py::test_noarch_type_coercion[n-None]": 0.0016656259291550088, "tests/models/test_enums.py::test_noarch_type_coercion[no-None]": 0.0016592360871741508, "tests/models/test_enums.py::test_noarch_type_coercion[non-None]": 0.0017937118767890636, "tests/models/test_enums.py::test_noarch_type_coercion[none-None]": 0.0017329403698734043, "tests/models/test_enums.py::test_noarch_type_coercion[null-None]": 0.0017038151963247835, "tests/models/test_enums.py::test_noarch_type_coercion[off-None]": 0.0017626539870095202, "tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]": 0.001626130060852076, "tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]": 0.002034251220361497, "tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]": 0.001760511643173431, "tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]": 0.0016627549043100568, "tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]": 0.0019856349005423443, "tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]": 0.00184785186895297, "tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]": 0.0016527608874844742, "tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]": 0.0016982832588708563, "tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]": 0.001764453933287027, "tests/models/test_enums.py::test_noarch_type_coercion[~-None]": 0.00168082694666291, "tests/models/test_environment.py::test_config_from_cli_channels_behaviors": 0.0025389156575826755, "tests/models/test_environment.py::test_config_from_cli_channels_empty": 0.0015771119644727072, "tests/models/test_environment.py::test_create_environment_missing_required_fields": 0.001562623694719977, "tests/models/test_environment.py::test_create_invalid_platform": 0.0016652729561836422, "tests/models/test_environment.py::test_create_missing_explicit_package": 0.002568791083488558, "tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages": 0.0025178770529980196, "tests/models/test_environment.py::test_environment_config_channels_basic": 0.0016009246654248165, "tests/models/test_environment.py::test_environment_config_from_context": 0.016243980273127987, "tests/models/test_environment.py::test_environments_merge": 0.003328167916951466, "tests/models/test_environment.py::test_environments_merge_colliding_name": 0.0018664986078308775, "tests/models/test_environment.py::test_environments_merge_colliding_platform": 0.0018520851421048815, "tests/models/test_environment.py::test_environments_merge_colliding_prefix": 0.0016266914963595175, "tests/models/test_environment.py::test_environments_merge_explicit_packages": 0.002535431408086428, "tests/models/test_environment.py::test_explicit_packages": 1.3916176836835898, "tests/models/test_environment.py::test_extrapolate": 9.184451045588823, "tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current": 0.003897010119043135, "tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli": 0.004116544003335586, "tests/models/test_environment.py::test_from_cli_empty": 0.00292671375388239, "tests/models/test_environment.py::test_from_cli_empty_with_default_packages": 0.019145204405875207, "tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file": 0.008968591404075597, "tests/models/test_environment.py::test_from_cli_inject_default_packages_override": 0.00885580039488771, "tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs": 0.0027443747339239238, "tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels": 0.004305995816935288, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]": 0.003477502380954705, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]": 0.01736355714286035, "tests/models/test_environment.py::test_from_cli_with_explicit_specs": 0.003996012644941347, "tests/models/test_environment.py::test_from_cli_with_files": 0.004374985985047865, "tests/models/test_environment.py::test_from_cli_with_specs": 0.003202587181497308, "tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability": 16.030303869838644, "tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages": 2.14254289928781, "tests/models/test_environment.py::test_from_prefix_package_population_semantics": 1.9083890517251931, "tests/models/test_environment.py::test_merge_channel_settings": 0.0016017354075325188, "tests/models/test_environment.py::test_merge_configs_channel_order_last_wins": 0.0015811817654533234, "tests/models/test_environment.py::test_merge_configs_deduplicate_values": 0.0016891403683630872, "tests/models/test_environment.py::test_merge_configs_primitive_none_values_order": 0.0019296684978707965, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_one": 0.0016059532833478936, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_two": 0.0015609700070860547, "tests/models/test_match_spec.py::test_bracket_matches": 0.02593514722318591, "tests/models/test_match_spec.py::test_build_glob_merge": 0.011695241494364716, "tests/models/test_match_spec.py::test_build_glob_merge_channel": 0.007835522397738883, "tests/models/test_match_spec.py::test_build_merge": 0.002757604691176144, "tests/models/test_match_spec.py::test_build_number_and_filename": 0.011242676383345212, "tests/models/test_match_spec.py::test_build_number_merge": 0.006234628490587098, "tests/models/test_match_spec.py::test_canonical_string_forms": 0.007603341510815269, "tests/models/test_match_spec.py::test_catch_invalid_regexes": 0.0029071367878951673, "tests/models/test_match_spec.py::test_channel_matching": 0.002926755054099488, "tests/models/test_match_spec.py::test_channel_merge": 0.003606221249678742, "tests/models/test_match_spec.py::test_comment": 0.005564918634495115, "tests/models/test_match_spec.py::test_conda_build_form[build_only]": 0.0020336890742961027, "tests/models/test_match_spec.py::test_conda_build_form[build_version]": 0.0018153282160597909, "tests/models/test_match_spec.py::test_conda_build_form[name_only]": 0.001736072138022832, "tests/models/test_match_spec.py::test_conda_build_form[version_only]": 0.0017656394646172811, "tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.0024954036591017976, "tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]": 0.0017708057603170425, "tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.002022903916088365, "tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]": 0.0024532438186316615, "tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]": 0.0018722977738467846, "tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]": 0.0018333181371250377, "tests/models/test_match_spec.py::test_conda_env_form_comprehensive": 0.00276113275859875, "tests/models/test_match_spec.py::test_conda_style": 0.0017517297043950337, "tests/models/test_match_spec.py::test_dist": 0.002939789222285779, "tests/models/test_match_spec.py::test_dist_str": 0.0040300081635170895, "tests/models/test_match_spec.py::test_exact_values": 0.0021645283497325595, "tests/models/test_match_spec.py::test_hash": 0.002086232832600688, "tests/models/test_match_spec.py::test_hash_merge_with_name[md5]": 0.0030008056892880785, "tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]": 0.002867820334885979, "tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]": 0.0018382690510445063, "tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]": 0.0017982247602044263, "tests/models/test_match_spec.py::test_index_record": 0.003225665612800965, "tests/models/test_match_spec.py::test_invalid": 0.0060359974500862066, "tests/models/test_match_spec.py::test_invalid_match_spec": 0.0017354821081047526, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]": 0.0016922143724583227, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0=0.13.0,<1.0.0>=py312]": 0.0019110502006340262, "tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms": 0.00040452641727319353, "tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms": 0.0016765342942316366, "tests/models/test_match_spec.py::test_license_match": 0.004553406096698973, "tests/models/test_match_spec.py::test_match_1": 0.008612498764201422, "tests/models/test_match_spec.py::test_matchspec_errors": 0.0017670104943217952, "tests/models/test_match_spec.py::test_merge_multiple_name": 0.008189566418592344, "tests/models/test_match_spec.py::test_merge_single_name": 0.003578570673199604, "tests/models/test_match_spec.py::test_no_name_match_spec": 0.0017382308084099012, "tests/models/test_match_spec.py::test_no_triple_equals_roundtrip": 0.001783777423188288, "tests/models/test_match_spec.py::test_openssl_match": 0.0028833424352289814, "tests/models/test_match_spec.py::test_parse_build_number_brackets": 0.0018116168242405914, "tests/models/test_match_spec.py::test_parse_channel_subdir": 0.002450589335763367, "tests/models/test_match_spec.py::test_parse_equal_equal": 0.0016665069082691093, "tests/models/test_match_spec.py::test_parse_errors": 0.0017218925837160866, "tests/models/test_match_spec.py::test_parse_hard": 0.0018979967929825248, "tests/models/test_match_spec.py::test_parse_parens": 0.00224538429525585, "tests/models/test_match_spec.py::test_parse_spec_str_no_brackets": 0.002730197737278684, "tests/models/test_match_spec.py::test_parse_spec_str_tarball_url": 0.0028844290913368964, "tests/models/test_match_spec.py::test_parse_spec_str_with_brackets": 0.002638858745697852, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]": 0.0026006798130464312, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]": 0.0019487054904921341, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]": 0.0018928141406332854, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]": 0.001919685119923717, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]": 0.001812851912337072, "tests/models/test_match_spec.py::test_pip_style2": 0.0022193257369146156, "tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]": 0.001905563766124681, "tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]": 0.0018505318422528047, "tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]": 0.0018405114085408378, "tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]": 0.001956925174859635, "tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]": 0.0017863822165359341, "tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]": 0.001889017015423043, "tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]": 0.0018731436373902112, "tests/models/test_match_spec.py::test_simple[python-python]": 0.0017352642819309402, "tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]": 0.0018051328828159682, "tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]": 0.0017894415507095512, "tests/models/test_match_spec.py::test_star_name": 0.001590866260200763, "tests/models/test_match_spec.py::test_strictness": 0.0027719717551609574, "tests/models/test_match_spec.py::test_subdir_merge": 0.004044834524331674, "tests/models/test_match_spec.py::test_tarball_match_specs": 0.0052258255683697045, "tests/models/test_match_spec.py::test_to_filename": 0.01821572048000352, "tests/models/test_match_spec.py::test_track_features_match": 0.00422757750273401, "tests/models/test_match_spec.py::test_url_percent_encoding": 0.00378906785968334, "tests/models/test_match_spec.py::test_version_wildcard_serialization": 0.0028190634658248944, "tests/models/test_package_info.py::test_package_info": 0.0025472924691248003, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]": 1.0617710653302688, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]": 0.38201558347046405, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]": 0.014619752116567547, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]": 0.012364123413829186, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]": 0.011033894417834877, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]": 0.00931390460673235, "tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]": 3.555703102870647, "tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]": 0.2746985348952149, "tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]": 3.838338774694641, "tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]": 0.3424214878694504, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]": 3.5574259703874764, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]": 0.3076693042678925, "tests/models/test_prefix_graph.py::test_sort_without_prep[classic]": 4.711198394183092, "tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]": 1.3130912225813496, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]": 4.805078911605646, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]": 1.4300074147048594, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]": 4.218134741504841, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]": 1.3604621095446892, "tests/models/test_records.py::test_package_record_feature": 0.0027343433131764546, "tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]": 0.0027570750015989813, "tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]": 0.0026881817189138646, "tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]": 0.002684276583104418, "tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]": 0.0026604791090240427, "tests/models/test_records.py::test_package_record_spec_strings_vs_str": 0.002401902362486211, "tests/models/test_records.py::test_package_record_timestamp": 0.0076257192138138846, "tests/models/test_records.py::test_package_virtual_package[123-testbuild]": 0.00272266318065281, "tests/models/test_records.py::test_package_virtual_package[None-None]": 0.0028172475625569747, "tests/models/test_records.py::test_package_virtual_package[None-testbuild]": 0.0028991934974466524, "tests/models/test_records.py::test_prefix_record_no_channel": 0.01071935111301427, "tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]": 0.0023747048110266777, "tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]": 0.0023404360445316965, "tests/models/test_records.py::test_requested_spec": 0.31814843881734683, "tests/models/test_version.py::test_compatible_release_versions": 0.002016513239988272, "tests/models/test_version.py::test_compound_versions": 0.0018402509619610881, "tests/models/test_version.py::test_hexrd": 0.0016970052708608489, "tests/models/test_version.py::test_invalid_version_specs": 0.0018263989143939084, "tests/models/test_version.py::test_local_identifier": 0.0017213684114094324, "tests/models/test_version.py::test_match": 0.0036734907561584667, "tests/models/test_version.py::test_not_eq_star": 0.0019087544773018134, "tests/models/test_version.py::test_openssl_convention": 0.002020975323207031, "tests/models/test_version.py::test_pep440": 0.002409716394458325, "tests/models/test_version.py::test_pep_440_arbitrary_equality_operator": 0.0015534565875445347, "tests/models/test_version.py::test_ver_eval": 0.0019570125726775306, "tests/models/test_version.py::test_ver_eval_errors": 0.0015382877683250463, "tests/models/test_version.py::test_version_order": 0.011925159650323142, "tests/models/test_version.py::test_version_spec_1": 0.0019219600834292638, "tests/models/test_version.py::test_version_spec_2": 0.0018184129387880956, "tests/models/test_version.py::test_version_spec_3": 0.00163976086232977, "tests/models/test_version.py::test_version_spec_4": 0.0017050559281220619, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]": 0.007691625925960782, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]": 0.00990248518522734, "tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches": 0.006372700000000535, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]": 0.006502100000008997, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]": 0.005821725925877082, "tests/notices/test_core.py::test__conda_user_story__disable_notices": 0.013077998951162843, "tests/notices/test_core.py::test__conda_user_story__more_notices_message": 0.1175781435878672, "tests/notices/test_core.py::test__conda_user_story__only_see_once": 0.117222598319177, "tests/notices/test_core.py::test_display_notices_happy_path[200]": 0.2217502535436943, "tests/notices/test_core.py::test_display_notices_happy_path[404]": 0.22134026390687658, "tests/notices/test_core.py::test_display_notices_happy_path[500]": 0.2207675908940307, "tests/notices/test_core.py::test_notices_decorator": 0.12302821958418125, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]": 0.48944144909509346, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]": 0.48361550036641465, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]": 0.4905865090388954, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]": 0.4871772819536814, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]": 0.49653200969809186, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests": 0.49675383165010706, "tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json": 0.1229010745491987, "tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error": 0.11033848568486025, "tests/notices/test_fetch.py::test_notice_response_cache_expired": 0.0017760716920942935, "tests/notices/test_types.py::test_channel_notice_response": 0.0017971776771094417, "tests/notices/test_types.py::test_channel_notice_response_date_parse_error": 0.0033245569445879636, "tests/notices/test_types.py::test_channel_notice_response_integer_id": 0.00161356716350871, "tests/notices/test_types.py::test_channel_notice_undefined_id": 0.0016651798689264583, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer": 0.0029296173390822434, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list": 0.004207094602001102, "tests/plugins/reporter_backends/test_console.py::test_prompt": 0.003484984027780064, "tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option": 0.0020787722488788676, "tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin": 0.0040871737543027595, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner": 0.0018767464776577605, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error": 0.0018419495570669705, "tests/plugins/reporter_backends/test_console.py::test_spinner": 0.10439800069477358, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_error": 0.1053420686467194, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe": 0.015166293421769962, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error": 0.006966626006961274, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno": 0.0054123598112107, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error": 0.003533649363837437, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe": 0.0032512391229809023, "tests/plugins/reporter_backends/test_json.py::test_json_handler": 0.001736844646030402, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled": 0.003059912564094877, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled": 0.002632627840805423, "tests/plugins/reporter_backends/test_json.py::test_json_spinner": 0.0017474000032110626, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]": 0.008812318155587865, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]": 0.007482039601949715, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]": 0.009903302087345037, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]": 0.007123561541330044, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]": 0.007648865041251405, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]": 0.0076098634831171, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]": 0.006355868905865491, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]": 0.00874548813368184, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]": 0.006389079226603636, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]": 0.006988812900815768, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]": 0.006287263343915423, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]": 0.007522933117158928, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]": 0.006958947428622191, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]": 0.006941740318054575, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]": 0.007072975741300079, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]": 0.006731417612940347, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]": 0.0063716670453058824, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]": 0.006518630527226797, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails": 0.4156685196512498, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose": 0.4003426542079373, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes": 0.4465436192876844, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met": 0.32957477175081684, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]": 0.016792823649207127, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]": 0.0345419181602946, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]": 0.00918451830505358, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]": 0.012057252728038634, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]": 0.01464347227911115, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]": 0.013649418915769582, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]": 0.01164650340366938, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]": 0.01044387929111061, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported": 4.793585501413312, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]": 5.346301996553403, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]": 6.490008351761527, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]": 0.006622848646948574, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]": 0.006350629423751464, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]": 0.00728627548744719, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]": 0.006963986738055644, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]": 0.006714973551920889, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]": 0.006714177253628094, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]": 0.03927532226496783, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]": 0.006395430860737809, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]": 0.006594372323174355, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]": 0.006896695055946447, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]": 0.006217325334582783, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]": 0.006504524970385479, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\"conda\"-\\u274c]": 0.04373920659996287, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\u2705]": 0.038670014759683326, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\u274c]": 0.03895734657019815, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\u2705]": 0.040846913937318194, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\u274c]": 0.03917785407017805, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]": 6.100895627330155, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]": 6.309583320029072, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]": 0.006926476975516011, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]": 0.00676921470983111, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]": 0.008009170214298703, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]": 0.007913260600530003, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run": 0.08327568934840433, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes": 0.043878294061173426, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path": 5.2478515582310346, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help": 0.026904995826018723, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose": 4.842906811100141, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list": 0.03243304869026585, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check": 0.03542144983251846, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment": 0.03246286963762107, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment": 0.041085075263973946, "tests/plugins/test_auth_handlers.py::test_duplicated": 0.0037883658824108806, "tests/plugins/test_auth_handlers.py::test_get_auth_handler": 0.014698122477368953, "tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple": 0.00969416186877458, "tests/plugins/test_config.py::test_plugin_config_data_env_var_source": 0.0014855573620058467, "tests/plugins/test_config.py::test_plugin_config_data_file_source": 0.0052776220789188845, "tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values": 0.0015628275928934118, "tests/plugins/test_config.py::test_plugin_config_from_file": 0.006128821630001494, "tests/plugins/test_config.py::test_plugin_describe_parameters": 0.0024184831650618695, "tests/plugins/test_config.py::test_plugins_config_from_environment": 0.002561880594117662, "tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect": 0.003677467594937779, "tests/plugins/test_env_specs.py::test_alias_normalization": 0.001720358214347838, "tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]": 0.0016597386904953465, "tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]": 0.001612124999980546, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]": 0.0033241367234975597, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]": 0.0033577189653668698, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]": 0.0034713460256654864, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]": 0.003414368180843244, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]": 0.007496660738869881, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]": 0.007067844051546322, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]": 0.005922740388664569, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]": 0.006515375518674733, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]": 0.006343459859281151, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error": 0.0074585176039805795, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard": 0.010350354483136972, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback": 0.006690904649057159, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents": 0.008886545299872485, "tests/plugins/test_env_specs.py::test_detect_spec_with_aliases": 0.0030155259715254354, "tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered": 0.0034417268242996376, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]": 0.0016476601190347428, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]": 0.001556485119031609, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]": 0.0017657309523767275, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]": 0.001721185714294344, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]": 0.0016445232142760211, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]": 0.0016143196428341103, "tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin": 0.0030513130959375404, "tests/plugins/test_env_specs.py::test_get_spec_by_aliases": 0.0037954884163635878, "tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection": 0.0033762036227353055, "tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors": 0.0036633452238605422, "tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers": 0.003531530153223535, "tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename": 0.00649247628434414, "tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable": 0.014577635006775265, "tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled": 0.0031633465461063676, "tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found": 0.0032328537775709277, "tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist": 0.0030363325566518527, "tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection": 0.0016521319184724696, "tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls": 0.01350287720096183, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]": 0.01287544638922679, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]": 0.012838246127163454, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]": 0.012802509835319305, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]": 0.013363031188140471, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]": 0.013457154143491478, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]": 0.013355648903566594, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]": 0.012782385393965884, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]": 0.016090109579914646, "tests/plugins/test_environment_export.py::test_builtin_requirements_exporter": 0.012936580399059849, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]": 0.014089512472290837, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]": 0.015503409031225776, "tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]": 0.6165183833068587, "tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]": 0.640227684106655, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]": 0.012515186980722194, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]": 0.012694526157167046, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]": 0.012951575701532455, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]": 0.01273419849168518, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]": 0.012470085200406975, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]": 0.012964286529911644, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]": 0.012289924914575943, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]": 0.013191099075302117, "tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern": 0.013260228331342015, "tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error": 0.013548316450243611, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]": 0.013161322957308529, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]": 0.014227069152760393, "tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility": 0.013299471895754245, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]": 0.012429836945767901, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]": 0.01278579626619527, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]": 0.012914576556053865, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]": 0.012594040953514482, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]": 0.01335012211044258, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]": 0.012914381120927802, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]": 0.01273818012809341, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]": 0.012718064263327899, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]": 0.012501700103210923, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]": 0.012558851511716634, "tests/plugins/test_environment_export.py::test_get_environment_exporters": 0.012897605651972567, "tests/plugins/test_environment_export.py::test_multi_platform_export": 0.015033638444192352, "tests/plugins/test_environment_export.py::test_only_one_export[both]": 0.0019089482973846886, "tests/plugins/test_environment_export.py::test_only_one_export[export]": 0.0017784028550431197, "tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]": 0.0017689409028939346, "tests/plugins/test_environment_export.py::test_only_one_export[none]": 0.002119029899450749, "tests/plugins/test_environment_export.py::test_single_platform_export": 0.014802815174333907, "tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format": 0.015421631026456542, "tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name": 0.014227959016658827, "tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env": 0.013754236764215598, "tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning": 0.03444931981863561, "tests/plugins/test_health_checks.py::test_health_check_not_ran": 0.04345732077554914, "tests/plugins/test_health_checks.py::test_health_check_ran": 0.03190050305621044, "tests/plugins/test_hookspec.py::test_deprecations[spec_name]": 0.0017268502617506078, "tests/plugins/test_manager.py::test_custom_plugin_name_validation": 0.004325811195476516, "tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]": 0.002958691027275495, "tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]": 0.0031204760658386063, "tests/plugins/test_manager.py::test_get_canonical_name_class": 0.0026570649912386756, "tests/plugins/test_manager.py::test_get_canonical_name_instance": 0.0028619601491013083, "tests/plugins/test_manager.py::test_get_canonical_name_module": 0.002761901691278633, "tests/plugins/test_manager.py::test_get_canonical_name_object": 0.002957746918929013, "tests/plugins/test_manager.py::test_get_hook_results": 0.003591573339359543, "tests/plugins/test_manager.py::test_get_request_headers": 0.002628556325714606, "tests/plugins/test_manager.py::test_get_session_headers": 0.00270043204922582, "tests/plugins/test_manager.py::test_get_solvers": 0.002816043262042294, "tests/plugins/test_manager.py::test_get_virtual_package_records": 0.0040813030933541695, "tests/plugins/test_manager.py::test_known_solver": 0.002995625871099221, "tests/plugins/test_manager.py::test_load_entrypoints_blocked": 0.01386014211340817, "tests/plugins/test_manager.py::test_load_entrypoints_importerror": 0.016300488142138265, "tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror": 0.029665172414509278, "tests/plugins/test_manager.py::test_load_entrypoints_success": 0.01584548129359044, "tests/plugins/test_manager.py::test_load_plugins_error": 0.0028170853524782644, "tests/plugins/test_manager.py::test_load_two_plugins_one_impls": 0.002958222277851255, "tests/plugins/test_manager.py::test_load_without_plugins": 0.0027149753444148795, "tests/plugins/test_manager.py::test_plugin_bad_names[42]": 0.0046574015976859956, "tests/plugins/test_manager.py::test_plugin_bad_names[False]": 0.00198088626161078, "tests/plugins/test_manager.py::test_plugin_bad_names[None]": 0.007554182866447132, "tests/plugins/test_manager.py::test_plugin_bad_names[True]": 0.0027378502863988985, "tests/plugins/test_manager.py::test_plugin_bad_names[name4]": 0.0024456993226274477, "tests/plugins/test_manager.py::test_plugin_bad_names[name5]": 0.0015640863252345677, "tests/plugins/test_manager.py::test_plugin_name": 0.0014407128295747243, "tests/plugins/test_manager.py::test_unknown_solver": 0.0027654414463555077, "tests/plugins/test_package_extractors.py::test_extract_package": 0.03917582155735953, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]": 0.0017027918912930885, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]": 0.0017166243088197952, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]": 0.0016977752019041573, "tests/plugins/test_package_extractors.py::test_get_package_extractors": 0.0035503793598516526, "tests/plugins/test_package_extractors.py::test_has_package_extension[-None]": 0.003565604387756142, "tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]": 0.00400683036368338, "tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]": 0.003530495350634352, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]": 0.0037332876504130325, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]": 0.003765054528046739, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]": 0.00371910439502746, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]": 0.003813035594256256, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]": 0.003685783638642792, "tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor": 0.006043871731290795, "tests/plugins/test_post_commands.py::test_post_command_action_raises_exception": 0.03496294283673902, "tests/plugins/test_post_commands.py::test_post_command_invoked": 0.05216466650034339, "tests/plugins/test_post_commands.py::test_post_command_not_invoked": 0.04337989720787689, "tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception": 3.2661881620717934, "tests/plugins/test_post_solves.py::test_post_solve_invoked": 6.776982300617965, "tests/plugins/test_post_solves.py::test_post_solve_not_invoked": 0.03514671432120989, "tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception": 0.026660768970085673, "tests/plugins/test_pre_commands.py::test_pre_command_invoked": 0.0454718086516335, "tests/plugins/test_pre_commands.py::test_pre_command_not_invoked": 0.03998696221221715, "tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception": 0.04517463830280635, "tests/plugins/test_pre_solves.py::test_pre_solve_invoked": 0.539766902166377, "tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked": 0.043818554443727134, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\n test : something\\n\\n]": 0.003430015684379808, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\n \"test\": \"something\"\\n}]": 0.003391134846462989, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\n]": 0.0034001582845284936, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\"test\"]": 0.004147759783948465, "tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered": 0.003251165512819649, "tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered": 0.003198647122392593, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]": 0.007109803503117148, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]": 0.0031062994312972074, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com]": 0.0029685685604381048, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]": 0.0030219457746788188, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com]": 0.0030624660348899492, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]": 0.0030739887822471704, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]": 0.003030044016356477, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com]": 0.003333989039959302, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]": 0.003113749291553316, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com]": 0.003082689845575234, "tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings": 0.10621412017529247, "tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins": 0.10756544401973787, "tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting": 0.028184040385777757, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]": 0.03406813371467259, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]": 0.11354535779436338, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]": 0.03264395498101968, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\n map_parameter: {}\\n]": 0.06741568176769462, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]": 0.0644860363155807, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\n seq_parameter: []\\n]": 0.07805156624668862, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\n string_parameter: value_one\\n]": 0.06470808379309066, "tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings": 0.13782786468528155, "tests/plugins/test_settings.py::test_conda_config_with_invalid_setting": 0.03561855907537948, "tests/plugins/test_settings.py::test_conda_config_with_map_settings": 0.1096454638154665, "tests/plugins/test_settings.py::test_conda_config_with_sequence_settings": 0.09529189982859818, "tests/plugins/test_settings.py::test_conda_config_with_string_settings": 0.09734538833440977, "tests/plugins/test_settings.py::test_get_settings": 0.007724801274198517, "tests/plugins/test_settings.py::test_load_configuration_parameters": 0.003172631202997699, "tests/plugins/test_settings.py::test_load_plugin_config_with_env_var": 0.007399489684083052, "tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc": 0.00825994009822456, "tests/plugins/test_solvers.py::test_duplicated": 0.0033061269906079346, "tests/plugins/test_solvers.py::test_get_cached_solver_backend": 0.0039848766776023285, "tests/plugins/test_solvers.py::test_get_conflicting_solvers": 0.002939033319579493, "tests/plugins/test_solvers.py::test_get_no_solver": 0.002673423988097313, "tests/plugins/test_solvers.py::test_get_one_solver": 0.01284926356933841, "tests/plugins/test_solvers.py::test_get_solver_backend": 0.007457828209478276, "tests/plugins/test_solvers.py::test_get_solver_backend_multiple": 0.0075929770540558985, "tests/plugins/test_solvers.py::test_get_two_solvers": 0.003221424593106338, "tests/plugins/test_solvers.py::test_solver_user_agent": 0.007488405719350691, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]": 0.02519663514329089, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]": 0.026867118325606936, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]": 0.02657317057781628, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]": 0.027806801208699872, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]": 0.025930695026616758, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]": 0.028082481890618353, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]": 0.026828212861763172, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]": 0.024703540221795453, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]": 0.0255638647484492, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]": 0.026691467913099367, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]": 0.0387094591829041, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]": 0.03282346730505797, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]": 0.03141390457376573, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]": 0.027647817600596262, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]": 0.026228394657442713, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]": 0.02651137209288632, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]": 0.025245355596846365, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]": 0.026775484535749457, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]": 0.031869648737226454, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]": 0.028269922133458296, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]": 0.04007401963316091, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]": 0.05350728508818532, "tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser": 0.02513643061697973, "tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser": 0.029974403177372436, "tests/plugins/test_subcommands.py::test_duplicated": 0.003365725010481879, "tests/plugins/test_subcommands.py::test_help": 0.03752059044173137, "tests/plugins/test_subcommands.py::test_invoked": 0.039287136918238444, "tests/plugins/test_subcommands.py::test_parser_no_plugins": 0.03457466296668552, "tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception": 0.43793174826924236, "tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception": 0.46012842088225914, "tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked": 0.5604339156121383, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields": 0.0014924339643119968, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name": 0.0015525817717471058, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved": 0.0015195704072709063, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields": 0.0016158358243819723, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name": 0.0016832768083554263, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved": 0.0016181041976573995, "tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]": 0.7111682162498694, "tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]": 0.10026928299664538, "tests/plugins/test_virtual_packages.py::test_conda_virtual_package": 0.0035460577067092957, "tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]": 0.003301318527371993, "tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]": 0.0032998826964814663, "tests/plugins/test_virtual_packages.py::test_cuda_detection": 0.7178861498570493, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]": 0.0063981758618698445, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]": 0.007920153233173629, "tests/plugins/test_virtual_packages.py::test_duplicated": 2.4128975326936386, "tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]": 0.008549678822444735, "tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]": 0.008768871608350971, "tests/plugins/test_virtual_packages.py::test_invoked": 4.6732644254382425, "tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]": 0.00901493418729911, "tests/plugins/test_virtual_packages.py::test_linux_override[None-True]": 0.35050740483861803, "tests/plugins/test_virtual_packages.py::test_linux_value": 0.27586191881420563, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda": 1.0981519897831498, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched": 0.001725655076560301, "tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]": 0.008314225316946809, "tests/plugins/test_virtual_packages.py::test_osx_override[None-False]": 0.008284522777974621, "tests/plugins/test_virtual_packages.py::test_osx_value": 0.008200759223521507, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]": 0.0031934193377857706, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]": 0.0031100373841138444, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]": 0.003219405323447127, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]": 0.0032333775839880484, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override]": 0.0031945069945717905, "tests/plugins/test_virtual_packages.py::test_override_package_values[no override]": 0.003077653976198641, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]": 0.003240946847616511, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override]": 0.0032468662387401645, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]": 0.0023077879162475686, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]": 0.0024091158773591405, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]": 0.003199137901454819, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]": 0.0023893478783182285, "tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]": 0.009046143290779837, "tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]": 0.008494423777666947, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]": 0.00904712550235126, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]": 0.008959037181451187, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]": 0.008491536767256908, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]": 0.009294244794124528, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]": 0.008574920008198003, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]": 0.008601717950054913, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]": 0.008794882215021812, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]": 0.008799772167706261, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]": 0.00901088058955212, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]": 0.009372796482074204, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]": 0.009317971357324652, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]": 0.008595543098794043, "tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]": 0.00830814452640728, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]": 0.00829100896178465, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]": 0.00815785571473459, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]": 0.008448014526214812, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]": 0.008782728781037861, "tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]": 0.008189844463676493, "tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]": 0.003096863648313755, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]": 0.002996317451624038, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]": 0.0030065313410353517, "tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]": 0.009083265871140585, "tests/plugins/test_virtual_packages.py::test_win_override[None-False]": 0.009124170853244134, "tests/plugins/test_virtual_packages.py::test_win_value": 0.008842665585911383, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]": 7.560802055670548, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]": 6.187577603680803, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]": 6.879798411875653, "tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]": 17.48541201660887, "tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]": 6.081257449999986, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]": 8.066458951494157, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]": 8.233614910318456, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]": 7.9326013812622564, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]": 7.740779972829482, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]": 7.911984048638141, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]": 8.320493518408494, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]": 7.639456625196004, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]": 6.9548637323193585, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]": 8.227079398733839, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]": 7.970799732049596, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]": 7.80600588973747, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]": 7.72399854159136, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]": 8.526858686275917, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]": 6.7950661461432444, "tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]": 11.04873183375639, "tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]": 0.005948314779666815, "tests/shell/test_csh.py::test_basic_integration[csh]": 0.00044434363357462786, "tests/shell/test_csh.py::test_basic_integration[tcsh]": 0.00043429458777534055, "tests/shell/test_csh.py::test_shell_available[csh]": 0.0006460417192977102, "tests/shell/test_csh.py::test_shell_available[tcsh]": 0.0004395892719763176, "tests/shell/test_fish.py::test_fish_basic_integration[fish]": 0.0005365747894636568, "tests/shell/test_fish.py::test_fish_disable_prompt": 0.0004053175594455378, "tests/shell/test_fish.py::test_fish_prompt_functions_in_hook": 0.00041997820901732455, "tests/shell/test_fish.py::test_shell_available[fish]": 0.0004181138319577709, "tests/shell/test_posix.py::test_bash_activate_error[ash]": 0.0004145570026979592, "tests/shell/test_posix.py::test_bash_activate_error[bash]": 0.0004591068481304716, "tests/shell/test_posix.py::test_bash_activate_error[dash]": 0.00043349177782842237, "tests/shell/test_posix.py::test_bash_activate_error[zsh]": 0.0004868660773265013, "tests/shell/test_posix.py::test_basic_integration[ash]": 0.00042210902494886746, "tests/shell/test_posix.py::test_basic_integration[bash]": 37.12917488093205, "tests/shell/test_posix.py::test_basic_integration[dash]": 0.0004536196804328326, "tests/shell/test_posix.py::test_basic_integration[zsh]": 0.0003926987074814408, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]": 0.00039147859668993423, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]": 14.827016758325415, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]": 0.00047351165448569164, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]": 0.0005928371851260136, "tests/shell/test_posix.py::test_shell_available[ash]": 0.0004035280107929279, "tests/shell/test_posix.py::test_shell_available[bash]": 0.0028677317715680275, "tests/shell/test_posix.py::test_shell_available[dash]": 0.0004188722292533579, "tests/shell/test_posix.py::test_shell_available[zsh]": 0.00045821717979146917, "tests/shell/test_powershell.py::test_powershell_PATH_management[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell-preview]": 0.0004678501243340314, "tests/shell/test_powershell.py::test_powershell_PATH_management[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell]": 0.0005427391883326519, "tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]": 0.0005881588159233751, "tests/shell/test_powershell.py::test_powershell_basic_integration[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell-preview]": 21.460657597786156, "tests/shell/test_powershell.py::test_powershell_basic_integration[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell]": 20.659546478159886, "tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]": 20.78495329101098, "tests/shell/test_powershell.py::test_shell_available[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell-preview]": 0.004762059277767813, "tests/shell/test_powershell.py::test_shell_available[C:\\\\Users\\\\runneradmin\\\\AppData\\\\Local\\\\Microsoft\\\\powershell]": 0.0032804244003504968, "tests/shell/test_powershell.py::test_shell_available[powershell]": 0.009506303525950511, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]": 0.0005086219680689233, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]": 10.221761551556387, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]": 7.116605716661049, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]": 0.0005196076812698515, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]": 0.0005163227479633792, "tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]": 10.745732984291529, "tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]": 8.797877161595904, "tests/shell/test_shell.py::test_stacking[0-None-not-sys]": 9.19429499414957, "tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]": 8.963635994421308, "tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]": 11.393867348294629, "tests/shell/test_shell.py::test_stacking[0-base-not-sys]": 9.800890135518324, "tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]": 9.0456392692343, "tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]": 9.31640024493456, "tests/shell/test_shell.py::test_stacking[0-has-not-sys]": 9.328355033403763, "tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]": 8.777506304402676, "tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]": 8.991734786925313, "tests/shell/test_shell.py::test_stacking[0-not-not-sys]": 9.39929204670285, "tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,sys]": 10.767073081916601, "tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]": 9.931820863528019, "tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]": 10.216059928606626, "tests/shell/test_shell.py::test_stacking[5-base,not-base-base,sys]": 10.144441280879343, "tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]": 10.606052282011593, "tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]": 10.318809455881764, "tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]": 9.06040901877074, "tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]": 9.586710646990962, "tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]": 9.021476147011958, "tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]": 8.71984256168399, "tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]": 9.071511108681754, "tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]": 9.17679232063548, "tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]": 8.751545200233426, "tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]": 9.056653088531315, "tests/shell/test_shell.py::test_stacking[5-not-not-sys]": 9.168424262559125, "tests/shell/test_xonsh.py::test_basic_integration[xonsh]": 0.0004460120910298493, "tests/shell/test_xonsh.py::test_shell_available[xonsh]": 0.00046762439069503235, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]": 0.012589706416387259, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]": 0.012462616967563697, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]": 0.0300223643813309, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]": 0.01657138212048213, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]": 0.01166812761548008, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]": 0.012543990645661198, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]": 0.012401266600223115, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]": 0.042321520479329286, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]": 0.012291315675976537, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]": 0.01678225370515242, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]": 0.01190918885813576, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]": 0.012390559481431598, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]": 0.011534683548665752, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]": 0.013513356618623481, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]": 0.012745395433810239, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]": 0.030612555700756525, "tests/test_activate.py::test_PS1": 0.24256454133626107, "tests/test_activate.py::test_PS1_no_changeps1": 0.2382900730266985, "tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env": 0.09424464501612964, "tests/test_activate.py::test_activate_default_env[CmdExeActivator]": 2.060606629965927, "tests/test_activate.py::test_activate_default_env[CshActivator]": 2.4383867396946166, "tests/test_activate.py::test_activate_default_env[FishActivator]": 2.4424701572779086, "tests/test_activate.py::test_activate_default_env[PosixActivator]": 2.491633210146418, "tests/test_activate.py::test_activate_default_env[PowerShellActivator]": 2.0379919224562046, "tests/test_activate.py::test_activate_default_env[XonshActivator]": 2.047152652461863, "tests/test_activate.py::test_activate_environment_not_found": 0.010045518037006162, "tests/test_activate.py::test_activate_same_environment": 0.6401182232187702, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]": 0.006904224823153388, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]": 0.006826330970486477, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\n\\\\['env-one', 'env-two'\\\\]\\n]": 0.006773158209263256, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\nremainder_args: \\\\['env-one']\\n]": 0.006733571355759254, "tests/test_activate.py::test_add_prefix_to_path_cmdexe": 0.01440755772114531, "tests/test_activate.py::test_add_prefix_to_path_posix": 0.0004215906814483425, "tests/test_activate.py::test_build_activate_dont_activate_unset_var": 0.4638008503758503, "tests/test_activate.py::test_build_activate_dont_use_PATH": 0.4645511824166836, "tests/test_activate.py::test_build_activate_restore_unset_env_vars": 0.0004140650866328838, "tests/test_activate.py::test_build_activate_shlvl_0": 0.4620689589798652, "tests/test_activate.py::test_build_activate_shlvl_1": 0.00043883954068959895, "tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars": 0.46736645543301475, "tests/test_activate.py::test_build_deactivate_dont_use_PATH": 0.20515989869111367, "tests/test_activate.py::test_build_deactivate_shlvl_1": 0.3364486723816781, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate": 0.00040786613710436036, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack": 0.0004158311843816146, "tests/test_activate.py::test_build_stack_shlvl_1": 0.00042708121156024475, "tests/test_activate.py::test_cmd_exe_basic[False]": 0.029610790212439026, "tests/test_activate.py::test_cmd_exe_basic[True]": 0.03203188282519514, "tests/test_activate.py::test_csh_basic[False]": 2.527058280213214, "tests/test_activate.py::test_csh_basic[True]": 2.557672596974521, "tests/test_activate.py::test_default_env": 0.009892663234453793, "tests/test_activate.py::test_fish_basic[False]": 2.5559926452483714, "tests/test_activate.py::test_fish_basic[True]": 2.5183382028156145, "tests/test_activate.py::test_force_uppercase[False]": 0.08441772129295948, "tests/test_activate.py::test_force_uppercase[True]": 0.08327721662514966, "tests/test_activate.py::test_get_env_vars_big_whitespace": 0.011028967963277557, "tests/test_activate.py::test_get_env_vars_empty_file": 0.010439258640956723, "tests/test_activate.py::test_get_export_unset_vars[False]": 0.01865592279616131, "tests/test_activate.py::test_get_export_unset_vars[True]": 0.028197589168642994, "tests/test_activate.py::test_json_basic[False]": 2.560848716194045, "tests/test_activate.py::test_json_basic[True]": 2.529775367262321, "tests/test_activate.py::test_metavars_force_uppercase[False]": 0.04770749626986053, "tests/test_activate.py::test_metavars_force_uppercase[True]": 0.047171079145087086, "tests/test_activate.py::test_msys2_shell_line_endings[ash]": 0.00870422823341417, "tests/test_activate.py::test_msys2_shell_line_endings[bash]": 0.008469701404788229, "tests/test_activate.py::test_msys2_shell_line_endings[dash]": 0.008521444482677403, "tests/test_activate.py::test_msys2_shell_line_endings[posix]": 0.008812352618029339, "tests/test_activate.py::test_msys2_shell_line_endings[zsh]": 0.008717546903017995, "tests/test_activate.py::test_msys2_shell_stdout_reconfiguration": 0.008547900414639665, "tests/test_activate.py::test_posix_basic[False]": 2.5359865109115227, "tests/test_activate.py::test_posix_basic[True]": 2.549352071777374, "tests/test_activate.py::test_powershell_basic[False]": 0.02679083481848196, "tests/test_activate.py::test_powershell_basic[True]": 0.08236773991504759, "tests/test_activate.py::test_pre_post_command_invoked[activate]": 0.23431338164151963, "tests/test_activate.py::test_pre_post_command_invoked[deactivate]": 0.03320729616405711, "tests/test_activate.py::test_pre_post_command_invoked[hook]": 0.01026876978642585, "tests/test_activate.py::test_pre_post_command_invoked[reactivate]": 0.028772311776695838, "tests/test_activate.py::test_pre_post_command_raises[activate]": 0.23175624820612284, "tests/test_activate.py::test_pre_post_command_raises[deactivate]": 0.010048844434006223, "tests/test_activate.py::test_pre_post_command_raises[hook]": 0.010243519210402507, "tests/test_activate.py::test_pre_post_command_raises[reactivate]": 0.009276235635649006, "tests/test_activate.py::test_remove_prefix_from_path_1": 0.19948093635651323, "tests/test_activate.py::test_remove_prefix_from_path_2": 0.1757933308054485, "tests/test_activate.py::test_replace_prefix_in_path_1": 0.3079221084902503, "tests/test_activate.py::test_replace_prefix_in_path_2": 0.28062836785590023, "tests/test_activate.py::test_xonsh_basic[False]": 0.024572148770807288, "tests/test_activate.py::test_xonsh_basic[True]": 0.024683793595110796, "tests/test_api.py::test_DepsModifier_contract": 0.0016694982673441856, "tests/test_api.py::test_PackageCacheData_contract": 0.00211626571075281, "tests/test_api.py::test_PackageCacheData_return_value_contract": 0.013274101898177484, "tests/test_api.py::test_PrefixData_contract": 0.0019136504328709817, "tests/test_api.py::test_PrefixData_return_value_contract": 0.09110935639230497, "tests/test_api.py::test_Solver_inputs_contract": 0.002419751757366869, "tests/test_api.py::test_Solver_return_value_contract": 7.846356383425533, "tests/test_api.py::test_SubdirData_contract": 0.001954123156733473, "tests/test_api.py::test_SubdirData_return_value_contract": 12.594104501648387, "tests/test_api.py::test_UpdateModifier_contract": 0.0015177155568255444, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]": 0.29781072768496736, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]": 0.2543255216594498, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]": 0.14700869707915806, "tests/test_create.py::test_allow_softlinks[classic]": 0.3482435081565946, "tests/test_create.py::test_allow_softlinks[libmamba]": 0.6501621472465435, "tests/test_create.py::test_channel_usage_replacing_python[classic]": 179.57146069039788, "tests/test_create.py::test_channel_usage_replacing_python[libmamba]": 121.39844495526312, "tests/test_create.py::test_clone_env_with_conda[classic]": 109.4312123793256, "tests/test_create.py::test_clone_env_with_conda[libmamba]": 39.041994044690625, "tests/test_create.py::test_clone_offline_simple[classic]": 0.9486614359603828, "tests/test_create.py::test_clone_offline_simple[libmamba]": 0.5889733982283576, "tests/test_create.py::test_clone_offline_with_untracked[classic]": 1.1331199522627087, "tests/test_create.py::test_clone_offline_with_untracked[libmamba]": 1.0740246816363839, "tests/test_create.py::test_compile_pyc[classic-False]": 10.33656895774911, "tests/test_create.py::test_compile_pyc[classic-True]": 1.8834150473938047, "tests/test_create.py::test_compile_pyc[libmamba-False]": 12.518616630536075, "tests/test_create.py::test_compile_pyc[libmamba-True]": 1.143281248695128, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]": 67.8051673446773, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]": 15.051001121734792, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]": 27.576990853346867, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]": 38.11300739767375, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]": 66.60955546062625, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]": 22.629840106952, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]": 0.04815446608786938, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]": 0.05621246695075089, "tests/test_create.py::test_conda_update_package_not_installed[classic]": 0.0631022514151181, "tests/test_create.py::test_conda_update_package_not_installed[libmamba]": 0.04319448920229916, "tests/test_create.py::test_create_default_packages[classic]": 0.82731991002336, "tests/test_create.py::test_create_default_packages[libmamba]": 0.7398881404737246, "tests/test_create.py::test_create_default_packages_no_default_packages[classic]": 0.7275458984094579, "tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]": 0.6499122746923233, "tests/test_create.py::test_create_download_only_without_prefix[classic]": 0.28778184977407034, "tests/test_create.py::test_create_download_only_without_prefix[libmamba]": 0.3065275788292338, "tests/test_create.py::test_create_dry_run[classic]": 3.172120365223734, "tests/test_create.py::test_create_dry_run[libmamba]": 5.174325322797482, "tests/test_create.py::test_create_dry_run_json[classic]": 2.699572188794724, "tests/test_create.py::test_create_dry_run_json[libmamba]": 2.815345947689684, "tests/test_create.py::test_create_dry_run_without_prefix[classic]": 0.32212953318181753, "tests/test_create.py::test_create_dry_run_without_prefix[libmamba]": 0.2500589449692126, "tests/test_create.py::test_create_dry_run_yes_safety[classic]": 0.037011167456362036, "tests/test_create.py::test_create_dry_run_yes_safety[libmamba]": 0.03458926386183206, "tests/test_create.py::test_create_empty_env[classic]": 0.49214270701198576, "tests/test_create.py::test_create_empty_env[libmamba]": 2.1274457733610452, "tests/test_create.py::test_create_env_different_platform[classic-cli]": 0.7355480022779015, "tests/test_create.py::test_create_env_different_platform[classic-env]": 0.9188916359894657, "tests/test_create.py::test_create_env_different_platform[libmamba-cli]": 0.7644635849128643, "tests/test_create.py::test_create_env_different_platform[libmamba-env]": 0.8318765057543712, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]": 0.04721314309182516, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]": 0.04853462086699505, "tests/test_create.py::test_create_install_update_remove_smoketest[classic]": 145.94711751899513, "tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]": 46.50460586834532, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]": 0.05868100335161555, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]": 0.03491395119241122, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]": 0.8981284496457722, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]": 0.7480721299638682, "tests/test_create.py::test_create_name_overrides_file[classic]": 0.847089038394451, "tests/test_create.py::test_create_name_overrides_file[libmamba]": 0.7715593084689664, "tests/test_create.py::test_create_no_deps_flag[classic]": 0.3164765746914965, "tests/test_create.py::test_create_no_deps_flag[libmamba]": 0.4359934436451578, "tests/test_create.py::test_create_only_deps_flag[classic]": 2.0909997334893085, "tests/test_create.py::test_create_only_deps_flag[libmamba]": 1.9747494372526244, "tests/test_create.py::test_create_override_channels_enabled[classic]": 1.8812293326164695, "tests/test_create.py::test_create_override_channels_enabled[libmamba]": 2.5845716397376264, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]": 0.039262288290602194, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]": 0.03375667731928195, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]": 0.03978343123992371, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]": 0.03741556588158902, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]": 0.844546663471393, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]": 0.7534277187701316, "tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]": 0.05904720924170214, "tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]": 0.034888904079916204, "tests/test_create.py::test_cross_channel_incompatibility[classic]": 54.70564177439035, "tests/test_create.py::test_cross_channel_incompatibility[libmamba]": 7.579280106867627, "tests/test_create.py::test_directory_not_a_conda_environment[classic]": 0.0402667265355648, "tests/test_create.py::test_directory_not_a_conda_environment[libmamba]": 0.04030019709661187, "tests/test_create.py::test_disallowed_packages[classic]": 0.0004944717496632627, "tests/test_create.py::test_disallowed_packages[libmamba]": 0.0004512472946587101, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]": 0.0439120372399096, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]": 0.04503239903474945, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]": 0.046725106041961374, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]": 0.040457094296053195, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]": 0.040065583520335984, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]": 0.037801860128070235, "tests/test_create.py::test_dont_remove_conda_1[classic]": 122.78548768883242, "tests/test_create.py::test_dont_remove_conda_1[libmamba]": 36.08382032288684, "tests/test_create.py::test_dont_remove_conda_2[classic]": 77.14742258103666, "tests/test_create.py::test_dont_remove_conda_2[libmamba]": 26.228202030633735, "tests/test_create.py::test_dont_remove_conda_3[classic]": 196.00777122001855, "tests/test_create.py::test_dont_remove_conda_3[libmamba]": 55.5611368075056, "tests/test_create.py::test_download_only_flag[classic]": 9.63382367025662, "tests/test_create.py::test_download_only_flag[libmamba]": 4.5589572620431555, "tests/test_create.py::test_force_remove[classic]": 15.012577998891176, "tests/test_create.py::test_force_remove[libmamba]": 6.107842773096314, "tests/test_create.py::test_install_bound_virtual_package[classic]": 0.0004318184450620998, "tests/test_create.py::test_install_bound_virtual_package[libmamba]": 0.00041340755976677045, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]": 2.145081858721348, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]": 2.3437908114206367, "tests/test_create.py::test_install_force_reinstall_flag[classic]": 0.530500466142707, "tests/test_create.py::test_install_force_reinstall_flag[libmamba]": 0.5525930252715795, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]": 1.55585208124021, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]": 1.3241506451565712, "tests/test_create.py::test_install_only_deps_flag[classic]": 0.7886154759195677, "tests/test_create.py::test_install_only_deps_flag[libmamba]": 0.7261019330609407, "tests/test_create.py::test_install_prune_flag[classic]": 32.58582372876228, "tests/test_create.py::test_install_prune_flag[libmamba]": 17.601254469006566, "tests/test_create.py::test_install_python_and_search[classic]": 59.129927462081625, "tests/test_create.py::test_install_python_and_search[libmamba]": 40.50085452789654, "tests/test_create.py::test_install_tarball_from_file_based_channel[classic]": 0.9916498608307438, "tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]": 3.13187512740835, "tests/test_create.py::test_install_update_deps_flag[classic]": 1.0140699111817906, "tests/test_create.py::test_install_update_deps_flag[libmamba]": 1.1172620598798024, "tests/test_create.py::test_install_update_deps_only_deps_flags[classic]": 1.5611395068642275, "tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]": 1.2940800350638004, "tests/test_create.py::test_install_virtual_packages[classic-__glibc-False]": 0.5590912264463146, "tests/test_create.py::test_install_virtual_packages[classic-__linux-False]": 3.694825498963425, "tests/test_create.py::test_install_virtual_packages[classic-__osx-False]": 0.462665520594369, "tests/test_create.py::test_install_virtual_packages[classic-__unix-False]": 0.4775308075639355, "tests/test_create.py::test_install_virtual_packages[classic-__win-True]": 0.2544775543916597, "tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-False]": 1.865072833611762, "tests/test_create.py::test_install_virtual_packages[libmamba-__linux-False]": 1.9184011376235162, "tests/test_create.py::test_install_virtual_packages[libmamba-__osx-False]": 1.8680740131840614, "tests/test_create.py::test_install_virtual_packages[libmamba-__unix-False]": 1.8851869679204254, "tests/test_create.py::test_install_virtual_packages[libmamba-__win-True]": 1.822918415100517, "tests/test_create.py::test_json_create_install_update_remove[classic]": 17.441867974381907, "tests/test_create.py::test_json_create_install_update_remove[libmamba]": 21.83392420233923, "tests/test_create.py::test_list_with_pip_no_binary[classic]": 12.009694992031752, "tests/test_create.py::test_list_with_pip_no_binary[libmamba]": 16.80137790511876, "tests/test_create.py::test_list_with_pip_wheel[classic]": 21.171018410003562, "tests/test_create.py::test_list_with_pip_wheel[libmamba]": 29.6519633712499, "tests/test_create.py::test_menuinst_v2[classic]": 6.639294339512495, "tests/test_create.py::test_menuinst_v2[libmamba]": 7.246372488679223, "tests/test_create.py::test_mix_explicit_and_packages[classic-create]": 0.0628521644825444, "tests/test_create.py::test_mix_explicit_and_packages[classic-install]": 0.04781712321689465, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]": 0.058303433023132685, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]": 0.06208339542780851, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]": 0.32177405417458343, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]": 0.34147006935524704, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]": 0.3441505071918168, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]": 0.37449518788987984, "tests/test_create.py::test_must_provide_args_to_install[classic]": 0.035348915039283106, "tests/test_create.py::test_must_provide_args_to_install[libmamba]": 0.03268449097442414, "tests/test_create.py::test_neutering_of_historic_specs[classic]": 0.0004521923774263668, "tests/test_create.py::test_neutering_of_historic_specs[libmamba]": 0.0004641044274177605, "tests/test_create.py::test_no_channels[classic]": 0.05061263887759357, "tests/test_create.py::test_no_channels[libmamba]": 0.04355524515172697, "tests/test_create.py::test_noarch_generic_package[classic]": 0.33218544769470626, "tests/test_create.py::test_noarch_generic_package[libmamba]": 0.46490833464055537, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]": 21.772748005417583, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]": 28.09447087461066, "tests/test_create.py::test_noarch_python_package_with_entry_points[classic]": 45.18293746790641, "tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]": 21.44634655409941, "tests/test_create.py::test_noarch_python_package_without_entry_points[classic]": 25.65229224021162, "tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]": 17.39065621144729, "tests/test_create.py::test_nonadmin_file_untouched[classic]": 1.3941293304345717, "tests/test_create.py::test_nonadmin_file_untouched[libmamba]": 1.2975813038718063, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]": 0.04993165699181347, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]": 0.07134921554671345, "tests/test_create.py::test_offline_with_empty_index_cache[classic]": 9.560101467000097, "tests/test_create.py::test_offline_with_empty_index_cache[libmamba]": 5.699181651413868, "tests/test_create.py::test_override_channels_disabled[classic]": 0.11271936809026954, "tests/test_create.py::test_override_channels_disabled[libmamba]": 0.10448089434054571, "tests/test_create.py::test_package_cache_regression[classic]": 0.4683256024373591, "tests/test_create.py::test_package_cache_regression[libmamba]": 0.6154850012901759, "tests/test_create.py::test_package_optional_pinning[classic]": 1.3856095368776287, "tests/test_create.py::test_package_optional_pinning[libmamba]": 1.283042227672213, "tests/test_create.py::test_package_pinning[classic]": 1.7827392258921266, "tests/test_create.py::test_package_pinning[libmamba]": 1.9148355543970295, "tests/test_create.py::test_packages_not_found[classic]": 0.4580198575143772, "tests/test_create.py::test_packages_not_found[libmamba]": 3.7464036921655532, "tests/test_create.py::test_pinned_override_with_explicit_spec[classic]": 1.108197013020609, "tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]": 0.47522535038216746, "tests/test_create.py::test_post_link_run_in_env[classic]": 0.8480261915502005, "tests/test_create.py::test_post_link_run_in_env[libmamba]": 0.818235582195762, "tests/test_create.py::test_python_site_packages_path[classic]": 0.0004042856384340721, "tests/test_create.py::test_python_site_packages_path[libmamba]": 0.00043268539096137464, "tests/test_create.py::test_remove_empty_env[classic]": 0.6320599121198471, "tests/test_create.py::test_remove_empty_env[libmamba]": 2.285568473845315, "tests/test_create.py::test_remove_force_remove_flag[classic]": 0.0004030550018373978, "tests/test_create.py::test_remove_force_remove_flag[libmamba]": 0.00044936920478056065, "tests/test_create.py::test_remove_ignore_nonenv[classic]": 0.03524958781192881, "tests/test_create.py::test_remove_ignore_nonenv[libmamba]": 0.03298427604050272, "tests/test_create.py::test_remove_spellcheck[classic]": 0.7097346993379199, "tests/test_create.py::test_remove_spellcheck[libmamba]": 0.7745324891557333, "tests/test_create.py::test_repodata_v2_base_url[classic]": 0.9510281244771237, "tests/test_create.py::test_repodata_v2_base_url[libmamba]": 0.9087530512696274, "tests/test_create.py::test_rm_rf[classic]": 8.185878420541881, "tests/test_create.py::test_rm_rf[libmamba]": 10.649979067839423, "tests/test_create.py::test_run_preserves_arguments[classic]": 14.591420365675937, "tests/test_create.py::test_run_preserves_arguments[libmamba]": 13.75232408529893, "tests/test_create.py::test_run_script_called[classic]": 0.0004664356586980326, "tests/test_create.py::test_run_script_called[libmamba]": 0.00043751242931764126, "tests/test_create.py::test_safety_checks_disabled[classic]": 7.067813000949207, "tests/test_create.py::test_safety_checks_disabled[libmamba]": 8.292400963569177, "tests/test_create.py::test_safety_checks_enabled[classic]": 4.562461148377677, "tests/test_create.py::test_safety_checks_enabled[libmamba]": 5.839723359044737, "tests/test_create.py::test_safety_checks_warn[classic]": 10.241402806620885, "tests/test_create.py::test_safety_checks_warn[libmamba]": 12.631822938569309, "tests/test_create.py::test_search_override_channels_enabled[classic]": 0.9095986356048922, "tests/test_create.py::test_search_override_channels_enabled[libmamba]": 2.934383672232539, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]": 37.71866848491676, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]": 18.971389194927546, "tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]": 36.58758218144408, "tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]": 17.132140386033548, "tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]": 36.942263161812946, "tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]": 19.338419422283906, "tests/test_create.py::test_strict_channel_priority[classic]": 0.00043155782698684576, "tests/test_create.py::test_strict_channel_priority[libmamba]": 0.0004222115295862874, "tests/test_create.py::test_strict_resolve_get_reduced_index[classic]": 74.52360950954736, "tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]": 77.60189333521245, "tests/test_create.py::test_tarball_install[classic]": 1.1007145868415424, "tests/test_create.py::test_tarball_install[libmamba]": 0.9351641743078398, "tests/test_create.py::test_tarball_install_and_bad_metadata[classic]": 1.7197568433060724, "tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]": 2.0612441635799392, "tests/test_create.py::test_transactional_rollback_simple[classic]": 1.0277220777363851, "tests/test_create.py::test_transactional_rollback_simple[libmamba]": 1.0888334421950592, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]": 1.4064771719841018, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]": 1.2858947810673957, "tests/test_create.py::test_update_all_updates_pip_pkg[classic]": 17.61629515934802, "tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]": 20.544086526161582, "tests/test_create.py::test_update_deps_flag_absent[classic]": 1.3837014913232208, "tests/test_create.py::test_update_deps_flag_absent[libmamba]": 1.3046441011279808, "tests/test_create.py::test_update_deps_flag_present[classic]": 1.438624114275546, "tests/test_create.py::test_update_deps_flag_present[libmamba]": 1.3191130233855763, "tests/test_create.py::test_update_with_pinned_packages[classic]": 1.0088285677832185, "tests/test_create.py::test_update_with_pinned_packages[libmamba]": 0.8486822342972508, "tests/test_create.py::test_use_index_cache[classic]": 13.534158315364714, "tests/test_create.py::test_use_index_cache[libmamba]": 12.370254022698465, "tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json": 0.4444844142857148, "tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json": 0.43310088214289655, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]": 0.001985713095232692, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]": 0.0019877499999768674, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]": 0.0018190273809371624, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]": 0.0017722261904869658, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]": 0.001846604761947815, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]": 0.0017090309523999686, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]": 0.0017714761904915662, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]": 0.0017352702380706087, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]": 0.0017147000000174253, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]": 0.0016363059523598622, "tests/test_deprecations.py::test_action[future]": 0.0023304058215168097, "tests/test_deprecations.py::test_action[pending]": 0.0033877672916964195, "tests/test_deprecations.py::test_action[remove]": 0.0021169793907016405, "tests/test_deprecations.py::test_arguments[deprecated]": 0.0018266676576712913, "tests/test_deprecations.py::test_arguments[pending]": 0.0019340036558706441, "tests/test_deprecations.py::test_arguments[remove]": 0.032547218968653154, "tests/test_deprecations.py::test_class[deprecated]": 0.0018359850697741652, "tests/test_deprecations.py::test_class[pending]": 0.00184541070638584, "tests/test_deprecations.py::test_class[remove]": 0.0018515769291346893, "tests/test_deprecations.py::test_constant[deprecated]": 0.0025130040862252163, "tests/test_deprecations.py::test_constant[pending]": 0.0025054495652948616, "tests/test_deprecations.py::test_constant[remove]": 0.002638903542008488, "tests/test_deprecations.py::test_constant_factory": 0.002626641071467177, "tests/test_deprecations.py::test_constant_factory_rejects_non_callable": 0.0016481005952714764, "tests/test_deprecations.py::test_constant_multiple_same_module": 0.0022761711125824824, "tests/test_deprecations.py::test_constant_rejects_value_and_factory_together": 0.0016721190476132396, "tests/test_deprecations.py::test_constant_requires_value_or_factory": 0.0015516636904872407, "tests/test_deprecations.py::test_function[deprecated]": 0.0019195097089018467, "tests/test_deprecations.py::test_function[pending]": 0.002011917887453829, "tests/test_deprecations.py::test_function[remove]": 0.001801966734137251, "tests/test_deprecations.py::test_get_module": 0.00293513845846241, "tests/test_deprecations.py::test_method[deprecated]": 0.0018396058052921728, "tests/test_deprecations.py::test_method[pending]": 0.0018442797708527893, "tests/test_deprecations.py::test_method[remove]": 0.0017852949601486873, "tests/test_deprecations.py::test_module[deprecated]": 0.0025365577107019444, "tests/test_deprecations.py::test_module[pending]": 0.00274562462354956, "tests/test_deprecations.py::test_module[remove]": 0.002621241802803483, "tests/test_deprecations.py::test_topic[deprecated]": 0.0017755774448109953, "tests/test_deprecations.py::test_topic[pending]": 0.0017716723302007675, "tests/test_deprecations.py::test_topic[remove]": 0.0017705743517937651, "tests/test_deprecations.py::test_version_fallback": 0.001712985019992022, "tests/test_exceptions.py::test_BasicClobberError": 0.007771206504130644, "tests/test_exceptions.py::test_BinaryPrefixReplacementError": 0.011906317278030648, "tests/test_exceptions.py::test_CommandNotFoundError_conda_build": 0.013627364029748908, "tests/test_exceptions.py::test_CommandNotFoundError_simple": 0.031295320951515194, "tests/test_exceptions.py::test_CondaFileNotFoundError": 0.011547468173794949, "tests/test_exceptions.py::test_CondaHTTPError": 0.013549040136917849, "tests/test_exceptions.py::test_CondaKeyError": 0.01113798470313503, "tests/test_exceptions.py::test_DirectoryNotFoundError": 0.022273039886360646, "tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]": 0.001839279442171636, "tests/test_exceptions.py::test_KnownPackageClobberError": 0.007557038983601802, "tests/test_exceptions.py::test_MD5MismatchError": 0.01186341689354213, "tests/test_exceptions.py::test_PackageNotFoundError": 0.01127458890276987, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]": 0.006370706626813839, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]": 0.006573232787068662, "tests/test_exceptions.py::test_SharedLinkPathClobberError": 0.007017282148023407, "tests/test_exceptions.py::test_TooManyArgumentsError": 0.06567324935704902, "tests/test_exceptions.py::test_UnknownPackageClobberError": 0.008162878527694586, "tests/test_exceptions.py::test_http_error_custom_reason_code": 0.01143328324185338, "tests/test_exceptions.py::test_http_error_rfc_9457": 0.011606733414663112, "tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error": 0.0015177791666379412, "tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]": 0.001746872023853522, "tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]": 0.0017674750000130266, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1": 0.020420303386802504, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2": 0.026299110717687504, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_1": 0.03164384108314728, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_2": 0.01615479704241503, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_3": 0.022753492598003407, "tests/test_exceptions.py::test_proxy_error_custom_message": 0.0015644345254558858, "tests/test_exceptions.py::test_proxy_error_default_message": 0.0016333678606859855, "tests/test_exports.py::test_deprecations[CondaError-TypeError]": 0.0017577543415805848, "tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]": 0.0017655188785901741, "tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]": 0.0016819140794181876, "tests/test_exports.py::test_deprecations[CondaOSError-TypeError]": 0.0016793089238038024, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]": 0.0017901044294625671, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]": 0.0018051249848441376, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]": 0.0017264997986333893, "tests/test_exports.py::test_deprecations[EntityEncoder-None]": 0.001730840560689674, "tests/test_exports.py::test_deprecations[LinkError-TypeError]": 0.0017235859524870848, "tests/test_exports.py::test_deprecations[LockError-TypeError]": 0.0017934920973491592, "tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]": 0.0017745401295872461, "tests/test_exports.py::test_deprecations[PY3-TypeError]": 0.0017206963062541187, "tests/test_exports.py::test_deprecations[PaddingError-TypeError]": 0.0018244866651319566, "tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]": 0.0017643373923063453, "tests/test_exports.py::test_deprecations[StringIO-None]": 0.0017542460393965233, "tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]": 0.001706803113921365, "tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]": 0.001696068519097268, "tests/test_exports.py::test_deprecations[input-OSError]": 0.001723913834816268, "tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]": 0.0034223631219548107, "tests/test_exports.py::test_deprecations[string_types-None]": 0.00165818991136936, "tests/test_exports.py::test_deprecations[text_type-None]": 0.0017904580468893513, "tests/test_features.py::test_install_track_features_downgrade": 1.8955566957584058, "tests/test_features.py::test_install_track_features_upgrade": 2.083636269752632, "tests/test_features.py::test_remove_features_downgrade": 0.661836523212637, "tests/test_features.py::test_remove_features_upgrade": 0.9851079496290821, "tests/test_fetch.py::test_checksum_checks_bytes[bad-type]": 0.02493406601795752, "tests/test_fetch.py::test_checksum_checks_bytes[gibberish]": 0.026601665510825052, "tests/test_fetch.py::test_checksum_checks_bytes[original]": 0.02955354736875819, "tests/test_fetch.py::test_checksum_checks_bytes[upper]": 0.024588441127869093, "tests/test_fetch.py::test_download_connectionerror": 0.20535382767522414, "tests/test_fetch.py::test_download_http_errors": 0.007136791858035103, "tests/test_fetch.py::test_download_httperror": 0.013453581404124861, "tests/test_fetch.py::test_download_size_none": 0.007694098914806232, "tests/test_fetch.py::test_download_text": 0.006411037921122335, "tests/test_fetch.py::test_download_when_ranges_not_supported": 0.02948449413463227, "tests/test_fetch.py::test_fetchrepodate_connectionerror": 0.0599995084391649, "tests/test_fetch.py::test_resume_bad_partial": 0.013530729842073463, "tests/test_fetch.py::test_resume_download": 0.03827693040869739, "tests/test_fetch.py::test_resume_partial": 0.10665467582302858, "tests/test_fetch.py::test_tmpDownload": 0.1298412575931124, "tests/test_history.py::test_calls_update_on_exit": 0.006312623428485913, "tests/test_history.py::test_comment_parsing[conda 4.5.1]": 0.001645464648537249, "tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]": 0.0016401782162014991, "tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]": 0.0016195962376578707, "tests/test_history.py::test_comment_parsing[post 4.4, install spec]": 0.0017608056379454678, "tests/test_history.py::test_comment_parsing[post 4.4, update spec]": 0.0016779222146642524, "tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]": 0.0031332201721242523, "tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]": 0.007858195192422743, "tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]": 0.006850579395010684, "tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]": 0.0016882451429260086, "tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]": 0.0016734906097026648, "tests/test_history.py::test_empty_history_check_on_empty_env": 0.006197913927397257, "tests/test_history.py::test_history_malformed": 0.005237479284105042, "tests/test_history.py::test_parse_on_empty_env": 0.0062703461771221975, "tests/test_history.py::test_returns_history_object_as_context_object": 0.0050165184121936926, "tests/test_history.py::test_user_requests[0]": 0.002243956416680701, "tests/test_history.py::test_user_requests[1]": 0.0022577845107304463, "tests/test_history.py::test_user_requests[2]": 0.0022248483538071496, "tests/test_history.py::test_user_requests[3]": 0.0022061546748112382, "tests/test_history.py::test_user_requests[4]": 0.0020908377087306574, "tests/test_history.py::test_user_requests[5]": 0.0021695262752585587, "tests/test_history.py::test_works_as_context_manager": 0.004091084237169554, "tests/test_install.py::test_binary[linux-64]": 0.006407781312851252, "tests/test_install.py::test_binary[noarch]": 0.005029009745952638, "tests/test_install.py::test_binary[win-64]": 0.004932464817833623, "tests/test_install.py::test_default_text": 0.005033832750510543, "tests/test_install.py::test_ends_with_newl[linux-64]": 0.0018815863667560025, "tests/test_install.py::test_ends_with_newl[noarch]": 0.0019025070898813375, "tests/test_install.py::test_ends_with_newl[win-64]": 0.0020109602599539264, "tests/test_install.py::test_long_default_text": 0.00038796923129782215, "tests/test_install.py::test_multiple[linux-64]": 0.0017720518875849287, "tests/test_install.py::test_multiple[noarch]": 0.0019344612151042883, "tests/test_install.py::test_multiple[win-64]": 0.002076728723952221, "tests/test_install.py::test_no_extra[linux-64]": 0.004147513667902195, "tests/test_install.py::test_no_extra[noarch]": 0.001956564522018347, "tests/test_install.py::test_no_extra[win-64]": 0.0019390981669044503, "tests/test_install.py::test_read_no_link": 0.004850535607891854, "tests/test_install.py::test_shorter[linux-64]": 0.0022541627772643784, "tests/test_install.py::test_shorter[noarch]": 0.0022537518638227083, "tests/test_install.py::test_shorter[win-64]": 0.0019134588781929956, "tests/test_install.py::test_simple[linux-64]": 0.005355091283467981, "tests/test_install.py::test_simple[noarch]": 0.0019833430603747914, "tests/test_install.py::test_simple[win-64]": 0.0020040339738698993, "tests/test_install.py::test_spaces[linux-64]": 0.0018341641798061132, "tests/test_install.py::test_spaces[noarch]": 0.0018648627205578047, "tests/test_install.py::test_spaces[win-64]": 0.0019912441224810627, "tests/test_install.py::test_too_long[linux-64]": 0.0021690534208927727, "tests/test_install.py::test_too_long[noarch]": 0.0017592069172095177, "tests/test_install.py::test_too_long[win-64]": 0.0017197420929820058, "tests/test_install.py::test_trash_outside_prefix": 0.028890898759682475, "tests/test_install.py::test_two[linux-64]": 0.0015951530865546085, "tests/test_install.py::test_two[noarch]": 0.001948402096039426, "tests/test_install.py::test_two[win-64]": 0.0018694653015179474, "tests/test_install.py::test_windows_entry_point": 1.4549905836173775, "tests/test_install.py::test_yield_lines": 0.004287322803330327, "tests/test_instructions.py::test_check_files_in_tarball_files_exist": 0.00437986085094021, "tests/test_instructions.py::test_check_files_in_tarball_files_not_exist": 0.0025461757006154766, "tests/test_instructions.py::test_expected_operation_order": 0.0015501993778246292, "tests/test_link_order.py::test_link_order_post_link_actions": 0.8574631598815384, "tests/test_link_order.py::test_link_order_post_link_depend": 0.7174985659409109, "tests/test_misc.py::test_Utf8NamedTemporaryFile": 0.002112328314753306, "tests/test_misc.py::test_cache_fn_url": 0.0015518192389540337, "tests/test_misc.py::test_deprecations[url_pat-TypeError]": 0.0020406596764286095, "tests/test_misc.py::test_explicit_missing_cache_entries": 1.2109323574109927, "tests/test_misc.py::test_explicit_no_cache": 0.0054009588320436406, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]": 0.0019822515215959795, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.0028856108805669052, "tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.0028822234375576773, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.0029433320730622345, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]": 0.001871542469462788, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]": 0.0019193741655610368, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.0029002367252363983, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.0029656516591344915, "tests/test_misc.py::test_url_pat_1": 0.0015225383718263698, "tests/test_misc.py::test_url_pat_2": 0.0015027605633319567, "tests/test_misc.py::test_url_pat_3": 0.0015314576194833526, "tests/test_misc.py::test_walk_prefix": 0.021960459197964428, "tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]": 1.6485213324831793, "tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]": 1.5673976261632367, "tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]": 2.150668724390094, "tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]": 2.8220419821131246, "tests/test_reporters.py::test_confirm_yn_always_yes": 0.006054250118761058, "tests/test_reporters.py::test_confirm_yn_dry_run_exit": 0.00617057462130478, "tests/test_reporters.py::test_confirm_yn_no": 0.006549525987677111, "tests/test_reporters.py::test_confirm_yn_yes": 0.009831845186721056, "tests/test_reporters.py::test_get_progress_bar": 0.0022553006411520264, "tests/test_reporters.py::test_get_progress_bar_context_managers": 0.001614746753560146, "tests/test_reporters.py::test_render": 0.003327152910701223, "tests/test_resolve.py::test_Resolve_make_channel_priorities": 0.0023778020939496133, "tests/test_resolve.py::test_specs_by_name_copy_is_independent": 0.0016856827973524622, "tests/test_solvers.py::TestClassicSolver::test_accelerate": 1.903554094523897, "tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl": 1.0470012301374614, "tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.2296004357210037, "tests/test_solvers.py::TestClassicSolver::test_channel_priority_1": 0.009689783428993407, "tests/test_solvers.py::TestClassicSolver::test_circular_dependencies": 0.7615609278377204, "tests/test_solvers.py::TestClassicSolver::test_empty": 0.7460954200395556, "tests/test_solvers.py::TestClassicSolver::test_get_dists": 1.1526858280486172, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution": 0.2150101310443196, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.22132208180420532, "tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature": 0.32737150715861674, "tests/test_solvers.py::TestClassicSolver::test_iopro_mkl": 1.189881061680327, "tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl": 0.7412254573872928, "tests/test_solvers.py::TestClassicSolver::test_irrational_version": 0.267712454621957, "tests/test_solvers.py::TestClassicSolver::test_mkl": 1.3508746843040758, "tests/test_solvers.py::TestClassicSolver::test_no_features": 1.9919547763467969, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater": 0.2126511562817464, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.21412918413479418, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater": 0.21336948924803917, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.216712909509828, "tests/test_solvers.py::TestClassicSolver::test_nonexistent": 0.44066075958294354, "tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps": 2.8925607667548077, "tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean": 1.2656131369422547, "tests/test_solvers.py::TestClassicSolver::test_remove": 0.9896828112735098, "tests/test_solvers.py::TestClassicSolver::test_scipy_mkl": 0.6087072218355158, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_1": 0.2138481380552849, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_2": 0.2239357836935148, "tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps": 1.7246722568874318, "tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade": 0.7780731007242828, "tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three": 0.8592498976858852, "tests/test_solvers.py::TestClassicSolver::test_unsat_chain": 0.21991810264088887, "tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority": 0.46514851310767363, "tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single": 0.22267651446382516, "tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1": 2.1321218858104896, "tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep": 0.21374114331017555, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1": 0.21510866785864097, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2": 0.22029786684416713, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3": 0.21510694884779175, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4": 0.21633766853625394, "tests/test_solvers.py::TestClassicSolver::test_unsat_simple": 0.21455069443001668, "tests/test_solvers.py::TestLibMambaSolver::test_accelerate": 0.0013916750829820544, "tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl": 0.2946747192551424, "tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.2577826328466928, "tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1": 0.008909430322175248, "tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies": 0.7371200133681524, "tests/test_solvers.py::TestLibMambaSolver::test_empty": 0.24891395470114727, "tests/test_solvers.py::TestLibMambaSolver::test_get_dists": 0.24986124170940077, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution": 0.22237791632798046, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.21690525570805702, "tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature": 0.24877745593667913, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl": 0.0016221667199066117, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl": 0.0015269614306144016, "tests/test_solvers.py::TestLibMambaSolver::test_irrational_version": 0.24672878602997558, "tests/test_solvers.py::TestLibMambaSolver::test_mkl": 0.0015007615141971443, "tests/test_solvers.py::TestLibMambaSolver::test_no_features": 0.0016025790849684765, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater": 0.21762601173560062, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.21650489120575217, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater": 0.21626565958703595, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.2200266429323679, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent": 0.4347562488413042, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps": 2.756748555745074, "tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean": 0.0014888776273797456, "tests/test_solvers.py::TestLibMambaSolver::test_remove": 0.0016844524073378194, "tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl": 0.0014251162327625106, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1": 0.0016032454395477666, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2": 0.0014683435495814975, "tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps": 1.7100154492668826, "tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade": 0.0015964906640972283, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three": 0.8523178418764462, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain": 0.2179668493631822, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority": 0.44908621547109584, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single": 0.22514430850502468, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1": 0.7354675122071309, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep": 0.21868349085795818, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1": 0.22386795657870184, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2": 0.21777050069284348, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3": 0.23064400697420123, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4": 0.22451023670811168, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple": 0.21809358267632445, "tests/test_utils.py::test_ensure_dir": 0.010115338662044502, "tests/test_utils.py::test_ensure_dir_errors": 0.005695686016115806, "tests/test_utils.py::test_quote_for_shell[!-!]": 0.001656666752377032, "tests/test_utils.py::test_quote_for_shell[\"-\"\"\"\"]": 0.0016060271458248024, "tests/test_utils.py::test_quote_for_shell[#-#]": 0.0015956752779945648, "tests/test_utils.py::test_quote_for_shell[$-$]": 0.0015680417925681266, "tests/test_utils.py::test_quote_for_shell[%-\"%%\"]": 0.0016610094033320862, "tests/test_utils.py::test_quote_for_shell[&-\"&\"]": 0.0016079799939259626, "tests/test_utils.py::test_quote_for_shell['-']": 0.0015872842348861257, "tests/test_utils.py::test_quote_for_shell[(-(]": 0.0016312292727956588, "tests/test_utils.py::test_quote_for_shell[)-)]": 0.0016334702193680608, "tests/test_utils.py::test_quote_for_shell[*-*]": 0.0015840761377555394, "tests/test_utils.py::test_quote_for_shell[+-+]": 0.0016346022987265834, "tests/test_utils.py::test_quote_for_shell[,-,]": 0.0015730535097279238, "tests/test_utils.py::test_quote_for_shell[---]": 0.0016062781913980856, "tests/test_utils.py::test_quote_for_shell[.-.]": 0.0016218125857262182, "tests/test_utils.py::test_quote_for_shell[/-/]": 0.0016397037563203058, "tests/test_utils.py::test_quote_for_shell[1>/dev/null-\"1>/dev/null\"]": 0.0016127781542716938, "tests/test_utils.py::test_quote_for_shell[1>NUL-\"1>NUL\"]": 0.0016891044411407948, "tests/test_utils.py::test_quote_for_shell[2>&1-\"2>&1\"]": 0.0016034836076031862, "tests/test_utils.py::test_quote_for_shell[2>/dev/null-\"2>/dev/null\"]": 0.0016246253488996206, "tests/test_utils.py::test_quote_for_shell[2>NUL-\"2>NUL\"]": 0.0016199922221955452, "tests/test_utils.py::test_quote_for_shell[:-:]": 0.00155531842624978, "tests/test_utils.py::test_quote_for_shell[;-;]": 0.0015881716680169508, "tests/test_utils.py::test_quote_for_shell[<-\"<\"]": 0.0016465967447198793, "tests/test_utils.py::test_quote_for_shell[=-=]": 0.0016405796588425004, "tests/test_utils.py::test_quote_for_shell[>-\">\"]": 0.0016009066070187437, "tests/test_utils.py::test_quote_for_shell[>/dev/null-\">/dev/null\"]": 0.0017037653977853924, "tests/test_utils.py::test_quote_for_shell[>NUL-\">NUL\"]": 0.001624519567576616, "tests/test_utils.py::test_quote_for_shell[?-?]": 0.0016138654602200124, "tests/test_utils.py::test_quote_for_shell[@-@]": 0.0016339006723396694, "tests/test_utils.py::test_quote_for_shell[C:\\\\temp\\\\some ^%file^% > nul-\"C:\\\\temp\\\\some ^%%file^%% > nul\"]": 0.0016353484524878304, "tests/test_utils.py::test_quote_for_shell[None-\"\"]": 0.0016146133531703731, "tests/test_utils.py::test_quote_for_shell[[-[]": 0.0016353314126086873, "tests/test_utils.py::test_quote_for_shell[\\\\-\\\\]": 0.0016541113415053112, "tests/test_utils.py::test_quote_for_shell[]-]]": 0.0016509822069039652, "tests/test_utils.py::test_quote_for_shell[^-\"^\"]": 0.0016232436025561841, "tests/test_utils.py::test_quote_for_shell[arg1 and 2-\"arg1 and 2\"]": 0.0017400721194435619, "tests/test_utils.py::test_quote_for_shell[arg1-arg1]": 0.0018087881139659645, "tests/test_utils.py::test_quote_for_shell[arg1\\nand\\n2-\"arg1\\nand\\n2\"]": 0.0016679734021393345, "tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\"&whoami-\"malicious argument\\\\\"\"&whoami\"]": 0.0016239503149412305, "tests/test_utils.py::test_quote_for_shell[numpy<1.22-\"numpy<1.22\"]": 0.0016563192911647746, "tests/test_utils.py::test_quote_for_shell[numpy>=1.0-\"numpy>=1.0\"]": 0.0017303157950781516, "tests/test_utils.py::test_quote_for_shell[one|two-\"one|two\"]": 0.0016172824726147443, "tests/test_utils.py::test_quote_for_shell[{-{]": 0.0016645509497609952, "tests/test_utils.py::test_quote_for_shell[|-\"|\"]": 0.0016120300194441507, "tests/test_utils.py::test_quote_for_shell[}-}]": 0.0015968457592204363, "tests/test_utils.py::test_quote_for_shell[~-~]": 0.0015991678505405183, "tests/testing/test_fixtures.py::test_conda_cli": 0.04461107989556348, "tests/testing/test_fixtures.py::test_empty_env": 0.005128171101890364, "tests/testing/test_fixtures.py::test_env": 0.15721565378515062, "tests/testing/test_fixtures.py::test_monkeypatch": 0.006146889855716153, "tests/testing/test_fixtures.py::test_path_factory": 0.004012850718941502, "tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity": 0.003919741468844826, "tests/testing/test_fixtures.py::test_path_factory_name_mode": 0.004048635554629645, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]": 0.00422903694841771, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]": 0.004027076592477306, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]": 0.0043763441134775545, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]": 0.004083459326188267, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]": 0.004023430131014948, "tests/testing/test_fixtures.py::test_path_factory_uniqueness": 0.00390514780776511, "tests/testing/test_fixtures.py::test_session_conda_cli": 0.06242434386986165, "tests/testing/test_fixtures.py::test_session_tmp_env": 0.035879040681181036, "tests/testing/test_fixtures.py::test_tmp_channel": 2.007042151235991, "tests/testing/test_fixtures.py::test_tmp_env": 0.05822465509364867, "tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity": 0.004486183554472577, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]": 0.005529278726971777, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]": 0.0053271391458203895, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]": 0.005376273251041051, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]": 0.005478114409675972, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]": 0.005577080914597722, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]": 0.007289177730351245, "tests/testing/test_fixtures.py::test_tmp_envs_dir": 0.008581952814863021, "tests/testing/test_fixtures.py::test_tmp_pkgs_dir": 0.005195960047959714, "tests/testing/test_http_test_server.py::test_dynamic_content_pattern": 0.5119969560258663, "tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]": 0.5120789083095345, "tests/testing/test_http_test_server.py::test_http_server_directory_attribute": 0.5147891346391638, "tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]": 0.5151769293077755, "tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]": 0.509109939950053, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]": 0.7875329771543123, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]": 0.5082235961623637, "tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]": 0.5166075058701791, "tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]": 0.5119531342502202, "tests/testing/test_http_test_server.py::test_http_server_without_marker": 0.512768349672609, "tests/testing/test_http_test_server.py::test_marker_validation_directory_type": 0.17464007338148466 } ================================================ FILE: durations/macOS.json ================================================ { "tests/base/test_constants.py::test_ChannelPriority": 0.004216883589334565, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]": 0.004723558334219607, "tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]": 0.0031918199086949208, "tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]": 0.004060530984756273, "tests/base/test_constants.py::test_null_is_falsey": 0.0038878073375711564, "tests/base/test_context.py::test_aggressive_update_packages": 0.01930340924086498, "tests/base/test_context.py::test_category_map_covers_all_parameters": 0.027227301481424868, "tests/base/test_context.py::test_category_map_is_class_constant": 0.002273740177760273, "tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]": 0.003594115197972685, "tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]": 0.0037815655297883982, "tests/base/test_context.py::test_channel_priority": 0.03140256830213121, "tests/base/test_context.py::test_channel_settings": 0.03304383168140191, "tests/base/test_context.py::test_channels_defaults_condarc": 0.03620498585317316, "tests/base/test_context.py::test_channels_empty": 0.037080393636827774, "tests/base/test_context.py::test_check_allowlist": 0.02214968462956203, "tests/base/test_context.py::test_check_allowlist_and_denylist": 0.020872265702408604, "tests/base/test_context.py::test_check_denylist": 0.021467475286737196, "tests/base/test_context.py::test_client_ssl_cert": 0.05952056465678931, "tests/base/test_context.py::test_clobber_enum[clobber]": 0.015015964452917953, "tests/base/test_context.py::test_clobber_enum[prevent]": 0.017469474889238334, "tests/base/test_context.py::test_clobber_enum[warn]": 0.012765900643005729, "tests/base/test_context.py::test_conda_bld_path": 0.022032278730435954, "tests/base/test_context.py::test_conda_build_root_dir": 0.03376980996360278, "tests/base/test_context.py::test_conda_envs_path": 0.06212473106595774, "tests/base/test_context.py::test_context_override_with_reset": 0.012669620996943595, "tests/base/test_context.py::test_context_parameter_map": 0.03282161425911004, "tests/base/test_context.py::test_context_parameters_have_descriptions": 0.09047837598730729, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]": 0.003066208772467681, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]": 0.0028401357563723195, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]": 0.0025039054755396357, "tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]": 0.0026965953318963585, "tests/base/test_context.py::test_context_stack_push_pop_roundtrip": 0.012293000774894373, "tests/base/test_context.py::test_context_stack_starts_with_single_slot": 0.002562482942257197, "tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]": 0.013649267797008724, "tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]": 0.014522281333119502, "tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]": 0.014286541804744205, "tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages": 0.019240347679401932, "tests/base/test_context.py::test_custom_multichannels": 0.03654063576416327, "tests/base/test_context.py::test_custom_multichannels_overrides_default_channels": 0.05880720508579446, "tests/base/test_context.py::test_default_activation_prefix": 0.037441175338434635, "tests/base/test_context.py::test_default_python_validation[-True]": 0.003482500702629616, "tests/base/test_context.py::test_default_python_validation[3.12-True]": 0.003990832081896736, "tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']": 0.002815436876073722, "tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']": 0.003548168213357671, "tests/base/test_context.py::test_default_target_is_root_prefix": 0.034189925388076275, "tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]": 0.003020293427921399, "tests/base/test_context.py::test_expandvars": 0.12366242249402754, "tests/base/test_context.py::test_export_platforms": 0.048637186813950156, "tests/base/test_context.py::test_local_build_root_custom_rc": 0.07027815284893531, "tests/base/test_context.py::test_local_build_root_default_rc": 0.014156849458435943, "tests/base/test_context.py::test_migrated_custom_channels": 0.03903699931724073, "tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]": 0.0036177525859652105, "tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]": 0.003589902573614288, "tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]": 0.003429730154267836, "tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]": 0.003359729949012515, "tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]": 0.003435599885430065, "tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]": 0.003246449500513311, "tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]": 0.004236265584893431, "tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]": 0.0037083955926628057, "tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]": 0.0037248480344342252, "tests/base/test_context.py::test_old_channel_alias": 0.04486644604076936, "tests/base/test_context.py::test_proxy_servers": 0.03899749569798917, "tests/base/test_context.py::test_signing_metadata_url_base": 0.0477710927926795, "tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels": 0.046870779521812594, "tests/base/test_context.py::test_specify_channels_cli_condarc": 0.038395435047443346, "tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc": 0.040348499264436545, "tests/base/test_context.py::test_specify_different_channels_cli_condarc": 0.03719060115591803, "tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc": 0.03543667540853389, "tests/base/test_context.py::test_subdirs": 0.013218124359324158, "tests/base/test_context.py::test_target_prefix": 0.061463485057484384, "tests/base/test_context.py::test_threads": 0.05514320986389983, "tests/base/test_context.py::test_validate_channels[-expected_channels3]": 0.0038806468347042083, "tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]": 0.006038510864799617, "tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]": 0.005516461247062072, "tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]": 0.006106952059571302, "tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]": 0.003603593453237281, "tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]": 0.004235784900316259, "tests/cli/test_actions.py::test_null_count_action": 0.005194912855033793, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]": 0.04135311400003161, "tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]": 0.0887445353333381, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']": 0.0647759583131879, "tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']": 0.057947997697476245, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]": 0.08386111105244996, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]": 0.06525398210760477, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]": 0.2054211273995247, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]": 0.08311664656572304, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]": 0.21384510915498983, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]": 0.07812220844265308, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]": 0.06568941922076364, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]": 0.2733978760119036, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]": 0.07842789187682735, "tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]": 0.2267305332448143, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]": 0.08944849586883818, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]": 0.06907673039192114, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]": 0.08766692199449581, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]": 0.09112964342422064, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]": 0.2429003619730979, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]": 0.08475521601462617, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]": 0.0719471233756735, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]": 0.18673353804493237, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]": 0.09789896559589048, "tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]": 0.2496464891176632, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]": 0.0076943821601584755, "tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]": 0.012464048134661237, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]": 0.020571850435631533, "tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]": 0.006615971176349361, "tests/cli/test_all_commands.py::test_env_spec_deprecation_removal": 0.006083772427483084, "tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used": 0.005962185030416224, "tests/cli/test_cli_install.py::test_emscripten_forge[classic]": 7.480853345485133, "tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]": 4.160096186792316, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]": 21.25222915143643, "tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]": 0.009329529434015863, "tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]": 67.57979419566804, "tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]": 37.11069807663952, "tests/cli/test_cli_install.py::test_pre_link_message[classic]": 1.6707249249157095, "tests/cli/test_cli_install.py::test_pre_link_message[libmamba]": 2.0400892487227402, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]": 0.023809915485808002, "tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]": 0.031808671239245065, "tests/cli/test_common.py::test_check_non_admin_enabled_false": 0.014287688188374312, "tests/cli/test_common.py::test_check_non_admin_enabled_true": 0.013059248920864559, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none": 0.0060110394473284375, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec": 0.005989230342089599, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier": 0.0056285698130236666, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both": 0.0062690975149602484, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name": 0.006960094628188991, "tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix": 0.005925176582128524, "tests/cli/test_common.py::test_is_active_prefix[-False]": 0.004053933409855258, "tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]": 0.0036026535799577796, "tests/cli/test_common.py::test_print_activate": 0.004965008228129584, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]": 0.015438975418808648, "tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]": 0.014508068078545239, "tests/cli/test_common.py::test_validate_file_exists[/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]": 0.0026555980036341454, "tests/cli/test_common.py::test_validate_file_exists[/Users/runner/work/conda/conda/tests/cli/test_common.py-True]": 0.004742478379501809, "tests/cli/test_common.py::test_validate_file_exists[file:///Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]": 0.0034766317329442326, "tests/cli/test_common.py::test_validate_file_exists[file:///Users/runner/work/conda/conda/tests/cli/test_common.py-True]": 0.005385275471445733, "tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]": 0.00410975788659898, "tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]": 0.003747550576006917, "tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]": 0.00399428470754883, "tests/cli/test_common.py::test_validate_subdir_config": 0.006126040617488074, "tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir": 0.006557161183122832, "tests/cli/test_compare.py::test_compare_fail": 1.6726883320663744, "tests/cli/test_compare.py::test_compare_success": 1.272659723133132, "tests/cli/test_conda_argparse.py::test_cli_args_as_strings": 0.09825581969048251, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]": 0.0060492343753245255, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-]": 0.004055312412510113, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]": 0.007780680421883457, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]": 0.005021625355001991, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]": 0.0043391700488606385, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]": 0.004331464320859218, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]": 0.004379118507514045, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]": 0.020283895515326035, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]": 0.00561471966562845, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]": 0.014084014484150031, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]": 0.004054089285958279, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]": 0.004348576755868434, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]": 0.0040902909800902935, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]": 0.004493833305046914, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]": 0.004139263588679391, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]": 0.012698916809484637, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]": 0.004067947600094233, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]": 0.003687451216570164, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]": 0.004002429775417028, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]": 0.0037502300423931764, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]": 0.004019723807996511, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]": 0.004009301001827388, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]": 0.004066500289432626, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]": 0.0038930447625835033, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]": 0.003914481094615946, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]": 0.0036460259766652675, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]": 0.0034857767026638628, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]": 0.004346794029608563, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]": 0.004058680903529706, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]": 0.004083459385055381, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]": 0.004256608048339528, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]": 0.004085107568441029, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]": 0.004692633192412332, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]": 0.0044523143666565105, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]": 0.0040443214011068014, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]": 0.004671380200404303, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]": 0.004834789306397318, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]": 0.004456499444931781, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]": 0.004480822843956616, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-]": 0.004463886586233026, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-]": 0.004528884410133324, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]": 0.004563722693859969, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]": 0.004294172805704509, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]": 0.004430678926971039, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-]": 0.004558504348299476, "tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-]": 0.004987354918818975, "tests/cli/test_conda_argparse.py::test_parse_clobber": 0.0678345580439776, "tests/cli/test_conda_argparse.py::test_parser_basics": 0.07765048273060866, "tests/cli/test_conda_argparse.py::test_sorted_commands_in_error": 0.006866359170337944, "tests/cli/test_config.py::test_add_invalid_key": 0.0881662688398049, "tests/cli/test_config.py::test_add_key": 0.1128598495080704, "tests/cli/test_config.py::test_channels_add_duplicate": 0.08756605842977994, "tests/cli/test_config.py::test_channels_add_empty": 0.1143466944044159, "tests/cli/test_config.py::test_channels_add_empty_with_defaults": 0.11124210329179562, "tests/cli/test_config.py::test_channels_append": 0.10244028575885665, "tests/cli/test_config.py::test_channels_append_duplicate": 0.13068234479943536, "tests/cli/test_config.py::test_channels_prepend": 0.10042145449423014, "tests/cli/test_config.py::test_channels_prepend_duplicate": 0.10483291190522376, "tests/cli/test_config.py::test_channels_remove": 0.11467462381714211, "tests/cli/test_config.py::test_channels_remove_duplicate": 0.19014362874533003, "tests/cli/test_config.py::test_conda_config_describe": 1.2213739663098422, "tests/cli/test_config.py::test_conda_config_validate": 0.3224462935635032, "tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore": 0.16790669170857242, "tests/cli/test_config.py::test_create_condarc_on_set": 0.09779198741298302, "tests/cli/test_config.py::test_custom_multichannels_add": 0.09552169498111235, "tests/cli/test_config.py::test_custom_multichannels_add_duplicate": 0.10375482779553064, "tests/cli/test_config.py::test_custom_multichannels_append": 0.0893947928188464, "tests/cli/test_config.py::test_custom_multichannels_append_duplicate": 0.08852036033694395, "tests/cli/test_config.py::test_custom_multichannels_prepend": 0.08422445616760957, "tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate": 0.090694175790913, "tests/cli/test_config.py::test_get_all": 0.11808253965606623, "tests/cli/test_config.py::test_get_all_inc_maps": 0.10158202958384323, "tests/cli/test_config.py::test_get_boolean_value": 0.10317755566103588, "tests/cli/test_config.py::test_get_channels_list": 0.1021486734731305, "tests/cli/test_config.py::test_get_invalid_key": 0.09483595300518417, "tests/cli/test_config.py::test_get_map_full": 0.1081727357868393, "tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]": 0.12796284999518226, "tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]": 0.09777210917195271, "tests/cli/test_config.py::test_get_multiple_keys": 0.09870216503244574, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_full": 0.10886658251964253, "tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey": 0.12888241824045005, "tests/cli/test_config.py::test_get_string_value": 0.09416948352517913, "tests/cli/test_config.py::test_get_unconfigured_key": 0.1103055512714119, "tests/cli/test_config.py::test_invalid_yaml": 0.09185876169102641, "tests/cli/test_config.py::test_remove_key": 0.08626311222495414, "tests/cli/test_config.py::test_remove_key_duplicate": 0.13686263621169695, "tests/cli/test_config.py::test_remove_unconfigured_key": 0.08027645374974685, "tests/cli/test_config.py::test_set_and_get_bool": 0.169627201543951, "tests/cli/test_config.py::test_set_check_types[always_yes-false-False]": 0.08606949771638943, "tests/cli/test_config.py::test_set_check_types[always_yes-no-False]": 0.08878308374440108, "tests/cli/test_config.py::test_set_check_types[always_yes-true-True]": 0.08566686828881509, "tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]": 0.08624213850675166, "tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]": 0.08003079772506745, "tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]": 0.08596973661201304, "tests/cli/test_config.py::test_set_invalid_key": 0.07383852304956055, "tests/cli/test_config.py::test_set_key": 0.10384791678756178, "tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]": 0.09508030414218076, "tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]": 0.0008571926615353055, "tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]": 0.0933782528925965, "tests/cli/test_config.py::test_set_rc_without_user_rc": 0.09834675199109405, "tests/cli/test_config.py::test_set_unconfigured_key": 0.0999756115614536, "tests/cli/test_config.py::test_show_sorts_keys": 0.23888580692370606, "tests/cli/test_config.py::test_ssl_verify_default": 0.0065441414461990775, "tests/cli/test_config.py::test_ssl_verify_set_bool": 0.0757976230859016, "tests/cli/test_config.py::test_ssl_verify_set_filename": 0.08827973955400154, "tests/cli/test_env.py::test_conda_env_create_empty_file[classic]": 0.05505775562871469, "tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]": 0.030370183974781237, "tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]": 1.2441171922846466, "tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]": 1.4911250961063174, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]": 0.03563459351198939, "tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]": 0.018122805486255653, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]": 0.03245778793687105, "tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]": 0.03598257398941148, "tests/cli/test_env.py::test_conda_env_create_no_file[classic]": 0.01659037640468958, "tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]": 0.03606590660912431, "tests/cli/test_env.py::test_create_dry_run_json[classic]": 0.26204305426897473, "tests/cli/test_env.py::test_create_dry_run_json[libmamba]": 0.49488479904040245, "tests/cli/test_env.py::test_create_dry_run_yaml[classic]": 0.4088668363730023, "tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]": 1.0020819006242665, "tests/cli/test_env.py::test_create_unsolvable_env[classic]": 0.735545060670648, "tests/cli/test_env.py::test_create_unsolvable_env[libmamba]": 0.924573155218304, "tests/cli/test_env.py::test_create_valid_env[classic]": 2.312457360803382, "tests/cli/test_env.py::test_create_valid_env[libmamba]": 1.5261040030114261, "tests/cli/test_env.py::test_create_valid_env_json_output[classic]": 0.07916513686452198, "tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]": 0.5052295876761401, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]": 12.382148847469997, "tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]": 10.47433856534404, "tests/cli/test_env.py::test_create_valid_env_with_variables[classic]": 1.3296485466071746, "tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]": 1.3066283193009385, "tests/cli/test_env.py::test_env_export[classic]": 2.1952579002513875, "tests/cli/test_env.py::test_env_export[libmamba]": 3.075971975747862, "tests/cli/test_env.py::test_env_export_json[classic]": 0.6292987153827415, "tests/cli/test_env.py::test_env_export_json[libmamba]": 0.6590647454497357, "tests/cli/test_env.py::test_env_export_with_variables[classic]": 1.7400692042574577, "tests/cli/test_env.py::test_env_export_with_variables[libmamba]": 2.392380626527689, "tests/cli/test_env.py::test_env_list_size[classic]": 1.1366013979298637, "tests/cli/test_env.py::test_env_list_size[libmamba]": 0.9756152526375992, "tests/cli/test_env.py::test_env_list_size_json[classic]": 0.5538304139539122, "tests/cli/test_env.py::test_env_list_size_json[libmamba]": 0.3649952969094625, "tests/cli/test_env.py::test_export_multi_channel[classic]": 25.445511622115358, "tests/cli/test_env.py::test_export_multi_channel[libmamba]": 24.28950444986007, "tests/cli/test_env.py::test_list[classic]": 1.9577647243614933, "tests/cli/test_env.py::test_list[libmamba]": 2.634406698771688, "tests/cli/test_env.py::test_list_info_envs[classic]": 0.9952254303383784, "tests/cli/test_env.py::test_list_info_envs[libmamba]": 0.319615834035123, "tests/cli/test_env.py::test_name_override[classic]": 1.0335505529145304, "tests/cli/test_env.py::test_name_override[libmamba]": 1.3146952698170429, "tests/cli/test_env.py::test_non_existent_file[classic]": 0.020570517587106093, "tests/cli/test_env.py::test_non_existent_file[libmamba]": 0.014873555073282241, "tests/cli/test_env.py::test_pip_error_is_propagated[classic]": 11.144689660016079, "tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]": 11.621286874938093, "tests/cli/test_env.py::test_remove_dry_run[classic]": 0.8655810908271245, "tests/cli/test_env.py::test_remove_dry_run[libmamba]": 1.5167196252240074, "tests/cli/test_env.py::test_set_unset_env_vars[classic]": 0.9964881781500212, "tests/cli/test_env.py::test_set_unset_env_vars[libmamba]": 1.3292080616892694, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]": 0.017254408503938883, "tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]": 0.02750112455408228, "tests/cli/test_env.py::test_update[classic]": 1.784724657616176, "tests/cli/test_env.py::test_update[libmamba]": 2.59339245839897, "tests/cli/test_env.py::test_update_env_json_output[classic]": 0.33379284093653505, "tests/cli/test_env.py::test_update_env_json_output[libmamba]": 0.9681776651100645, "tests/cli/test_env.py::test_update_env_no_action_json_output[classic]": 15.269981707212796, "tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]": 13.29377193111022, "tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]": 15.89302986097874, "tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]": 13.227630381661324, "tests/cli/test_find_commands.py::test_find_commands[subset0]": 0.0006224097560600733, "tests/cli/test_find_commands.py::test_find_commands[subset1]": 0.016970226638298218, "tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]": 0.0009140900139078096, "tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]": 0.009747500563386916, "tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]": 0.0006240382388041978, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]": 0.005393432379147106, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]": 0.005171087625398872, "tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]": 0.004502278881201581, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]": 0.006367944893434679, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]": 0.005350718695911137, "tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]": 0.004768732890218016, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]": 0.0051687940787764185, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]": 0.00510213458977081, "tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]": 0.004432094450630918, "tests/cli/test_helpers.py::test_choices_func_exception_propagation": 0.003242629887354951, "tests/cli/test_helpers.py::test_choices_property_evaluation": 0.004411931825748949, "tests/cli/test_helpers.py::test_choices_setter_ignores_values": 0.0036148069267918966, "tests/cli/test_helpers.py::test_conda_export_format_integration": 0.005344778456832886, "tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]": 0.006325971630595284, "tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]": 0.006528121978552367, "tests/cli/test_helpers.py::test_empty_choices_behavior": 0.002999877999103077, "tests/cli/test_helpers.py::test_invalid_choice_handling[orange]": 0.003538945478320301, "tests/cli/test_helpers.py::test_invalid_choice_handling[purple]": 0.0035189909349035747, "tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]": 0.005497175991435536, "tests/cli/test_helpers.py::test_lazy_choices_action_initialization": 0.0058505627795689685, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]": 0.004270778111635529, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]": 0.004982637205432234, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]": 0.004296066361563172, "tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]": 0.004407159195323465, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]": 0.0037788355039633514, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]": 0.003967064731095287, "tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]": 0.0038650926583483885, "tests/cli/test_helpers.py::test_valid_choice_handling[blue]": 0.003442752080676508, "tests/cli/test_helpers.py::test_valid_choice_handling[green]": 0.003483023527978036, "tests/cli/test_helpers.py::test_valid_choice_handling[red]": 0.003947206118868136, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]": 0.05684552981621189, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]": 0.05710770121212911, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]": 0.057080432699741834, "tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]": 0.06688929066837189, "tests/cli/test_main.py::test_main": 0.06582363818766539, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]": 0.0005226828048491048, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]": 0.0004896932281519194, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]": 0.0008661933715064588, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]": 0.0005949625189190099, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]": 0.0006391020231259678, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]": 0.000567169752503556, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]": 0.0006130389765988087, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]": 0.0005043548570780534, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]": 0.000598442020189519, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]": 0.0006013837555635859, "tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]": 0.000599696675593059, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]": 0.014539749001384621, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]": 0.014608788295919257, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]": 0.014285836314099262, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]": 0.016801969763387173, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]": 0.015359429176069155, "tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]": 0.01697084427426797, "tests/cli/test_main.py::test_main_subshell_help_exits_cleanly": 0.05435508877405768, "tests/cli/test_main.py::test_main_subshell_no_plugins_flag": 0.07373641260252566, "tests/cli/test_main.py::test_version_fast_path[--version]": 0.004430751619736734, "tests/cli/test_main.py::test_version_fast_path[-V]": 0.0037526817987900726, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]": 0.004555486133277235, "tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]": 0.0037110433025305404, "tests/cli/test_main_clean.py::test_clean_all[False]": 1.2061855515733475, "tests/cli/test_main_clean.py::test_clean_all[True]": 2.4432230296848463, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]": 1.3892099433027092, "tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]": 0.7237207917952272, "tests/cli/test_main_clean.py::test_clean_and_packages": 1.1746536786039004, "tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs": 0.5775497230365876, "tests/cli/test_main_clean.py::test_clean_index_cache": 0.4214395692780606, "tests/cli/test_main_clean.py::test_clean_logfiles": 0.37977697745409444, "tests/cli/test_main_clean.py::test_clean_tarballs": 0.5410704310029012, "tests/cli/test_main_clean.py::test_clean_tarballs_partial": 0.08951586538918638, "tests/cli/test_main_clean.py::test_clean_tempfiles": 0.39801686570651446, "tests/cli/test_main_clean.py::test_get_size": 0.006782541016631626, "tests/cli/test_main_clean.py::test_get_size_None": 0.004381785062935701, "tests/cli/test_main_clean.py::test_get_size_list": 0.004049362961187191, "tests/cli/test_main_commands.py::test_commands": 0.08270204802094794, "tests/cli/test_main_compare.py::test_compare": 0.08377218778688053, "tests/cli/test_main_compare.py::test_get_packages": 0.36823890590988123, "tests/cli/test_main_config.py::test_config_describe": 0.20644033393598982, "tests/cli/test_main_config.py::test_config_describe_json": 0.2140468645314033, "tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format": 0.053560982608732516, "tests/cli/test_main_config.py::test_config_env_does_not_exist": 0.06560409947890938, "tests/cli/test_main_config.py::test_config_file_context_manager": 0.008398567771523095, "tests/cli/test_main_config.py::test_config_file_context_manager_exception": 0.0056345857376428835, "tests/cli/test_main_config.py::test_config_file_from_env_condarc": 0.013112220034573428, "tests/cli/test_main_config.py::test_config_file_from_system_condarc": 0.017605751462545404, "tests/cli/test_main_config.py::test_config_file_from_user_condarc": 0.017724698699907025, "tests/cli/test_main_config.py::test_config_get_key": 0.013594434726864507, "tests/cli/test_main_config.py::test_config_get_missing[get]": 0.09317277008415437, "tests/cli/test_main_config.py::test_config_get_missing[key]": 0.08648540622208875, "tests/cli/test_main_config.py::test_config_get_missing[unknown]": 0.10517694062663764, "tests/cli/test_main_config.py::test_config_get_system[get]": 0.08491408534005905, "tests/cli/test_main_config.py::test_config_get_system[key]": 0.0898364772437708, "tests/cli/test_main_config.py::test_config_get_system[unknown]": 0.08133650504177083, "tests/cli/test_main_config.py::test_config_get_user[get]": 0.09928938252013311, "tests/cli/test_main_config.py::test_config_get_user[key]": 0.12345922351737953, "tests/cli/test_main_config.py::test_config_get_user[unknown]": 0.09684768775190702, "tests/cli/test_main_config.py::test_config_read_rc": 0.007383687517321146, "tests/cli/test_main_config.py::test_config_remove_item": 0.008309955673950105, "tests/cli/test_main_config.py::test_config_remove_key": 0.004144025609808541, "tests/cli/test_main_config.py::test_config_set_and_get_key_for_env": 0.3411165604845912, "tests/cli/test_main_config.py::test_config_set_key": 0.008146537741213104, "tests/cli/test_main_config.py::test_config_set_keys": 0.013873148823004328, "tests/cli/test_main_config.py::test_config_set_keys_aliases": 0.34309290237693374, "tests/cli/test_main_config.py::test_config_show": 0.1252986325998459, "tests/cli/test_main_config.py::test_config_show_errors": 0.13238512768802033, "tests/cli/test_main_config.py::test_config_show_sources_json": 0.10757612347984348, "tests/cli/test_main_config.py::test_config_write_rc": 0.007784496528525652, "tests/cli/test_main_config.py::test_format_dict_mapping_items": 0.004268943212893452, "tests/cli/test_main_config.py::test_key_exists[False]": 0.006346284047929255, "tests/cli/test_main_config.py::test_key_exists[True]": 0.005675860707855989, "tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export": 0.5924817497259629, "tests/cli/test_main_export.py::test_execute_export_no_file_specified": 0.09259583552364457, "tests/cli/test_main_export.py::test_export": 0.0801274181308353, "tests/cli/test_main_export.py::test_export_add_channels": 0.08858722197186354, "tests/cli/test_main_export.py::test_export_explicit_format_validation_errors": 22.504799061410893, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]": 0.0976322298070495, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]": 0.08923541019843544, "tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]": 0.08319302770605982, "tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular": 0.33880358822032874, "tests/cli/test_main_export.py::test_export_format_consistency": 0.004581471527519896, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]": 0.07896331015812262, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]": 0.08156681217608207, "tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]": 0.08889894503253815, "tests/cli/test_main_export.py::test_export_format_priority_over_extension": 0.08374946828556848, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]": 0.09134591603068576, "tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]": 0.09883442902504386, "tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]": 0.09966888645364322, "tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]": 0.10505108803899252, "tests/cli/test_main_export.py::test_export_from_history_format": 0.21174034611790227, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]": 1.5200611469127703, "tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]": 0.323273142928019, "tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast": 0.07269582080270791, "tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast": 0.07998903508164663, "tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast": 0.074943123835702, "tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility": 0.09704463325762402, "tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error": 0.08000170401915052, "tests/cli/test_main_export.py::test_export_multiple_platforms": 7.051940810679821, "tests/cli/test_main_export.py::test_export_no_builds_format": 0.21043164074945941, "tests/cli/test_main_export.py::test_export_non_pip_env_warnings": 13.19364107074998, "tests/cli/test_main_export.py::test_export_override_channels": 0.12117249549787466, "tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence": 3.050223989891278, "tests/cli/test_main_export.py::test_export_override_channels_behavior": 0.3950089016287179, "tests/cli/test_main_export.py::test_export_package_alphabetical_ordering": 0.6246299294790612, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]": 0.11106583629251525, "tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]": 0.1863210707958544, "tests/cli/test_main_export.py::test_export_platform_argument": 0.1718032358044899, "tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages": 2.6072165640933886, "tests/cli/test_main_export.py::test_export_regular_format_consistency": 0.7291553839724204, "tests/cli/test_main_export.py::test_export_single_platform_different_platform": 3.831011097729378, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]": 0.09631271401253336, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]": 0.09433158812778591, "tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]": 0.10297012447500689, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]": 0.06814171088909332, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]": 0.07437677213450578, "tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]": 0.08069693394509626, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]": 0.06962681306346832, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]": 0.08978556980644924, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]": 0.07261333950443309, "tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]": 0.07769624861514308, "tests/cli/test_main_export.py::test_export_unknown_format_verbose": 0.06295115402485361, "tests/cli/test_main_export.py::test_export_unrecognized_file_extension": 0.1763084369919984, "tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]": 0.05432462733911558, "tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]": 0.07203814576656078, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]": 16.67258843828124, "tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]": 17.358322417171873, "tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]": 17.232404248031273, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]": 17.79796804682818, "tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]": 16.972833392593795, "tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]": 16.411417349656254, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]": 22.727787534915258, "tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]": 23.49677125277254, "tests/cli/test_main_info.py::test_compute_prefix_size": 3.3706049625656416, "tests/cli/test_main_info.py::test_compute_prefix_size_empty_env": 0.00740153373649229, "tests/cli/test_main_info.py::test_info_all": 0.9866227803765705, "tests/cli/test_main_info.py::test_info_base": 0.17577828638171356, "tests/cli/test_main_info.py::test_info_detail": 0.4356229398319181, "tests/cli/test_main_info.py::test_info_envs": 0.18551676914004622, "tests/cli/test_main_info.py::test_info_envs_frozen": 0.09814610147433862, "tests/cli/test_main_info.py::test_info_envs_json": 0.09978812280419419, "tests/cli/test_main_info.py::test_info_envs_size": 2.034025917538794, "tests/cli/test_main_info.py::test_info_envs_size_json": 0.7147913843704942, "tests/cli/test_main_info.py::test_info_json": 0.22444243518220075, "tests/cli/test_main_info.py::test_info_size_without_envs": 0.08132794516456858, "tests/cli/test_main_info.py::test_info_system": 0.4491483575661175, "tests/cli/test_main_info.py::test_info_unsafe_channels": 0.18162824420137413, "tests/cli/test_main_info.py::test_iter_info_components": 0.00420809899520042, "tests/cli/test_main_install.py::test_build_version_shows_as_changed": 29.165132270661687, "tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip": 406.4671225793905, "tests/cli/test_main_install.py::test_install_freezes_env_by_default": 3.0521639517368664, "tests/cli/test_main_install.py::test_install_from_extracted_package": 14.848603682274264, "tests/cli/test_main_install.py::test_install_revision_revert": 4.5150224009564575, "tests/cli/test_main_install.py::test_too_many_arguments": 0.08458335549890922, "tests/cli/test_main_list.py::test_exit_codes": 5.338972117566506, "tests/cli/test_main_list.py::test_explicit[--md5]": 0.1544567911443396, "tests/cli/test_main_list.py::test_explicit[--sha256]": 0.1319936328019356, "tests/cli/test_main_list.py::test_explicit[None]": 0.18196987907039294, "tests/cli/test_main_list.py::test_export": 0.17666105822681985, "tests/cli/test_main_list.py::test_fields_all": 3.0170206554667454, "tests/cli/test_main_list.py::test_fields_dependent": 0.9966377035583611, "tests/cli/test_main_list.py::test_fields_invalid": 2.5428962591389888, "tests/cli/test_main_list.py::test_list": 0.580051076313993, "tests/cli/test_main_list.py::test_list_argument_variations[args0]": 2.5945570817431127, "tests/cli/test_main_list.py::test_list_argument_variations[args10]": 0.9360380965689534, "tests/cli/test_main_list.py::test_list_argument_variations[args11]": 2.2848375028465115, "tests/cli/test_main_list.py::test_list_argument_variations[args12]": 0.09636492169110178, "tests/cli/test_main_list.py::test_list_argument_variations[args13]": 0.09744677533588969, "tests/cli/test_main_list.py::test_list_argument_variations[args14]": 0.09624014542389044, "tests/cli/test_main_list.py::test_list_argument_variations[args15]": 0.07793359192328113, "tests/cli/test_main_list.py::test_list_argument_variations[args1]": 2.464095444067054, "tests/cli/test_main_list.py::test_list_argument_variations[args2]": 1.4756454651277398, "tests/cli/test_main_list.py::test_list_argument_variations[args3]": 2.5699485122850962, "tests/cli/test_main_list.py::test_list_argument_variations[args4]": 0.08120832365914941, "tests/cli/test_main_list.py::test_list_argument_variations[args5]": 0.10072447509100461, "tests/cli/test_main_list.py::test_list_argument_variations[args6]": 0.4389346329113359, "tests/cli/test_main_list.py::test_list_argument_variations[args7]": 0.12495803518718714, "tests/cli/test_main_list.py::test_list_argument_variations[args8]": 2.4260113690397573, "tests/cli/test_main_list.py::test_list_argument_variations[args9]": 2.541874729898696, "tests/cli/test_main_list.py::test_list_explicit": 0.8468960165488868, "tests/cli/test_main_list.py::test_list_full_name": 2.4920049726924365, "tests/cli/test_main_list.py::test_list_full_name_no_results": 2.9741167285869707, "tests/cli/test_main_list.py::test_list_json": 2.6005037273192677, "tests/cli/test_main_list.py::test_list_package": 2.3780594458279816, "tests/cli/test_main_list.py::test_list_reverse": 0.6877587738073054, "tests/cli/test_main_list.py::test_list_revisions": 0.15489507274538133, "tests/cli/test_main_list.py::test_list_size": 1.5231649818729094, "tests/cli/test_main_list.py::test_list_size_empty_paths_data": 0.772989186215713, "tests/cli/test_main_list.py::test_list_size_json": 0.5062203870879654, "tests/cli/test_main_list.py::test_list_specific_version": 0.5784298236677621, "tests/cli/test_main_list.py::test_list_with_bad_prefix_raises": 0.0724078801800962, "tests/cli/test_main_notices.py::test_cache_names_appear_as_expected": 0.23496862666041135, "tests/cli/test_main_notices.py::test_main_notices[200]": 0.20011299730156912, "tests/cli/test_main_notices.py::test_main_notices[404]": 0.20554094469602577, "tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field": 0.26984249611916467, "tests/cli/test_main_notices.py::test_main_notices_help": 0.18117027526898116, "tests/cli/test_main_notices.py::test_main_notices_json": 0.10569518349855615, "tests/cli/test_main_notices.py::test_main_notices_reads_from_cache": 0.25227577686876945, "tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache": 0.2640875211446023, "tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands": 1.4475212539024696, "tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files": 0.2555907852300255, "tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure": 1.247984018356054, "tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error": 3.139912178888329, "tests/cli/test_main_notices.py::test_notices_work_with_s3_channel": 0.2567585383253836, "tests/cli/test_main_remove.py::test_remove_all": 25.04493016728059, "tests/cli/test_main_remove.py::test_remove_all_default_activation_env": 0.08367281650506546, "tests/cli/test_main_remove.py::test_remove_all_keep_env": 21.721268227078777, "tests/cli/test_main_remove.py::test_remove_early_existence_check": 0.08595332853370358, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]": 5.0671977872103255, "tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]": 1.1941753872446823, "tests/cli/test_main_remove.py::test_remove_nonexistent_env": 0.07410845223198331, "tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name": 4.755571348322737, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name": 0.08880330585545049, "tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path": 0.08016511283318485, "tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env": 0.08201038834977548, "tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename": 4.975029081405726, "tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error": 4.5388671617922585, "tests/cli/test_main_rename.py::test_rename_by_name_success": 5.517134496098558, "tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error": 4.4565016324527775, "tests/cli/test_main_rename.py::test_rename_by_path_success": 7.187953354374219, "tests/cli/test_main_rename.py::test_rename_default_activation_env": 0.07840126892408755, "tests/cli/test_main_rename.py::test_rename_with_dry_run": 4.238773641769901, "tests/cli/test_main_rename.py::test_rename_with_force": 9.19758227040933, "tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run": 4.407008602857294, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors": 9.049334007844552, "tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix": 0.14516561053049173, "tests/cli/test_main_rename.py::test_separator_chars_on_win": 0.0009812297711259033, "tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix": 0.07256560031657561, "tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env": 0.08787366255092711, "tests/cli/test_main_run.py::test_multiline_run_command": 3.1240500698371263, "tests/cli/test_main_run.py::test_no_newline_in_output[stderr]": 19.870509632736056, "tests/cli/test_main_run.py::test_no_newline_in_output[stdout]": 17.866578161550905, "tests/cli/test_main_run.py::test_run_deactivates_environment_unix": 0.015054291187811613, "tests/cli/test_main_run.py::test_run_deactivates_environment_windows": 0.0007301774274294292, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]": 2.359859090110457, "tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]": 0.0008052874375650065, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]": 2.6687077334452187, "tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]": 0.0007785286217055026, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]": 0.0020144384911308087, "tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]": 2.7471973733819426, "tests/cli/test_main_run.py::test_run_readonly_env": 2.505449054307734, "tests/cli/test_main_run.py::test_run_returns_int": 2.6123799561005097, "tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel": 3.043266583797985, "tests/cli/test_main_run.py::test_run_returns_zero_errorlevel": 2.7310180534613826, "tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]": 2.378103882153354, "tests/cli/test_main_run.py::test_run_uncaptured[-s]": 2.2561014990755064, "tests/cli/test_main_run.py::test_run_with_empty_command_will_raise": 0.07575482472931586, "tests/cli/test_main_run.py::test_run_with_separator[combined option]": 3.2885033131637926, "tests/cli/test_main_run.py::test_run_with_separator[double dash option]": 2.9851089470957906, "tests/cli/test_main_run.py::test_run_with_separator[multiple args]": 2.8453750396925597, "tests/cli/test_main_run.py::test_run_with_separator[multiple separators]": 3.0490329965845144, "tests/cli/test_main_run.py::test_run_with_separator[no known args]": 2.970450073282078, "tests/cli/test_main_run.py::test_run_with_separator[no separator]": 4.259214920011618, "tests/cli/test_main_run.py::test_run_with_separator[separator not first]": 3.0792047507295486, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]": 3.0620220303128862, "tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]": 2.7908490191562456, "tests/cli/test_main_search.py::test_anaconda_token_with_private_package": 2.5280198233634907, "tests/cli/test_main_search.py::test_bad_anaconda_token": 0.6209110884622168, "tests/cli/test_main_search.py::test_current_platform_package_missing": 0.048581188884173315, "tests/cli/test_main_search.py::test_different_platform_package_found": 0.030072073656007677, "tests/cli/test_main_search.py::test_mocked_platform_package_found": 0.053475622330031836, "tests/cli/test_main_search.py::test_pretty_record": 0.016929721818557324, "tests/cli/test_main_search.py::test_rpy_search[linux-32]": 1.794621364455229, "tests/cli/test_main_search.py::test_rpy_search[linux-64]": 4.040763383796076, "tests/cli/test_main_search.py::test_rpy_search[osx-64]": 4.52340060685915, "tests/cli/test_main_search.py::test_rpy_search[win-32]": 2.082108124341218, "tests/cli/test_main_search.py::test_rpy_search[win-64]": 4.310204195776278, "tests/cli/test_main_search.py::test_search_0": 1.4476049350436395, "tests/cli/test_main_search.py::test_search_1": 0.023971735510696045, "tests/cli/test_main_search.py::test_search_2[exact]": 0.4565700038212836, "tests/cli/test_main_search.py::test_search_2[wildcard]": 0.47010381323675776, "tests/cli/test_main_search.py::test_search_3": 1.4352936939923675, "tests/cli/test_main_search.py::test_search_4": 0.03795935701720322, "tests/cli/test_main_search.py::test_search_5": 0.4664231513850444, "tests/cli/test_main_search.py::test_search_envs": 0.19802714370982696, "tests/cli/test_main_search.py::test_search_envs_info": 0.1997273758959648, "tests/cli/test_main_search.py::test_search_envs_json": 0.08081167338672168, "tests/cli/test_main_search.py::test_search_envs_nonexistent": 0.27704952498058594, "tests/cli/test_main_search.py::test_search_envs_nonexistent_info": 0.31497865727824587, "tests/cli/test_main_search.py::test_search_envs_nonexistent_json": 0.1489419677363914, "tests/cli/test_main_search.py::test_search_inflexible": 1.1894620289835383, "tests/cli/test_main_search.py::test_unknown_platform_package_missing": 0.024154134772498812, "tests/cli/test_main_update.py::test_dont_update_explicit_packages": 0.21087469101792364, "tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints": 0.0971525119834319, "tests/cli/test_main_update.py::test_update": 29.497740200014473, "tests/cli/test_startup_benchmarks.py::test_context_init": 0.01167137803334981, "tests/cli/test_startup_benchmarks.py::test_generate_parser": 0.04951388954993566, "tests/cli/test_startup_benchmarks.py::test_import_cli_main": 0.3441420336250436, "tests/cli/test_startup_benchmarks.py::test_import_conda_argparse": 0.8724711998500292, "tests/cli/test_startup_benchmarks.py::test_import_context": 0.3440000401499844, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]": 0.7528596494566643, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]": 1.0697239363153128, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]": 1.1485381374609887, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]": 0.61890850540717, "tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]": 0.6318345422454468, "tests/cli/test_startup_benchmarks.py::test_version_main": 0.004775082258373686, "tests/cli/test_subcommands.py::test_clean[classic]": 7.35113498169319, "tests/cli/test_subcommands.py::test_clean[libmamba]": 5.416063534311589, "tests/cli/test_subcommands.py::test_compare[classic]": 0.19410497375683028, "tests/cli/test_subcommands.py::test_compare[libmamba]": 0.1108415862194627, "tests/cli/test_subcommands.py::test_config[classic]": 0.16118142415701375, "tests/cli/test_subcommands.py::test_config[libmamba]": 0.08371641546920729, "tests/cli/test_subcommands.py::test_create[classic]": 1.285036368628234, "tests/cli/test_subcommands.py::test_create[libmamba]": 8.777802681822273, "tests/cli/test_subcommands.py::test_doctor[classic]": 9.193177879599338, "tests/cli/test_subcommands.py::test_doctor[libmamba]": 8.810159892728587, "tests/cli/test_subcommands.py::test_env_config_vars[classic]": 0.3058466136004222, "tests/cli/test_subcommands.py::test_env_config_vars[libmamba]": 0.596893947940655, "tests/cli/test_subcommands.py::test_env_create[libmamba]": 5.310538420153476, "tests/cli/test_subcommands.py::test_env_export[classic]": 0.25212962689248536, "tests/cli/test_subcommands.py::test_env_export[libmamba]": 0.17078258852125985, "tests/cli/test_subcommands.py::test_env_list[classic]": 0.40046363401039164, "tests/cli/test_subcommands.py::test_env_list[libmamba]": 0.16289831714219158, "tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]": 0.06788393400771249, "tests/cli/test_subcommands.py::test_env_remove[classic]": 0.2856071090489689, "tests/cli/test_subcommands.py::test_env_remove[libmamba]": 0.24636009128641526, "tests/cli/test_subcommands.py::test_env_update[libmamba]": 5.111513057050136, "tests/cli/test_subcommands.py::test_info[classic]": 0.4872864620084771, "tests/cli/test_subcommands.py::test_info[libmamba]": 0.3150121318265804, "tests/cli/test_subcommands.py::test_info_json[classic]": 0.781316674270815, "tests/cli/test_subcommands.py::test_info_json[libmamba]": 0.9291754274422696, "tests/cli/test_subcommands.py::test_init[classic]": 0.20145124818207286, "tests/cli/test_subcommands.py::test_init[libmamba]": 0.14624446517338466, "tests/cli/test_subcommands.py::test_install[libmamba]": 1.435862443689011, "tests/cli/test_subcommands.py::test_list[libmamba]": 0.3844882141357735, "tests/cli/test_subcommands.py::test_notices[classic]": 0.27181648536757935, "tests/cli/test_subcommands.py::test_notices[libmamba]": 0.29987167755813876, "tests/cli/test_subcommands.py::test_package[classic]": 0.11801663600939975, "tests/cli/test_subcommands.py::test_package[libmamba]": 0.09448965828668553, "tests/cli/test_subcommands.py::test_remove[classic-remove]": 0.25201466557594926, "tests/cli/test_subcommands.py::test_remove[classic-uninstall]": 0.22394853662434033, "tests/cli/test_subcommands.py::test_remove[libmamba-remove]": 0.1626885994096639, "tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]": 0.17024170552876852, "tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]": 7.696399678869317, "tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]": 8.199403589237368, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]": 3.4492793763739176, "tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]": 9.53567113048829, "tests/cli/test_subcommands.py::test_rename[classic]": 0.8098697165687279, "tests/cli/test_subcommands.py::test_rename[libmamba]": 0.7141398389268505, "tests/cli/test_subcommands.py::test_run[libmamba]": 2.8089896712179967, "tests/cli/test_subcommands.py::test_search[classic]": 6.916997840218317, "tests/cli/test_subcommands.py::test_search[libmamba]": 18.941263262687485, "tests/cli/test_subcommands.py::test_update[libmamba-update]": 2.127915921484813, "tests/cli/test_subcommands.py::test_update[libmamba-upgrade]": 1.9754582263852534, "tests/common/_os/test_windows.py::test_is_admin_on_windows": 0.0038679353039230225, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]": 0.000745847862747786, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]": 0.0006457007573290254, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]": 0.0006696961616382776, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]": 0.0007780606106846077, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]": 0.0006336607985640941, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]": 0.000672415559483729, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]": 0.0006216172607814087, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]": 0.0007176111767842358, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]": 0.0007092738527158865, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]": 0.0006767110410371138, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]": 0.0006407484920226092, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]": 0.0006850466695615832, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]": 0.0006040700299171489, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]": 0.0009103183160486027, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]": 0.0006410475243801781, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]": 0.0008129763495322108, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]": 0.0006868759097373807, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]": 0.0007873424460855086, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]": 0.0006051532668125671, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]": 0.000718092357430318, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]": 0.0005867871244438576, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]": 0.0006391741586832968, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]": 0.0012864639129483131, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]": 0.0007375230952724553, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]": 0.0006009742686043577, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]": 0.0006055560010948059, "tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]": 0.0009616153224438033, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]": 0.000583399724108783, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]": 0.0006825837444746914, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]": 0.0006588296388148699, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]": 0.0006964163738053035, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]": 0.0006295421701803198, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]": 0.0006976643186210208, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]": 0.0007266043861334062, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]": 0.0006880372097976622, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]": 0.000691993812970392, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]": 0.0006839924966444128, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]": 0.0006202682703310224, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]": 0.0006580235376453377, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]": 0.000935783092110122, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]": 0.0008771051575449814, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]": 0.0007039496325251371, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]": 0.0005891864339719983, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]": 0.000637108171044809, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]": 0.0005848667185799803, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]": 0.0007676550072485541, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]": 0.0008967278909142941, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]": 0.0006520894203079871, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]": 0.0007204091765220965, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]": 0.0010685797792365657, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]": 0.0006824780219712794, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]": 0.0020239421604605046, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]": 0.0007120733889815089, "tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]": 0.0007837358480275475, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]": 0.0011972140882540666, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]": 0.0011576889863508686, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]": 0.000750807128730337, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]": 0.0012310246489356572, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]": 0.000600292999397356, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]": 0.0012267076529786935, "tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]": 0.0006103735772063464, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]": 0.0006601936293816036, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]": 0.0020737905389305953, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]": 0.0007871527523475369, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]": 0.0005719682192100964, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]": 0.0006789062949440461, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]": 0.0006445781227168047, "tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]": 0.002097326801864817, "tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file": 0.005227775036523911, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data": 0.005134911817207406, "tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data": 0.005870912219476517, "tests/common/pkg_formats/test_python.py::test_dist_get_paths": 0.009237111883252538, "tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths": 0.003240645340717558, "tests/common/pkg_formats/test_python.py::test_evaluate_marker": 0.004924061786780196, "tests/common/pkg_formats/test_python.py::test_get_default_marker_context": 0.002984451610242093, "tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link": 0.012343905739832647, "tests/common/pkg_formats/test_python.py::test_get_dist_requirements": 0.005025597898778231, "tests/common/pkg_formats/test_python.py::test_get_entry_points": 0.005496658292959356, "tests/common/pkg_formats/test_python.py::test_get_extra_provides": 0.005224841489127819, "tests/common/pkg_formats/test_python.py::test_get_python_distribution_info": 0.0006656361420401405, "tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files": 0.0066652873466270905, "tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]": 0.007154048193420876, "tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]": 0.004585094997313455, "tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]": 0.005988491895772561, "tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]": 0.004691746006945139, "tests/common/pkg_formats/test_python.py::test_metadata_keys": 0.0030577413502148308, "tests/common/pkg_formats/test_python.py::test_metadata_none": 0.004759355378544362, "tests/common/pkg_formats/test_python.py::test_metadata_process_path": 0.003870250809144012, "tests/common/pkg_formats/test_python.py::test_metadata_read_metadata": 0.011036319696959306, "tests/common/pkg_formats/test_python.py::test_norm_package_name": 0.0035794390713264584, "tests/common/pkg_formats/test_python.py::test_norm_package_version": 0.014520294983315338, "tests/common/pkg_formats/test_python.py::test_parse_specification": 0.007727442206697122, "tests/common/pkg_formats/test_python.py::test_pydist_check_files": 0.008222286928074814, "tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name": 0.003401164250312268, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath": 0.0037890729413496502, "tests/common/pkg_formats/test_python.py::test_python_dist_egg_path": 0.004613451142665216, "tests/common/pkg_formats/test_python.py::test_python_dist_info": 0.0058709553586240495, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies": 0.007868911627227183, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2": 0.0041893806837673304, "tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3": 0.0038228565449401402, "tests/common/pkg_formats/test_python.py::test_split_spec": 0.004495004127082688, "tests/common/test_configuration.py::test_commented_map_parameter": 0.0051739354155486235, "tests/common/test_configuration.py::test_config_resets": 0.004114425395768272, "tests/common/test_configuration.py::test_cross_parameter_validation": 0.0034403296553198776, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]": 0.0027326348550631378, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]": 0.004726015543918719, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]": 0.03316815436208151, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]": 0.0026237832777487044, "tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]": 0.0042689169437887635, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]": 0.0042183517158644775, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]": 0.002846775310372992, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]": 0.003177793792810921, "tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]": 0.004969198119471815, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]": 0.0030005974632113072, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]": 0.0029405791898407412, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]": 0.005655849744261785, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]": 0.003313865708939363, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]": 0.0026444744116279222, "tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]": 0.002292194104893909, "tests/common/test_configuration.py::test_default_values": 0.003635335645460834, "tests/common/test_configuration.py::test_empty_map_parameter": 0.008608042380590285, "tests/common/test_configuration.py::test_env_var_config": 0.00355963916508043, "tests/common/test_configuration.py::test_env_var_config_alias": 0.004412534905829284, "tests/common/test_configuration.py::test_env_var_config_empty_sequence": 0.003272938587753559, "tests/common/test_configuration.py::test_env_var_config_no_split_sequence": 0.004015724917374263, "tests/common/test_configuration.py::test_env_var_config_split_sequence": 0.003808693525968047, "tests/common/test_configuration.py::test_expand_search_path": 0.005319746266180404, "tests/common/test_configuration.py::test_expanded_variables": 0.009516669125849132, "tests/common/test_configuration.py::test_important_primitive_map_merges": 0.12263226124933446, "tests/common/test_configuration.py::test_invalid_map_parameter": 0.003312476088939994, "tests/common/test_configuration.py::test_invalid_seq_parameter": 0.0034735181411411995, "tests/common/test_configuration.py::test_list_merges": 0.10965989274390452, "tests/common/test_configuration.py::test_load_raw_configs": 0.02276391159969462, "tests/common/test_configuration.py::test_map_parameter_must_be_map": 0.006666952178667356, "tests/common/test_configuration.py::test_nested": 0.021939370293320562, "tests/common/test_configuration.py::test_object": 0.013784099086462767, "tests/common/test_configuration.py::test_object_defaults_completely_empty": 0.003825835010187201, "tests/common/test_configuration.py::test_object_defaults_partially_empty": 0.006999122522916413, "tests/common/test_configuration.py::test_parameter": 0.0030529405927571785, "tests/common/test_configuration.py::test_parameter_flag": 0.0027898581799104243, "tests/common/test_configuration.py::test_pretty_list": 0.0033184966324401235, "tests/common/test_configuration.py::test_raise_errors": 0.002743071093634317, "tests/common/test_configuration.py::test_set_search_path_empty_path": 0.002814155453014777, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]": 0.013585315796836639, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]": 0.007695463374963296, "tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]": 0.023534776437596605, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]": 0.013216622453109395, "tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]": 0.011957342874955756, "tests/common/test_configuration.py::test_set_search_path_reloads_raw_data": 0.014996308046853812, "tests/common/test_configuration.py::test_set_search_path_result_is_tuple": 0.007394888500018126, "tests/common/test_configuration.py::test_simple_merges_and_caching": 0.023332687095134405, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates": 0.005650394043768655, "tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key": 0.004955582528325604, "tests/common/test_configuration.py::test_validate_all": 0.017733264919725527, "tests/common/test_configuration.py::test_validation": 0.04568553188130778, "tests/common/test_io.py::test_attach_stderr_handler": 0.00458968319662292, "tests/common/test_io.py::test_captured": 0.004133917155135087, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]": 0.19391892730796367, "tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]": 0.006819105401183367, "tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts": 0.00354492466998237, "tests/common/test_json.py::test_condajsonencoder_with_dumps": 0.003418280780638652, "tests/common/test_logic.py::test_ALL": 2.756717892724152, "tests/common/test_logic.py::test_AMONE": 3.347243580173973, "tests/common/test_logic.py::test_AND": 0.03077960049895598, "tests/common/test_logic.py::test_ANY": 2.508851914611521, "tests/common/test_logic.py::test_ITE": 0.9608413175544794, "tests/common/test_logic.py::test_LinearBound": 4.366124800004874, "tests/common/test_logic.py::test_NOT": 0.007489886875498232, "tests/common/test_logic.py::test_OR": 0.026421369982818917, "tests/common/test_logic.py::test_XONE": 0.4672541242990909, "tests/common/test_logic.py::test_XOR": 0.03740363807181712, "tests/common/test_logic.py::test_minimal_unsatisfiable_subset": 0.007222076235232602, "tests/common/test_logic.py::test_minimize": 0.007664233495885581, "tests/common/test_logic.py::test_sat": 0.004293599944179671, "tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]": 0.004909157877155806, "tests/common/test_path.py::test_deprecations[is_package_file-TypeError]": 0.0037562023649282215, "tests/common/test_path.py::test_get_major_minor_version_no_dot": 0.00407456093386897, "tests/common/test_path.py::test_missing_pyc_files_27": 0.0031226663387389844, "tests/common/test_path.py::test_missing_pyc_files_34": 0.0034437840670360855, "tests/common/test_path.py::test_missing_pyc_files_35": 0.0031349250946891586, "tests/common/test_path.py::test_path_conversion[cygpath-PATH0]": 0.0006875780547535323, "tests/common/test_path.py::test_path_conversion[cygpath-PATH10]": 0.0005978371701879533, "tests/common/test_path.py::test_path_conversion[cygpath-PATH11]": 0.0009457928351333119, "tests/common/test_path.py::test_path_conversion[cygpath-PATH1]": 0.0006691491429616735, "tests/common/test_path.py::test_path_conversion[cygpath-PATH2]": 0.0007398573871869653, "tests/common/test_path.py::test_path_conversion[cygpath-PATH3]": 0.0005926236912956128, "tests/common/test_path.py::test_path_conversion[cygpath-PATH4]": 0.0007173280016867956, "tests/common/test_path.py::test_path_conversion[cygpath-PATH5]": 0.0006781852369540785, "tests/common/test_path.py::test_path_conversion[cygpath-PATH6]": 0.0009092870183971558, "tests/common/test_path.py::test_path_conversion[cygpath-PATH7]": 0.0006409511510460491, "tests/common/test_path.py::test_path_conversion[cygpath-PATH8]": 0.0007743392250344329, "tests/common/test_path.py::test_path_conversion[cygpath-PATH9]": 0.0005695669173892395, "tests/common/test_path.py::test_path_conversion[cygpath-UNC0]": 0.014645853699819914, "tests/common/test_path.py::test_path_conversion[cygpath-UNC1]": 0.0006895199615804795, "tests/common/test_path.py::test_path_conversion[cygpath-UNC2]": 0.0006073269522035286, "tests/common/test_path.py::test_path_conversion[cygpath-UNC3]": 0.0005556559433619238, "tests/common/test_path.py::test_path_conversion[cygpath-UNC4]": 0.0005356858952734024, "tests/common/test_path.py::test_path_conversion[cygpath-UNC5]": 0.0005456012669103987, "tests/common/test_path.py::test_path_conversion[cygpath-UNC6]": 0.0006003295241211664, "tests/common/test_path.py::test_path_conversion[cygpath-UNC7]": 0.0006192516588410506, "tests/common/test_path.py::test_path_conversion[cygpath-cwd0]": 0.0006339980577659686, "tests/common/test_path.py::test_path_conversion[cygpath-cwd1]": 0.0005680082927998644, "tests/common/test_path.py::test_path_conversion[cygpath-cwd2]": 0.0006029854030948156, "tests/common/test_path.py::test_path_conversion[cygpath-cwd3]": 0.000589072014763883, "tests/common/test_path.py::test_path_conversion[cygpath-drive0]": 0.0005647556741638074, "tests/common/test_path.py::test_path_conversion[cygpath-drive10]": 0.0006896710583298257, "tests/common/test_path.py::test_path_conversion[cygpath-drive11]": 0.000645147407214615, "tests/common/test_path.py::test_path_conversion[cygpath-drive12]": 0.0006215436964679803, "tests/common/test_path.py::test_path_conversion[cygpath-drive13]": 0.0006222824937530875, "tests/common/test_path.py::test_path_conversion[cygpath-drive14]": 0.0007360633799517931, "tests/common/test_path.py::test_path_conversion[cygpath-drive15]": 0.0006504512897213235, "tests/common/test_path.py::test_path_conversion[cygpath-drive1]": 0.0005658302172681367, "tests/common/test_path.py::test_path_conversion[cygpath-drive2]": 0.0005661015254686781, "tests/common/test_path.py::test_path_conversion[cygpath-drive3]": 0.0013674254393792773, "tests/common/test_path.py::test_path_conversion[cygpath-drive4]": 0.0009276206789984968, "tests/common/test_path.py::test_path_conversion[cygpath-drive5]": 0.0005508833184659592, "tests/common/test_path.py::test_path_conversion[cygpath-drive6]": 0.0005765302691062832, "tests/common/test_path.py::test_path_conversion[cygpath-drive7]": 0.0006725334223450086, "tests/common/test_path.py::test_path_conversion[cygpath-drive8]": 0.0005506570475138254, "tests/common/test_path.py::test_path_conversion[cygpath-drive9]": 0.0006117658438119769, "tests/common/test_path.py::test_path_conversion[cygpath-relative0]": 0.000736046832577913, "tests/common/test_path.py::test_path_conversion[cygpath-relative1]": 0.0007442219346851153, "tests/common/test_path.py::test_path_conversion[cygpath-relative2]": 0.0005913936877942882, "tests/common/test_path.py::test_path_conversion[cygpath-root0]": 0.0005885300640303139, "tests/common/test_path.py::test_path_conversion[cygpath-root10]": 0.0007654191129811603, "tests/common/test_path.py::test_path_conversion[cygpath-root11]": 0.000662137866554387, "tests/common/test_path.py::test_path_conversion[cygpath-root12]": 0.0006260197031504781, "tests/common/test_path.py::test_path_conversion[cygpath-root13]": 0.0006894778587666903, "tests/common/test_path.py::test_path_conversion[cygpath-root14]": 0.0005684538032528952, "tests/common/test_path.py::test_path_conversion[cygpath-root1]": 0.0007192991536351444, "tests/common/test_path.py::test_path_conversion[cygpath-root2]": 0.0007503717966135758, "tests/common/test_path.py::test_path_conversion[cygpath-root3]": 0.0006905142813454208, "tests/common/test_path.py::test_path_conversion[cygpath-root4]": 0.0006394588115435617, "tests/common/test_path.py::test_path_conversion[cygpath-root5]": 0.0007807786162236136, "tests/common/test_path.py::test_path_conversion[cygpath-root6]": 0.000561786288066849, "tests/common/test_path.py::test_path_conversion[cygpath-root7]": 0.0008010079767085247, "tests/common/test_path.py::test_path_conversion[cygpath-root8]": 0.0005881558209148763, "tests/common/test_path.py::test_path_conversion[cygpath-root9]": 0.0006083838490591724, "tests/common/test_path.py::test_path_conversion[fallback-PATH0]": 0.012143254323001186, "tests/common/test_path.py::test_path_conversion[fallback-PATH10]": 0.014439384663435065, "tests/common/test_path.py::test_path_conversion[fallback-PATH11]": 0.01754741474319557, "tests/common/test_path.py::test_path_conversion[fallback-PATH1]": 0.015457551751542778, "tests/common/test_path.py::test_path_conversion[fallback-PATH2]": 0.01792410866508783, "tests/common/test_path.py::test_path_conversion[fallback-PATH3]": 0.012644000943189803, "tests/common/test_path.py::test_path_conversion[fallback-PATH4]": 0.018894928222047375, "tests/common/test_path.py::test_path_conversion[fallback-PATH5]": 0.01358987073894361, "tests/common/test_path.py::test_path_conversion[fallback-PATH6]": 0.012274243478998399, "tests/common/test_path.py::test_path_conversion[fallback-PATH7]": 0.013849931401283686, "tests/common/test_path.py::test_path_conversion[fallback-PATH8]": 0.02489308633882055, "tests/common/test_path.py::test_path_conversion[fallback-PATH9]": 0.011311560589592547, "tests/common/test_path.py::test_path_conversion[fallback-UNC0]": 0.01811487353062487, "tests/common/test_path.py::test_path_conversion[fallback-UNC1]": 0.018919055950738856, "tests/common/test_path.py::test_path_conversion[fallback-UNC2]": 0.01785246637464084, "tests/common/test_path.py::test_path_conversion[fallback-UNC3]": 0.012350900764667848, "tests/common/test_path.py::test_path_conversion[fallback-UNC4]": 0.012315094990866693, "tests/common/test_path.py::test_path_conversion[fallback-UNC5]": 0.02160250086250047, "tests/common/test_path.py::test_path_conversion[fallback-UNC6]": 0.01137341589141038, "tests/common/test_path.py::test_path_conversion[fallback-UNC7]": 0.014299157041084575, "tests/common/test_path.py::test_path_conversion[fallback-cwd0]": 0.025126988407717845, "tests/common/test_path.py::test_path_conversion[fallback-cwd1]": 0.007519554325568393, "tests/common/test_path.py::test_path_conversion[fallback-cwd2]": 0.0121594010776337, "tests/common/test_path.py::test_path_conversion[fallback-cwd3]": 0.022142061452648448, "tests/common/test_path.py::test_path_conversion[fallback-drive0]": 0.0132082522604287, "tests/common/test_path.py::test_path_conversion[fallback-drive10]": 0.02683783777919012, "tests/common/test_path.py::test_path_conversion[fallback-drive11]": 0.016269014459964273, "tests/common/test_path.py::test_path_conversion[fallback-drive12]": 0.016181483258296128, "tests/common/test_path.py::test_path_conversion[fallback-drive13]": 0.01727412983893589, "tests/common/test_path.py::test_path_conversion[fallback-drive14]": 0.02212376097194027, "tests/common/test_path.py::test_path_conversion[fallback-drive15]": 0.01609262433993368, "tests/common/test_path.py::test_path_conversion[fallback-drive1]": 0.01451577751745586, "tests/common/test_path.py::test_path_conversion[fallback-drive2]": 0.0175666277728228, "tests/common/test_path.py::test_path_conversion[fallback-drive3]": 0.01659095530716004, "tests/common/test_path.py::test_path_conversion[fallback-drive4]": 0.023880558869248843, "tests/common/test_path.py::test_path_conversion[fallback-drive5]": 0.013097877768191078, "tests/common/test_path.py::test_path_conversion[fallback-drive6]": 0.013155749565254803, "tests/common/test_path.py::test_path_conversion[fallback-drive7]": 0.013970152513894258, "tests/common/test_path.py::test_path_conversion[fallback-drive8]": 0.01723593493822127, "tests/common/test_path.py::test_path_conversion[fallback-drive9]": 0.019346367806917966, "tests/common/test_path.py::test_path_conversion[fallback-relative0]": 0.01680511352810292, "tests/common/test_path.py::test_path_conversion[fallback-relative1]": 0.019248715504626715, "tests/common/test_path.py::test_path_conversion[fallback-relative2]": 0.016298850029785976, "tests/common/test_path.py::test_path_conversion[fallback-root0]": 0.045396263842502366, "tests/common/test_path.py::test_path_conversion[fallback-root10]": 0.011267186069714039, "tests/common/test_path.py::test_path_conversion[fallback-root11]": 0.013447001825100566, "tests/common/test_path.py::test_path_conversion[fallback-root12]": 0.01858397894245273, "tests/common/test_path.py::test_path_conversion[fallback-root13]": 0.01991375220090876, "tests/common/test_path.py::test_path_conversion[fallback-root14]": 0.013943253420175014, "tests/common/test_path.py::test_path_conversion[fallback-root1]": 0.013831772653662392, "tests/common/test_path.py::test_path_conversion[fallback-root2]": 0.012439113126567227, "tests/common/test_path.py::test_path_conversion[fallback-root3]": 0.014074125302581925, "tests/common/test_path.py::test_path_conversion[fallback-root4]": 0.019873640600642516, "tests/common/test_path.py::test_path_conversion[fallback-root5]": 0.010740019861525611, "tests/common/test_path.py::test_path_conversion[fallback-root6]": 0.012955940727346344, "tests/common/test_path.py::test_path_conversion[fallback-root7]": 0.01877266108076609, "tests/common/test_path.py::test_path_conversion[fallback-root8]": 0.02079473782404345, "tests/common/test_path.py::test_path_conversion[fallback-root9]": 0.013119852336611726, "tests/common/test_path.py::test_path_conversion_falsy[None]": 0.0034709663121428014, "tests/common/test_path.py::test_path_conversion_falsy[empty dict]": 0.0036958020441130593, "tests/common/test_path.py::test_path_conversion_falsy[empty list]": 0.003538778969450382, "tests/common/test_path.py::test_path_conversion_falsy[empty set]": 0.0032033138804167974, "tests/common/test_path.py::test_path_conversion_falsy[empty tuple]": 0.0031143895242301167, "tests/common/test_path.py::test_path_identity": 0.004953138321427424, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]": 0.004910118351645267, "tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]": 0.005421335042689447, "tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]": 0.003661148858300275, "tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]": 0.004084425568241236, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]": 0.0051500590811039415, "tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]": 0.003996153859158005, "tests/common/test_path.py::test_url_to_path_unix": 0.0036685959907119953, "tests/common/test_path.py::test_url_to_path_windows_local": 0.003996446980099536, "tests/common/test_path.py::test_url_to_path_windows_unc": 0.003352684482743122, "tests/common/test_path.py::test_win_path_backout": 0.002834767324831614, "tests/common/test_serialize.py::test_comment_round_trip": 0.013835456142104836, "tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]": 0.003895951251079281, "tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]": 0.003724430805011125, "tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]": 0.0035926880583380077, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]": 0.0033047921408034275, "tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]": 0.0031965748721062156, "tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]": 0.004038597254584728, "tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]": 0.0035347253771635828, "tests/common/test_serialize.py::test_encode_enum[value0- - disabled\\n-write]": 0.004599904815586969, "tests/common/test_serialize.py::test_encode_enum[value1- - warn\\n-write]": 0.004032598009081814, "tests/common/test_serialize.py::test_encode_enum[value2- - enabled\\n-write]": 0.004094070613889649, "tests/common/test_serialize.py::test_encode_enum[value3-[\\n \"disabled\"\\n]-write]": 0.0038115137958931494, "tests/common/test_serialize.py::test_encode_enum[value4-[\\n \"warn\"\\n]-write]": 0.0035213329052632067, "tests/common/test_serialize.py::test_encode_enum[value5-[\\n \"enabled\"\\n]-write]": 0.003989260651054296, "tests/common/test_serialize.py::test_read_write[obj0-{\\n \"a_map\": {\\n \"a_key\": \"a_value\"\\n },\\n \"a_seq\": [\\n 1,\\n 2,\\n 3\\n ]\\n}-read-write0]": 0.012125641054191484, "tests/common/test_serialize.py::test_read_write[obj1-{\\n \"a_map\": {\\n \"field1\": true,\\n \"field2\": \"yes\"\\n },\\n \"a_seq_1\": [\\n 1,\\n 2,\\n 3\\n ],\\n \"a_seq_2\": [\\n 1,\\n {\\n \"two\": 2\\n },\\n 3\\n ],\\n \"single_bool\": false,\\n \"single_str\": \"no\"\\n}-read-write1]": 0.009266785134944295, "tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\n - 1\\n - 2\\n - 3\\na_map:\\n a_key: a_value\\n-read-write]": 0.023837262102113885, "tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\nsingle_str: no\\na_seq_1:\\n - 1\\n - 2\\n - 3\\na_seq_2:\\n - 1\\n - two: 2\\n - 3\\na_map:\\n field1: true\\n field2: yes\\n-read-write]": 0.035519722967826746, "tests/common/test_toposort.py::test_cycle": 0.002950674984673941, "tests/common/test_toposort.py::test_cycle_best_effort": 0.003559884338232368, "tests/common/test_toposort.py::test_degenerate": 0.002734412663037646, "tests/common/test_toposort.py::test_pop_key": 0.00425110562245914, "tests/common/test_toposort.py::test_python_is_prioritized": 0.003128746372682474, "tests/common/test_toposort.py::test_simple": 0.0029473628550642414, "tests/common/test_url.py::test_add_username_and_pass_to_url": 0.0032557115677339706, "tests/common/test_url.py::test_is_ip_address": 0.002878467687169964, "tests/common/test_url.py::test_is_ipv6_address": 0.0030545264761379313, "tests/common/test_url.py::test_is_url": 0.0033091827082634114, "tests/common/test_url.py::test_maybe_add_auth": 0.0029210059390698904, "tests/common/test_url.py::test_split_scheme_auth_token": 0.003230238316065342, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]": 0.0031128436101296795, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]": 0.003253303672939624, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]": 0.003484469608890532, "tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]": 0.004757516156196878, "tests/common/test_url.py::test_url_to_s3_info": 0.002993639015935145, "tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]": 0.005251884765595636, "tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]": 0.005463833736991429, "tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]": 0.0033445591617967427, "tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]": 0.003182813373162183, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error": 0.3099159523944974, "tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error": 0.38781568977856873, "tests/core/test_envs_manager.py::test_prefix_cli_flag": 0.006274108524666918, "tests/core/test_envs_manager.py::test_register_env_directory_creation_error": 0.010234471474925375, "tests/core/test_envs_manager.py::test_register_unregister_location_env": 0.02627460447732026, "tests/core/test_envs_manager.py::test_rewrite_environments_txt_file": 0.010910020008361328, "tests/core/test_index.py::TestIndex::test_cache_entries[False]": 0.9656795576861524, "tests/core/test_index.py::TestIndex::test_cache_entries[True]": 1.5175450114028783, "tests/core/test_index.py::TestIndex::test_contains_invalid[False]": 0.5629270091181878, "tests/core/test_index.py::TestIndex::test_contains_invalid[True]": 1.1430146777453976, "tests/core/test_index.py::TestIndex::test_contains_valid[False]": 0.5505920671978967, "tests/core/test_index.py::TestIndex::test_contains_valid[True]": 1.0066724928308626, "tests/core/test_index.py::TestIndex::test_copy[False]": 1.4041396454709074, "tests/core/test_index.py::TestIndex::test_copy[True]": 1.069720036561334, "tests/core/test_index.py::TestIndex::test_getitem_cache[False]": 0.49489408118954387, "tests/core/test_index.py::TestIndex::test_getitem_cache[True]": 1.0000899938999954, "tests/core/test_index.py::TestIndex::test_getitem_channel[False]": 0.49212625792811654, "tests/core/test_index.py::TestIndex::test_getitem_channel[True]": 1.1219207306349435, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]": 0.7744071683531154, "tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]": 1.1606420817769654, "tests/core/test_index.py::TestIndex::test_getitem_feature[False]": 0.5895745644188031, "tests/core/test_index.py::TestIndex::test_getitem_feature[True]": 1.1496216123272218, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]": 0.5752471572720255, "tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]": 1.023410928792974, "tests/core/test_index.py::TestIndex::test_getitem_prefix[False]": 0.6326690465685891, "tests/core/test_index.py::TestIndex::test_getitem_prefix[True]": 0.9884861369929685, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]": 0.9999787665163739, "tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]": 1.0301007573018182, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]": 1.0566522043470803, "tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]": 0.9211343367822048, "tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs": 0.04983721012394079, "tests/core/test_index.py::TestIndex::test_init_prefix_data": 0.051808106334195025, "tests/core/test_index.py::TestIndex::test_init_prefix_path": 0.05487555765385172, "tests/core/test_index.py::TestIndex::test_init_use_local": 0.05055917745378944, "tests/core/test_index.py::TestIndex::test_reduced_index[False]": 1.450606385846588, "tests/core/test_index.py::TestIndex::test_reduced_index[True]": 2.0056012516223216, "tests/core/test_index.py::test_calculate_channel_urls": 0.11276382118280869, "tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]": 0.05548695525099707, "tests/core/test_index.py::test_dist_str_in_index": 0.13542169431388265, "tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]": 3.1912817146241523, "tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]": 0.022178221994087668, "tests/core/test_index.py::test_get_index_platform[linux-64]": 0.09761549423469519, "tests/core/test_index.py::test_get_index_platform[osx-64]": 0.038813317919363266, "tests/core/test_index.py::test_get_index_platform[win-64]": 0.05795228934121504, "tests/core/test_index.py::test_supplement_index_with_system": 0.6325967623214792, "tests/core/test_index.py::test_supplement_index_with_system_archspec": 0.44240074336698265, "tests/core/test_index.py::test_supplement_index_with_system_cuda": 0.513732635979904, "tests/core/test_index.py::test_supplement_index_with_system_glibc": 0.0006165669330864846, "tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]": 0.0007075613146060663, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]": 0.0006510977128934718, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]": 0.0007149996708646786, "tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]": 0.0006970747866614386, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]": 0.0006969887341219085, "tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]": 0.0005485094410185856, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]": 0.000570576423442472, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]": 0.0006568850438280636, "tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]": 0.0008981458117493892, "tests/core/test_index.py::test_supplement_index_with_system_osx": 0.826607114255116, "tests/core/test_initialize.py::test__get_python_info": 0.05891490390175168, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]": 0.018116550939613413, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]": 0.016439123777434166, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]": 0.1205699145074311, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]": 0.020427422430009643, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]": 0.016695471069045238, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]": 0.01740013856429237, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]": 0.018613442559966727, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]": 0.016818474036988787, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]": 0.01717236302888625, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]": 0.021726569933061133, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]": 0.01637569265369859, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]": 0.020257688883038163, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]": 0.01736875109823934, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]": 0.022993564153718882, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]": 0.01730905944533178, "tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]": 0.018222864125959783, "tests/core/test_initialize.py::test_conda_init_dry_run": 0.14910865015037233, "tests/core/test_initialize.py::test_get_python_info": 0.07871987160278733, "tests/core/test_initialize.py::test_init_all": 2.0238352989694013, "tests/core/test_initialize.py::test_init_cmd_exe_registry": 0.0005966586131206122, "tests/core/test_initialize.py::test_init_condabin[init_fish_user]": 0.007747144738820211, "tests/core/test_initialize.py::test_init_condabin[init_powershell_user]": 0.009019458792071375, "tests/core/test_initialize.py::test_init_condabin[init_sh_system]": 0.007134259322674937, "tests/core/test_initialize.py::test_init_condabin[init_sh_user]": 0.008842351200822156, "tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]": 0.006556474002081276, "tests/core/test_initialize.py::test_init_enable_long_path": 0.0006557304775809802, "tests/core/test_initialize.py::test_init_sh_system": 0.08961192829845717, "tests/core/test_initialize.py::test_init_sh_user_tcsh_unix": 0.0932886564295176, "tests/core/test_initialize.py::test_init_sh_user_unix": 0.09434601043090944, "tests/core/test_initialize.py::test_init_sh_user_windows": 0.0007965294089348674, "tests/core/test_initialize.py::test_initialize_dev_bash": 0.2878900732966253, "tests/core/test_initialize.py::test_initialize_dev_cmd_exe": 0.25448875089783735, "tests/core/test_initialize.py::test_install_1": 0.19366922342252255, "tests/core/test_initialize.py::test_install_conda_csh": 0.10182793648767785, "tests/core/test_initialize.py::test_install_conda_fish": 0.11141216922424621, "tests/core/test_initialize.py::test_install_conda_sh": 0.0969485782984388, "tests/core/test_initialize.py::test_install_conda_xsh": 0.0916917260056276, "tests/core/test_initialize.py::test_install_condabin_conda_bat": 0.1096576299247437, "tests/core/test_initialize.py::test_make_entry_point": 0.10507954685840468, "tests/core/test_initialize.py::test_make_entry_point_exe": 0.007406999753535747, "tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh": 0.18717807187734492, "tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe": 0.1563647339615858, "tests/core/test_initialize.py::test_make_install_plan": 0.007085649887314763, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes": 0.032353376685428016, "tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes": 0.016351515447575238, "tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes": 0.016048943317492726, "tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes": 0.016074717757144082, "tests/core/test_link.py::test_calculate_change_report_downgrade": 0.007059380367733946, "tests/core/test_link.py::test_calculate_change_report_revised_variant": 0.0066939743309328645, "tests/core/test_link.py::test_calculate_change_report_superseded": 0.006212800320457585, "tests/core/test_link.py::test_calculate_change_report_update": 0.005409209894300441, "tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format": 0.03947574181540134, "tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2": 0.07643511851662026, "tests/core/test_package_cache_data.py::test_cover_extract_bad_package": 0.1299287236298144, "tests/core/test_package_cache_data.py::test_cover_fetch_not_exists": 6.20799824105978, "tests/core/test_package_cache_data.py::test_cover_get_entry_to_link": 0.01147963365808676, "tests/core/test_package_cache_data.py::test_cover_reverse": 0.0033832071024860605, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata": 0.0054494525979037825, "tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2": 0.005018506706265024, "tests/core/test_package_cache_data.py::test_download_filename_from_url_basename": 0.00601524059473918, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist": 0.05207128076451573, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only": 0.13221555761135553, "tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist": 0.044149203406710615, "tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted": 0.2338268289994743, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg": 0.10196042524689643, "tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg": 0.08009272839826032, "tests/core/test_path_actions.py::test_CompileMultiPycAction_generic": 0.004980171354877896, "tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python": 2.7068786166740866, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic": 0.005839000981527613, "tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python": 0.008382781560152194, "tests/core/test_path_actions.py::test_create_file_link_actions": 0.009176309333392755, "tests/core/test_path_actions.py::test_simple_LinkPathAction_copy": 0.009604019810274346, "tests/core/test_path_actions.py::test_simple_LinkPathAction_directory": 0.006184793450418865, "tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink": 0.009514639388841388, "tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink": 0.008972357254880624, "tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang": 0.005840809260387517, "tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix": 0.0036669362568943643, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space": 0.0030649119233229273, "tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python": 0.0035669592038981898, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space": 0.0027799845888157523, "tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python": 0.002868980507596821, "tests/core/test_portability.py::test_replace_simple_shebang_no_replacement": 0.0031611180519486234, "tests/core/test_portability.py::test_shebang_regex_matches": 0.0031816984582664115, "tests/core/test_prefix_data.py::test_api_consistency[conda]": 0.5179736398386532, "tests/core/test_prefix_data.py::test_api_consistency[python]": 0.5931565074966907, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]": 0.0008546995708182835, "tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]": 0.0008621708878449653, "tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json": 0.0037357429553732577, "tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json": 0.004460834925966369, "tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored": 0.009350450452854497, "tests/core/test_prefix_data.py::test_empty_environment_package_methods": 0.007581721396824864, "tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records": 0.0049302325944687465, "tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list": 0.6093062392750762, "tests/core/test_prefix_data.py::test_get_environment_env_vars": 0.008129099812065648, "tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability": 23.51640536198004, "tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality": 0.6091804911071964, "tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability": 0.5062350575878259, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]": 0.0060890711839105575, "tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]": 0.006407431030806161, "tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]": 0.0065816953628845916, "tests/core/test_prefix_data.py::test_method_consistency": 0.5390110123811943, "tests/core/test_prefix_data.py::test_no_tokens_dumped[False]": 0.011980674266037527, "tests/core/test_prefix_data.py::test_no_tokens_dumped[True]": 0.012485102680904199, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]": 1.0054683540505176, "tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]": 1.5555380654476567, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]": 0.019186018662529048, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]": 0.4521094275903264, "tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]": 2.9429152897477158, "tests/core/test_prefix_data.py::test_package_methods_with_mock_data": 0.007992291999811899, "tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages": 0.007480204359827178, "tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned": 0.011800275452025423, "tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]": 1.0247627834418525, "tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]": 0.00058374640933928, "tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]": 0.9686105822475974, "tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]": 1.0265557251180606, "tests/core/test_prefix_data.py::test_pip_interop[envpy37win]": 0.0006189462440582555, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]": 0.005961873191033136, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]": 0.0065287837675508265, "tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]": 0.005060772106939999, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]": 0.006512833156458049, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]": 0.005042829125092187, "tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]": 0.005275905394154476, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]": 0.00757447679430215, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]": 0.007654268557795169, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]": 0.00784353950447723, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]": 0.0076256400350628905, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]": 0.007606719400634252, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]": 0.008418877339186793, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]": 0.010826907121872446, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]": 0.008106100704741302, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]": 0.00762630120466623, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]": 0.007241817436803426, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]": 0.009964267830004977, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]": 0.007729263129182488, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]": 0.009211788554611761, "tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]": 0.009375960827924143, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]": 0.009969197939899425, "tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]": 0.009656770994558785, "tests/core/test_prefix_data.py::test_prefix_insertion_error": 0.6322064783054031, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars": 0.0101930216137936, "tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist": 0.007598417680087114, "tests/core/test_prefix_data.py::test_timestamps": 1.8480606459025968, "tests/core/test_prefix_data.py::test_unset_reserved_env_vars": 0.010108394832289433, "tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars": 0.008360732709163179, "tests/core/test_solve.py::test_aggressive_update_packages[classic]": 19.22151502797869, "tests/core/test_solve.py::test_aggressive_update_packages[libmamba]": 13.81781370668515, "tests/core/test_solve.py::test_archspec_call[classic]": 4.657810223577849, "tests/core/test_solve.py::test_archspec_call[libmamba]": 2.7166934264794356, "tests/core/test_solve.py::test_auto_update_conda[classic]": 11.774973342876153, "tests/core/test_solve.py::test_auto_update_conda[libmamba]": 7.643028112669224, "tests/core/test_solve.py::test_broken_install[classic]": 13.839733918430616, "tests/core/test_solve.py::test_broken_install[libmamba]": 0.017058523353599128, "tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]": 22.607387487626877, "tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]": 1.7207832292123877, "tests/core/test_solve.py::test_conda_downgrade[classic]": 63.80198235238613, "tests/core/test_solve.py::test_conda_downgrade[libmamba]": 14.514362270877418, "tests/core/test_solve.py::test_cuda_1[classic]": 3.1975558073134756, "tests/core/test_solve.py::test_cuda_1[libmamba]": 1.8940040156762754, "tests/core/test_solve.py::test_cuda_2[classic]": 2.8754149482493507, "tests/core/test_solve.py::test_cuda_2[libmamba]": 1.9685188882180233, "tests/core/test_solve.py::test_cuda_constrain_absent[classic]": 2.7362997690762967, "tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]": 2.5127615077235235, "tests/core/test_solve.py::test_cuda_constrain_sat[classic]": 0.0006456608691912531, "tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]": 0.0007067062209542789, "tests/core/test_solve.py::test_cuda_constrain_unsat[classic]": 0.0007596077851713936, "tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]": 0.0005652628782099066, "tests/core/test_solve.py::test_cuda_fail_1[classic]": 2.9830353101623137, "tests/core/test_solve.py::test_cuda_fail_1[libmamba]": 1.7154198349937522, "tests/core/test_solve.py::test_cuda_fail_2[classic]": 2.7395494632970463, "tests/core/test_solve.py::test_cuda_fail_2[libmamba]": 1.9940002095814728, "tests/core/test_solve.py::test_cuda_glibc_sat[classic]": 0.0007320121159533627, "tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]": 0.0005470550533513465, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]": 0.0005690749463904464, "tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]": 0.0006904458025745182, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]": 0.0006441435773985534, "tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]": 0.0006195138875328614, "tests/core/test_solve.py::test_current_repodata_fallback[classic]": 1.106576538839763, "tests/core/test_solve.py::test_current_repodata_fallback[libmamba]": 0.6587631449678208, "tests/core/test_solve.py::test_current_repodata_usage[classic]": 1.084306207246031, "tests/core/test_solve.py::test_current_repodata_usage[libmamba]": 0.6487267604628394, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]": 0.02472798889427607, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]": 0.025153671612395137, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]": 0.025185598213112427, "tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]": 0.026160661014990275, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]": 0.025264537455383117, "tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]": 0.025916053833029626, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]": 0.030262157460552407, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]": 0.024836854949229558, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]": 0.026977155147309896, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]": 0.025593343644152104, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]": 0.023499482071694056, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]": 0.023712054969638532, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]": 0.02521529625646976, "tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]": 0.02228745507675965, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]": 12.236631993820078, "tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]": 5.485853195531896, "tests/core/test_solve.py::test_explicit_conda_downgrade[classic]": 12.004500583221574, "tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]": 6.951263989618943, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]": 5.160378873787344, "tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]": 3.795472597629759, "tests/core/test_solve.py::test_features_solve_1[classic]": 11.680491895716754, "tests/core/test_solve.py::test_features_solve_1[libmamba]": 0.8270690014263263, "tests/core/test_solve.py::test_force_reinstall_1[classic]": 6.157162344310654, "tests/core/test_solve.py::test_force_reinstall_1[libmamba]": 5.240907172161833, "tests/core/test_solve.py::test_force_reinstall_2[classic]": 2.6449906236991625, "tests/core/test_solve.py::test_force_reinstall_2[libmamba]": 1.695005099904066, "tests/core/test_solve.py::test_force_remove_1[classic]": 13.45995058106573, "tests/core/test_solve.py::test_force_remove_1[libmamba]": 5.0734009686679125, "tests/core/test_solve.py::test_freeze_deps_1[classic]": 8.90904771790472, "tests/core/test_solve.py::test_freeze_deps_1[libmamba]": 2.8520483197263307, "tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]": 1.110658484356277, "tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]": 1.0460310884251813, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]": 1.0531158730181676, "tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]": 1.151088585180696, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]": 1.6543861378898175, "tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]": 1.0366420710248185, "tests/core/test_solve.py::test_no_channels_error[classic]": 0.021077548146244234, "tests/core/test_solve.py::test_no_channels_error[libmamba]": 0.01688029233339969, "tests/core/test_solve.py::test_no_deps_1[classic]": 11.83775649659096, "tests/core/test_solve.py::test_no_deps_1[libmamba]": 5.42183840363413, "tests/core/test_solve.py::test_no_update_deps_1[classic]": 11.932465618129664, "tests/core/test_solve.py::test_no_update_deps_1[libmamba]": 7.025779122921504, "tests/core/test_solve.py::test_only_deps_1[classic]": 3.5514635527286784, "tests/core/test_solve.py::test_only_deps_1[libmamba]": 1.7868461550530208, "tests/core/test_solve.py::test_only_deps_2[classic]": 17.139294564792543, "tests/core/test_solve.py::test_only_deps_2[libmamba]": 7.524834265559651, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]": 0.026606206710255254, "tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]": 0.0358644759171666, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]": 0.026043873796840866, "tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]": 0.022948165786746147, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]": 0.022750583870971623, "tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]": 0.02951971382669301, "tests/core/test_solve.py::test_pinned_1[classic]": 5.3457862554934135, "tests/core/test_solve.py::test_pinned_1[libmamba]": 5.0614985155976715, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]": 0.03763290570006184, "tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]": 0.02542672167195106, "tests/core/test_solve.py::test_pinned_specs_all[classic]": 0.15292284981993143, "tests/core/test_solve.py::test_pinned_specs_all[libmamba]": 0.10216984476451477, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]": 0.028966327681042285, "tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]": 0.022698491149996912, "tests/core/test_solve.py::test_pinned_specs_condarc[classic]": 0.13149128005943184, "tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]": 0.12773777082791335, "tests/core/test_solve.py::test_priority_1[classic]": 38.048560872892395, "tests/core/test_solve.py::test_priority_1[libmamba]": 11.553934652684257, "tests/core/test_solve.py::test_prune_1[classic]": 7.299929596365899, "tests/core/test_solve.py::test_prune_1[libmamba]": 2.2676286560814742, "tests/core/test_solve.py::test_python2_update[classic]": 10.78033174111313, "tests/core/test_solve.py::test_python2_update[libmamba]": 1.5198421260165147, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]": 13.307393739172792, "tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]": 1.5718707523508324, "tests/core/test_solve.py::test_solve_1[libmamba]": 2.626776350119269, "tests/core/test_solve.py::test_solve_2[classic]": 39.272133204361275, "tests/core/test_solve.py::test_solve_2[libmamba]": 0.018924705658460925, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]": 2.78654822160509, "tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]": 1.912533963791152, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]": 0.02052452835911627, "tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]": 37.34448509447505, "tests/core/test_solve.py::test_timestamps_1[classic]": 1.3025509372940836, "tests/core/test_solve.py::test_timestamps_1[libmamba]": 0.7125887736258425, "tests/core/test_solve.py::test_unfreeze_when_required[classic]": 3.193625426704279, "tests/core/test_solve.py::test_unfreeze_when_required[libmamba]": 2.3232304880076944, "tests/core/test_solve.py::test_update_all_1[classic]": 11.621182153219959, "tests/core/test_solve.py::test_update_all_1[libmamba]": 5.3343053482019736, "tests/core/test_solve.py::test_update_deps_1[classic]": 22.74901089143252, "tests/core/test_solve.py::test_update_deps_1[libmamba]": 10.762311258498032, "tests/core/test_solve.py::test_update_deps_2[classic]": 18.589904624377766, "tests/core/test_solve.py::test_update_deps_2[libmamba]": 3.744749121854098, "tests/core/test_solve.py::test_update_prune_1[classic]": 6.43687977448346, "tests/core/test_solve.py::test_update_prune_1[libmamba]": 3.709491610846389, "tests/core/test_solve.py::test_update_prune_2[classic]": 6.785436715278541, "tests/core/test_solve.py::test_update_prune_2[libmamba]": 1.9239162076217349, "tests/core/test_solve.py::test_update_prune_3[classic]": 7.365520466944183, "tests/core/test_solve.py::test_update_prune_3[libmamba]": 1.9194089583330178, "tests/core/test_solve.py::test_update_prune_4[classic]": 6.604107644171135, "tests/core/test_solve.py::test_update_prune_4[libmamba]": 4.062756074709056, "tests/core/test_solve.py::test_update_prune_5[classic-False]": 7.430519602886875, "tests/core/test_solve.py::test_update_prune_5[classic-True]": 6.7012473003611674, "tests/core/test_solve.py::test_update_prune_5[libmamba-False]": 3.552528421701025, "tests/core/test_solve.py::test_update_prune_5[libmamba-True]": 3.899409159547911, "tests/core/test_solve.py::test_virtual_package_solver[classic]": 2.569260719032285, "tests/core/test_solve.py::test_virtual_package_solver[libmamba]": 0.01698972569729531, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com": 0.0028079153510145965, "tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io": 0.002630707052845094, "tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache": 2.4504032637563324, "tests/core/test_subdir_data.py::test_metadata_cache_clearing": 0.05445617432546687, "tests/core/test_subdir_data.py::test_metadata_cache_works": 3.113294040042959, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]": 2.2547330763651794, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]": 1.0974275764118078, "tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]": 0.016578329416127878, "tests/core/test_subdir_data.py::test_repodata_version_error": 5.038823380534624, "tests/core/test_subdir_data.py::test_search_by_packagerecord": 0.01128990357839903, "tests/core/test_subdir_data.py::test_state_is_not_json": 0.04884360999245699, "tests/core/test_subdir_data.py::test_subdir_data_coverage": 0.02598795447421371, "tests/core/test_subdir_data.py::test_subdir_data_dict_state": 0.004875606644327361, "tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2": 0.023110970994400997, "tests/core/test_subdir_data.py::test_use_only_tar_bz2": 0.038287646237833026, "tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs": 0.007657623616398601, "tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit": 0.17269160639416217, "tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit": 0.01127004737576375, "tests/env/specs/test_explicit.py::test_can_handle_explicit": 0.0036064123745934477, "tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt": 0.003373082745788483, "tests/env/specs/test_explicit.py::test_environment": 0.26825586398088097, "tests/env/specs/test_explicit.py::test_no_environment_file": 0.0033042730348935984, "tests/env/specs/test_requirements.py::test_can_not_handle_explicit": 0.0038574770396906815, "tests/env/specs/test_requirements.py::test_environment": 0.0033549980911451397, "tests/env/specs/test_requirements.py::test_no_environment_file": 0.00365655436588184, "tests/env/specs/test_requirements.py::test_no_name": 0.004394809471824144, "tests/env/specs/test_requirements.py::test_req_file_and_name": 0.0035052763579616433, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]": 0.0047663181557067846, "tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]": 0.005010540933291693, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]": 0.0034745771114651682, "tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]": 0.00464387156463358, "tests/env/specs/test_yaml_file.py::test_filename": 0.005110376079338934, "tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]": 0.0055165740618187825, "tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]": 0.006479414719682531, "tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]": 0.003223677715667403, "tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]": 0.003631809222171888, "tests/env/test_create.py::test_create_advanced_pip": 29.9453337866182, "tests/env/test_create.py::test_create_empty_env": 3.043594189069503, "tests/env/test_create.py::test_create_env_custom_platform": 0.9249924588201082, "tests/env/test_create.py::test_create_env_default_packages": 17.69350984708605, "tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning": 1.362841851106181, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/env_with_dependencies.yml]": 8.799966797015738, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/Users/runner/work/conda/conda/tests/env/support/env_with_dependencies.yml]": 11.304656637366625, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/explicit.txt]": 0.617149637011708, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/Users/runner/work/conda/conda/tests/env/support/explicit.txt]": 0.7581659631380523, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/requirements.txt]": 10.53187922675677, "tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/Users/runner/work/conda/conda/tests/env/support/requirements.txt]": 12.57829650479584, "tests/env/test_create.py::test_create_env_from_non_existent_plugin": 0.07521129260137792, "tests/env/test_create.py::test_create_env_json[example/environment.yml]": 20.717422413288222, "tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]": 24.022319556275267, "tests/env/test_create.py::test_create_env_no_default_packages": 13.27071263984563, "tests/env/test_create.py::test_create_host_port": 0.00039910141472900175, "tests/env/test_create.py::test_create_update": 13.632458002571244, "tests/env/test_create.py::test_create_update_remote_env_file": 12.219563065501813, "tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]": 1.9666666531876826, "tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]": 1.8317181162906984, "tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]": 2.2643710914704727, "tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]": 1.6697434107070062, "tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon": 0.06862541066761543, "tests/env/test_create.py::test_protected_dirs_error_for_env_create": 0.1255099095252187, "tests/env/test_env.py::test_add_channels": 0.00267755687745237, "tests/env/test_env.py::test_add_pip": 0.006838540187678731, "tests/env/test_env.py::test_args_are_wildcarded": 0.0029541280218447256, "tests/env/test_env.py::test_builds_spec_from_line_raw_dependency": 0.00309859042092241, "tests/env/test_env.py::test_can_add_dependencies_to_environment": 0.006646234828540174, "tests/env/test_env.py::test_channels_are_provided_by_kwarg": 0.0027027232140380735, "tests/env/test_env.py::test_channels_default_to_empty_list": 0.002560750449759723, "tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']": 0.003372487932214843, "tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]": 0.0035999009954622106, "tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]": 0.0033100119128273687, "tests/env/test_env.py::test_channels_validation[channels3-None]": 0.0031499763424548553, "tests/env/test_env.py::test_create_and_update_env_with_just_vars": 1.3612970452648983, "tests/env/test_env.py::test_creates_file_on_save": 0.007510600892048453, "tests/env/test_env.py::test_dependencies_are_empty_by_default": 0.0029379220404019326, "tests/env/test_env.py::test_dependencies_update_after_adding": 0.005280949302831016, "tests/env/test_env.py::test_dependency_validation[dependencies0]": 0.0038054048065086768, "tests/env/test_env.py::test_dependency_validation[dependencies1]": 0.0026732437244419193, "tests/env/test_env.py::test_dependency_validation[dependencies2]": 0.0028981154287145003, "tests/env/test_env.py::test_dependency_validation[dependencies3]": 0.0031296229565040846, "tests/env/test_env.py::test_dependency_validation[dependencies4]": 0.002996042102856336, "tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]": 0.004092016600757807, "tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']": 0.004440440597355791, "tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']": 0.004061181126526033, "tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]": 0.0034138152095188547, "tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']": 0.003451978391066684, "tests/env/test_env.py::test_empty_deps": 0.006559335189895454, "tests/env/test_env.py::test_env_advanced_pip": 10.87118874980462, "tests/env/test_env.py::test_environment_deprecated": 0.0037055225346725304, "tests/env/test_env.py::test_envvars": 0.007312818656441987, "tests/env/test_env.py::test_from_history": 0.0077460884591359636, "tests/env/test_env.py::test_has_empty_filename_by_default": 0.002739850278626674, "tests/env/test_env.py::test_has_empty_name_by_default": 0.0026203171487959006, "tests/env/test_env.py::test_has_filename_if_provided": 0.0027450808535533383, "tests/env/test_env.py::test_has_name_if_provided": 0.0032603773615301197, "tests/env/test_env.py::test_http": 0.08698257123501842, "tests/env/test_env.py::test_http_raises": 0.10359924170668158, "tests/env/test_env.py::test_invalid_keys": 0.007507674297678497, "tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']": 0.00368732355009409, "tests/env/test_env.py::test_name_validation[name-None]": 0.003041645976380761, "tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']": 0.004048961773683062, "tests/env/test_env.py::test_other_tips_of_dependencies_are_supported": 0.002741418871586284, "tests/env/test_env.py::test_parses_dependencies_from_raw_file": 0.004824111835305733, "tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']": 0.0036050734095179286, "tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]": 0.0030934958800843816, "tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']": 0.003300635103915284, "tests/env/test_env.py::test_remove_channels": 0.0027862229547346478, "tests/env/test_env.py::test_retains_full_filename": 0.005412778645107665, "tests/env/test_env.py::test_returns_Environment": 0.005816943218383147, "tests/env/test_env.py::test_to_dict_returns_dictionary_of_data": 0.0027118497651488797, "tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present": 0.0029091623654733533, "tests/env/test_env.py::test_to_yaml_returns_proper_yaml": 0.005396696398186456, "tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string": 0.0073475551182685984, "tests/env/test_env.py::test_to_yaml_takes_stream": 0.004899920787343771, "tests/env/test_env.py::test_valid_keys": 0.0073999109107112555, "tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']": 0.0036772198017815108, "tests/env/test_env.py::test_variables_validation[variables1-None]": 0.003566884090278672, "tests/env/test_env.py::test_variables_validation[variables2-None]": 0.0030207984965194665, "tests/env/test_env.py::test_with_pip": 0.00619958327786766, "tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]": 0.003311049257128863, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting attrs\\n Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\nInstalling collected packages: attrs\\nSuccessfully installed attrs-19.1.0\\n-expected1]": 0.003434975588623382, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nCollecting itsdangerous>=0.24 (from flask)\\n Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\nCollecting click>=5.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\nCollecting Werkzeug>=0.15 (from flask)\\n Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\nCollecting Jinja2>=2.10.1 (from flask)\\n Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\n Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\n-expected2]": 0.002953577259935457, "tests/env/test_pip_util.py::test_get_pip_installed_packages[\\nCollecting flask\\n Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\nInstalling collected packages: flask\\nSuccessfully installed flask-1.1.1\\n-expected3]": 0.003311296594202359, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\n]": 0.002730073023983998, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]": 0.0027804250830873807, "tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]": 0.004193938860104972, "tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]": 0.0039571878708007475, "tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]": 0.004080161471374526, "tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]": 0.0033430942232802827, "tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]": 0.0032115498412424765, "tests/gateways/disk/test_delete.py::test_backoff_unlink": 0.08767788767394429, "tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist": 0.003983408316192888, "tests/gateways/disk/test_delete.py::test_remove_dir": 0.0891181802079068, "tests/gateways/disk/test_delete.py::test_remove_file": 0.003927419025409388, "tests/gateways/disk/test_delete.py::test_remove_link_to_dir": 0.1025336629393028, "tests/gateways/disk/test_delete.py::test_remove_link_to_file": 0.005286145158566326, "tests/gateways/disk/test_delete.py::test_rm_rf": 0.1386480953727838, "tests/gateways/disk/test_delete.py::test_rm_rf_couldnt": 0.004276468299719552, "tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks": 0.1775690276511962, "tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist": 0.08873211858382052, "tests/gateways/disk/test_link.py::test_hard_link": 0.0075921656064102715, "tests/gateways/disk/test_link.py::test_soft_link": 0.00847194122446409, "tests/gateways/disk/test_lock.py::test_LockError_raised": 0.009885982754759652, "tests/gateways/disk/test_lock.py::test_double_locking_fails": 2.0334795595426414, "tests/gateways/disk/test_lock.py::test_lock_acquired_success": 0.004935862682023107, "tests/gateways/disk/test_permissions.py::test_make_executable": 0.004462469445844519, "tests/gateways/disk/test_permissions.py::test_make_writable": 0.005033159127635437, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES": 0.004581862086998964, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM": 0.00432146212941095, "tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS": 0.004807406286139433, "tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist": 0.003653454991175568, "tests/gateways/disk/test_permissions.py::test_recursive_make_writable": 0.004803209490141165, "tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary": 0.06124181715728597, "tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl": 0.06565830943813988, "tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary": 0.015013984563333463, "tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl": 0.0205097687391292, "tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary": 0.12429563647460443, "tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl": 0.14025408163061664, "tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable": 0.00716015536853768, "tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary": 0.16873970654404644, "tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl": 0.23200176466398886, "tests/gateways/test_connection.py::test_accept_range_none": 1.0169261385140462, "tests/gateways/test_connection.py::test_add_binstar_token": 0.2299709397065554, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]": 0.015868017706784053, "tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]": 0.014958048816038856, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]": 0.015908437952330233, "tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]": 0.01668872253526083, "tests/gateways/test_connection.py::test_get_session_returns_default": 0.006169792269200127, "tests/gateways/test_connection.py::test_get_session_with_channel_settings": 0.016998525643534067, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple": 0.008233765201093833, "tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler": 0.006413971444630989, "tests/gateways/test_connection.py::test_get_session_with_request_headers": 0.009829824665091122, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]": 0.043743494076156825, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]": 0.01933786580966311, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]": 0.010777273847022036, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]": 0.011038403251890788, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]": 0.009615988855546622, "tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]": 0.0073558346346325265, "tests/gateways/test_connection.py::test_local_file_adapter_200": 0.009035780147922473, "tests/gateways/test_connection.py::test_local_file_adapter_404": 0.3109380375244605, "tests/gateways/test_connection.py::test_offline[False]": 0.01183789533561034, "tests/gateways/test_connection.py::test_offline[True]": 0.02296177118956712, "tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers": 0.010397262161449872, "tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers": 0.012552694490697756, "tests/gateways/test_connection.py::test_s3_download_uses_direct_path": 0.2736298940409685, "tests/gateways/test_connection.py::test_s3_server": 0.00036803917933440314, "tests/gateways/test_connection.py::test_s3_server_with_mock": 0.00037645000896303167, "tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive": 0.002792184781852739, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]": 0.003037656446984448, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]": 0.003443442736499117, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]": 0.003254291226670505, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]": 0.00327761080576088, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]": 0.0033614484618525124, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]": 0.002901701818510202, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]": 0.0034266953314696777, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]": 0.002925555327162294, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]": 0.003146486381236182, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]": 0.002968584752474132, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]": 0.003099520441811837, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]": 0.0029249359124618687, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]": 0.0030923659152001233, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]": 0.0030632920419865328, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]": 0.003046465301724, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]": 0.0033405372405025586, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]": 0.00324630701540995, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]": 0.003168657214299745, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]": 0.0030508629456749243, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]": 0.0033207762215910464, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]": 0.0032363671452905, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]": 0.0033497779778725685, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]": 0.0034457826966794148, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]": 0.0030811682143165025, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]": 0.003294861439844841, "tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]": 0.0033460003832785482, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]": 0.0036165323493961734, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]": 0.0034648131235265386, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]": 0.0030196596527702698, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]": 0.0031185801466319697, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]": 0.0037793737526674825, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]": 0.003882737858652577, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]": 0.003729942688331344, "tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]": 0.003479856258250466, "tests/gateways/test_logging.py::test_token_not_present_in_conda_create": 2.891880551222096, "tests/gateways/test_logging.py::test_token_replace_big_string": 0.003811855619003034, "tests/gateways/test_logging.py::test_token_replace_individual_strings": 0.0031918925889712867, "tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers": 0.009254643938754683, "tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]": 0.0031741655530968015, "tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]": 0.0034690988218204787, "tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]": 0.003570992037700892, "tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]": 0.0033790094128309826, "tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors": 0.07126341836477429, "tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age": 0.0035013073491725827, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]": 0.016313284475275493, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]": 0.2718303778495547, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]": 0.031172172214538902, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]": 0.6333349678814396, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats": 0.29206333375967103, "tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror": 0.0073967813895560635, "tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format": 0.009283534353624263, "tests/gateways/test_repodata_gateway.py::test_save": 0.21043645647528675, "tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message": 0.00392825238327026, "tests/gateways/test_repodata_gateway.py::test_stale": 0.0263335632257148, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]": 10.664511037758496, "tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]": 1.0094027054025718, "tests/gateways/test_repodata_lock.py::test_lock_rename": 0.01953762077510777, "tests/gateways/test_repodata_shards.py::test_bytes_cache": 0.007547738440273159, "tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter": 0.002948677341886971, "tests/gateways/test_streams.py::test_stderr_writes_redacted_text": 0.0037309774419942115, "tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output": 0.4216251559072464, "tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output": 0.4795472030499844, "tests/gateways/test_zstd.py::test_download_repodata": 0.10159113028971792, "tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror": 0.0895721841364877, "tests/gateways/test_zstd.py::test_repodata_state": 0.0411568626674316, "tests/gateways/test_zstd.py::test_repodata_use_zst[False]": 0.015195673236544423, "tests/gateways/test_zstd.py::test_repodata_use_zst[True]": 0.013098609950431996, "tests/gateways/test_zstd.py::test_server_available": 0.02150256966191195, "tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd": 0.03262767393515482, "tests/gateways/test_zstd.py::test_zstd_not_404": 0.009567847919581644, "tests/models/test_channel.py::test_bare_channel_file": 0.004675111165224124, "tests/models/test_channel.py::test_bare_channel_http": 0.004570524117669543, "tests/models/test_channel.py::test_basic_multichannel": 0.0049863544758693285, "tests/models/test_channel.py::test_canonicalized_url_gets_correct_token": 0.016936635388717626, "tests/models/test_channel.py::test_channel_alias": 0.020866740978424152, "tests/models/test_channel.py::test_channel_alias_channels": 0.004349742306724392, "tests/models/test_channel.py::test_channel_alias_w_conda_path": 0.014968287002477496, "tests/models/test_channel.py::test_channel_alias_w_subhcnnale": 0.015014855431806704, "tests/models/test_channel.py::test_channel_cache": 0.00516250556763031, "tests/models/test_channel.py::test_channel_equality_respects_platform": 0.004170720217126365, "tests/models/test_channel.py::test_channel_host_port": 0.004144654169491134, "tests/models/test_channel.py::test_channel_mangles_urls": 0.005217484615942755, "tests/models/test_channel.py::test_channel_name_subdir_only": 0.004003208172832212, "tests/models/test_channel.py::test_channels_with_dashes": 0.020956459728777924, "tests/models/test_channel.py::test_custom_channels": 0.022814924252077515, "tests/models/test_channel.py::test_custom_channels_port_token_auth": 0.02235779004164807, "tests/models/test_channel.py::test_custom_token_in_channel": 0.015123252310646972, "tests/models/test_channel.py::test_default_channel[None]": 0.008732609889339256, "tests/models/test_channel.py::test_default_channel[win-32]": 0.004201762820539509, "tests/models/test_channel.py::test_default_channels": 0.022776371378136578, "tests/models/test_channel.py::test_defaults_channel": 0.029720020477990643, "tests/models/test_channel.py::test_env_var_file_urls": 0.007800060790544248, "tests/models/test_channel.py::test_expanded_variables": 0.010992713418347094, "tests/models/test_channel.py::test_file_channel": 0.0229244064370845, "tests/models/test_channel.py::test_file_url_with_backslashes": 0.004272764316628354, "tests/models/test_channel.py::test_file_urls": 0.005476831532078275, "tests/models/test_channel.py::test_local_channel": 0.10356680929871413, "tests/models/test_channel.py::test_migrated_custom_channels": 0.0226420713784981, "tests/models/test_channel.py::test_multichannel_priority": 0.004823839649231719, "tests/models/test_channel.py::test_named_custom_channel": 0.020857666801900095, "tests/models/test_channel.py::test_named_custom_channel_w_subchan": 0.023387678182205454, "tests/models/test_channel.py::test_old_channel_alias": 0.026695438865361954, "tests/models/test_channel.py::test_pkgs_main": 0.02903829553337325, "tests/models/test_channel.py::test_pkgs_pro": 0.027122088257751482, "tests/models/test_channel.py::test_ppc64le_vs_ppc64": 0.005245141215534867, "tests/models/test_channel.py::test_prioritize_channels": 0.004829289799639074, "tests/models/test_channel.py::test_regression_against_unknown_none": 0.005937435489495916, "tests/models/test_channel.py::test_subdir_env_var": 0.0150822756613486, "tests/models/test_channel.py::test_subdirs_env_var": 0.018144085621829415, "tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform": 0.005578320284910166, "tests/models/test_channel.py::test_token_in_custom_channel": 0.005058523534375475, "tests/models/test_channel.py::test_unexpanded_variables": 0.010017707270239512, "tests/models/test_channel.py::test_url_channel_w_platform": 0.004874124355373916, "tests/models/test_channel.py::test_url_custom_channel": 0.02277454195305068, "tests/models/test_channel.py::test_url_custom_channel_w_subchan": 0.02154831312179366, "tests/models/test_dist.py::test_channel[.conda]": 0.009263558949732988, "tests/models/test_dist.py::test_channel[.tar.bz2]": 0.005290407544854359, "tests/models/test_dist.py::test_dist[.conda]": 0.0059607886948114825, "tests/models/test_dist.py::test_dist[.tar.bz2]": 0.004750734607949999, "tests/models/test_dist.py::test_dist_with_channel_url[.conda]": 0.10608061077544521, "tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]": 0.11606908444125298, "tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]": 0.006832273281561652, "tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]": 0.006801704382346794, "tests/models/test_enums.py::test_noarch_type_coercion[-None]": 0.003559942984213849, "tests/models/test_enums.py::test_noarch_type_coercion[0-None]": 0.003581507554996246, "tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]": 0.0031860512856660803, "tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]": 0.0037691424700346215, "tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]": 0.003941452634633288, "tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]": 0.0032218731008042192, "tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]": 0.004419948390809814, "tests/models/test_enums.py::test_noarch_type_coercion[False-None0]": 0.003414510105770859, "tests/models/test_enums.py::test_noarch_type_coercion[False-None1]": 0.0037489891679092493, "tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]": 0.0036909561166388358, "tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]": 0.003315116722145273, "tests/models/test_enums.py::test_noarch_type_coercion[N-None]": 0.0030759300523462004, "tests/models/test_enums.py::test_noarch_type_coercion[NO-None]": 0.005618376289585373, "tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]": 0.003691935912382511, "tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]": 0.0032401238641589013, "tests/models/test_enums.py::test_noarch_type_coercion[No-None]": 0.005167258804319472, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]": 0.003419554899156863, "tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]": 0.003228474180280429, "tests/models/test_enums.py::test_noarch_type_coercion[Non-None]": 0.003089853549083907, "tests/models/test_enums.py::test_noarch_type_coercion[None-None]": 0.003253043821562788, "tests/models/test_enums.py::test_noarch_type_coercion[Null-None]": 0.004335695333607072, "tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]": 0.0033735747381643992, "tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]": 0.00416832583772679, "tests/models/test_enums.py::test_noarch_type_coercion[Off-None]": 0.0038347235618285997, "tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]": 0.004132739999523365, "tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]": 0.003511306720767652, "tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]": 0.003978188550644289, "tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]": 0.004155661257401209, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]": 0.004933710921069817, "tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]": 0.003917838603347129, "tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]": 0.004293513454107848, "tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]": 0.0030511484962579345, "tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]": 0.0057472105646479595, "tests/models/test_enums.py::test_noarch_type_coercion[\\x00-None]": 0.003520964571235689, "tests/models/test_enums.py::test_noarch_type_coercion[false-None]": 0.0040364090352378685, "tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]": 0.005168909262429408, "tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]": 0.0033049005899962337, "tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]": 0.003956175008654704, "tests/models/test_enums.py::test_noarch_type_coercion[n-None]": 0.004047630221773659, "tests/models/test_enums.py::test_noarch_type_coercion[no-None]": 0.004185430903354565, "tests/models/test_enums.py::test_noarch_type_coercion[non-None]": 0.003098764155772866, "tests/models/test_enums.py::test_noarch_type_coercion[none-None]": 0.0038143879082450263, "tests/models/test_enums.py::test_noarch_type_coercion[null-None]": 0.003314532322896719, "tests/models/test_enums.py::test_noarch_type_coercion[off-None]": 0.003356650625830281, "tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]": 0.004112368827072596, "tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]": 0.00567212108028569, "tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]": 0.004255939043025668, "tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]": 0.004145290914145445, "tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]": 0.0037686998245693177, "tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]": 0.003571493027813554, "tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]": 0.003921488363488119, "tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]": 0.003649593387737985, "tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]": 0.003859763532801203, "tests/models/test_enums.py::test_noarch_type_coercion[~-None]": 0.003582010480058302, "tests/models/test_environment.py::test_config_from_cli_channels_behaviors": 0.00519968471867827, "tests/models/test_environment.py::test_config_from_cli_channels_empty": 0.0033341956460281536, "tests/models/test_environment.py::test_create_environment_missing_required_fields": 0.003583822885944259, "tests/models/test_environment.py::test_create_invalid_platform": 0.003234472482033122, "tests/models/test_environment.py::test_create_missing_explicit_package": 0.007498871094469546, "tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages": 0.005051625273689534, "tests/models/test_environment.py::test_environment_config_channels_basic": 0.004508173194480232, "tests/models/test_environment.py::test_environment_config_from_context": 0.05028533868533594, "tests/models/test_environment.py::test_environments_merge": 0.007158204463158883, "tests/models/test_environment.py::test_environments_merge_colliding_name": 0.0036255615146318304, "tests/models/test_environment.py::test_environments_merge_colliding_platform": 0.003115756177394852, "tests/models/test_environment.py::test_environments_merge_colliding_prefix": 0.003099400418933132, "tests/models/test_environment.py::test_environments_merge_explicit_packages": 0.005819205215104383, "tests/models/test_environment.py::test_explicit_packages": 0.8465757798108724, "tests/models/test_environment.py::test_extrapolate": 20.45164841398633, "tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current": 0.01362900504681619, "tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli": 0.012390033546972119, "tests/models/test_environment.py::test_from_cli_empty": 0.005553648846176814, "tests/models/test_environment.py::test_from_cli_empty_with_default_packages": 0.01955364235020293, "tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file": 0.02072441067543533, "tests/models/test_environment.py::test_from_cli_inject_default_packages_override": 0.02506835679425927, "tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs": 0.005292108455368195, "tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels": 0.021041845006587807, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]": 0.005000869015663767, "tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]": 0.006673307390620664, "tests/models/test_environment.py::test_from_cli_with_explicit_specs": 0.009271658655055755, "tests/models/test_environment.py::test_from_cli_with_files": 0.008767826592271464, "tests/models/test_environment.py::test_from_cli_with_specs": 0.007648601445422258, "tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability": 22.95012265986908, "tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages": 0.6692511973016302, "tests/models/test_environment.py::test_from_prefix_package_population_semantics": 0.5691129886412909, "tests/models/test_environment.py::test_merge_channel_settings": 0.0031833267560315514, "tests/models/test_environment.py::test_merge_configs_channel_order_last_wins": 0.002983162340473797, "tests/models/test_environment.py::test_merge_configs_deduplicate_values": 0.0032020425128776544, "tests/models/test_environment.py::test_merge_configs_primitive_none_values_order": 0.006096986508769032, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_one": 0.003087513236878511, "tests/models/test_environment.py::test_merge_configs_primitive_values_order_two": 0.004333016197030526, "tests/models/test_match_spec.py::test_bracket_matches": 0.012266794894752566, "tests/models/test_match_spec.py::test_build_glob_merge": 0.03058006832106787, "tests/models/test_match_spec.py::test_build_glob_merge_channel": 0.006967646326689065, "tests/models/test_match_spec.py::test_build_merge": 0.006042858909677327, "tests/models/test_match_spec.py::test_build_number_and_filename": 0.0031420452371329678, "tests/models/test_match_spec.py::test_build_number_merge": 0.015375540371275316, "tests/models/test_match_spec.py::test_canonical_string_forms": 0.01568749423694769, "tests/models/test_match_spec.py::test_catch_invalid_regexes": 0.007076096472222989, "tests/models/test_match_spec.py::test_channel_matching": 0.0070403817007833, "tests/models/test_match_spec.py::test_channel_merge": 0.005467329201515743, "tests/models/test_match_spec.py::test_comment": 0.0031631341769837768, "tests/models/test_match_spec.py::test_conda_build_form[build_only]": 0.0034861756232130604, "tests/models/test_match_spec.py::test_conda_build_form[build_version]": 0.0050048049714757565, "tests/models/test_match_spec.py::test_conda_build_form[name_only]": 0.020045413310174908, "tests/models/test_match_spec.py::test_conda_build_form[version_only]": 0.0144416247663975, "tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.0048788033503977014, "tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]": 0.0053551700782226855, "tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]": 0.00342721895460896, "tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]": 0.005321912306124143, "tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]": 0.004245387672004155, "tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]": 0.004250334211871246, "tests/models/test_match_spec.py::test_conda_env_form_comprehensive": 0.0074360424660663655, "tests/models/test_match_spec.py::test_conda_style": 0.003668401771231211, "tests/models/test_match_spec.py::test_dist": 0.006412339526439576, "tests/models/test_match_spec.py::test_dist_str": 0.010328198341728942, "tests/models/test_match_spec.py::test_exact_values": 0.004407377285509318, "tests/models/test_match_spec.py::test_hash": 0.004370122878001328, "tests/models/test_match_spec.py::test_hash_merge_with_name[md5]": 0.008405521774236847, "tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]": 0.006634089296876259, "tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]": 0.004637224162399524, "tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]": 0.0039992895940978886, "tests/models/test_match_spec.py::test_index_record": 0.006536236823753463, "tests/models/test_match_spec.py::test_invalid": 0.0031402509288751736, "tests/models/test_match_spec.py::test_invalid_match_spec": 0.002816325904337673, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]": 0.003738442073289037, "tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0=0.13.0,<1.0.0>=py312]": 0.004067183333541838, "tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms": 0.0006524862514404209, "tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms": 0.0032036813938352065, "tests/models/test_match_spec.py::test_license_match": 0.012145479104848094, "tests/models/test_match_spec.py::test_match_1": 0.016754595414248195, "tests/models/test_match_spec.py::test_matchspec_errors": 0.007616768757113775, "tests/models/test_match_spec.py::test_merge_multiple_name": 0.006072444974944864, "tests/models/test_match_spec.py::test_merge_single_name": 0.007340756888316446, "tests/models/test_match_spec.py::test_no_name_match_spec": 0.0050628825973125955, "tests/models/test_match_spec.py::test_no_triple_equals_roundtrip": 0.0037936699948037606, "tests/models/test_match_spec.py::test_openssl_match": 0.01021405450762953, "tests/models/test_match_spec.py::test_parse_build_number_brackets": 0.003389219237559038, "tests/models/test_match_spec.py::test_parse_channel_subdir": 0.004853523362150642, "tests/models/test_match_spec.py::test_parse_equal_equal": 0.003959623132607563, "tests/models/test_match_spec.py::test_parse_errors": 0.0038978140450418924, "tests/models/test_match_spec.py::test_parse_hard": 0.004343764317819297, "tests/models/test_match_spec.py::test_parse_parens": 0.004865214496543671, "tests/models/test_match_spec.py::test_parse_spec_str_no_brackets": 0.005484743567176536, "tests/models/test_match_spec.py::test_parse_spec_str_tarball_url": 0.006412029017559827, "tests/models/test_match_spec.py::test_parse_spec_str_with_brackets": 0.00543562749482061, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]": 0.010376788446938935, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]": 0.0045676444491826625, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]": 0.006130442966801122, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]": 0.005366335596400622, "tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]": 0.0055797461542888525, "tests/models/test_match_spec.py::test_pip_style2": 0.004554794198002353, "tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]": 0.004566816640789342, "tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]": 0.00383974171170152, "tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]": 0.0041374920565411255, "tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]": 0.0033529111455398723, "tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]": 0.004439682901795454, "tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]": 0.00325458729880866, "tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]": 0.003849329958700229, "tests/models/test_match_spec.py::test_simple[python-python]": 0.003472460273026749, "tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]": 0.003712910946347747, "tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]": 0.0041427295892660036, "tests/models/test_match_spec.py::test_star_name": 0.0036963416982764446, "tests/models/test_match_spec.py::test_strictness": 0.004758245114511353, "tests/models/test_match_spec.py::test_subdir_merge": 0.006960002743274213, "tests/models/test_match_spec.py::test_tarball_match_specs": 0.010554659838986078, "tests/models/test_match_spec.py::test_to_filename": 0.0074369068365470565, "tests/models/test_match_spec.py::test_track_features_match": 0.009762731550468844, "tests/models/test_match_spec.py::test_url_percent_encoding": 0.00750713048833998, "tests/models/test_match_spec.py::test_version_wildcard_serialization": 0.006709786804870906, "tests/models/test_package_info.py::test_package_info": 0.009170463979238022, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]": 3.2307693396316752, "tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]": 0.8202815907893073, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]": 0.02752151456360894, "tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]": 0.02469876506821204, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]": 0.02704033004431867, "tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]": 0.02071930573531292, "tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]": 11.89839218245966, "tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]": 0.7625344397689006, "tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]": 12.161782469415503, "tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]": 0.6025674659818763, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]": 12.59791070880558, "tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]": 0.7567228198060517, "tests/models/test_prefix_graph.py::test_sort_without_prep[classic]": 12.548428733435042, "tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]": 2.0234840269046765, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]": 12.09246936156507, "tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]": 2.646793202639001, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]": 13.981669468573552, "tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]": 2.338847220107226, "tests/models/test_records.py::test_package_record_feature": 0.005173244217278484, "tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]": 0.0065073269262677595, "tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]": 0.006142934370145408, "tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]": 0.006227676624634121, "tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]": 0.005156924685033037, "tests/models/test_records.py::test_package_record_spec_strings_vs_str": 0.005015247205021807, "tests/models/test_records.py::test_package_record_timestamp": 0.00648005601521746, "tests/models/test_records.py::test_package_virtual_package[123-testbuild]": 0.006019286969045843, "tests/models/test_records.py::test_package_virtual_package[None-None]": 0.00600946798340684, "tests/models/test_records.py::test_package_virtual_package[None-testbuild]": 0.0058848096657603145, "tests/models/test_records.py::test_prefix_record_no_channel": 0.005693643773878402, "tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]": 0.005815626015764926, "tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]": 0.006356633371563395, "tests/models/test_records.py::test_requested_spec": 0.8117094379738286, "tests/models/test_version.py::test_compatible_release_versions": 0.0033548502327545413, "tests/models/test_version.py::test_compound_versions": 0.004386219428056677, "tests/models/test_version.py::test_hexrd": 0.0028335903446853844, "tests/models/test_version.py::test_invalid_version_specs": 0.0035086162374608054, "tests/models/test_version.py::test_local_identifier": 0.002893698407282012, "tests/models/test_version.py::test_match": 0.006709881700962513, "tests/models/test_version.py::test_not_eq_star": 0.0029682523670707148, "tests/models/test_version.py::test_openssl_convention": 0.0036119924520672956, "tests/models/test_version.py::test_pep440": 0.004759552813550929, "tests/models/test_version.py::test_pep_440_arbitrary_equality_operator": 0.0036353202163421174, "tests/models/test_version.py::test_ver_eval": 0.004008987491235885, "tests/models/test_version.py::test_ver_eval_errors": 0.0027153132965055484, "tests/models/test_version.py::test_version_order": 0.0062940185976681, "tests/models/test_version.py::test_version_spec_1": 0.0037632647512376547, "tests/models/test_version.py::test_version_spec_2": 0.0035142308313774392, "tests/models/test_version.py::test_version_spec_3": 0.0032534223686041938, "tests/models/test_version.py::test_version_spec_4": 0.0029155257503358047, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]": 0.010570457357110692, "tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]": 0.008500530285557164, "tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches": 0.007092120357274975, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]": 0.008038792071488388, "tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]": 0.0076121331426455595, "tests/notices/test_core.py::test__conda_user_story__disable_notices": 0.020367053638016545, "tests/notices/test_core.py::test__conda_user_story__more_notices_message": 0.2007057923866766, "tests/notices/test_core.py::test__conda_user_story__only_see_once": 0.21046136372666505, "tests/notices/test_core.py::test_display_notices_happy_path[200]": 0.3588409190338839, "tests/notices/test_core.py::test_display_notices_happy_path[404]": 0.35922588586512094, "tests/notices/test_core.py::test_display_notices_happy_path[500]": 0.3527042334838735, "tests/notices/test_core.py::test_notices_decorator": 0.2118576209379098, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]": 0.5382848835407467, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]": 0.5806117021259382, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]": 0.5920366252926362, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]": 0.54287130712237, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]": 0.6431355750110966, "tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests": 0.5830005146927213, "tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json": 0.18054409750828937, "tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error": 0.17071506324788688, "tests/notices/test_fetch.py::test_notice_response_cache_expired": 0.0032108957974727893, "tests/notices/test_types.py::test_channel_notice_response": 0.0032682458531572323, "tests/notices/test_types.py::test_channel_notice_response_date_parse_error": 0.003677279762496058, "tests/notices/test_types.py::test_channel_notice_response_integer_id": 0.00337104353291486, "tests/notices/test_types.py::test_channel_notice_undefined_id": 0.0027510107132150317, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer": 0.005510690154991365, "tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list": 0.008036394779175003, "tests/plugins/reporter_backends/test_console.py::test_prompt": 0.0034048920020896965, "tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option": 0.0030360054067023415, "tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin": 0.004028070671171783, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner": 0.0030722202760591327, "tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error": 0.003073517313413007, "tests/plugins/reporter_backends/test_console.py::test_spinner": 0.17811483227544012, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_error": 0.17245834621479794, "tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe": 0.05262880860382246, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error": 0.004440995558287316, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno": 0.004248382390983966, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error": 0.00785009554613117, "tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe": 0.006966544852064212, "tests/plugins/reporter_backends/test_json.py::test_json_handler": 0.0041311629028464615, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled": 0.005660638829003523, "tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled": 0.004905754310590926, "tests/plugins/reporter_backends/test_json.py::test_json_spinner": 0.003611049693225991, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]": 0.015875886504455424, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]": 0.00894984968203431, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]": 0.00772994808331688, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]": 0.008367090464988973, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]": 0.008963149296496062, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]": 0.009563176257582066, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]": 0.008276223694463684, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]": 0.006397391811547099, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]": 0.007162406350872201, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]": 0.006998164665508332, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]": 0.011781447006961664, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]": 0.00838791565484797, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]": 0.00800015559339902, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]": 0.008554105732483708, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]": 0.006931815513229597, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]": 0.011672150826688314, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]": 0.007495635563210778, "tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]": 0.0082759132087907, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails": 1.3466379418855388, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose": 0.7234452045964268, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes": 1.0802666490831117, "tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met": 0.813246943138456, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]": 0.008977506512466411, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]": 0.00928789430549027, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]": 0.011609293140803792, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]": 0.011314278608687762, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]": 0.008734295755155509, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]": 0.016730102851809377, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]": 0.008624352130239717, "tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]": 0.010428676017651467, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported": 4.810820967671605, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]": 6.767817787922704, "tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]": 6.8814076072136725, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]": 0.00911673244378429, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]": 0.0065599691999173, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]": 0.007466797241951139, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]": 0.0076224608010861715, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]": 0.008005840454730496, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]": 0.008743577614902487, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]": 0.007901053000413515, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]": 0.007343427657620289, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]": 0.008552138941267341, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]": 0.008324440148659483, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]": 0.00764689380713016, "tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]": 0.0089609022979844, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\"conda\"-\\u274c]": 0.30753849066101596, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\u2705]": 0.23553904346533117, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\u274c]": 0.2603083469829682, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\u2705]": 0.3104817946396769, "tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\u274c]": 0.21467348950000809, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]": 6.297582319475705, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]": 6.249821056575497, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]": 0.008832447451241426, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]": 0.009110954186630164, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]": 0.011922255388591072, "tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]": 0.014485253335845208, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run": 0.39784037051961885, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes": 0.4148902338991604, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path": 5.0200480939832595, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help": 0.07219343857403447, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose": 4.9970653430133405, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list": 0.13406789903343638, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check": 0.0907472065416626, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment": 0.07609475123204133, "tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment": 0.27861337083033827, "tests/plugins/test_auth_handlers.py::test_duplicated": 0.007665690119912052, "tests/plugins/test_auth_handlers.py::test_get_auth_handler": 0.006969075313656007, "tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple": 0.006524755902660087, "tests/plugins/test_config.py::test_plugin_config_data_env_var_source": 0.0030637448077123486, "tests/plugins/test_config.py::test_plugin_config_data_file_source": 0.013743012054472502, "tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values": 0.002817226344228918, "tests/plugins/test_config.py::test_plugin_config_from_file": 0.011927350585897854, "tests/plugins/test_config.py::test_plugin_describe_parameters": 0.00498968948904248, "tests/plugins/test_config.py::test_plugins_config_from_environment": 0.00579740913945244, "tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect": 0.008023455883016662, "tests/plugins/test_env_specs.py::test_alias_normalization": 0.0030569937796257824, "tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]": 0.0074796005469650595, "tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]": 0.0035393774217524765, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]": 0.008494092560384466, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]": 0.007847486451096754, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]": 0.006594440430049514, "tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]": 0.008694233581499018, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]": 0.01316697181502479, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]": 0.01425829099436836, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]": 0.009831414372863796, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]": 0.010903920305100928, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]": 0.009709585586784496, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error": 0.011734119405942774, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard": 0.017530553904978076, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback": 0.011693781324723264, "tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents": 0.01220711973718158, "tests/plugins/test_env_specs.py::test_detect_spec_with_aliases": 0.005939518169326329, "tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered": 0.0064157387636883745, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]": 0.0030488514844257963, "tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]": 0.00371427228128951, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]": 0.003448699265639732, "tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]": 0.003645143703167264, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]": 0.0031280101406565564, "tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]": 0.0028568878906192197, "tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin": 0.006245848841735704, "tests/plugins/test_env_specs.py::test_get_spec_by_aliases": 0.006398527134109234, "tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection": 0.006730273527893397, "tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors": 0.00736016918818531, "tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers": 0.00765631810376444, "tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename": 0.0116032570959602, "tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable": 0.007368744576399407, "tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled": 0.007090327744443193, "tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found": 0.006804721788143578, "tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist": 0.006354536543177389, "tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection": 0.002946813686977528, "tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls": 0.01802255284536269, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]": 0.017756153623991355, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]": 0.018644908078563956, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]": 0.017703460798188006, "tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]": 0.01726044850038585, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]": 0.018039065965149478, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]": 0.016292394540602006, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]": 0.018206100672976205, "tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]": 0.01747324587470653, "tests/plugins/test_environment_export.py::test_builtin_requirements_exporter": 0.016268720391086663, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]": 0.02027048783265313, "tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]": 0.02870967088032949, "tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]": 1.316152392412993, "tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]": 0.778207160648104, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]": 0.017536309249967272, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]": 0.016873746353078152, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]": 0.01801045610069399, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]": 0.01749626729243094, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]": 0.014790890878769745, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]": 0.018682296850089687, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]": 0.01621336104298367, "tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]": 0.022678629901541663, "tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern": 0.023170417924257874, "tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error": 0.0221987084998075, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]": 0.017262288026560192, "tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]": 0.02076735969670557, "tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility": 0.016224632228501776, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]": 0.015749925612667418, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]": 0.021487865078544124, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]": 0.015594778148439736, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]": 0.020948258046825124, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]": 0.017308069056246635, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]": 0.017224406696144723, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]": 0.016216740032647833, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]": 0.015698985962109738, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]": 0.016613710551387724, "tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]": 0.026334909340930985, "tests/plugins/test_environment_export.py::test_get_environment_exporters": 0.014552350141568329, "tests/plugins/test_environment_export.py::test_multi_platform_export": 0.020169154772262308, "tests/plugins/test_environment_export.py::test_only_one_export[both]": 0.004329890229837614, "tests/plugins/test_environment_export.py::test_only_one_export[export]": 0.0036666251069414502, "tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]": 0.0033263782310122172, "tests/plugins/test_environment_export.py::test_only_one_export[none]": 0.004052532403604741, "tests/plugins/test_environment_export.py::test_single_platform_export": 0.019970567381014673, "tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format": 0.024024565619456838, "tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name": 0.019650522591410535, "tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env": 0.02407763092407155, "tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning": 0.06348324256685361, "tests/plugins/test_health_checks.py::test_health_check_not_ran": 0.08067126131253724, "tests/plugins/test_health_checks.py::test_health_check_ran": 0.07264272032462459, "tests/plugins/test_hookspec.py::test_deprecations[spec_name]": 0.0031193197575130394, "tests/plugins/test_manager.py::test_custom_plugin_name_validation": 0.008085254422215004, "tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]": 0.006214738268686431, "tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]": 0.006113184373585004, "tests/plugins/test_manager.py::test_get_canonical_name_class": 0.006542368999778708, "tests/plugins/test_manager.py::test_get_canonical_name_instance": 0.008144821230154758, "tests/plugins/test_manager.py::test_get_canonical_name_module": 0.0075716593664407646, "tests/plugins/test_manager.py::test_get_canonical_name_object": 0.007913196866782225, "tests/plugins/test_manager.py::test_get_hook_results": 0.0075480150563503505, "tests/plugins/test_manager.py::test_get_request_headers": 0.005785211558514753, "tests/plugins/test_manager.py::test_get_session_headers": 0.005854593280135572, "tests/plugins/test_manager.py::test_get_solvers": 0.008660836242373633, "tests/plugins/test_manager.py::test_get_virtual_package_records": 0.008551033199479982, "tests/plugins/test_manager.py::test_known_solver": 0.005572591981367236, "tests/plugins/test_manager.py::test_load_entrypoints_blocked": 0.020023113469780543, "tests/plugins/test_manager.py::test_load_entrypoints_importerror": 0.02635443956196381, "tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror": 0.0244895820549357, "tests/plugins/test_manager.py::test_load_entrypoints_success": 0.02081504973627186, "tests/plugins/test_manager.py::test_load_plugins_error": 0.005028265473728042, "tests/plugins/test_manager.py::test_load_two_plugins_one_impls": 0.006131178073084071, "tests/plugins/test_manager.py::test_load_without_plugins": 0.005318565139236019, "tests/plugins/test_manager.py::test_plugin_bad_names[42]": 0.0044280517655988965, "tests/plugins/test_manager.py::test_plugin_bad_names[False]": 0.0029957171533611677, "tests/plugins/test_manager.py::test_plugin_bad_names[None]": 0.0032415712129100958, "tests/plugins/test_manager.py::test_plugin_bad_names[True]": 0.003122508126877475, "tests/plugins/test_manager.py::test_plugin_bad_names[name4]": 0.003275519075487663, "tests/plugins/test_manager.py::test_plugin_bad_names[name5]": 0.003880661508921257, "tests/plugins/test_manager.py::test_plugin_name": 0.0029682670845329793, "tests/plugins/test_manager.py::test_unknown_solver": 0.00703963639242222, "tests/plugins/test_package_extractors.py::test_extract_package": 0.021662550161760608, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]": 0.0030290625665706605, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]": 0.003399556193652548, "tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]": 0.004023301412600717, "tests/plugins/test_package_extractors.py::test_get_package_extractors": 0.007852096560838994, "tests/plugins/test_package_extractors.py::test_has_package_extension[-None]": 0.00958531527304922, "tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]": 0.007628268520820376, "tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]": 0.00862464517711072, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]": 0.007956133237427658, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]": 0.008374242823683153, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]": 0.00712881760513211, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]": 0.007445992632944997, "tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]": 0.0077897116552636024, "tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor": 0.013194331998286131, "tests/plugins/test_post_commands.py::test_post_command_action_raises_exception": 0.08068302357334976, "tests/plugins/test_post_commands.py::test_post_command_invoked": 0.08712542703466457, "tests/plugins/test_post_commands.py::test_post_command_not_invoked": 0.09041838527685707, "tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception": 2.3328227966555386, "tests/plugins/test_post_solves.py::test_post_solve_invoked": 5.094257859332086, "tests/plugins/test_post_solves.py::test_post_solve_not_invoked": 0.08201599760545449, "tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception": 0.06230029086796897, "tests/plugins/test_pre_commands.py::test_pre_command_invoked": 0.09129314093078957, "tests/plugins/test_pre_commands.py::test_pre_command_not_invoked": 0.17536706074726083, "tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception": 0.08657864795963423, "tests/plugins/test_pre_solves.py::test_pre_solve_invoked": 2.4695453120760034, "tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked": 0.12236142251893672, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\n test : something\\n\\n]": 0.009365169067500819, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\n \"test\": \"something\"\\n}]": 0.007005687498229698, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\n]": 0.008056675148156674, "tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\"test\"]": 0.008025333166073447, "tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered": 0.006771138736534225, "tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered": 0.006194539238443608, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]": 0.006653411391835246, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]": 0.006345589340338879, "tests/plugins/test_request_headers.py::test_get_request_headers[example.com]": 0.008144098059424447, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]": 0.00598712419980128, "tests/plugins/test_request_headers.py::test_get_request_headers[random.com]": 0.025494286870836956, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]": 0.007032783561165888, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]": 0.006878991426178119, "tests/plugins/test_request_headers.py::test_get_session_headers[example.com]": 0.00703765694935107, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]": 0.0075935525041909285, "tests/plugins/test_request_headers.py::test_get_session_headers[random.com]": 0.0073669041840607385, "tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings": 0.19449053645257086, "tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins": 0.210196759109919, "tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting": 0.09623649839138072, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]": 0.0789919801113439, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]": 0.10242750077416646, "tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]": 0.10363308288001571, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\n map_parameter: {}\\n]": 0.18714377340449692, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]": 0.25092493346149014, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\n seq_parameter: []\\n]": 0.15745751557605991, "tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\n string_parameter: value_one\\n]": 0.16481232651289426, "tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings": 0.35308347765876164, "tests/plugins/test_settings.py::test_conda_config_with_invalid_setting": 0.09380595714595716, "tests/plugins/test_settings.py::test_conda_config_with_map_settings": 0.20213400208497723, "tests/plugins/test_settings.py::test_conda_config_with_sequence_settings": 0.2022883663050726, "tests/plugins/test_settings.py::test_conda_config_with_string_settings": 0.243344116087706, "tests/plugins/test_settings.py::test_get_settings": 0.005662987026243048, "tests/plugins/test_settings.py::test_load_configuration_parameters": 0.006853310174864632, "tests/plugins/test_settings.py::test_load_plugin_config_with_env_var": 0.017499289558656067, "tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc": 0.018876155921854376, "tests/plugins/test_solvers.py::test_duplicated": 0.008369093230795849, "tests/plugins/test_solvers.py::test_get_cached_solver_backend": 0.009422568255713686, "tests/plugins/test_solvers.py::test_get_conflicting_solvers": 0.006217978448739531, "tests/plugins/test_solvers.py::test_get_no_solver": 0.005482644711644902, "tests/plugins/test_solvers.py::test_get_one_solver": 0.006730303278486053, "tests/plugins/test_solvers.py::test_get_solver_backend": 0.01641155444422631, "tests/plugins/test_solvers.py::test_get_solver_backend_multiple": 0.016771564817395005, "tests/plugins/test_solvers.py::test_get_two_solvers": 0.006695170782201824, "tests/plugins/test_solvers.py::test_solver_user_agent": 0.01665571853597892, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]": 0.06177260556537377, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]": 0.06226391137041998, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]": 0.0675800940970349, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]": 0.08608266938810231, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]": 0.07513000878264524, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]": 0.06140359189716622, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]": 0.057411996240643366, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]": 0.0640488712042599, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]": 0.06234793988592619, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]": 0.0562080393610683, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]": 0.06201006758482683, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]": 0.07061573965989579, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]": 0.07887011101473526, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]": 0.08545970344759764, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]": 0.05802724990717212, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]": 0.065092972818858, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]": 0.06104474672530978, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]": 0.05919975456968734, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]": 0.07538229353693991, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]": 0.06299568361248119, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]": 0.08074024764327446, "tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]": 0.06356854133168038, "tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser": 0.061556785419216546, "tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser": 0.07862055262275564, "tests/plugins/test_subcommands.py::test_duplicated": 0.0057731822583853894, "tests/plugins/test_subcommands.py::test_help": 0.050954946550567, "tests/plugins/test_subcommands.py::test_invoked": 0.07698505412312652, "tests/plugins/test_subcommands.py::test_parser_no_plugins": 0.08041981941622058, "tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception": 0.6404788935587888, "tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception": 1.1507677641662768, "tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked": 0.6020245166245038, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields": 0.0028872865716188267, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name": 0.0028484493729574126, "tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved": 0.003088349874418517, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields": 0.0024844005083586866, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name": 0.002682113371995512, "tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved": 0.0027951353499335177, "tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]": 0.9155074717026079, "tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]": 0.42989588258824385, "tests/plugins/test_virtual_packages.py::test_conda_virtual_package": 0.18528061166265875, "tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]": 0.006146202871338018, "tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]": 0.007645233713510137, "tests/plugins/test_virtual_packages.py::test_cuda_detection": 0.8830738058967486, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]": 0.012268142943350567, "tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]": 0.014623105741153873, "tests/plugins/test_virtual_packages.py::test_duplicated": 5.46863610457061, "tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]": 0.0850121693783034, "tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]": 0.01753208275339104, "tests/plugins/test_virtual_packages.py::test_invoked": 10.073163870885999, "tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]": 0.13194370390661303, "tests/plugins/test_virtual_packages.py::test_linux_override[None-True]": 0.3186377419880483, "tests/plugins/test_virtual_packages.py::test_linux_value": 0.021509913486780732, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda": 1.7684846435156838, "tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched": 0.0030077384507636922, "tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]": 0.18206731992776873, "tests/plugins/test_virtual_packages.py::test_osx_override[None-False]": 0.17099377735915752, "tests/plugins/test_virtual_packages.py::test_osx_value": 0.1851026711234215, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]": 0.005760275512660375, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]": 0.007536551836279036, "tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]": 0.006500899900666107, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]": 0.00627737955667956, "tests/plugins/test_virtual_packages.py::test_override_package_values[build override]": 0.00693018626692723, "tests/plugins/test_virtual_packages.py::test_override_package_values[no override]": 0.006989725562024294, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]": 0.007210172353739085, "tests/plugins/test_virtual_packages.py::test_override_package_values[version override]": 0.0075351215056720135, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]": 0.005375070916715054, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]": 0.0049407674123928425, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]": 0.007513942850329148, "tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]": 0.0048427485011914755, "tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]": 0.021496093146411873, "tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]": 0.018615620055698667, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]": 0.018728839385534646, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]": 0.01962486604219331, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]": 0.017406860622091343, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]": 0.02218299271192618, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]": 0.01824059816962396, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]": 0.02133575797917302, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]": 0.019776590750856707, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]": 0.018761136891662245, "tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]": 0.02053113765474566, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]": 0.01823272561242075, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]": 0.02424930050214297, "tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]": 0.018783388633198585, "tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]": 0.017466387109981076, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]": 0.0181591801528609, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]": 0.018760478340339948, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]": 0.02007159575746052, "tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]": 0.016857272061901987, "tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]": 0.02275127912617051, "tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]": 0.006007388238801088, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]": 0.006513449096258592, "tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]": 0.006204551934855947, "tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]": 0.019404970808739003, "tests/plugins/test_virtual_packages.py::test_win_override[None-False]": 0.019115347223608994, "tests/plugins/test_virtual_packages.py::test_win_value": 0.017087219092260148, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]": 0.0002458790594808359, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]": 0.00042063285087991665, "tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]": 0.00019875575696461466, "tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]": 0.0003159745632226955, "tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]": 0.00013845824997815726, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]": 0.0002098587464768927, "tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]": 0.0001399300667045376, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]": 0.00020486957180073062, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]": 0.0002490800666150348, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]": 0.00016090733314590893, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]": 0.0001390942660705613, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]": 0.00022614668170484802, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]": 0.00028406664027064664, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]": 0.00014893552496879884, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]": 0.00021093394115634552, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]": 0.00013911547315435786, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]": 0.0003121441761457033, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]": 0.0001383077170960685, "tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]": 0.0001641709216783755, "tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]": 0.0002680293877887613, "tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]": 0.0008555203299887173, "tests/shell/test_csh.py::test_basic_integration[csh]": 5.782904011471404, "tests/shell/test_csh.py::test_basic_integration[tcsh]": 6.45835370351718, "tests/shell/test_csh.py::test_shell_available[csh]": 0.005801910700657312, "tests/shell/test_csh.py::test_shell_available[tcsh]": 0.0016348798300461923, "tests/shell/test_fish.py::test_fish_basic_integration[fish]": 16.553252755891833, "tests/shell/test_fish.py::test_fish_disable_prompt": 0.04002660382289743, "tests/shell/test_fish.py::test_fish_prompt_functions_in_hook": 0.025940803163042862, "tests/shell/test_fish.py::test_shell_available[fish]": 0.003480408591897288, "tests/shell/test_posix.py::test_bash_activate_error[ash]": 0.00022489826312394864, "tests/shell/test_posix.py::test_bash_activate_error[bash]": 4.333333465566059, "tests/shell/test_posix.py::test_bash_activate_error[dash]": 3.9077182643181265, "tests/shell/test_posix.py::test_bash_activate_error[zsh]": 3.933610067817321, "tests/shell/test_posix.py::test_basic_integration[ash]": 0.00020077279725626103, "tests/shell/test_posix.py::test_basic_integration[bash]": 18.72139708631054, "tests/shell/test_posix.py::test_basic_integration[dash]": 15.786398527837239, "tests/shell/test_posix.py::test_basic_integration[zsh]": 14.269164675967236, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]": 0.00014093250931358176, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]": 5.903254690329539, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]": 0.0007039696829239963, "tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]": 5.42648422340978, "tests/shell/test_posix.py::test_shell_available[ash]": 0.00024929907975246464, "tests/shell/test_posix.py::test_shell_available[bash]": 0.0008256895662998032, "tests/shell/test_posix.py::test_shell_available[dash]": 0.0026376560161624507, "tests/shell/test_posix.py::test_shell_available[zsh]": 0.0024175747948098616, "tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]": 7.2476489560040225, "tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]": 12.217302827602913, "tests/shell/test_powershell.py::test_shell_available[powershell]": 0.0013387154864506832, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]": 0.0003109749971429464, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]": 3.8133376031942756, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]": 0.0004653699274529765, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]": 3.8087155566696547, "tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]": 4.2154871779516405, "tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]": 5.7382223530537475, "tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]": 6.0376758999958575, "tests/shell/test_shell.py::test_stacking[0-None-not-sys]": 6.381297716058559, "tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]": 5.812462940131706, "tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]": 5.743677036327138, "tests/shell/test_shell.py::test_stacking[0-base-not-sys]": 5.4014515246491595, "tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]": 5.23241131087063, "tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]": 5.180682657233605, "tests/shell/test_shell.py::test_stacking[0-has-not-sys]": 5.294801695063204, "tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]": 4.861150139402385, "tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]": 5.457715651725507, "tests/shell/test_shell.py::test_stacking[0-not-not-sys]": 5.434530110608021, "tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,base,sys]": 5.708179749206318, "tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]": 5.564470287904632, "tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]": 5.6035926011917425, "tests/shell/test_shell.py::test_stacking[5-base,not-base-base,base,sys]": 5.847438248825592, "tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]": 5.662016030693767, "tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]": 6.0690570232138645, "tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]": 5.141397686845938, "tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]": 5.05193168878791, "tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]": 5.2321337906058165, "tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]": 4.777258764815082, "tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]": 5.322722087196407, "tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]": 4.882306776290024, "tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]": 5.044867115514644, "tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]": 5.485959755639582, "tests/shell/test_shell.py::test_stacking[5-not-not-sys]": 5.6103257405898095, "tests/shell/test_xonsh.py::test_basic_integration[xonsh]": 11.765378480289904, "tests/shell/test_xonsh.py::test_shell_available[xonsh]": 0.003521802060237461, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]": 0.0005246723909849743, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]": 0.0006734021704437323, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]": 0.0005844013936734922, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]": 0.0005069061692844693, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]": 0.0005036440354119912, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]": 0.0005591097451168865, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]": 0.0005632472932373152, "tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]": 0.0006148346934850531, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]": 0.0006473507228929518, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]": 0.0005413771438345744, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]": 0.0006462888862071032, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]": 0.0006255875612446127, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]": 0.0005628096783635726, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]": 0.0006226076288705982, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]": 0.0007027814671927231, "tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]": 0.0007817917514211244, "tests/test_activate.py::test_PS1": 0.016910813027425458, "tests/test_activate.py::test_PS1_no_changeps1": 0.026089633212275476, "tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env": 0.24236743753026635, "tests/test_activate.py::test_activate_default_env[CmdExeActivator]": 3.708528571962274, "tests/test_activate.py::test_activate_default_env[CshActivator]": 3.8039092424629977, "tests/test_activate.py::test_activate_default_env[FishActivator]": 3.652926683503038, "tests/test_activate.py::test_activate_default_env[PosixActivator]": 4.285253367946306, "tests/test_activate.py::test_activate_default_env[PowerShellActivator]": 3.8392624820278534, "tests/test_activate.py::test_activate_default_env[XonshActivator]": 3.700302838094288, "tests/test_activate.py::test_activate_environment_not_found": 0.01539834954492413, "tests/test_activate.py::test_activate_same_environment": 0.0211122723606492, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]": 0.014577441419619737, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]": 0.013788732410838354, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\n\\\\['env-one', 'env-two'\\\\]\\n]": 0.014547003939142242, "tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\nremainder_args: \\\\['env-one']\\n]": 0.014709333370462164, "tests/test_activate.py::test_add_prefix_to_path_cmdexe": 0.0009417907933933013, "tests/test_activate.py::test_add_prefix_to_path_posix": 0.012556290396404775, "tests/test_activate.py::test_build_activate_dont_activate_unset_var": 0.027527928543606344, "tests/test_activate.py::test_build_activate_dont_use_PATH": 0.023559806439607797, "tests/test_activate.py::test_build_activate_restore_unset_env_vars": 0.02567848124398732, "tests/test_activate.py::test_build_activate_shlvl_0": 0.020332037795361985, "tests/test_activate.py::test_build_activate_shlvl_1": 0.02468502498054346, "tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars": 0.022262752929051957, "tests/test_activate.py::test_build_deactivate_dont_use_PATH": 0.03811840143101291, "tests/test_activate.py::test_build_deactivate_shlvl_1": 0.023247166264818226, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate": 0.027368461413021374, "tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack": 0.02607304658671075, "tests/test_activate.py::test_build_stack_shlvl_1": 0.02492886829370028, "tests/test_activate.py::test_cmd_exe_basic[False]": 0.0006057341503240473, "tests/test_activate.py::test_cmd_exe_basic[True]": 0.0005893224046883573, "tests/test_activate.py::test_csh_basic[False]": 0.0468090471400629, "tests/test_activate.py::test_csh_basic[True]": 0.050547520884082243, "tests/test_activate.py::test_default_env": 0.015939792366073013, "tests/test_activate.py::test_fish_basic[False]": 0.04614205797594405, "tests/test_activate.py::test_fish_basic[True]": 0.04657781443537956, "tests/test_activate.py::test_force_uppercase[False]": 0.026655528984560407, "tests/test_activate.py::test_force_uppercase[True]": 0.02746648180295163, "tests/test_activate.py::test_get_env_vars_big_whitespace": 0.01774654961973053, "tests/test_activate.py::test_get_env_vars_empty_file": 0.019680464600414296, "tests/test_activate.py::test_get_export_unset_vars[False]": 0.026028076487933177, "tests/test_activate.py::test_get_export_unset_vars[True]": 0.023372916422199443, "tests/test_activate.py::test_json_basic[False]": 0.0435296231692352, "tests/test_activate.py::test_json_basic[True]": 0.04751110903710841, "tests/test_activate.py::test_metavars_force_uppercase[False]": 0.023703625723194156, "tests/test_activate.py::test_metavars_force_uppercase[True]": 0.02502527279543966, "tests/test_activate.py::test_msys2_shell_line_endings[ash]": 0.0007644537993299604, "tests/test_activate.py::test_msys2_shell_line_endings[bash]": 0.000555247725275198, "tests/test_activate.py::test_msys2_shell_line_endings[dash]": 0.0007169441260466816, "tests/test_activate.py::test_msys2_shell_line_endings[posix]": 0.0012430328060216015, "tests/test_activate.py::test_msys2_shell_line_endings[zsh]": 0.0006919160453980038, "tests/test_activate.py::test_msys2_shell_stdout_reconfiguration": 0.0005528107574483903, "tests/test_activate.py::test_posix_basic[False]": 0.04905513385811972, "tests/test_activate.py::test_posix_basic[True]": 0.04679945132718183, "tests/test_activate.py::test_powershell_basic[False]": 0.04571305769479569, "tests/test_activate.py::test_powershell_basic[True]": 0.042200473155890796, "tests/test_activate.py::test_pre_post_command_invoked[activate]": 0.022154079914958765, "tests/test_activate.py::test_pre_post_command_invoked[deactivate]": 0.02003147919270893, "tests/test_activate.py::test_pre_post_command_invoked[hook]": 0.032356490313062564, "tests/test_activate.py::test_pre_post_command_invoked[reactivate]": 0.017773944558611032, "tests/test_activate.py::test_pre_post_command_raises[activate]": 0.02298394773021649, "tests/test_activate.py::test_pre_post_command_raises[deactivate]": 0.019295904380797653, "tests/test_activate.py::test_pre_post_command_raises[hook]": 0.02098691226066586, "tests/test_activate.py::test_pre_post_command_raises[reactivate]": 0.020960419009293116, "tests/test_activate.py::test_remove_prefix_from_path_1": 0.014015392201132678, "tests/test_activate.py::test_remove_prefix_from_path_2": 0.01487726187011807, "tests/test_activate.py::test_replace_prefix_in_path_1": 0.01242845904984453, "tests/test_activate.py::test_replace_prefix_in_path_2": 0.0006005416178609227, "tests/test_activate.py::test_xonsh_basic[False]": 0.050166073830990504, "tests/test_activate.py::test_xonsh_basic[True]": 0.0489877385542688, "tests/test_api.py::test_DepsModifier_contract": 0.003492625807495849, "tests/test_api.py::test_PackageCacheData_contract": 0.0036520954158717825, "tests/test_api.py::test_PackageCacheData_return_value_contract": 0.010459680892345119, "tests/test_api.py::test_PrefixData_contract": 0.0035142547040631893, "tests/test_api.py::test_PrefixData_return_value_contract": 0.09334464997820753, "tests/test_api.py::test_Solver_inputs_contract": 0.003951060224723726, "tests/test_api.py::test_Solver_return_value_contract": 2.9044552925252947, "tests/test_api.py::test_SubdirData_contract": 0.0032708914095841684, "tests/test_api.py::test_SubdirData_return_value_contract": 4.620383626360983, "tests/test_api.py::test_UpdateModifier_contract": 0.0031261993972934296, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]": 0.0005824677071077604, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]": 0.000683729127923121, "tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]": 0.0005220852544052363, "tests/test_create.py::test_allow_softlinks[classic]": 0.19097045758172887, "tests/test_create.py::test_allow_softlinks[libmamba]": 0.17205139928262295, "tests/test_create.py::test_channel_usage_replacing_python[classic]": 67.88313387325572, "tests/test_create.py::test_channel_usage_replacing_python[libmamba]": 58.51468430857701, "tests/test_create.py::test_clone_env_with_conda[classic]": 47.28573522728245, "tests/test_create.py::test_clone_env_with_conda[libmamba]": 25.70558957757382, "tests/test_create.py::test_clone_offline_simple[classic]": 1.0944170796826092, "tests/test_create.py::test_clone_offline_simple[libmamba]": 0.8187205062500975, "tests/test_create.py::test_clone_offline_with_untracked[classic]": 1.1061078003324532, "tests/test_create.py::test_clone_offline_with_untracked[libmamba]": 1.3581768254088702, "tests/test_create.py::test_compile_pyc[classic-False]": 10.751070309745632, "tests/test_create.py::test_compile_pyc[classic-True]": 1.453668715806872, "tests/test_create.py::test_compile_pyc[libmamba-False]": 10.772160082644113, "tests/test_create.py::test_compile_pyc[libmamba-True]": 1.4929279506996012, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]": 1.9523717574244361, "tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]": 1.8653956252986603, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]": 23.94965319848013, "tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]": 24.577934761557334, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]": 0.0002033764683804794, "tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]": 0.00020410707211520327, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]": 0.023814191972481503, "tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]": 0.018703862738665762, "tests/test_create.py::test_conda_update_package_not_installed[classic]": 0.021870647376956882, "tests/test_create.py::test_conda_update_package_not_installed[libmamba]": 0.03184883339225639, "tests/test_create.py::test_create_default_packages[classic]": 0.9353886114730591, "tests/test_create.py::test_create_default_packages[libmamba]": 1.2135860364251636, "tests/test_create.py::test_create_default_packages_no_default_packages[classic]": 1.1261365699842325, "tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]": 1.0401425296829088, "tests/test_create.py::test_create_download_only_without_prefix[classic]": 0.4325701067478934, "tests/test_create.py::test_create_download_only_without_prefix[libmamba]": 0.4360730943417712, "tests/test_create.py::test_create_dry_run[classic]": 1.2772371135023306, "tests/test_create.py::test_create_dry_run[libmamba]": 1.740715172327587, "tests/test_create.py::test_create_dry_run_json[classic]": 0.5206226640470839, "tests/test_create.py::test_create_dry_run_json[libmamba]": 0.6241330839500719, "tests/test_create.py::test_create_dry_run_without_prefix[classic]": 0.17793924506283773, "tests/test_create.py::test_create_dry_run_without_prefix[libmamba]": 0.16245431781081338, "tests/test_create.py::test_create_dry_run_yes_safety[classic]": 0.018842038753135816, "tests/test_create.py::test_create_dry_run_yes_safety[libmamba]": 0.02976797144770717, "tests/test_create.py::test_create_empty_env[classic]": 0.2356111448725942, "tests/test_create.py::test_create_empty_env[libmamba]": 0.7743431530789022, "tests/test_create.py::test_create_env_different_platform[classic-cli]": 1.0963791308315165, "tests/test_create.py::test_create_env_different_platform[classic-env]": 1.0096003474309687, "tests/test_create.py::test_create_env_different_platform[libmamba-cli]": 1.0815446979163947, "tests/test_create.py::test_create_env_different_platform[libmamba-env]": 0.5634945538942588, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]": 0.029673345074735735, "tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]": 0.023684691788109558, "tests/test_create.py::test_create_install_update_remove_smoketest[classic]": 26.508850178905096, "tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]": 22.219018039491477, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]": 0.016727534054244236, "tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]": 0.01970398898833572, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]": 1.0691139607208011, "tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]": 1.041789816337657, "tests/test_create.py::test_create_name_overrides_file[classic]": 1.0253661320187224, "tests/test_create.py::test_create_name_overrides_file[libmamba]": 1.059079069069906, "tests/test_create.py::test_create_no_deps_flag[classic]": 0.5378645823436494, "tests/test_create.py::test_create_no_deps_flag[libmamba]": 0.24032002242470935, "tests/test_create.py::test_create_only_deps_flag[classic]": 2.9655373084008922, "tests/test_create.py::test_create_only_deps_flag[libmamba]": 2.497389444256294, "tests/test_create.py::test_create_override_channels_enabled[classic]": 1.106929219221621, "tests/test_create.py::test_create_override_channels_enabled[libmamba]": 1.554103890483582, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]": 0.015250393097347603, "tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]": 0.017075198959932657, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]": 0.020440265632460403, "tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]": 0.01976803461610719, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]": 1.0057856780217427, "tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]": 1.0713124552124507, "tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]": 0.023960630251046548, "tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]": 0.028415098797019332, "tests/test_create.py::test_cross_channel_incompatibility[classic]": 8.900357910908015, "tests/test_create.py::test_cross_channel_incompatibility[libmamba]": 3.446952355811601, "tests/test_create.py::test_directory_not_a_conda_environment[classic]": 0.07951794013118989, "tests/test_create.py::test_directory_not_a_conda_environment[libmamba]": 0.02196528243699194, "tests/test_create.py::test_disallowed_packages[classic]": 2.7002199269588956, "tests/test_create.py::test_disallowed_packages[libmamba]": 1.5439778984617267, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]": 0.029725573155844155, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]": 0.07784199342193587, "tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]": 0.02742656588422457, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]": 0.02223852191702872, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]": 0.034521081139561, "tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]": 0.03312793750348629, "tests/test_create.py::test_dont_remove_conda_1[classic]": 31.331331054431125, "tests/test_create.py::test_dont_remove_conda_1[libmamba]": 20.73568649932129, "tests/test_create.py::test_dont_remove_conda_2[classic]": 31.18630084013002, "tests/test_create.py::test_dont_remove_conda_2[libmamba]": 20.86660038196799, "tests/test_create.py::test_dont_remove_conda_3[classic]": 50.58559115162624, "tests/test_create.py::test_dont_remove_conda_3[libmamba]": 28.360798654874586, "tests/test_create.py::test_download_only_flag[classic]": 1.624882210051123, "tests/test_create.py::test_download_only_flag[libmamba]": 2.55784792362599, "tests/test_create.py::test_force_remove[classic]": 2.9595843782733637, "tests/test_create.py::test_force_remove[libmamba]": 3.5410473941296963, "tests/test_create.py::test_install_bound_virtual_package[classic]": 0.00025325692809685847, "tests/test_create.py::test_install_bound_virtual_package[libmamba]": 0.00042185590325146256, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]": 2.7659658441338477, "tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]": 3.2385470695202216, "tests/test_create.py::test_install_force_reinstall_flag[classic]": 0.3559422397317964, "tests/test_create.py::test_install_force_reinstall_flag[libmamba]": 0.613524843587271, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]": 1.9399409968776993, "tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]": 2.0725709452330805, "tests/test_create.py::test_install_only_deps_flag[classic]": 1.0683579617015582, "tests/test_create.py::test_install_only_deps_flag[libmamba]": 1.1901377245512768, "tests/test_create.py::test_install_prune_flag[classic]": 13.319500993186987, "tests/test_create.py::test_install_prune_flag[libmamba]": 11.429875213983227, "tests/test_create.py::test_install_python_and_search[classic]": 25.104264344482413, "tests/test_create.py::test_install_python_and_search[libmamba]": 17.98075769343601, "tests/test_create.py::test_install_tarball_from_file_based_channel[classic]": 0.8399149669203245, "tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]": 1.2972600459981587, "tests/test_create.py::test_install_update_deps_flag[classic]": 1.6268467456458346, "tests/test_create.py::test_install_update_deps_flag[libmamba]": 1.4353339746343834, "tests/test_create.py::test_install_update_deps_only_deps_flags[classic]": 2.000208748661193, "tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]": 2.047786342357797, "tests/test_create.py::test_install_virtual_packages[classic-__glibc-False]": 0.91010250784694, "tests/test_create.py::test_install_virtual_packages[classic-__linux-False]": 1.196957124820189, "tests/test_create.py::test_install_virtual_packages[classic-__osx-True]": 0.43194616818453235, "tests/test_create.py::test_install_virtual_packages[classic-__unix-True]": 0.4092945489263785, "tests/test_create.py::test_install_virtual_packages[classic-__win-False]": 0.7514677663841479, "tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-False]": 1.05500607940086, "tests/test_create.py::test_install_virtual_packages[libmamba-__linux-False]": 0.8382073622005697, "tests/test_create.py::test_install_virtual_packages[libmamba-__osx-True]": 0.9146049314962565, "tests/test_create.py::test_install_virtual_packages[libmamba-__unix-True]": 0.8710379250490972, "tests/test_create.py::test_install_virtual_packages[libmamba-__win-False]": 0.8555915116014556, "tests/test_create.py::test_json_create_install_update_remove[classic]": 1.1496353517449212, "tests/test_create.py::test_json_create_install_update_remove[libmamba]": 4.074095050842808, "tests/test_create.py::test_list_with_pip_no_binary[classic]": 12.296941562401221, "tests/test_create.py::test_list_with_pip_no_binary[libmamba]": 10.57778716149989, "tests/test_create.py::test_list_with_pip_wheel[classic]": 18.947441813718363, "tests/test_create.py::test_list_with_pip_wheel[libmamba]": 17.02018346011683, "tests/test_create.py::test_menuinst_v2[classic]": 2.2386456189710993, "tests/test_create.py::test_menuinst_v2[libmamba]": 2.8403619881564692, "tests/test_create.py::test_mix_explicit_and_packages[classic-create]": 0.08250883026523723, "tests/test_create.py::test_mix_explicit_and_packages[classic-install]": 0.025744663530760103, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]": 0.041514198596031754, "tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]": 0.02074430752467978, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]": 0.22006636634315502, "tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]": 0.10615523491873802, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]": 0.1411405320602886, "tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]": 0.1634120200006421, "tests/test_create.py::test_must_provide_args_to_install[classic]": 0.021405002398688113, "tests/test_create.py::test_must_provide_args_to_install[libmamba]": 0.0275064644962914, "tests/test_create.py::test_neutering_of_historic_specs[classic]": 0.00014250679505675685, "tests/test_create.py::test_neutering_of_historic_specs[libmamba]": 0.00032951483864024394, "tests/test_create.py::test_no_channels[classic]": 0.021480409853436303, "tests/test_create.py::test_no_channels[libmamba]": 0.024062326640204048, "tests/test_create.py::test_noarch_generic_package[classic]": 0.7101447008162439, "tests/test_create.py::test_noarch_generic_package[libmamba]": 0.3725265375362923, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]": 17.14187073624195, "tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]": 17.626584722964616, "tests/test_create.py::test_noarch_python_package_with_entry_points[classic]": 11.803124422041332, "tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]": 14.43448279200523, "tests/test_create.py::test_noarch_python_package_without_entry_points[classic]": 9.405674408668489, "tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]": 14.034553697756811, "tests/test_create.py::test_nonadmin_file_untouched[classic]": 2.05041183390323, "tests/test_create.py::test_nonadmin_file_untouched[libmamba]": 2.0043944629869337, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]": 0.03002431506553347, "tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]": 0.048048049623064096, "tests/test_create.py::test_offline_with_empty_index_cache[classic]": 3.2151878479833003, "tests/test_create.py::test_offline_with_empty_index_cache[libmamba]": 4.599605530505972, "tests/test_create.py::test_override_channels_disabled[classic]": 0.05854919871884532, "tests/test_create.py::test_override_channels_disabled[libmamba]": 0.04532562680211737, "tests/test_create.py::test_package_cache_regression[classic]": 0.9991344311856702, "tests/test_create.py::test_package_cache_regression[libmamba]": 0.8575035640826982, "tests/test_create.py::test_package_optional_pinning[classic]": 2.042795581994633, "tests/test_create.py::test_package_optional_pinning[libmamba]": 2.0739727826206424, "tests/test_create.py::test_package_pinning[classic]": 2.508352900009489, "tests/test_create.py::test_package_pinning[libmamba]": 2.8189612382817595, "tests/test_create.py::test_packages_not_found[classic]": 0.7593521905181035, "tests/test_create.py::test_packages_not_found[libmamba]": 1.5670780868193561, "tests/test_create.py::test_pinned_override_with_explicit_spec[classic]": 1.2916743141871017, "tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]": 0.4317556728168961, "tests/test_create.py::test_post_link_run_in_env[classic]": 2.1473524921103713, "tests/test_create.py::test_post_link_run_in_env[libmamba]": 2.1949800713888736, "tests/test_create.py::test_python_site_packages_path[classic]": 2.362631334163523, "tests/test_create.py::test_python_site_packages_path[libmamba]": 2.284918739716196, "tests/test_create.py::test_remove_empty_env[classic]": 0.9992973236311691, "tests/test_create.py::test_remove_empty_env[libmamba]": 1.526236210405812, "tests/test_create.py::test_remove_force_remove_flag[classic]": 10.800829202881651, "tests/test_create.py::test_remove_force_remove_flag[libmamba]": 12.402270043267958, "tests/test_create.py::test_remove_ignore_nonenv[classic]": 0.019421873126434418, "tests/test_create.py::test_remove_ignore_nonenv[libmamba]": 0.03055672124438778, "tests/test_create.py::test_remove_spellcheck[classic]": 0.9474763115536209, "tests/test_create.py::test_remove_spellcheck[libmamba]": 0.9625504136583307, "tests/test_create.py::test_repodata_v2_base_url[classic]": 1.156951921909545, "tests/test_create.py::test_repodata_v2_base_url[libmamba]": 1.17937915485256, "tests/test_create.py::test_rm_rf[classic]": 8.305353551170686, "tests/test_create.py::test_rm_rf[libmamba]": 8.736023647984604, "tests/test_create.py::test_run_preserves_arguments[classic]": 12.03162050593929, "tests/test_create.py::test_run_preserves_arguments[libmamba]": 12.382208102612427, "tests/test_create.py::test_run_script_called[classic]": 0.00017107834439094243, "tests/test_create.py::test_run_script_called[libmamba]": 0.00020248723331163848, "tests/test_create.py::test_safety_checks_disabled[classic]": 9.491944830629935, "tests/test_create.py::test_safety_checks_disabled[libmamba]": 8.642464585729865, "tests/test_create.py::test_safety_checks_enabled[classic]": 6.525433254849894, "tests/test_create.py::test_safety_checks_enabled[libmamba]": 7.385361374954012, "tests/test_create.py::test_safety_checks_warn[classic]": 13.114435020218446, "tests/test_create.py::test_safety_checks_warn[libmamba]": 12.619409773008371, "tests/test_create.py::test_search_override_channels_enabled[classic]": 1.2822596151664194, "tests/test_create.py::test_search_override_channels_enabled[libmamba]": 3.393941107319437, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]": 0.7424729939777528, "tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]": 1.6058812716289605, "tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]": 0.7234791136308492, "tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]": 1.66828943833921, "tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]": 0.7576608935877068, "tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]": 1.555409853182622, "tests/test_create.py::test_strict_channel_priority[classic]": 0.0003104461521301036, "tests/test_create.py::test_strict_channel_priority[libmamba]": 0.0002925206990387271, "tests/test_create.py::test_strict_resolve_get_reduced_index[classic]": 15.58024238818084, "tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]": 14.72896878337811, "tests/test_create.py::test_tarball_install[classic]": 1.0195648404409616, "tests/test_create.py::test_tarball_install[libmamba]": 1.3671960162711279, "tests/test_create.py::test_tarball_install_and_bad_metadata[classic]": 3.0090546607528497, "tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]": 2.7176686740559592, "tests/test_create.py::test_transactional_rollback_simple[classic]": 1.2326534086292142, "tests/test_create.py::test_transactional_rollback_simple[libmamba]": 1.2257367622913173, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]": 2.0857767349917737, "tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]": 2.034331339247575, "tests/test_create.py::test_update_all_updates_pip_pkg[classic]": 11.740064329929645, "tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]": 14.785368049917578, "tests/test_create.py::test_update_deps_flag_absent[classic]": 1.7258403317310034, "tests/test_create.py::test_update_deps_flag_absent[libmamba]": 1.6653954112652651, "tests/test_create.py::test_update_deps_flag_present[classic]": 2.075812184341522, "tests/test_create.py::test_update_deps_flag_present[libmamba]": 2.2352869782009672, "tests/test_create.py::test_update_with_pinned_packages[classic]": 1.3115646102665963, "tests/test_create.py::test_update_with_pinned_packages[libmamba]": 1.1073856679138019, "tests/test_create.py::test_use_index_cache[classic]": 5.361974587606935, "tests/test_create.py::test_use_index_cache[libmamba]": 5.666767704408559, "tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json": 0.6114771338124001, "tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json": 0.5446047338749054, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]": 0.0034788951878397256, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]": 0.0048697448125381015, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]": 0.003040599624910101, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]": 0.0031713303749398847, "tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]": 0.002951691124849276, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]": 0.004020251999889979, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]": 0.0031425132499833808, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]": 0.0035779628124430474, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]": 0.0028907900624375316, "tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]": 0.0035395702499982917, "tests/test_deprecations.py::test_action[future]": 0.0044182438317234285, "tests/test_deprecations.py::test_action[pending]": 0.00541664716009917, "tests/test_deprecations.py::test_action[remove]": 0.005431950371035186, "tests/test_deprecations.py::test_arguments[deprecated]": 0.0032466886583508046, "tests/test_deprecations.py::test_arguments[pending]": 0.0032989802700975532, "tests/test_deprecations.py::test_arguments[remove]": 0.003003788489044623, "tests/test_deprecations.py::test_class[deprecated]": 0.003677719167976667, "tests/test_deprecations.py::test_class[pending]": 0.0035809882408914984, "tests/test_deprecations.py::test_class[remove]": 0.002947096326060928, "tests/test_deprecations.py::test_constant[deprecated]": 0.0075183894183992635, "tests/test_deprecations.py::test_constant[pending]": 0.005277445718125409, "tests/test_deprecations.py::test_constant[remove]": 0.005372092152927018, "tests/test_deprecations.py::test_constant_factory": 0.0048106862031538355, "tests/test_deprecations.py::test_constant_factory_rejects_non_callable": 0.003224860546811925, "tests/test_deprecations.py::test_constant_multiple_same_module": 0.005467764958935707, "tests/test_deprecations.py::test_constant_rejects_value_and_factory_together": 0.0029825083437806654, "tests/test_deprecations.py::test_constant_requires_value_or_factory": 0.003131149124989463, "tests/test_deprecations.py::test_function[deprecated]": 0.003940224642472782, "tests/test_deprecations.py::test_function[pending]": 0.004158515388757535, "tests/test_deprecations.py::test_function[remove]": 0.003690210341599531, "tests/test_deprecations.py::test_get_module": 0.009101402134518669, "tests/test_deprecations.py::test_method[deprecated]": 0.003427724884338752, "tests/test_deprecations.py::test_method[pending]": 0.0038246018066272025, "tests/test_deprecations.py::test_method[remove]": 0.0035730076325666254, "tests/test_deprecations.py::test_module[deprecated]": 0.005709873295769871, "tests/test_deprecations.py::test_module[pending]": 0.005757026679910626, "tests/test_deprecations.py::test_module[remove]": 0.006056554962537127, "tests/test_deprecations.py::test_topic[deprecated]": 0.003097506555348576, "tests/test_deprecations.py::test_topic[pending]": 0.00296491721772514, "tests/test_deprecations.py::test_topic[remove]": 0.00292892632514946, "tests/test_deprecations.py::test_version_fallback": 0.0028319130509619206, "tests/test_exceptions.py::test_BasicClobberError": 0.015000954344287255, "tests/test_exceptions.py::test_BinaryPrefixReplacementError": 0.030370508470238176, "tests/test_exceptions.py::test_CommandNotFoundError_conda_build": 0.023137409712241812, "tests/test_exceptions.py::test_CommandNotFoundError_simple": 0.08503779496540848, "tests/test_exceptions.py::test_CondaFileNotFoundError": 0.02614457214957533, "tests/test_exceptions.py::test_CondaHTTPError": 0.02407791812465141, "tests/test_exceptions.py::test_CondaKeyError": 0.025560102345471476, "tests/test_exceptions.py::test_DirectoryNotFoundError": 0.026135163094552372, "tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]": 0.003971167691771904, "tests/test_exceptions.py::test_KnownPackageClobberError": 0.014781273146093395, "tests/test_exceptions.py::test_MD5MismatchError": 0.026274952658436636, "tests/test_exceptions.py::test_PackageNotFoundError": 0.024508435187888086, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]": 0.014566723538497504, "tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]": 0.0149513020619996, "tests/test_exceptions.py::test_SharedLinkPathClobberError": 0.015666147355176754, "tests/test_exceptions.py::test_TooManyArgumentsError": 0.026383062166684457, "tests/test_exceptions.py::test_UnknownPackageClobberError": 0.015891970896068582, "tests/test_exceptions.py::test_http_error_custom_reason_code": 0.0265675500290234, "tests/test_exceptions.py::test_http_error_rfc_9457": 0.030241939395618582, "tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error": 0.003381930703149294, "tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]": 0.0029285635310323244, "tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]": 0.0034057841093861896, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1": 0.1980406683991565, "tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2": 0.1907824252358664, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_1": 0.22829197418619415, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_2": 0.21139891378094802, "tests/test_exceptions.py::test_print_unexpected_error_message_upload_3": 0.18070197011762915, "tests/test_exceptions.py::test_proxy_error_custom_message": 0.0030477522368924184, "tests/test_exceptions.py::test_proxy_error_default_message": 0.0029993754732567813, "tests/test_exports.py::test_deprecations[CondaError-TypeError]": 0.00351226590418312, "tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]": 0.0032071638855415583, "tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]": 0.003067757260464929, "tests/test_exports.py::test_deprecations[CondaOSError-TypeError]": 0.0034596477905702223, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]": 0.003340440686342228, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]": 0.003191441620195099, "tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]": 0.0035293169241464237, "tests/test_exports.py::test_deprecations[EntityEncoder-None]": 0.0029511192175821163, "tests/test_exports.py::test_deprecations[LinkError-TypeError]": 0.003384041074396847, "tests/test_exports.py::test_deprecations[LockError-TypeError]": 0.003298916368299331, "tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]": 0.0030236989891263433, "tests/test_exports.py::test_deprecations[PY3-TypeError]": 0.003971405545943702, "tests/test_exports.py::test_deprecations[PaddingError-TypeError]": 0.0029866695176146863, "tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]": 0.003025143773549552, "tests/test_exports.py::test_deprecations[StringIO-None]": 0.0034403012345046347, "tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]": 0.0033175728305442787, "tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]": 0.0038477199851570535, "tests/test_exports.py::test_deprecations[input-OSError]": 0.0029429662357645546, "tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]": 0.0036691124626821855, "tests/test_exports.py::test_deprecations[string_types-None]": 0.003337017713992612, "tests/test_exports.py::test_deprecations[text_type-None]": 0.0036426997353251733, "tests/test_features.py::test_install_track_features_downgrade": 3.8418179492930693, "tests/test_features.py::test_install_track_features_upgrade": 4.069982759552939, "tests/test_features.py::test_remove_features_downgrade": 1.7453559414100104, "tests/test_features.py::test_remove_features_upgrade": 2.0062550155882897, "tests/test_fetch.py::test_checksum_checks_bytes[bad-type]": 0.015820595968499183, "tests/test_fetch.py::test_checksum_checks_bytes[gibberish]": 0.016717528127739682, "tests/test_fetch.py::test_checksum_checks_bytes[original]": 0.02381266494523575, "tests/test_fetch.py::test_checksum_checks_bytes[upper]": 0.02248818008901487, "tests/test_fetch.py::test_download_connectionerror": 2.06096880005465, "tests/test_fetch.py::test_download_http_errors": 0.021451091408166312, "tests/test_fetch.py::test_download_httperror": 0.04206497788096284, "tests/test_fetch.py::test_download_size_none": 0.013571278712536763, "tests/test_fetch.py::test_download_text": 0.012280460648132287, "tests/test_fetch.py::test_download_when_ranges_not_supported": 0.018060535266706746, "tests/test_fetch.py::test_fetchrepodate_connectionerror": 2.0260956231628837, "tests/test_fetch.py::test_resume_bad_partial": 0.018534390316048296, "tests/test_fetch.py::test_resume_download": 0.05421581736441532, "tests/test_fetch.py::test_resume_partial": 0.04847186257123998, "tests/test_fetch.py::test_tmpDownload": 0.14452757046199594, "tests/test_history.py::test_calls_update_on_exit": 0.008535112211056302, "tests/test_history.py::test_comment_parsing[conda 4.5.1]": 0.0029815188769499734, "tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]": 0.0030514926475957316, "tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]": 0.002969354515175742, "tests/test_history.py::test_comment_parsing[post 4.4, install spec]": 0.0031485661879629926, "tests/test_history.py::test_comment_parsing[post 4.4, update spec]": 0.0026657024785347577, "tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]": 0.0028324806151136897, "tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]": 0.003611070082663764, "tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]": 0.003283436440998297, "tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]": 0.0030232597817952812, "tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]": 0.003019264323983136, "tests/test_history.py::test_empty_history_check_on_empty_env": 0.00975956657029232, "tests/test_history.py::test_history_malformed": 0.007517578645969741, "tests/test_history.py::test_parse_on_empty_env": 0.009691744812870644, "tests/test_history.py::test_returns_history_object_as_context_object": 0.007859093124813879, "tests/test_history.py::test_user_requests[0]": 0.004371099409547981, "tests/test_history.py::test_user_requests[1]": 0.0042620156340991405, "tests/test_history.py::test_user_requests[2]": 0.0037746849411675948, "tests/test_history.py::test_user_requests[3]": 0.003695436425266963, "tests/test_history.py::test_user_requests[4]": 0.0032948410138273483, "tests/test_history.py::test_user_requests[5]": 0.0035994256228339843, "tests/test_history.py::test_works_as_context_manager": 0.0061098206556154545, "tests/test_install.py::test_binary[linux-64]": 0.009776732354310662, "tests/test_install.py::test_binary[noarch]": 0.007230797519658728, "tests/test_install.py::test_binary[win-64]": 0.01335847066052624, "tests/test_install.py::test_default_text": 0.008173238158757864, "tests/test_install.py::test_ends_with_newl[linux-64]": 0.003485453630753459, "tests/test_install.py::test_ends_with_newl[noarch]": 0.0031685618581675638, "tests/test_install.py::test_ends_with_newl[win-64]": 0.003420285490404081, "tests/test_install.py::test_long_default_text": 0.006562090636358963, "tests/test_install.py::test_multiple[linux-64]": 0.0038053858991430323, "tests/test_install.py::test_multiple[noarch]": 0.0031640410733866377, "tests/test_install.py::test_multiple[win-64]": 0.0034344216915800797, "tests/test_install.py::test_no_extra[linux-64]": 0.00304755049035602, "tests/test_install.py::test_no_extra[noarch]": 0.003969851898703473, "tests/test_install.py::test_no_extra[win-64]": 0.003418109780306016, "tests/test_install.py::test_read_no_link": 0.006409740988742783, "tests/test_install.py::test_shorter[linux-64]": 0.002888802880764943, "tests/test_install.py::test_shorter[noarch]": 0.0032388927977170623, "tests/test_install.py::test_shorter[win-64]": 0.0041452385271300895, "tests/test_install.py::test_simple[linux-64]": 0.004606091655834078, "tests/test_install.py::test_simple[noarch]": 0.0036431161803321794, "tests/test_install.py::test_simple[win-64]": 0.00462715649040566, "tests/test_install.py::test_spaces[linux-64]": 0.003070803490473728, "tests/test_install.py::test_spaces[noarch]": 0.003359709129703901, "tests/test_install.py::test_spaces[win-64]": 0.00351128135042496, "tests/test_install.py::test_too_long[linux-64]": 0.002723104472152466, "tests/test_install.py::test_too_long[noarch]": 0.003139374509201356, "tests/test_install.py::test_too_long[win-64]": 0.00313746179283155, "tests/test_install.py::test_trash_outside_prefix": 0.1114309753483765, "tests/test_install.py::test_two[linux-64]": 0.003434245117295124, "tests/test_install.py::test_two[noarch]": 0.003113097518428634, "tests/test_install.py::test_two[win-64]": 0.003912564601335407, "tests/test_install.py::test_windows_entry_point": 0.0018638421100382145, "tests/test_install.py::test_yield_lines": 0.005888904305308097, "tests/test_instructions.py::test_check_files_in_tarball_files_exist": 0.0033574874757952484, "tests/test_instructions.py::test_check_files_in_tarball_files_not_exist": 0.0030015709234829124, "tests/test_instructions.py::test_expected_operation_order": 0.00300731616007637, "tests/test_link_order.py::test_link_order_post_link_actions": 2.249750756140972, "tests/test_link_order.py::test_link_order_post_link_depend": 1.9792677411763395, "tests/test_misc.py::test_Utf8NamedTemporaryFile": 0.004304852922879006, "tests/test_misc.py::test_cache_fn_url": 0.0031083347836946816, "tests/test_misc.py::test_deprecations[url_pat-TypeError]": 0.0032257521363478273, "tests/test_misc.py::test_explicit_missing_cache_entries": 1.9245580644345932, "tests/test_misc.py::test_explicit_no_cache": 0.025294800874997005, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]": 0.003491346326908341, "tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.005986860791400265, "tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.005842023608201633, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.006139148483206517, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]": 0.003970263977765232, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]": 0.003578954013422642, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]": 0.00551402418183645, "tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]": 0.005199508444378479, "tests/test_misc.py::test_url_pat_1": 0.003029204915660908, "tests/test_misc.py::test_url_pat_2": 0.0030702262322249807, "tests/test_misc.py::test_url_pat_3": 0.003265474471465242, "tests/test_misc.py::test_walk_prefix": 0.012396213328745099, "tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]": 2.608357664175627, "tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]": 2.68102307970993, "tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]": 2.870552515710332, "tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]": 2.67592430993507, "tests/test_reporters.py::test_confirm_yn_always_yes": 0.01272500348370451, "tests/test_reporters.py::test_confirm_yn_dry_run_exit": 0.01405534961087567, "tests/test_reporters.py::test_confirm_yn_no": 0.013080754250823669, "tests/test_reporters.py::test_confirm_yn_yes": 0.015184873293345407, "tests/test_reporters.py::test_get_progress_bar": 0.0041382413807116505, "tests/test_reporters.py::test_get_progress_bar_context_managers": 0.0026957148828876177, "tests/test_reporters.py::test_render": 0.005929122667597395, "tests/test_resolve.py::test_Resolve_make_channel_priorities": 0.004778115729816266, "tests/test_resolve.py::test_specs_by_name_copy_is_independent": 0.0028499346666918694, "tests/test_solvers.py::TestClassicSolver::test_accelerate": 5.244262261951888, "tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl": 2.924408280822407, "tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.5837607178552465, "tests/test_solvers.py::TestClassicSolver::test_channel_priority_1": 0.021857085780823817, "tests/test_solvers.py::TestClassicSolver::test_circular_dependencies": 2.067609252544417, "tests/test_solvers.py::TestClassicSolver::test_empty": 1.7486225985475088, "tests/test_solvers.py::TestClassicSolver::test_get_dists": 3.299707489841372, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution": 0.6187623748846472, "tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.69907293245369, "tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature": 1.0049669653886268, "tests/test_solvers.py::TestClassicSolver::test_iopro_mkl": 2.314088567216035, "tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl": 1.7044793545419332, "tests/test_solvers.py::TestClassicSolver::test_irrational_version": 0.8317321038667843, "tests/test_solvers.py::TestClassicSolver::test_mkl": 4.203353136830852, "tests/test_solvers.py::TestClassicSolver::test_no_features": 5.19128651353391, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater": 0.6266161597489135, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.6355594751684026, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater": 0.6265794889653652, "tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.6564828836268091, "tests/test_solvers.py::TestClassicSolver::test_nonexistent": 1.1731396320457503, "tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps": 7.244449725408078, "tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean": 3.152323410837957, "tests/test_solvers.py::TestClassicSolver::test_remove": 3.659939109702015, "tests/test_solvers.py::TestClassicSolver::test_scipy_mkl": 2.113473111495055, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_1": 0.5935045020918189, "tests/test_solvers.py::TestClassicSolver::test_surplus_features_2": 0.630682239855327, "tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps": 4.898586093867125, "tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade": 1.8947825317037186, "tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three": 2.4593792819782228, "tests/test_solvers.py::TestClassicSolver::test_unsat_chain": 0.6001223520053686, "tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority": 1.3158308012395143, "tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single": 0.5929891083773617, "tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1": 5.914934025449288, "tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep": 0.5890335709348116, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1": 0.6120793289768797, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2": 0.6133220021582018, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3": 0.6945943588123759, "tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4": 0.6424707282915096, "tests/test_solvers.py::TestClassicSolver::test_unsat_simple": 0.5968485113760914, "tests/test_solvers.py::TestLibMambaSolver::test_accelerate": 0.003379475682498219, "tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl": 0.7793559446955233, "tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal": 0.5302684861182446, "tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1": 0.019267627614120136, "tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies": 1.6646177569765412, "tests/test_solvers.py::TestLibMambaSolver::test_empty": 0.6041463757603918, "tests/test_solvers.py::TestLibMambaSolver::test_get_dists": 0.6434936916367211, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution": 0.5280244020530444, "tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep": 0.5253145074552017, "tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature": 0.6144131510329596, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl": 0.003825201539507539, "tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl": 0.0031538551394951373, "tests/test_solvers.py::TestLibMambaSolver::test_irrational_version": 0.6234909372430631, "tests/test_solvers.py::TestLibMambaSolver::test_mkl": 0.003119788249541848, "tests/test_solvers.py::TestLibMambaSolver::test_no_features": 0.0032241658642971475, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater": 0.5300217272105906, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep": 0.527720278941143, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater": 0.5075887674398054, "tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep": 0.5181913161193624, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent": 1.0067129349200277, "tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps": 5.144002855619975, "tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean": 0.00302261506543326, "tests/test_solvers.py::TestLibMambaSolver::test_remove": 0.0027261691254623463, "tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl": 0.003112466599404695, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1": 0.003008965329713636, "tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2": 0.0030800737400586797, "tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps": 4.203872181240609, "tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade": 0.0037459584011041544, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three": 1.9568347467061125, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain": 0.5330459843134364, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority": 1.004942240595136, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single": 0.5236852350273841, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1": 1.7993064354881565, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep": 0.532090758251297, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1": 0.5428680159150936, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2": 0.4597743241370136, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3": 0.5376438391162703, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4": 0.5544756413486285, "tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple": 0.5110583168969304, "tests/test_utils.py::test_ensure_dir": 0.007325484739053447, "tests/test_utils.py::test_ensure_dir_errors": 0.017416154223105013, "tests/test_utils.py::test_quote_for_shell[!-'!']": 0.0028186698875886113, "tests/test_utils.py::test_quote_for_shell[\"-'\"']": 0.0030323460272758435, "tests/test_utils.py::test_quote_for_shell[#-'#']": 0.0031410666692085654, "tests/test_utils.py::test_quote_for_shell[$-'$']": 0.0029740866259089778, "tests/test_utils.py::test_quote_for_shell[%-%]": 0.002863558044692871, "tests/test_utils.py::test_quote_for_shell[&-'&']": 0.0029168724560673424, "tests/test_utils.py::test_quote_for_shell['-''\"'\"'']": 0.0032034546084106297, "tests/test_utils.py::test_quote_for_shell[(-'(']": 0.0030112329607434457, "tests/test_utils.py::test_quote_for_shell[)-')']": 0.002935573814604108, "tests/test_utils.py::test_quote_for_shell[*-'*']": 0.0030004978853632497, "tests/test_utils.py::test_quote_for_shell[+-+]": 0.0028171452809327645, "tests/test_utils.py::test_quote_for_shell[,-,]": 0.0028992434549739484, "tests/test_utils.py::test_quote_for_shell[---]": 0.004324868645491816, "tests/test_utils.py::test_quote_for_shell[.-.]": 0.002770562707222328, "tests/test_utils.py::test_quote_for_shell[/-/]": 0.002892496011995653, "tests/test_utils.py::test_quote_for_shell[1>/dev/null-'1>/dev/null']": 0.003030949030200001, "tests/test_utils.py::test_quote_for_shell[1>NUL-'1>NUL']": 0.0033181569529203855, "tests/test_utils.py::test_quote_for_shell[2>&1-'2>&1']": 0.0031741354435959207, "tests/test_utils.py::test_quote_for_shell[2>/dev/null-'2>/dev/null']": 0.002997383825571714, "tests/test_utils.py::test_quote_for_shell[2>NUL-'2>NUL']": 0.002690562416169539, "tests/test_utils.py::test_quote_for_shell[:-:]": 0.003113018615286333, "tests/test_utils.py::test_quote_for_shell[;-';']": 0.004107060892808664, "tests/test_utils.py::test_quote_for_shell[<-'<']": 0.003089653086976494, "tests/test_utils.py::test_quote_for_shell[=-=]": 0.0028030245916607337, "tests/test_utils.py::test_quote_for_shell[>-'>']": 0.0031496774753359187, "tests/test_utils.py::test_quote_for_shell[>/dev/null-'>/dev/null']": 0.0030877749656593022, "tests/test_utils.py::test_quote_for_shell[>NUL-'>NUL']": 0.0029749177112705274, "tests/test_utils.py::test_quote_for_shell[?-'?']": 0.0032261177415407005, "tests/test_utils.py::test_quote_for_shell[@-@]": 0.003124887403952385, "tests/test_utils.py::test_quote_for_shell[C:\\\\temp\\\\some ^%file^% > nul-\"C:\\\\temp\\\\some ^%%file^%% > nul\"]": 0.0005629162670484008, "tests/test_utils.py::test_quote_for_shell[None-'']": 0.0030222666715150007, "tests/test_utils.py::test_quote_for_shell[[-'[']": 0.0033582446905370206, "tests/test_utils.py::test_quote_for_shell[\\\\-'\\\\']": 0.0035160463528702618, "tests/test_utils.py::test_quote_for_shell[]-']']": 0.003998100653854907, "tests/test_utils.py::test_quote_for_shell[^-'^']": 0.003283783038926128, "tests/test_utils.py::test_quote_for_shell[arg1 and 2-'arg1 and 2']": 0.003019283174604343, "tests/test_utils.py::test_quote_for_shell[arg1-arg1]": 0.003450729935391127, "tests/test_utils.py::test_quote_for_shell[arg1\\nand\\n2-'arg1\\nand\\n2']": 0.0053101889515873415, "tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\"&whoami-\"malicious argument\\\\\"\"&whoami\"]": 0.0006027899862676981, "tests/test_utils.py::test_quote_for_shell[numpy<1.22-'numpy<1.22']": 0.003502997337890696, "tests/test_utils.py::test_quote_for_shell[numpy>=1.0-'numpy>=1.0']": 0.003935085745804217, "tests/test_utils.py::test_quote_for_shell[one|two-'one|two']": 0.003258907503058005, "tests/test_utils.py::test_quote_for_shell[{-'{']": 0.003146904351960451, "tests/test_utils.py::test_quote_for_shell[|-'|']": 0.003523664313247163, "tests/test_utils.py::test_quote_for_shell[}-'}']": 0.0029325674099506625, "tests/test_utils.py::test_quote_for_shell[~-'~']": 0.0028212153635374685, "tests/testing/test_fixtures.py::test_conda_cli": 0.2558693174321708, "tests/testing/test_fixtures.py::test_empty_env": 0.007354540833894733, "tests/testing/test_fixtures.py::test_env": 0.2677063902839674, "tests/testing/test_fixtures.py::test_monkeypatch": 0.013379577293109672, "tests/testing/test_fixtures.py::test_path_factory": 0.00794483352206538, "tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity": 0.008212140192182344, "tests/testing/test_fixtures.py::test_path_factory_name_mode": 0.008569644958796684, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]": 0.005383813263242419, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]": 0.005908841887431463, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]": 0.0086000198988792, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]": 0.007972492341759887, "tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]": 0.006349098797783229, "tests/testing/test_fixtures.py::test_path_factory_uniqueness": 0.006159604930153617, "tests/testing/test_fixtures.py::test_session_conda_cli": 0.3211433814658595, "tests/testing/test_fixtures.py::test_session_tmp_env": 0.005506416727074559, "tests/testing/test_fixtures.py::test_tmp_channel": 3.8920311347546956, "tests/testing/test_fixtures.py::test_tmp_env": 0.007779081580212708, "tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity": 0.007216002552818215, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]": 0.007172502574519128, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]": 0.00804005959157663, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]": 0.006785611156671312, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]": 0.009183354457857751, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]": 0.00927094053267215, "tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]": 0.0076787262691856845, "tests/testing/test_fixtures.py::test_tmp_envs_dir": 0.005981746846684455, "tests/testing/test_fixtures.py::test_tmp_pkgs_dir": 0.007006202119866888, "tests/testing/test_http_test_server.py::test_dynamic_content_pattern": 0.5133855936395878, "tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]": 0.5145906263158477, "tests/testing/test_http_test_server.py::test_http_server_directory_attribute": 0.5135065212778307, "tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]": 0.4561391647095376, "tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]": 0.5227676049778793, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]": 0.48700759858707204, "tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]": 0.6400416279060936, "tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]": 0.5150678604261607, "tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]": 0.5117658101228931, "tests/testing/test_http_test_server.py::test_http_server_without_marker": 0.5538903345015489, "tests/testing/test_http_test_server.py::test_marker_validation_directory_type": 0.2131500744503293 } ================================================ FILE: news/TEMPLATE ================================================ ### Enhancements * ### Bug fixes * ### Deprecations * ### Docs * ### Other * ================================================ FILE: pyproject.toml ================================================ [build-system] requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" [project] name = "conda-libmamba-solver" description = "The fast mamba solver, now in conda" readme = "README.md" authors = [ {name = "Anaconda, Inc.", email = "conda@continuum.io"} ] license = {file = "LICENSE"} classifiers = [ "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ] requires-python = ">=3.10" dependencies = [ "conda >=26.1", # "libmambapy >=2", "boltons >=23.0.0", "msgpack >=1.1.1", "requests >=2.28.0,<3", "zstandard >=0.15" ] dynamic = [ "version" ] [project.urls] homepage = "https://github.com/conda/conda-libmamba-solver" [project.entry-points.conda] conda-libmamba-solver = "conda_libmamba_solver.plugin" [tool.hatch.version] source = "vcs" [tool.black] line-length = 99 target-version = ['py310', 'py311', 'py312', 'py313'] exclude = ''' ( ^/conda_libmamba_solver/_libmamba\.py | ^/tests/_reposerver\.py ) ''' [tool.pytest.ini_options] minversion = "6.0" addopts = [ "--color=yes", "--tb=native", "--strict-markers" ] filterwarnings = [ # elevate all deprecation warnings to errors "error::PendingDeprecationWarning", "error::DeprecationWarning", "error::FutureWarning", # temporary ignores "ignore:conda.cli.install.print_activate:PendingDeprecationWarning:conda.env.env", "ignore:`remote_definition`:FutureWarning:argparse", "ignore:conda.core.prefix_data.python_record_for_prefix:PendingDeprecationWarning:conda.core.link", "ignore:conda.core.prefix_data.PrefixDataType.__call__:PendingDeprecationWarning:conda_libmamba_solver.state", "ignore:conda.env.specs.binstar:DeprecationWarning:conda", "ignore:conda.env.specs.binstar:PendingDeprecationWarning:conda", "ignore:.*conda.plugins.types.*:DeprecationWarning", "ignore:.*conda.plugins.types.*:PendingDeprecationWarning", "ignore:conda.trust:DeprecationWarning:conda", "ignore:conda.trust:PendingDeprecationWarning:conda", "ignore:conda.core.link.PrefixActions:DeprecationWarning:conda", "ignore:conda.core.link.PrefixActions:PendingDeprecationWarning:conda", "ignore:conda.base.constants.CONDA_PACKAGE_EXTENSIONS:PendingDeprecationWarning", "ignore:conda.common.io.env_vars:PendingDeprecationWarning", ] markers = [ "integration: integration tests that usually require an internet connect", "slow: slow running tests", "trouble: troublesome tests", ] [tool.ruff] exclude = ["conda_libmamba_solver/mamba_utils.py", "tests/data/"] line-length = 99 show-fixes = true target-version = "py310" [tool.ruff.lint] # E, W = pycodestyle errors and warnings # F = pyflakes # I = isort # D = pydocstyle # UP = pyupgrade # ISC = flake8-implicit-str-concat # TCH = flake8-type-checking # T10 = flake8-debugger # FA = flake8-future-annotations # see also https://docs.astral.sh/ruff/rules/ select = ["E", "W", "F", "I", "D1", "UP", "ISC", "TCH", "T10", "FA"] # E402 module level import not at top of file # E501 line too long # E722 do not use bare 'except' # E731 do not assign a lambda expression, use a def # D101 Missing docstring in public class # D102 Missing docstring in public method # D103 Missing docstring in public function # D104 Missing docstring in public package # D105 Missing docstring in magic method # D107 Missing docstring in `__init__` ignore = ["E402", "E501", "E722", "E731", "D101", "D102", "D103", "D104", "D105", "D107"] extend-per-file-ignores = {"docs/*" = ["D1"], "tests/*" = ["D1"]} pydocstyle = {convention = "pep257"} flake8-type-checking = {exempt-modules = [], strict = true} # [tool.pyright] # include = ["conda_libmamba_solver"] # ignore = ["conda_libmamba_solver/*_v1.py"] # strict = ["**/"] [tool.coverage.report] exclude_also = [ "pragma: no cover", "if TYPE_CHECKING:", "\\.\\.\\.", ] ================================================ FILE: recipe/meta.yaml ================================================ package: name: "conda-libmamba-solver" version: "{{ GIT_DESCRIBE_TAG }}.{{ GIT_BUILD_STR }}" source: # git_url is nice in that it won't capture devenv stuff. However, it only # captures committed code, so pay attention. git_url: ../ folder: src/ build: noarch: python number: 0 script: "{{ PYTHON }} -m pip install src/ -vv --no-deps --no-build-isolation" requirements: host: - python >=3.10 - pip - hatchling - hatch-vcs run: - python >=3.10 - conda >=26.1 - libmambapy >=2.0.0 - boltons >=23.0.0 - msgpack-python >=1.1.1 - requests >=2.28.0,<3 - zstandard >=0.15 test: imports: - conda_libmamba_solver commands: - conda create -n test --dry-run scipy --solver=libmamba - >- python -c "import conda_libmamba_solver as cls; from importlib.metadata import version; assert '{{ PKG_VERSION }}' == cls.__version__ == version('conda_libmamba_solver'), '{{ PKG_VERSION }}' + f', {cls.__version__}, ' + version('conda_libmamba_solver') " || true # we accept errors here because GIT_DESCRIBE_TAG has some accuracy issues. # Shouldn't happen in production recipes; aka do not add '|| true' in the feedstock about: home: https://github.com/conda/conda-libmamba-solver license: BSD-3-Clause license_family: BSD license_file: src/LICENSE summary: 'The fast mamba solver, now in conda!' extra: recipe-maintainers: - jaimergp - jezdez - wolfv ================================================ FILE: rever.xsh ================================================ # edit this in https://github.com/conda/infrastructure $ACTIVITIES = ["authors", "changelog"] # Basic settings $PROJECT = $GITHUB_REPO = $(basename $(git remote get-url origin)).split('.')[0].strip() $GITHUB_ORG = "conda" # Authors settings $AUTHORS_FILENAME = "AUTHORS.md" $AUTHORS_SORTBY = "alpha" # Changelog settings $CHANGELOG_FILENAME = "CHANGELOG.md" $CHANGELOG_PATTERN = r"\[//\]: # \(current developments\)" $CHANGELOG_HEADER = """[//]: # (current developments) ## $VERSION ($RELEASE_DATE) """ $CHANGELOG_CATEGORIES = [ "Enhancements", "Bug fixes", "Deprecations", "Docs", "Other", ] $CHANGELOG_CATEGORY_TITLE_FORMAT = "### {category}\n\n" $CHANGELOG_AUTHORS_TITLE = "Contributors" $CHANGELOG_AUTHORS_FORMAT = "* @{github}\n" try: # allow repository to customize synchronized-from-infa rever config from rever_overrides import * except ImportError: pass ================================================ FILE: tests/__init__.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause ================================================ FILE: tests/channel_testing/helpers.py ================================================ # Copyright (C) 2019 QuantStack and the Mamba contributors. # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations import os import pathlib import re import socket import sys from typing import TYPE_CHECKING import pytest from xprocess import ProcessStarter if TYPE_CHECKING: from xprocess import XProcess def _dummy_http_server( xprocess: XProcess, name, port, auth="none", user=None, password=None, token=None, path=None, ): """ Adapted from https://github.com/mamba-org/powerloader/blob/effe2b7e1/test/helpers.py#L11 """ curdir = pathlib.Path(__file__).parent print("Starting dummy_http_server") if not path: path = curdir / ".." / "data" / "mamba_repo" class Starter(ProcessStarter): pattern = r"Server started at localhost:(\d+)" terminate_on_interrupt = True timeout = 10 args = [ sys.executable, "-u", # unbuffered str(curdir / "reposerver.py"), "-d", str(path), "--port", str(port), ] if auth == "token": assert token args += ["--token", token] elif auth: args += ["--auth", auth] env = os.environ.copy() env["PYTHONUNBUFFERED"] = "1" if user and password: env["TESTPWD"] = f"{user}:{password}" def startup_check(self): # type: ignore nonlocal xprocess, port info = xprocess.getinfo(name) loglines: str = info.logpath.read_text(encoding="utf-8") for line in reversed(loglines.splitlines()): match = re.search(self.pattern, line) # type: ignore if match: port = int(match.group(1)) break s = socket.socket() address = "localhost" error = False try: s.connect((address, port)) except Exception as e: print(f"something's wrong with {address}:{port}. Exception is {e}") error = True finally: s.close() return not error logfile = xprocess.ensure(name, Starter) print("Logfile at", logfile) if user and password: yield f"http://{user}:{password}@localhost:{port}" elif token: yield f"http://localhost:{port}/t/{token}" else: yield f"http://localhost:{port}" xprocess.getinfo(name).terminate() @pytest.fixture def http_server_auth_none(xprocess): yield from _dummy_http_server(xprocess, name="http_server_auth_none", port=8000, auth="none") @pytest.fixture def http_server_auth_none_debug_repodata(xprocess): yield from _dummy_http_server( xprocess, name="http_server_auth_none_debug_repodata", port=8000, auth="none-debug-repodata", ) @pytest.fixture def http_server_auth_none_debug_packages(xprocess): yield from _dummy_http_server( xprocess, name="http_server_auth_none_debug_packages", port=8000, auth="none-debug-packages", ) @pytest.fixture def http_server_auth_basic(xprocess): yield from _dummy_http_server( xprocess, name="http_server_auth_basic", port=8000, auth="basic", user="user", password="test", ) @pytest.fixture def http_server_auth_basic_email(xprocess): yield from _dummy_http_server( xprocess, name="http_server_auth_basic_email", port=8000, auth="basic", user="user@email.com", password="test", ) @pytest.fixture def http_server_auth_token(xprocess): yield from _dummy_http_server( xprocess, name="http_server_auth_token", port=8000, auth="token", token="xy-12345678-1234-1234-1234-123456789012", ) ================================================ FILE: tests/channel_testing/reposerver.py ================================================ # Copyright (C) 2019 QuantStack and the Mamba contributors. # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Helper module/script to launch a conda channel/server for local testing. Copied from https://github.com/mamba-org/mamba/blob/53eb28d/mamba/tests/reposerver.py on Apr 27 2022 See data/mamba_repo/LICENSE for full details """ import argparse import base64 import glob import os import re import shutil from http.server import HTTPServer, SimpleHTTPRequestHandler from pathlib import Path try: import conda_content_trust.authentication as cct_authentication import conda_content_trust.common as cct_common import conda_content_trust.metadata_construction as cct_metadata_construction import conda_content_trust.root_signing as cct_root_signing import conda_content_trust.signing as cct_signing conda_content_trust_available = True except ImportError: conda_content_trust_available = False if os.environ.get("TESTPWD"): default_user, default_password = os.environ.get("TESTPWD").split(":") else: default_user, default_password = None, None parser = argparse.ArgumentParser(description="Start a simple conda package server.") parser.add_argument("-p", "--port", type=int, default=8000, help="Port to use.") parser.add_argument( "-d", "--directory", type=str, default=os.getcwd(), help="Root directory for serving.", ) parser.add_argument( "-a", "--auth", default=None, type=str, help="auth method (none, none-debug-repodata, none-debug-packages, basic, or token)", ) parser.add_argument( "--sign", action="store_true", help="Sign repodata (note: run generate_gpg_keys.sh before)", ) parser.add_argument( "--token", type=str, default=None, help="Use token as API Key", ) parser.add_argument( "--user", type=str, default=default_user, help="Use token as API Key", ) parser.add_argument( "--password", type=str, default=default_password, help="Use token as API Key", ) args = parser.parse_args() def get_fingerprint(gpg_output): lines = gpg_output.splitlines() fpline = lines[1].strip() fpline = fpline.replace(" ", "") return fpline class RepoSigner: keys = { "root": [], "key_mgr": [ { "private": "c9c2060d7e0d93616c2654840b4983d00221d8b6b69c850107da74b42168f937", "public": "013ddd714962866d12ba5bae273f14d48c89cf0773dee2dbf6d4561e521c83f7", }, ], "pkg_mgr": [ { "private": "f3cdab14740066fb277651ec4f96b9f6c3e3eb3f812269797b9656074cd52133", "public": "f46b5a7caa43640744186564c098955147daa8bac4443887bc64d8bfee3d3569", } ], } def normalize_keys(self, keys): out = {} for ik, iv in keys.items(): out[ik] = [] for el in iv: if isinstance(el, str): el = el.lower() keyval = cct_root_signing.fetch_keyval_from_gpg(el) res = {"fingerprint": el, "public": keyval} elif isinstance(el, dict): res = { "private": el["private"].lower(), "public": el["public"].lower(), } out[ik].append(res) return out def create_root(self, keys): root_keys = keys["root"] root_pubkeys = [k["public"] for k in root_keys] key_mgr_pubkeys = [k["public"] for k in keys["key_mgr"]] root_version = 1 root_md = cct_metadata_construction.build_root_metadata( root_pubkeys=root_pubkeys[0:1], root_threshold=1, root_version=root_version, key_mgr_pubkeys=key_mgr_pubkeys, key_mgr_threshold=1, ) # Wrap the metadata in a signing envelope. root_md = cct_signing.wrap_as_signable(root_md) root_md_serialized_unsigned = cct_common.canonserialize(root_md) root_filepath = self.folder / f"{root_version}.root.json" print("Writing out: ", root_filepath) # Write unsigned sample root metadata. with open(root_filepath, "wb") as fout: fout.write(root_md_serialized_unsigned) # This overwrites the file with a signed version of the file. cct_root_signing.sign_root_metadata_via_gpg(root_filepath, root_keys[0]["fingerprint"]) # Load untrusted signed root metadata. signed_root_md = cct_common.load_metadata_from_file(root_filepath) cct_authentication.verify_signable(signed_root_md, root_pubkeys, 1, gpg=True) print("[reposigner] Root metadata signed & verified!") def create_key_mgr(self, keys): private_key_key_mgr = cct_common.PrivateKey.from_hex(keys["key_mgr"][0]["private"]) pkg_mgr_pub_keys = [k["public"] for k in keys["pkg_mgr"]] key_mgr = cct_metadata_construction.build_delegating_metadata( metadata_type="key_mgr", # 'root' or 'key_mgr' delegations={"pkg_mgr": {"pubkeys": pkg_mgr_pub_keys, "threshold": 1}}, version=1, # timestamp default: now # expiration default: now plus root expiration default duration ) key_mgr = cct_signing.wrap_as_signable(key_mgr) # sign dictionary in place cct_signing.sign_signable(key_mgr, private_key_key_mgr) key_mgr_serialized = cct_common.canonserialize(key_mgr) with open(self.folder / "key_mgr.json", "wb") as fobj: fobj.write(key_mgr_serialized) # let's run a verification root_metadata = cct_common.load_metadata_from_file(self.folder / "1.root.json") key_mgr_metadata = cct_common.load_metadata_from_file(self.folder / "key_mgr.json") cct_common.checkformat_signable(root_metadata) if "delegations" not in root_metadata["signed"]: raise ValueError('Expected "delegations" entry in root metadata.') root_delegations = root_metadata["signed"]["delegations"] # for brevity cct_common.checkformat_delegations(root_delegations) if "key_mgr" not in root_delegations: raise ValueError('Missing expected delegation to "key_mgr" in root metadata.') cct_common.checkformat_delegation(root_delegations["key_mgr"]) # Doing delegation processing. cct_authentication.verify_delegation("key_mgr", key_mgr_metadata, root_metadata) print("[reposigner] success: key mgr metadata verified based on root metadata.") return key_mgr def sign_repodata(self, repodata_fn, keys): target_folder = self.folder / repodata_fn.parent.name if not target_folder.exists(): target_folder.mkdir() final_fn = target_folder / repodata_fn.name print("copy", repodata_fn, final_fn) shutil.copyfile(repodata_fn, final_fn) pkg_mgr_key = keys["pkg_mgr"][0]["private"] cct_signing.sign_all_in_repodata(str(final_fn), pkg_mgr_key) print(f"[reposigner] Signed {final_fn}") def __init__(self, in_folder=args.directory): self.keys["root"] = [ get_fingerprint(os.environ["KEY1"]), get_fingerprint(os.environ["KEY2"]), ] self.in_folder = Path(in_folder).resolve() self.folder = self.in_folder.parent / (str(self.in_folder.name) + "_signed") if not self.folder.exists(): os.mkdir(self.folder) self.keys = self.normalize_keys(self.keys) print("[reposigner] Using keys:", self.keys) print("[reposigner] Using folder:", self.folder) self.create_root(self.keys) self.create_key_mgr(self.keys) for f in glob.glob(str(self.in_folder / "**" / "repodata.json")): self.sign_repodata(Path(f), self.keys) class RepodataHeadersHandler(SimpleHTTPRequestHandler): """ This handler is used to debug requests to repodata.json files. We make them error out with a failed redirection to a URL that contains the client headers in the URL, encoded as base64. """ path_suffix_to_debug = "repodata.json" def do_GET(self) -> None: """ HACK: if a repodata.json is requested, redirect to a fake address which encodes the client headers as b64. This way, we can parse the exception message in a test. """ if not self.path.endswith(self.path_suffix_to_debug): return super().do_GET() headers_b64 = base64.b64encode(str(self.headers).encode("utf-8")) self.send_response(307) # redirect self.send_header("Location", f"/headers/{headers_b64.decode('utf-8')}") self.end_headers() class PackagesHeadersHandler(RepodataHeadersHandler): "Same as RepodataHeadersHandler, but it fails when tarballs are requested" path_suffix_to_debug = ".tar.bz2" class BasicAuthHandler(SimpleHTTPRequestHandler): """Main class to present webpages and authentication.""" user = args.user password = args.password key = base64.b64encode(bytes(f"{args.user}:{args.password}", "utf-8")).decode("ascii") def do_HEAD(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() def do_AUTHHEAD(self): self.send_response(401) self.send_header("WWW-Authenticate", 'Basic realm="Test"') self.send_header("Content-type", "text/html") self.end_headers() def do_GET(self): """Present frontpage with user authentication.""" auth_header = self.headers.get("Authorization", "") if not auth_header: self.do_AUTHHEAD() self.wfile.write(b"no auth header received") pass elif auth_header == "Basic " + self.key: SimpleHTTPRequestHandler.do_GET(self) pass else: self.do_AUTHHEAD() self.wfile.write(auth_header.encode("ascii")) self.wfile.write(b"not authenticated") pass class CondaTokenHandler(SimpleHTTPRequestHandler): """Main class to present webpages and authentication.""" api_key = args.token token_pattern = re.compile("^/t/([^/]+?)/") def do_GET(self): """Present frontpage with user authentication.""" match = self.token_pattern.search(self.path) if match: prefix_length = len(match.group(0)) - 1 new_path = self.path[prefix_length:] found_api_key = match.group(1) if found_api_key == self.api_key: self.path = new_path return SimpleHTTPRequestHandler.do_GET(self) self.send_response(403) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(b"no valid api key received") if args.sign: if not conda_content_trust_available: print("Conda content trust not installed!") exit(1) signer = RepoSigner() os.chdir(signer.folder) else: os.chdir(args.directory) if args.auth == "none": handler = SimpleHTTPRequestHandler elif args.auth == "none-debug-repodata": handler = RepodataHeadersHandler elif args.auth == "none-debug-packages": handler = PackagesHeadersHandler elif args.auth == "basic" or (args.user and args.password): handler = BasicAuthHandler elif args.auth == "token" or args.token: handler = CondaTokenHandler else: print("No auth method given.") exit(1) PORT = args.port server = HTTPServer(("", PORT), handler) print("Server started at localhost:" + str(server.server_port)) try: server.serve_forever() except Exception as exc: # Catch all sorts of interrupts print("Shutting server down:", exc.__class__.__name__, exc) server.shutdown() print("Server shut down") ================================================ FILE: tests/conftest.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause pytest_plugins = ( # Add testing fixtures and internal pytest plugins here "conda.testing", "conda.testing.fixtures", ) # Allow fixtures from test_shards to be available globally, specifically in # test_shards_subset: from .test_shards import ( # noqa: F401 http_server_shards as http_server_shards, ) from .test_shards import ( mock_cache as mock_cache, ) from .test_shards import ( prepare_shards_test as prepare_shards_test, ) from .test_shards import ( shard_cache_with_data as shard_cache_with_data, ) from .test_shards import ( shard_factory as shard_factory, ) ================================================ FILE: tests/data/conda_build_recipes/LICENSE ================================================ This directory was taken from mamba-org/boa, commit 3213180564e51b72a27efed5183d21f97f630692, on May 12 2022 --- Copyright 2020 QuantStack and the Boa contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: tests/data/conda_build_recipes/baddeps/meta.yaml ================================================ {% set name = "stackvana-core" %} {% set version = "0.2021.43" %} package: name: {{ name|lower }} version: {{ version }} build: number: 0 outputs: - name: stackvana-core-impl version: {{ version }} build: script: - echo "BUILDING IMPL" >> $PREFIX/stackvana-core-impl # [unix] - echo "BUILDING IMPL" >> %PREFIX%/stackvana-core-impl # [win] - name: stackvana-core version: {{ version }} run_exports: - {{ pin_subpackage('stackvana-core-impl', exact=True) }} requirements: run: - thispackagedoesnotexist >=100000000 ================================================ FILE: tests/data/conda_build_recipes/jedi/meta.yaml ================================================ {% set name = "jedi" %} {% set version = "0.19.2" %} package: name: {{ name }} version: {{ version }} source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz sha256: 4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0 build: number: 0 script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --ignore-installed --no-cache-dir -vv # the minimal version of python supported is 3.6 skip: true # [py<36] requirements: host: - python - pip - setuptools - wheel run: - python - parso >=0.8.4,<0.9.0 test: imports: - jedi - jedi.api - jedi.common - jedi.inference - jedi.inference.compiled - jedi.inference.compiled.subprocess - jedi.inference.gradual - jedi.inference.value - jedi.plugins ================================================ FILE: tests/data/conda_build_recipes/multioutput/meta.yaml ================================================ {% set name = "ocp" %} {% set version = "7.5.2beta" %} {% set occt_version = "=7.5.2" %} package: name: {{ name }}-split version: {{ version }} build: number: 0 outputs: - name: ocp-devel build: script: - echo "BUILDING IMPL" >> $PREFIX/stackvana-core-impl # [unix] - echo "BUILDING IMPL" >> %PREFIX%/stackvana-core-impl # [win] - name: ocp build: script: - echo "BUILDING IMPL" >> $PREFIX/ocp # [unix] - echo "BUILDING IMPL" >> %PREFIX%/ocp # [win] requirements: host: - "{{ pin_subpackage('ocp-devel', exact=True) }}" run: - "{{ pin_subpackage('ocp-devel', exact=True) }}" ================================================ FILE: tests/data/conda_build_recipes/stackvana/meta.yaml ================================================ {% set name = "stackvana-split" %} {% set version = "0.2021.43" %} {% set eups_product = "lsst_distrib" %} package: name: {{ name|lower }} version: {{ version }} build: number: 0 outputs: - name: stackvana-core-impl version: {{ version }} build: script: - echo "BUILDING IMPL" >> $PREFIX/stackvana-core-impl # [unix] - echo "BUILDING IMPL" >> %PREFIX%/stackvana-core-impl # [win] test: commands: - echo OK - name: stackvana-core version: {{ version }} build: script: - echo "BUILDING CORE" >> $PREFIX/stackvana-core # [unix] - echo "BUILDING CORE" >> %PREFIX%/stackvana-core # [win] run_exports: - {{ pin_subpackage('stackvana-core-impl', exact=True) }} requirements: run: - {{ pin_subpackage('stackvana-core-impl', exact=True) }} test: commands: - echo OK - name: stackvana-{{ eups_product }} version: {{ version }} build: script: - echo "BUILDING {{ eups_product }}" >> $PREFIX/stackvana-{{ eups_product }} # [unix] - echo "BUILDING {{ eups_product }}" >> %PREFIX%/stackvana-{{ eups_product }} # [win] requirements: host: - stackvana-core =={{ version }} run: - stackvana-core =={{ version }} test: commands: - echo OK - name: stackvana version: {{ version }} build: script: - echo "BUILDING STACKVANA" >> $PREFIX/stackvana # [unix] - echo "BUILDING STACKVANA" >> %PREFIX%/stackvana # [win] requirements: - {{ pin_subpackage("stackvana-" ~ eups_product, max_pin="x.x.x") }} test: commands: - echo OK ================================================ FILE: tests/data/lock_this_env.yml ================================================ channels: - conda-forge dependencies: - zlib ================================================ FILE: tests/data/mamba_repo/LICENSE ================================================ This directory was taken from mamba-org/mamba, commit bff16c2bdc4103ba74c23ab4fdbf58849a55981c, on Mar 17 2022 --- Copyright 2019 QuantStack and the Mamba contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: tests/data/mamba_repo/channeldata.json ================================================ { "channeldata_version": 1, "packages": { "test-package": { "activate.d": false, "binary_prefix": false, "deactivate.d": false, "description": null, "dev_url": null, "doc_source_url": null, "doc_url": null, "home": "https://github.com/mamba-org/mamba", "icon_hash": null, "icon_url": null, "identifiers": null, "keywords": null, "license": "BSD", "post_link": false, "pre_link": false, "pre_unlink": false, "recipe_origin": null, "run_exports": {}, "source_git_url": null, "source_url": null, "subdirs": [ "noarch" ], "summary": "I am just a test package!", "tags": null, "text_prefix": false, "timestamp": 1613117294, "version": "0.1" } }, "subdirs": [ "noarch" ] } ================================================ FILE: tests/data/mamba_repo/index.html ================================================ repo

repo

RSS Feed   channeldata.json

noarch   
Package Latest Version Doc Dev License noarch Summary
test-package 0.1 BSD X I am just a test package!
Updated: 2021-02-12 09:02:37 +0000 - Files: 1
================================================ FILE: tests/data/mamba_repo/noarch/current_repodata.json ================================================ { "info": { "subdir": "noarch" }, "packages": { "test-package-0.1-0.tar.bz2": { "build": "0", "build_number": 0, "depends": [], "license": "BSD", "license_family": "BSD", "md5": "2a8595f37faa2950e1b433acbe91d481", "name": "test-package", "noarch": "generic", "sha256": "b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988", "size": 5719, "subdir": "noarch", "timestamp": 1613117294885, "version": "0.1" } }, "packages.conda": {}, "removed": [], "repodata_version": 1 } ================================================ FILE: tests/data/mamba_repo/noarch/index.html ================================================ repo/noarch

repo/noarch

Filename Size Last Modified SHA256 MD5
repodata.json 586 B 2021-02-12 09:01:48 +0000 cc5f72aaa8d3f508c8adca196fe05cf4b19e1ca1006cfcbb3892d73160bd3b04 7501ec77771889b42a39c615158cb9c4
repodata.json.bz2 351 B 2021-02-12 09:01:48 +0000 9a0288ca48c6b8caa348d7cafefd0981c2d25dcb4a5837a5187ab200b8b9fb45 0c926155642f0e894d97dc8a5af7007b
repodata_from_packages.json 586 B 2021-02-12 09:01:48 +0000 cc5f72aaa8d3f508c8adca196fe05cf4b19e1ca1006cfcbb3892d73160bd3b04 7501ec77771889b42a39c615158cb9c4
repodata_from_packages.json.bz2 351 B 2021-02-12 09:01:48 +0000 9a0288ca48c6b8caa348d7cafefd0981c2d25dcb4a5837a5187ab200b8b9fb45 0c926155642f0e894d97dc8a5af7007b
test-package-0.1-0.tar.bz2 6 KB 2021-02-12 08:08:14 +0000 b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988 2a8595f37faa2950e1b433acbe91d481
Updated: 2021-02-12 09:02:37 +0000 - Files: 1
================================================ FILE: tests/data/mamba_repo/noarch/repodata.json ================================================ { "info": { "subdir": "noarch" }, "packages": { "test-package-0.1-0.tar.bz2": { "build": "0", "build_number": 0, "depends": [], "license": "BSD", "license_family": "BSD", "md5": "2a8595f37faa2950e1b433acbe91d481", "name": "test-package", "noarch": "generic", "sha256": "b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988", "size": 5719, "subdir": "noarch", "timestamp": 1613117294885, "version": "0.1" } }, "packages.conda": {}, "removed": [], "repodata_version": 1 } ================================================ FILE: tests/data/mamba_repo/noarch/repodata_from_packages.json ================================================ { "info": { "subdir": "noarch" }, "packages": { "test-package-0.1-0.tar.bz2": { "build": "0", "build_number": 0, "depends": [], "license": "BSD", "license_family": "BSD", "md5": "2a8595f37faa2950e1b433acbe91d481", "name": "test-package", "noarch": "generic", "sha256": "b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988", "size": 5719, "subdir": "noarch", "timestamp": 1613117294885, "version": "0.1" } }, "packages.conda": {}, "removed": [], "repodata_version": 1 } ================================================ FILE: tests/data/mamba_repo/recipes/test-package/meta.yaml ================================================ package: name: test-package version: 0.1 build: number: 0 script: echo Hello world noarch: generic about: home: https://github.com/mamba-org/mamba license: BSD license_family: BSD summary: I am just a test package! ================================================ FILE: tests/http_test_server.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Local test server based on http.server """ # From conda/tests; data/reposerver.py was refusing connections on Windows for shards tests. from __future__ import annotations import contextlib import http.server import queue import socket import threading from typing import TYPE_CHECKING if TYPE_CHECKING: from collections.abc import Callable def run_test_server( directory: str, finish_request_action: Callable | None = None ) -> http.server.ThreadingHTTPServer: """ Run a test server on a random port. Inspect returned server to get port, shutdown etc. """ class DualStackServer(http.server.ThreadingHTTPServer): daemon_threads = False # These are per-request threads allow_reuse_address = True # Good for tests request_queue_size = 64 # Should be more than the number of test packages def server_bind(self): # suppress exception when protocol is IPv4 with contextlib.suppress(Exception): self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) return super().server_bind() def finish_request(self, request, client_address): if finish_request_action: finish_request_action() self.RequestHandlerClass(request, client_address, self, directory=directory) def start_server(queue): try: with DualStackServer(("127.0.0.1", 0), http.server.SimpleHTTPRequestHandler) as httpd: host, port = httpd.socket.getsockname()[:2] queue.put(httpd) url_host = f"[{host}]" if ":" in host else host print(f"Serving HTTP on {host} port {port} (http://{url_host}:{port}/) ...") try: httpd.serve_forever() except KeyboardInterrupt: print("\nKeyboard interrupt received, exiting.") except Exception as exc: queue.put(exc) started = queue.Queue() threading.Thread(target=start_server, args=(started,), daemon=True).start() result = started.get(timeout=1) if isinstance(result, Exception): raise result return result if __name__ == "__main__": server = run_test_server(directory=".") print(server) ================================================ FILE: tests/repodata_time_machine.py ================================================ # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ conda repodata time machine Given a date and a channel, this script will: - Download a local copy of the (unpatched) repodata - Trim to the closest timestamp - Download the closest repodata patches for that channel - Apply the patches - Generate a ready-to-use local channel """ import bz2 import json import os import urllib.request from argparse import ArgumentParser from datetime import datetime import requests from conda.base.context import context from conda.models.channel import Channel from conda_index.index import _apply_instructions from conda_package_handling.api import extract as cph_extract PATCHED_CHANNELS = {"defaults", "main", "conda-forge"} def cli(): p = ArgumentParser() p.add_argument("channels", nargs="+", metavar="channel") p.add_argument("-t", "--timestamp", required=True, help="YYYY-MM-DD HH:MM:SS. Assumes UTC.") p.add_argument( "-s", "--subdirs", default=f"{context.subdir},noarch", help="Comma-separated list of subdirs to download. Include 'noarch' explicitly if needed.", ) return p.parse_args() def download_repodata(channel, subdirs=None): "Download remote repodata JSON payload to a temporary location in disk" c = Channel(channel) if c.canonical_name in PATCHED_CHANNELS: repodata_fn = "repodata_from_packages" else: repodata_fn = "repodata" subdirs = subdirs or context.subdirs for url in c.urls(with_credentials=True, subdirs=subdirs): subdir = url.strip("/").split("/")[-1] urllib.request.urlretrieve(f"{url}/{repodata_fn}.json.bz2", f"{repodata_fn}.json.bz2") with open(f"{repodata_fn}.json.bz2", "rb") as f: with open(f"{repodata_fn}.json", "wb") as g: g.write(bz2.decompress(f.read())) yield f"{repodata_fn}.json", subdir def trim_to_timestamp(repodata, timestamp: float): trimmed_tar_pkgs = {} trimmed_conda_pkgs = {} with open(repodata) as f: data = json.load(f) for name, pkg in data["packages"].items(): if pkg.get("timestamp", 0) <= timestamp: trimmed_tar_pkgs[name] = pkg for name, pkg in data["packages.conda"].items(): if pkg.get("timestamp", 0) <= timestamp: trimmed_conda_pkgs[name] = pkg data["packages"] = trimmed_tar_pkgs data["packages.conda"] = trimmed_conda_pkgs fn = f"trimmed.{os.path.basename(repodata)}" with open(fn, "w") as f: json.dump(data, f) return fn def download_patches(channel, timestamp: float): name = Channel(channel).canonical_name if name != "conda-forge": raise NotImplementedError("Only conda-forge is supported for now") url = "https://api.anaconda.org/package/conda-forge/conda-forge-repodata-patches/files" r = requests.get(url) r.raise_for_status() pkgs = r.json() closest_older = None for pkg in sorted(pkgs, key=lambda pkg: pkg["attrs"]["timestamp"]): if pkg["attrs"]["timestamp"] <= timestamp: closest_older = pkg else: break if closest_older is None: raise ValueError(f"No patch found for timestamp {timestamp}") fn = closest_older["basename"].split("/")[-1] urllib.request.urlretrieve(f"https:{closest_older['download_url']}", fn) extract_path = f"conda-forge-repodata-patches-{closest_older['version']}" cph_extract(fn, dest_dir=extract_path) return extract_path def apply_patch(repodata_file, patch): with open(repodata_file) as f, open(patch) as g: repodata = json.load(f) instructions = json.load(g) fn = f"patched.{os.path.basename(repodata_file)}" with open(fn, "w") as f: patched = _apply_instructions(None, repodata, instructions) json.dump(patched, f, indent=2) return fn def repodata_time_machine(channels, timestamp_str, subdirs=None): horizon = datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S") timestamp = horizon.timestamp() * 1000 original_dir = os.getcwd() try: workdir = f"repodata-{timestamp_str.replace(' ', '-').replace(':', '-').replace('.', '-')}" os.makedirs(workdir, exist_ok=True) os.chdir(workdir) # Download repodata for channel in channels: print("Rolling back", channel, "to", horizon) channel_name = Channel(channel).canonical_name os.makedirs(channel_name, exist_ok=True) os.chdir(channel_name) must_patch = channel_name in PATCHED_CHANNELS if must_patch: print(" Getting patches") patch_dir = os.path.abspath(download_patches(channel, timestamp)) for repodata, subdir in download_repodata(channel, subdirs=subdirs): print(" Downloaded", repodata, "for", subdir) print(" Trimming...") abs_repodata = os.path.abspath(repodata) os.makedirs(subdir, exist_ok=True) os.chdir(subdir) trimmed = trim_to_timestamp(abs_repodata, timestamp) if must_patch: print(" Patching...") instructions = f"{patch_dir}/{subdir}/patch_instructions.json" patched = apply_patch(trimmed, instructions) if not os.path.exists("repodata.json"): os.symlink(patched, "repodata.json") else: if not os.path.exists("repodata.json"): os.symlink(trimmed, "repodata.json") os.chdir("..") os.chdir("..") return workdir finally: os.chdir(original_dir) def main(): args = cli() return repodata_time_machine(args.channels, args.timestamp, args.subdirs.split(",")) if __name__ == "__main__": main() print("Done!") ================================================ FILE: tests/requirements.txt ================================================ conda-build conda-forge::pytest-xprocess conda-index conda-lock conda-forge::pre-commit pytest-codspeed >=4 conda-forge::pytest-mock # needed for many conda tests flask ================================================ FILE: tests/run_in_profiler.py ================================================ #!/usr/bin/env python # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ To be run with python -m scalene """ import logging import os import pathlib from conda.base.context import reset_context import tests.test_shards_subset from conda_libmamba_solver import shards, shards_cache, shards_subset os.environ["CONDA_TOKEN"] = "" os.environ["CONDA_PLUGINS_USE_SHARDED_REPODATA"] = "1" os.environ["CONDA_REPODATA_THREADS"] = ( "10" # shave a half second off our time by avoiding CondaSession() creation ) reset_context() pathlib.Path("/tmp/shards").mkdir(exist_ok=True) tmp_path = pathlib.Path("/tmp/shards") logging.basicConfig(level=logging.INFO) for module in (shards, shards_cache, shards_subset): module.log.setLevel(logging.DEBUG) tests.test_shards_subset.test_build_repodata_subset_pipelined(None, tmp_path) ================================================ FILE: tests/test_channels.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations import json import os import shutil import sys import time from pathlib import Path from subprocess import check_call from typing import TYPE_CHECKING from urllib.request import urlretrieve import pytest from conda.base.context import reset_context from conda.common.compat import on_linux, on_win from conda.common.io import env_vars from conda.core.prefix_data import PrefixData from conda.exceptions import DryRunExit from conda.models.channel import Channel from conda.testing.integration import package_is_installed from conda_libmamba_solver.index import LibMambaIndexHelper from .channel_testing.helpers import ( http_server_auth_basic, # noqa: F401 http_server_auth_basic_email, # noqa: F401 http_server_auth_none, # noqa: F401 http_server_auth_token, # noqa: F401 ) from .utils import conda_subprocess, write_env_config if TYPE_CHECKING: from conda.testing.fixtures import CondaCLIFixture, PathFactoryFixture, TmpEnvFixture from .test_shards import ShardFactory DATA = Path(__file__).parent / "data" def test_channel_matchspec(conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture) -> None: stdout, _, _ = conda_cli( "create", f"--prefix={path_factory()}", "--solver=libmamba", "--json", "--override-channels", "--channel=defaults", "conda-forge::libblas=*=*openblas", "python=3.9", ) result = json.loads(stdout) assert result["success"] is True for record in result["actions"]["LINK"]: if record["name"] == "numpy": assert record["channel"] == "conda-forge" elif record["name"] == "python": assert record["channel"] == "pkgs/main" def test_channels_prefixdata(tmp_env: TmpEnvFixture) -> None: """ Make sure libmamba does not complain about missing channels used in previous commands. See https://github.com/conda/conda/issues/11790 """ with tmp_env("conda-forge::xz", "python=3.13", "--solver=libmamba") as prefix: p = conda_subprocess( "install", "-yp", prefix, "pytest", "--solver=libmamba", ) assert ( "Selected channel specific (or force-reinstall) job, " "but package is not available from channel. " "Solve job will fail." not in (p.stdout + p.stderr) ) def test_channels_installed_unavailable( tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture, ) -> None: """Ensure we don't fail if a channel coming ONLY from an installed pkg is unavailable""" with tmp_env("xz", "--solver=libmamba") as prefix: pd = PrefixData(prefix) pd.load() record = pd.get("xz") assert record record.channel = Channel.from_url("file:///nonexistent") _, _, retcode = conda_cli( "install", f"--prefix={prefix}", "zlib", "--solver=libmamba", "--dry-run", raises=DryRunExit, ) def _setup_conda_forge_as_defaults(prefix, force=False): write_env_config( prefix, force=force, channels=["defaults"], default_channels=["conda-forge"], ) def _setup_channels_alias(prefix, force=False): write_env_config( prefix, force=force, channels=["conda-forge", "defaults"], channel_alias="https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud", migrated_channel_aliases=["https://conda.anaconda.org"], default_channels=[ "https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main", "https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r", "https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2", ], ) def _setup_channels_custom(prefix, force=False): write_env_config( prefix, force=force, channels=["conda-forge"], custom_channels={ "conda-forge": "https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud", }, ) @pytest.mark.parametrize( "config_env", ( _setup_channels_alias, _setup_channels_custom, ), ) def test_mirrors_do_not_leak_channels(config_env, tmp_path, tmp_env): """ https://github.com/conda/conda-libmamba-solver/issues/108 On existing environments, we load channels from the prefix data information to silence some warnings in libmamba (see `test_channels_prefixdata`). In some configurations that use proxies or Anaconda mirrors, this can lead to the non-mirrored (original) channels being loaded. In airgapped contexts, this is undesirable. """ with env_vars({"CONDA_PKGS_DIRS": tmp_path}), tmp_env() as prefix: assert (Path(prefix) / "conda-meta" / "history").exists() # Setup conda configuration config_env(prefix) common = ["-yp", prefix, "--solver=libmamba", "--json", "-vv"] env = os.environ.copy() env["CONDA_PREFIX"] = str(prefix) # fake activation so config is loaded # Create an environment using mirrored channels only p = conda_subprocess("install", *common, "ca-certificates", env=env) result = json.loads(p.stdout) if p.stderr: assert "conda.anaconda.org" not in p.stderr for pkg in result["actions"]["LINK"]: assert pkg["channel"] == "conda-forge", pkg assert ( pkg["base_url"] == "https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge" ), pkg # Make a change to that channel p = conda_subprocess("install", *common, "zlib", env=env) # Ensure that the loaded channels are ONLY the mirrored ones result = json.loads(p.stdout) if p.stderr: assert "conda.anaconda.org" not in p.stderr for pkg in result["actions"]["LINK"]: assert pkg["channel"] == "conda-forge", pkg assert ( pkg["base_url"] == "https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge" ), pkg # Ensure that other end points were never loaded @pytest.mark.skipif(not on_linux, reason="Only run on Linux") def test_jax_and_jaxlib(): "https://github.com/conda/conda-libmamba-solver/issues/221" env = os.environ.copy() env["CONDA_SUBDIR"] = "linux-64" for specs in (("jax", "jaxlib"), ("jaxlib", "jax")): process = conda_subprocess( "create", "--name=unused", "--solver=libmamba", "--json", "--dry-run", "--override-channels", "-c", "defaults", f"conda-forge::{specs[0]}", f"conda-forge::{specs[1]}", explain=True, env=env, ) result = json.loads(process.stdout) assert result["success"] is True pkgs = {pkg["name"] for pkg in result["actions"]["LINK"]} assert specs[0] in pkgs assert specs[1] in pkgs def test_encoding_file_paths(tmp_path: Path): tmp_channel = tmp_path / "channel+some+encodable+bits" repo = Path(__file__).parent / "data/mamba_repo" shutil.copytree(repo, tmp_channel) process = conda_subprocess( "create", "-p", tmp_path / "env", "-c", tmp_channel, "test-package", "--solver=libmamba", ) print(process.stdout) print(process.stderr, file=sys.stderr) assert process.returncode == 0 assert list((tmp_path / "env" / "conda-meta").glob("test-package-*.json")) def test_conda_build_with_aliased_channels(tmp_path): "https://github.com/conda/conda-libmamba-solver/issues/363" condarc = Path.home() / ".condarc" condarc_contents = condarc.read_text() if condarc.is_file() else None env = os.environ.copy() if on_win: env["CONDA_BLD_PATH"] = str(Path(os.environ.get("RUNNER_TEMP", tmp_path), "bld")) else: env["CONDA_BLD_PATH"] = str(tmp_path / "conda-bld") try: _setup_conda_forge_as_defaults(Path.home(), force=True) conda_subprocess( "build", DATA / "conda_build_recipes" / "jedi", "--override-channels", "--channel=defaults", capture_output=False, env=env, ) finally: if condarc_contents: condarc.write_text(condarc_contents) else: condarc.unlink() def test_http_server_auth_none( http_server_auth_none: str, # noqa: F811 conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture, ): conda_cli( "create", f"--prefix={path_factory()}", "--solver=libmamba", "--json", "--override-channels", f"--channel={http_server_auth_none}", "test-package", ) def test_http_server_auth_basic( http_server_auth_basic, # noqa: F811 conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture, ): conda_cli( "create", f"--prefix={path_factory()}", "--solver=libmamba", "--json", "--override-channels", f"--channel={http_server_auth_basic}", "test-package", ) @pytest.mark.parametrize("shards", [True, False], ids=("shard", "noshard")) def test_http_server_auth_basic_email( http_server_auth_basic_email, # noqa: F811 conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture, shards: bool, monkeypatch, ): monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", str(shards)) conda_cli( "create", f"--prefix={path_factory()}", "--solver=libmamba", "--json", "--override-channels", f"--channel={http_server_auth_basic_email}", "test-package", ) def test_http_server_auth_token( http_server_auth_token, # noqa: F811 conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture, ): conda_cli( "create", f"--prefix={path_factory()}", "--solver=libmamba", "--json", "--override-channels", f"--channel={http_server_auth_token}", "test-package", ) def test_http_server_auth_token_in_defaults( http_server_auth_token, # noqa: F811 path_factory: PathFactoryFixture, ) -> None: condarc = Path.home() / ".condarc" condarc_contents = condarc.read_text() if condarc.is_file() else None try: write_env_config( Path.home(), force=True, channels=["defaults"], default_channels=[http_server_auth_token], ) reset_context() conda_subprocess("info", capture_output=False) conda_subprocess( "create", f"--prefix={path_factory()}", "--solver=libmamba", "test-package", ) finally: if condarc_contents: condarc.write_text(condarc_contents) else: condarc.unlink() def test_local_spec() -> None: """https://github.com/conda/conda-libmamba-solver/issues/398""" env = os.environ.copy() env["CONDA_BLD_PATH"] = str(DATA / "mamba_repo") process = conda_subprocess( "create", "--dry-run", "--solver=libmamba", "--channel=local", "test-package", env=env, ) assert process.returncode == 0 process = conda_subprocess( "create", "--dry-run", "--solver=libmamba", "local::test-package", env=env, ) assert process.returncode == 0 def test_nameless_channel( http_server_auth_none: str, # noqa: F811 conda_cli: CondaCLIFixture, tmp_path: Path, ): out, err, rc = conda_cli( "create", f"--prefix={tmp_path}", "--solver=libmamba", "--yes", "--override-channels", f"--channel={http_server_auth_none}", "test-package", ) print(out) print(err, file=sys.stderr) assert not rc out, err, rc = conda_cli( "install", f"--prefix={tmp_path}", "--solver=libmamba", "--yes", f"--channel={http_server_auth_none}", "zlib", ) print(out) print(err, file=sys.stderr) assert not rc def test_unknown_channels_do_not_crash(tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture) -> None: """https://github.com/conda/conda-libmamba-solver/issues/418""" DATA = Path(__file__).parent / "data" test_pkg = DATA / "mamba_repo" / "noarch" / "test-package-0.1-0.tar.bz2" with tmp_env("ca-certificates") as prefix: # copy pkg to a new non-channel-like location without repodata around to obtain # '' channel and reproduce the issue temp_pkg = Path(prefix, "test-package-0.1-0.tar.bz2") shutil.copy(test_pkg, temp_pkg) conda_cli("install", f"--prefix={prefix}", temp_pkg) assert package_is_installed(prefix, "test-package") conda_cli("install", f"--prefix={prefix}", "zlib") assert package_is_installed(prefix, "zlib") @pytest.mark.skipif(not on_linux, reason="Only run on Linux") def test_use_cache_works_offline_fresh_install_keep(tmp_path): """ https://github.com/conda/conda-libmamba-solver/issues/396 constructor installers have a `-k` switch (keep) to leave the pkgs/ cache prepopulated. Offline updating from the cache should be a harmless no-op, not a hard crash. """ miniforge_url = ( "https://github.com/conda-forge/miniforge/releases/" f"latest/download/Miniforge3-Linux-{os.uname().machine}.sh" ) urlretrieve(miniforge_url, tmp_path / "miniforge.sh") # bkfp: batch, keep, force, prefix check_call(["bash", str(tmp_path / "miniforge.sh"), "-bkfp", tmp_path / "miniforge"]) env = os.environ.copy() env["CONDA_ROOT_PREFIX"] = str(tmp_path / "miniforge") env["CONDA_PKGS_DIRS"] = str(tmp_path / "miniforge" / "pkgs") env["CONDA_ENVS_DIRS"] = str(tmp_path / "miniforge" / "envs") env["HOME"] = str(tmp_path) # ignore ~/.condarc args = ( "update", "-p", tmp_path / "miniforge", "--all", "--dry-run", "--override-channels", "--channel=conda-forge", ) kwargs = {"capture_output": False, "check": True, "env": env} conda_subprocess(*args, "--offline", **kwargs) conda_subprocess(*args, "--use-index-cache", **kwargs) conda_subprocess(*args, "--offline", "--use-index-cache", **kwargs) def test_channels_are_percent_encoded(tmp_path): channel = tmp_path / "channel with spaces" noarch = channel / "noarch" noarch.mkdir(parents=True, exist_ok=True) (noarch / "repodata.json").write_text("{}") index = LibMambaIndexHelper(channels=[Channel(str(channel))]) assert index.repos for repo in index.repos: assert "%20" in repo.url_no_cred assert "%20" in repo.url_w_cred index = LibMambaIndexHelper(channels=[], pkgs_dirs=[str(channel)]) assert index.repos for repo in index.repos: assert "%20" in repo.url_no_cred assert "%20" in repo.url_w_cred def test_channel_ordering( conda_cli: CondaCLIFixture, monkeypatch: pytest.MonkeyPatch, shard_factory: ShardFactory ) -> None: """https://github.com/conda/conda-libmamba-solver/issues/824""" # Setup two shard servers. server_one will have a small # delay in the response to mimic a slower response. server_one = shard_factory.http_server_shards( "channel-ordering-one", finish_request_action=lambda: time.sleep(0.2) ) server_two = shard_factory.http_server_shards("channel-ordering-two") monkeypatch.setenv("CONDA_CHANNELS", server_two) monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", "1") out, err, rc = conda_cli( "create", "--dry-run", "--solver=libmamba", f"--channel={server_one}", "foo", "--json", raises=DryRunExit, ) data = json.loads(out) assert data.get("success") is True for link_package in data["actions"]["LINK"]: if link_package["name"] == "foo": # Match the base url of the package to the server url. But clip # the trailing slash from the server url. assert link_package["base_url"] == server_one[:-1] # Ensure that the ordering is respected in the other direction as well. monkeypatch.setenv("CONDA_CHANNELS", server_one) monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", "1") out, err, rc = conda_cli( "create", "--dry-run", "--solver=libmamba", f"--channel={server_two}", "foo", "--json", raises=DryRunExit, ) data = json.loads(out) assert data.get("success") is True for link_package in data["actions"]["LINK"]: if link_package["name"] == "foo": # Match the base url of the package to the server url. But clip # the trailing slash from the server url. assert link_package["base_url"] == server_two[:-1] ================================================ FILE: tests/test_downstream.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause import os from pathlib import Path from subprocess import CalledProcessError, check_call import pytest from conda.base.context import context DATA = Path(__file__).parent / "data" @pytest.mark.parametrize( "recipe", [ pytest.param(x, id=x.name) for x in sorted((DATA / "conda_build_recipes").iterdir()) if (x / "meta.yaml").is_file() ], ) def test_build_recipe(recipe): """ Adapted from https://github.com/mamba-org/boa/blob/3213180564/tests/test_mambabuild.py#L6 See /tests/data/conda_build_recipes/LICENSE for more details """ expected_fail_recipes = ["baddeps"] env = os.environ.copy() env["CONDA_SOLVER"] = "libmamba" recipe_name = Path(recipe).name if recipe_name in expected_fail_recipes: with pytest.raises(CalledProcessError): check_call(["conda-build", recipe], env=env) else: check_call(["conda-build", recipe], env=env) def test_conda_lock(tmp_path): conda_exe_path = "Scripts/conda.exe" if os.name == "nt" else "bin/conda" check_call( [ "conda-lock", "lock", "--platform", context.subdir, "--file", DATA / "lock_this_env.yml", "--conda", Path(context.conda_prefix) / conda_exe_path, ], cwd=tmp_path, ) ================================================ FILE: tests/test_experimental.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Ensure experimental features work accordingly. """ from __future__ import annotations import sys from subprocess import run from typing import TYPE_CHECKING import pytest from conda.base.context import context, fresh_context from conda.exceptions import CondaEnvironmentError if TYPE_CHECKING: from conda.testing.fixtures import CondaCLIFixture from pytest import MonkeyPatch def print_and_check_output(*args, **kwargs): kwargs.setdefault("capture_output", True) kwargs.setdefault("universal_newlines", True) process = run(*args, **kwargs) print("stdout", process.stdout, "---", "stderr", process.stderr, sep="\n") process.check_returncode() return process @pytest.mark.xfail(reason="base protections not enabled anymore") def test_protection_for_base_env(monkeypatch: MonkeyPatch, conda_cli: CondaCLIFixture) -> None: with pytest.raises(CondaEnvironmentError), fresh_context(CONDA_SOLVER="libmamba"): monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) conda_cli( "install", f"--prefix={context.root_prefix}", "--dry-run", "scipy", "--solver=libmamba", ) def test_cli_flag_in_help(): commands_with_flag = ( ["install"], ["update"], ["remove"], ["create"], ["env", "create"], ["env", "update"], ["env", "remove"], ) for command in commands_with_flag: process = print_and_check_output([sys.executable, "-m", "conda"] + command + ["--help"]) assert "--solver" in process.stdout commands_without_flag = ( ["config"], ["list"], ["info"], ["run"], ["env", "list"], ) for command in commands_without_flag: process = print_and_check_output([sys.executable, "-m", "conda"] + command + ["--help"]) assert "--solver" not in process.stdout ================================================ FILE: tests/test_index.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations import json import shutil import time from pathlib import Path from typing import TYPE_CHECKING import pytest from conda.base.context import context, reset_context from conda.common.compat import on_win from conda.core.subdir_data import SubdirData from conda.gateways.logging import initialize_logging from conda.models.channel import Channel from conda_libmamba_solver.index import ( LibMambaIndexHelper, _is_sharded_repodata_enabled, _package_info_from_package_dict, ) from conda_libmamba_solver.shards import ShardLike, spec_to_package_name from conda_libmamba_solver.state import SolverInputState from .test_shards import CONDA_FORGE_WITH_SHARDS if TYPE_CHECKING: import os from conda.testing.fixtures import CondaCLIFixture from pytest_benchmark.plugin import BenchmarkFixture from pytest_mock import MockerFixture initialize_logging() DATA = Path(__file__).parent / "data" def test_given_channels(monkeypatch: pytest.MonkeyPatch, tmp_path: os.PathLike): monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() libmamba_index = LibMambaIndexHelper.from_platform_aware_channel( channel=Channel("conda-test/noarch") ) assert libmamba_index.db.repo_count() == 1 conda_index = SubdirData(Channel("conda-test/noarch")) conda_index.load() assert libmamba_index.db.package_count() == len(tuple(conda_index.iter_records())) @pytest.mark.parametrize( "only_tar_bz2", ( pytest.param("1", id="CONDA_USE_ONLY_TAR_BZ2=true"), pytest.param("", id="CONDA_USE_ONLY_TAR_BZ2=false"), ), ) def test_defaults_use_only_tar_bz2(monkeypatch: pytest.MonkeyPatch, only_tar_bz2: bool): """ Defaults is particular in the sense that it offers both .tar.bz2 and .conda for LOTS of packages. SubdirData ignores .tar.bz2 entries if they have a .conda counterpart. So if we count all the packages in each implementation, libmamba's has way more. To remain accurate, we test this with `use_only_tar_bz2`: - When true, we only count .tar.bz2 - When false, we only count .conda """ monkeypatch.setenv("CONDA_USE_ONLY_TAR_BZ2", only_tar_bz2) reset_context() libmamba_index = LibMambaIndexHelper( channels=[Channel("defaults")], subdirs=("noarch",), installed_records=(), # do not load installed pkgs_dirs=(), # do not load local cache as a channel ) n_repos = 3 if on_win else 2 assert len(libmamba_index.repos) == n_repos libmamba_dot_conda_total = libmamba_index.n_packages( filter_=lambda pkg: pkg.package_url.endswith(".conda") ) libmamba_tar_bz2_total = libmamba_index.n_packages( filter_=lambda pkg: pkg.package_url.endswith(".tar.bz2") ) conda_dot_conda_total = 0 conda_tar_bz2_total = 0 for channel_url in Channel("defaults/noarch").urls(subdirs=("noarch",)): conda_index = SubdirData(Channel(channel_url)) conda_index.load() for pkg in conda_index.iter_records(): if pkg["url"].endswith(".conda"): conda_dot_conda_total += 1 elif pkg["url"].endswith(".tar.bz2"): conda_tar_bz2_total += 1 else: raise RuntimeError(f"Unrecognized package URL: {pkg['url']}") if only_tar_bz2: assert conda_tar_bz2_total == libmamba_tar_bz2_total assert libmamba_dot_conda_total == conda_dot_conda_total == 0 else: assert conda_dot_conda_total == libmamba_dot_conda_total assert conda_tar_bz2_total == libmamba_tar_bz2_total def test_reload_channels(tmp_path: Path): (tmp_path / "noarch").mkdir(parents=True, exist_ok=True) shutil.copy(DATA / "mamba_repo" / "noarch" / "repodata.json", tmp_path / "noarch") initial_repodata = (tmp_path / "noarch" / "repodata.json").read_text() index = LibMambaIndexHelper(channels=[Channel(str(tmp_path))]) initial_count = index.n_packages() SubdirData._cache_.clear() data = json.loads(initial_repodata) package = data["packages"]["test-package-0.1-0.tar.bz2"] data["packages"]["test-package-copy-0.1-0.tar.bz2"] = {**package, "name": "test-package-copy"} modified_repodata = json.dumps(data) (tmp_path / "noarch" / "repodata.json").write_text(modified_repodata) assert initial_repodata != modified_repodata # TODO: Remove this sleep after addressing # https://github.com/conda/conda/issues/13783 time.sleep(1) index.reload_channel(Channel(str(tmp_path))) assert index.n_packages() == initial_count + 1 @pytest.mark.parametrize( "load_type,requested", [ ("shard", ("python",)), ("shard", ("django", "celery")), ("shard", ("vaex",)), ("repodata", ("vaex",)), ("main", ()), ], ids=["shard-small", "shard-medium", "shard-large", "noshard", "main"], ) def test_load_channel_repo_info_shards( load_type: str, requested: tuple[str, ...], tmp_path: Path, conda_cli: CondaCLIFixture, monkeypatch: pytest.MonkeyPatch, benchmark: BenchmarkFixture, ): """ Benchmark shards/not-shards under different dependency tree sizes. """ load_channel = "defaults" if load_type == "main" else CONDA_FORGE_WITH_SHARDS monkeypatch.setattr(context.plugins, "use_sharded_repodata", load_type == "shard") assert _is_sharded_repodata_enabled() == (load_type == "shard") in_state = SolverInputState(str(tmp_path / "env"), requested=requested) subdir = context.subdir # override to hunt bugs def index(): return LibMambaIndexHelper( # this is expanded to noarch, linux-64 for shards. channels=[Channel(f"{load_channel}/{subdir}")], subdirs=( "noarch", subdir, ), installed_records=(), # do not load installed pkgs_dirs=(), # do not load local cache as a channel in_state=in_state, ) index_helper = benchmark.pedantic(index, rounds=1) assert len(index_helper.repos) > 0 @pytest.mark.parametrize( "add_pip", ( pytest.param(True, id="add_pip=True"), pytest.param(False, id="add_pip=False"), ), ) def test_add_pip_as_python_dependency_sharded( monkeypatch: pytest.MonkeyPatch, mocker: MockerFixture, add_pip: bool, ): """ Regression test for https://github.com/conda/conda-libmamba-solver/issues/918. When sharded repodata is used, add_pip_as_python_dependency must be honored. """ monkeypatch.setenv("CONDA_ADD_PIP_AS_PYTHON_DEPENDENCY", "true" if add_pip else "false") reset_context() # Verify the context was set correctly assert context.add_pip_as_python_dependency == add_pip, ( f"Context add_pip_as_python_dependency={context.add_pip_as_python_dependency}, " f"expected {add_pip}" ) # Python interpreter packages are always platform-specific (never noarch). # libmamba only injects pip when the package's platform is a real platform # present in the db — so the test must use the current subdir, not "noarch". subdir = context.subdir shardlike = ShardLike( { "info": {"subdir": subdir, "base_url": "", "shards_base_url": ""}, "packages": { "python-3.10.0-h1234567_0.tar.bz2": { "name": "python", "version": "3.10.0", "build": "h1234567_0", "build_number": 0, "depends": [], } }, "packages.conda": {}, "repodata_version": 2, }, url=f"https://shards.example.com/{subdir}/", ) shardlike.fetch_shard("python") in_state = SolverInputState(prefix="idontexist", requested=("python",)) mocker.patch( "conda_libmamba_solver.index._is_sharded_repodata_enabled", return_value=True, ) mocker.patch( "conda_libmamba_solver.index.build_repodata_subset", return_value={f"https://shards.example.com/{subdir}/": shardlike}, ) index_helper = LibMambaIndexHelper( channels=[Channel("https://shards.example.com")], subdirs=(subdir,), installed_records=(), pkgs_dirs=(), in_state=in_state, ) python_records = index_helper.search("python") assert python_records # Verify the package was loaded correctly python_rec = python_records[0] assert python_rec.name == "python", f"Expected python, got {python_rec.name}" # subdir will attach to channel, not record pip_in_depends = any( spec_to_package_name(dep) == "pip" for dep in (python_records[0].depends or []) ) if add_pip: assert pip_in_depends else: assert not pip_in_depends def test_load_channels_order(shard_factory, mocker: MockerFixture): # Setup two shard servers. server_one will have a small # delay in the response to mimic a slower response. server_one = shard_factory.http_server_shards( "one", finish_request_action=lambda: time.sleep(0.2) ) server_two = shard_factory.http_server_shards("two") channel_one = Channel.from_url(f"{server_one}/noarch") channel_two = Channel.from_url(f"{server_two}/noarch") index_args = { "channels": [ channel_one, channel_two, ], "in_state": SolverInputState(prefix="idontexist"), } mocker.patch( "conda_libmamba_solver.index._is_sharded_repodata_enabled", return_value=True, ) shard_enabled_index = LibMambaIndexHelper(**index_args) # The expected output is that all of channel_one subdirs (noarch and current # platform) are ordered higher than channel_two subdirs. expected_output_channels = [ channel_one.canonical_name, channel_one.canonical_name, channel_two.canonical_name, channel_two.canonical_name, ] assert [ repo.channel.canonical_name for repo in shard_enabled_index.repos ] == expected_output_channels def test_package_info_from_package_dict_add_pip_as_python_dependency(): """ Test that _package_info_from_package_dict appends "pip" to dependencies when add_pip_as_python_dependency=True for Python packages. """ # Test with Python 3.x package and add_pip_as_python_dependency=True python_record = { "name": "python", "version": "3.11.0", "build": "h96f0305_0", "build_number": 0, "depends": ["libffi >=3.4,<4.0"], "subdir": "osx-64", } package_info = _package_info_from_package_dict( python_record, "python-3.11.0-h96f0305_0.tar.bz2", url="https://conda.anaconda.com/pkgs/main/osx-64/python-3.11.0-h96f0305_0.tar.bz2", channel_id="pkgs/main", add_pip_as_python_dependency=True, ) # pip should be appended to dependencies assert "pip" in package_info.dependencies assert "libffi >=3.4,<4.0" in package_info.dependencies assert len(package_info.dependencies) == 2 assert package_info.name == "python" assert package_info.version == "3.11.0" def test_package_info_from_package_dict_add_pip_as_python_dependency_false(): """ Test that _package_info_from_package_dict does NOT append "pip" when add_pip_as_python_dependency=False. """ python_record = { "name": "python", "version": "3.11.0", "build": "h96f0305_0", "build_number": 0, "depends": ["libffi >=3.4,<4.0"], "subdir": "osx-64", } package_info = _package_info_from_package_dict( python_record, "python-3.11.0-h96f0305_0.tar.bz2", url="https://conda.anaconda.com/pkgs/main/osx-64/python-3.11.0-h96f0305_0.tar.bz2", channel_id="pkgs/main", add_pip_as_python_dependency=False, ) # pip should NOT be appended assert "pip" not in package_info.dependencies assert len(package_info.dependencies) == 1 assert list(package_info.dependencies) == ["libffi >=3.4,<4.0"] def test_package_info_from_package_dict_add_pip_python2(): """ Test that _package_info_from_package_dict appends "pip" for Python 2.x packages. """ python_record = { "name": "python", "version": "2.7.18", "build": "h9ed2024_0", "build_number": 0, "depends": [], "subdir": "osx-64", } package_info = _package_info_from_package_dict( python_record, "python-2.7.18-h9ed2024_0.tar.bz2", url="https://conda.anaconda.com/pkgs/main/osx-64/python-2.7.18-h9ed2024_0.tar.bz2", channel_id="pkgs/main", add_pip_as_python_dependency=True, ) # pip should be appended for Python 2.x as well assert "pip" in package_info.dependencies assert len(package_info.dependencies) == 1 def test_package_info_from_package_dict_add_pip_non_python_package(): """ Test that _package_info_from_package_dict does NOT append "pip" for non-Python packages. """ record = { "name": "numpy", "version": "1.24.0", "build": "py311h5a7a992_0", "build_number": 0, "depends": ["python >=3.11"], "subdir": "osx-64", } package_info = _package_info_from_package_dict( record, "numpy-1.24.0-py311h5a7a992_0.tar.bz2", url="https://conda.anaconda.com/pkgs/main/osx-64/numpy-1.24.0-py311h5a7a992_0.tar.bz2", channel_id="pkgs/main", add_pip_as_python_dependency=True, ) # pip should NOT be appended for non-Python packages assert "pip" not in package_info.dependencies assert len(package_info.dependencies) == 1 assert list(package_info.dependencies) == ["python >=3.11"] def test_package_info_from_package_dict_add_pip_invalid_version(): """ Test that _package_info_from_package_dict does NOT append "pip" for Python packages with versions that don't start with "2." or "3.". """ record = { "name": "python", "version": "1.0.0", # Invalid Python version "build": "h0000_0", "build_number": 0, "depends": [], "subdir": "osx-64", } package_info = _package_info_from_package_dict( record, "python-1.0.0-h0000_0.tar.bz2", url="https://conda.anaconda.com/pkgs/main/osx-64/python-1.0.0-h0000_0.tar.bz2", channel_id="pkgs/main", add_pip_as_python_dependency=True, ) # pip should NOT be appended for invalid Python versions assert "pip" not in package_info.dependencies assert len(package_info.dependencies) == 0 ================================================ FILE: tests/test_performance.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Measure the speed and memory usage of the different backend solvers """ from __future__ import annotations from pathlib import Path from typing import TYPE_CHECKING import pytest from conda.base.context import context from conda.exceptions import DryRunExit if TYPE_CHECKING: from collections.abc import Iterable from conda.testing.fixtures import CondaCLIFixture, TmpEnvFixture from pytest import FixtureRequest pytestmark = [ pytest.mark.slow, pytest.mark.usefixtures("parametrized_solver_fixture"), pytest.mark.skip, ] TEST_DATA_DIR = Path(__file__).parent / "data" PLATFORM = context.subdir def _get_channels_from_lockfile(path: Path) -> tuple[str, ...]: """Parse `# channels: conda-forge,defaults` comments""" for line in path.read_text().splitlines(): if line.startswith("# channels:"): return tuple(line.split(":")[1].strip().split(",")) return () def _channels_as_args(channels: Iterable[str]) -> tuple[str, ...]: if not channels: return () return ("--override-channels", *(f"--channel={channel}" for channel in channels)) @pytest.fixture( scope="session", params=TEST_DATA_DIR.glob("*.lock"), ) def prefix_and_channels( request: FixtureRequest, session_tmp_env: TmpEnvFixture, ) -> Iterable[tuple[Path, tuple[str, ...]]]: lockfile = Path(request.param) lock_platform = lockfile.suffixes[-2] if not lock_platform.endswith(PLATFORM): pytest.skip(f"Running platform {PLATFORM} does not match file platform {lock_platform}") with pytest.MonkeyPatch.context() as monkeypatch: monkeypatch.setenv("CONDA_TEST_SAVE_TEMPS", "1") with session_tmp_env("--file", lockfile) as prefix: channels = _get_channels_from_lockfile(lockfile) yield prefix, channels def test_update_python( prefix_and_channels: tuple[Path, tuple[str, ...]], conda_cli: CondaCLIFixture, ) -> None: prefix, channels = prefix_and_channels try: conda_cli( "update", f"--prefix={prefix}", "--dry-run", *_channels_as_args(channels), "python", ) except DryRunExit: assert True else: # this can happen if "all requirements are satisfied" assert True def test_install_python_update_deps( prefix_and_channels: tuple[Path, tuple[str, ...]], conda_cli: CondaCLIFixture, ) -> None: prefix, channels = prefix_and_channels conda_cli( "install", f"--prefix={prefix}", "--dry-run", *_channels_as_args(channels), "python", "--update-deps", raises=DryRunExit, ) def test_update_all( prefix_and_channels: tuple[Path, tuple[str, ...]], conda_cli: CondaCLIFixture, ) -> None: prefix, channels = prefix_and_channels conda_cli( "update", f"--prefix={prefix}", "--dry-run", *_channels_as_args(channels), "--all", raises=DryRunExit, ) def test_install_vaex_from_conda_forge_and_defaults(conda_cli: CondaCLIFixture) -> None: conda_cli( "create", "--dry-run", *_channels_as_args(["conda-forge", "defaults"]), "python=3.9", "vaex", raises=DryRunExit, ) ================================================ FILE: tests/test_plugin.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Ensure configuration plugin functions as expected """ import pytest from conda.auxlib.ish import dals from conda.base.context import context, reset_context @pytest.fixture(scope="function", autouse=True) def always_reset_context(): reset_context() def test_enabled_sharded_repodata(): """ Ensure that the setting `plugins.enable_sharded_repodata` exists and is set to the correct default value. """ assert context.plugins.use_sharded_repodata # type: ignore def test_enabled_sharded_repodata_environment_variable(monkeypatch): """ Ensure that the sharded repodata flag can be controlled by its corresponding environment variable. """ monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", "true") context.__init__() assert context.plugins.use_sharded_repodata # type: ignore def test_enabled_sharded_repodata_condarc(tmp_path): """ Ensure that the sharded repodata flag can be controlled by a condarc file. """ condarc_file = tmp_path / "conda.yml" with condarc_file.open("w") as f: condarc_yml = dals(""" plugins: use_sharded_repodata: true """) f.write(condarc_yml) context.__init__(search_path=(str(condarc_file),)) assert context.plugins.use_sharded_repodata # type: ignore ================================================ FILE: tests/test_repoquery.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause import json from conda.models.channel import Channel from conda_libmamba_solver.index import LibMambaIndexHelper from .utils import conda_subprocess, python_site_packages_path_support def test_repoquery(): p = conda_subprocess("repoquery", "--help") assert "whoneeds" in p.stdout assert "depends" in p.stdout assert "search" in p.stdout p = conda_subprocess("repoquery", "depends", "conda", "--json") print(p.stdout) data = json.loads(p.stdout) assert data["result"]["status"] == "OK" assert len(data["result"]["pkgs"]) > 0 assert len([p for p in data["result"]["pkgs"] if p["name"] == "python"]) == 1 def test_query_search(): index = LibMambaIndexHelper(channels=[Channel("conda-forge")]) for query in ( "ca-certificates", "ca-certificates =2022.9.24", "ca-certificates >=2022.9.24", "ca-certificates >2022.9.24", "ca-certificates<2022.9.24,>2020", "ca-certificates<=2022.9.24,>2020", "ca-certificates !=2022.9.24,>2020", "ca-certificates=*=*_0", # TODO: channel specs are accepted but they seem to be ignored by libmambapy.Query! # "defaults::ca-certificates", # "defaults::ca-certificates=2022.9.24", # "defaults::ca-certificates[version='>=2022.9.24']", # "defaults::ca-certificates[build='*_0']", ): results = index.search(query) assert len(results) > 0, query assert index.search("ca-certificates=*=*_0") == index.search("ca-certificates[build='*_0']") assert index.search("ca-certificates >=2022.9.24") == index.search( "ca-certificates[version='>=2022.9.24']" ) def test_query_search_includes_python_site_packages_path(): index = LibMambaIndexHelper(channels=[Channel("conda-forge")], subdirs=("linux-64", "noarch")) results = index.search("python=3.13.2=h4724d56_1_cp313t") assert len(results) == 1 prec = results[0] assert prec.name == "python" assert prec.version == "3.13.2" if python_site_packages_path_support: assert prec.python_site_packages_path == "lib/python3.13t/site-packages" else: assert prec.python_site_packages_path is None ================================================ FILE: tests/test_shards.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Test sharded repodata. """ from __future__ import annotations import hashlib import json import logging import os import sqlite3 import tempfile import threading import time from contextlib import contextmanager from pathlib import Path from typing import TYPE_CHECKING, NamedTuple import conda.gateways.repodata import msgpack import pytest import zstandard from conda.base.context import context, reset_context from conda.core.subdir_data import SubdirData from conda.models.channel import Channel from requests import Request, Response from conda_libmamba_solver import shards, shards_cache, shards_subset from conda_libmamba_solver.index import ( LibMambaIndexHelper, _is_sharded_repodata_enabled, ) from conda_libmamba_solver.shards import ( ShardLike, Shards, _repodata_shards, _safe_urljoin_with_slash, _shards_connections, batch_retrieve_from_cache, fetch_channels, fetch_shards_index, shard_mentioned_packages, ) from conda_libmamba_solver.shards_subset import ( RepodataSubset, ) from tests import http_test_server if TYPE_CHECKING: from collections.abc import Callable, Iterable, Iterator from conda_libmamba_solver.shards_typing import ShardsIndexDict HERE = Path(__file__).parent # was conda-forge-sharded during testing CONDA_FORGE_WITH_SHARDS = "conda-forge" ROOT_PACKAGES = [ "__archspec", "__conda", "__osx", "__unix", "bzip2", "ca-certificates", "expat", "icu", "libexpat", "libffi", "liblzma", "libmpdec", "libsqlite", "libzlib", "ncurses", "openssl", "pip", "python", "python_abi", "readline", "tk", "twine", "tzdata", "xz", "zlib", ] def package_names(shard: shards_cache.ShardDict): """ All package names mentioned in a shard (should be a single package name) """ return set(package["name"] for package in shard["packages"].values()) | set( package["name"] for package in shard["packages.conda"].values() ) def expand_channels(channels: list[Channel], subdirs: Iterable[str] | None = None): """ Expand channels list into a dict of subdir-aware channels, matching LibMambaIndexHelper behavior. """ subdirs_ = list(context.subdirs) if subdirs is None else subdirs channels_urls = LibMambaIndexHelper._channel_urls(subdirs_, channels) channels_urls = LibMambaIndexHelper._encoded_urls_to_channels(channels_urls) return channels_urls @contextmanager def _timer(name: str, callback=None): """ Print measured time with name as part of message. Call callback(nanoseconds_elapsed) if given. """ begin = time.monotonic_ns() yield end = time.monotonic_ns() print(f"{name} took {(end - begin) / 1e9:0.6f}s") if callback: callback(end - begin) @pytest.fixture def prepare_shards_test(monkeypatch: pytest.MonkeyPatch): """ Reset token to avoid being logged in. e.g. the testing channel doesn't understand them. Enable shards. """ logging.basicConfig(level=logging.INFO) for module in (shards, shards_cache, shards_subset): module.log.setLevel(logging.DEBUG) monkeypatch.setenv("CONDA_TOKEN", "") monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", "1") reset_context() assert _is_sharded_repodata_enabled() @pytest.fixture def empty_shards_cache(tmp_path): """ Empty shards cache, with cleanup. """ with shards_cache.ShardCache(tmp_path) as cache: yield cache cache.remove_cache() # 'foo' and 'bar' have circular dependencies on each other; dependencies on # missing shards (which are not an error during traversal; the solver may or may # not complain if ran); and 'constrains' to exercise other parts of the code. # TODO may need to give these unique prefixes, version numbers ending in # '.tar.bz2', '.conda' to avoid confusing tar-vs-conda code. May need to create # a few more packages giving a richer dependency graph. FAKE_REPODATA = { "info": {"subdir": "noarch", "base_url": "", "shards_base_url": ""}, "packages": { "foo.tar.bz2": { "name": "foo", "version": "1", "build": "0_a", "build_number": 0, "depends": ["bar", "baz"], }, "bar.tar.bz2": { "name": "bar", "version": "1", "build": "0_a", "build_number": 0, "depends": ["foo"], }, "no-matching-conda.tar.bz2": { "name": "foo", "version": "0.1", "build": "0_a", "build_number": 0, }, }, "packages.conda": { "foo.conda": { "name": "foo", "version": "1", "build": "0_a", "build_number": 0, "depends": ["bar", "baz"], "constrains": ["splat<3"], "sha256": hashlib.sha256().digest(), }, "bar.conda": { "name": "bar", "version": "1", "build": "0_a", "build_number": 0, "depends": ["foo"], "constrains": ["splat<3"], "sha256": hashlib.sha256().digest(), }, "no-matching-tar-bz2.conda": { "name": "foo", "version": "2", "build": "0_a", "build_number": 0, "depends": ["quux", "warble"], "constrains": ["splat<3"], "sha256": hashlib.sha256().digest(), }, }, "repodata_version": 2, } def ensure_hex_hash(repodata: dict): """ Convert every hash in a repodata to hex. Copy repodata. """ new_repodata = {**repodata} for group in ("packages", "packages.conda"): for name, record in repodata[group].items(): record = {**record} new_repodata[group][name] = record for hash_type in "sha256", "md5": if hash_value := record.get(hash_type): if not isinstance(hash_value, str): record[hash_type] = bytes(hash_value).hex() return new_repodata def shard_for_name(repodata, name): return { group: {k: v for (k, v) in repodata[group].items() if v["name"] == name} for group in ("packages", "packages.conda") } FAKE_SHARD = shard_for_name(FAKE_REPODATA, "foo") FAKE_SHARD_2 = shard_for_name(FAKE_REPODATA, "bar") class ShardFactory: """ Create http server shards in a temporary directory. Use this class in the context of tests to generate multiple shard servers that can be cleaned up after use. Example: ``` # create shard factory with its root in a temporary directory shard_factory = ShardFactory(tmp_path_factory.mktemp("sharded_repo")) # create an http server serving the testing data url = shard_factory.http_server_shards("http_server_shards") # make a request to the server subdir_data = SubdirData(Channel.from_url(f"{url}/noarch")) found = fetch_shards_index(subdir_data) # shutdown up all servers created by this factory shard_factory.clean_up_http_servers() ``` """ def __init__(self, root: Path = tempfile.gettempdir()): self.root = root self._http_servers = [] def clean_up_http_servers(self): """Shutdown all the servers created by this factory.""" for http in self._http_servers: http.shutdown() self._http_servers = [] def http_server_shards( self, dir_name: str, finish_request_action: Callable | None = None ) -> str: """Create a new http server serving shards from a temporary directory. :param dir_name: The name of the directory to create the shards in. :param finish_request_action: An optional callable to be called after each request is finished. :return: The URL of the http server serving the shards. """ shards_repository = self.root / dir_name / "sharded_repo" shards_repository.mkdir(parents=True) noarch = shards_repository / "noarch" noarch.mkdir() foo_shard = zstandard.compress(msgpack.dumps(FAKE_SHARD)) # type: ignore foo_shard_digest = hashlib.sha256(foo_shard).digest() (noarch / f"{foo_shard_digest.hex()}.msgpack.zst").write_bytes(foo_shard) bar_shard = zstandard.compress(msgpack.dumps(FAKE_SHARD_2)) # type: ignore bar_shard_digest = hashlib.sha256(bar_shard).digest() (noarch / f"{bar_shard_digest.hex()}.msgpack.zst").write_bytes(bar_shard) malformed = {"follows_schema": False} bad_schema = zstandard.compress(msgpack.dumps(malformed)) # type: ignore malformed_digest = hashlib.sha256(bad_schema).digest() (noarch / f"{malformed_digest.hex()}.msgpack.zst").write_bytes(bad_schema) not_zstd = b"not zstd" (noarch / f"{hashlib.sha256(not_zstd).digest().hex()}.msgpack.zst").write_bytes(not_zstd) not_msgpack = zstandard.compress(b"not msgpack") (noarch / f"{hashlib.sha256(not_msgpack).digest().hex()}.msgpack.zst").write_bytes( not_msgpack ) fake_shards: ShardsIndexDict = { "info": {"subdir": "noarch", "base_url": "", "shards_base_url": ""}, "version": 1, "shards": { "foo": foo_shard_digest, "bar": bar_shard_digest, "wrong_package_name": foo_shard_digest, "fake_package": b"", "malformed": hashlib.sha256(bad_schema).digest(), "not_zstd": hashlib.sha256(not_zstd).digest(), "not_msgpack": hashlib.sha256(not_msgpack).digest(), }, } (shards_repository / "noarch" / "repodata_shards.msgpack.zst").write_bytes( zstandard.compress(msgpack.dumps(fake_shards)) # type: ignore ) http = http_test_server.run_test_server( str(shards_repository), finish_request_action=finish_request_action ) self._http_servers.append(http) host, port = http.socket.getsockname()[:2] url_host = f"[{host}]" if ":" in host else host return f"http://{url_host}:{port}/" @pytest.fixture(scope="session") def shard_factory(tmp_path_factory, request: pytest.FixtureRequest) -> ShardFactory: """ Use ShardFactory to manage creating and cleaning up shards for testing. Example: ``` def test_something(shard_factory: ShardFactory): server_one = shard_factory.http_server_shards("one") server_two = shard_factory.http_server_shards("two") ... ``` """ shards_repository = tmp_path_factory.mktemp("sharded_repo") shard_factory = ShardFactory(shards_repository) def close_servers(): shard_factory.clean_up_http_servers() request.addfinalizer(close_servers) return shard_factory @pytest.fixture(scope="session") def http_server_shards(tmp_path_factory) -> Iterable[str]: """ A shard repository with a difference. """ shard_factory = ShardFactory(tmp_path_factory.mktemp("sharded_repo")) url = shard_factory.http_server_shards("http_server_shards") yield url shard_factory.clean_up_http_servers() @pytest.mark.parametrize("error_code", [404, 405, 416, 511]) def test_fetch_shards_index_mark_unavailable(monkeypatch, tmp_path, error_code): expect_should_check_shards = not (400 <= error_code < 500 and error_code != 416) # Guarantee clean cache to avoid interference from previous tests monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() class MockSession: proxies = None get_count = 0 def __call__(self, *args): return self def get(self, url, *args, **kwargs): self.get_count += 1 request = Request("GET", url).prepare() response = Response() response.request = request response.url = url # due to fetch_shards_index going through conda_http_errors, only # 404 may be converted to the RepodataUnavailable exception we are # looking for: response.status_code = error_code return response mock_session = MockSession() monkeypatch.setattr(shards, "get_session", mock_session) channel = Channel("http://localhost/mock/noarch") subdir_data = SubdirData(channel) repo_cache = subdir_data.repo_cache repo_cache.load_state() assert repo_cache.state.should_check_format("shards") fetch_shards_index(subdir_data, None) # load json directly due to issues with repo_cache API, also # fetch_shards_index gets a different repo_cache instance: repo_cache.state.update(json.loads(repo_cache.cache_path_state.read_text())) assert repo_cache.state.should_check_format("shards") == expect_should_check_shards assert mock_session.get_count == 1 # assert that retry skips over shards without trying to GET get_count = mock_session.get_count second_try = fetch_shards_index(subdir_data, None) assert second_try is None assert mock_session.get_count == get_count + expect_should_check_shards def test_fetch_shards_error(http_server_shards, empty_shards_cache): channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) found = fetch_shards_index(subdir_data, empty_shards_cache) assert found not_found = fetch_shards_index( SubdirData(Channel.from_url(f"{http_server_shards}/linux-64")), empty_shards_cache ) assert not not_found # cover "unexpected package name in shard" branch found.visited.clear() assert "packages" in found.fetch_shard("wrong_package_name") # one non-error shard shard_a = found.fetch_shard("foo") shard_b = found.fetch_shard("foo") assert shard_a is shard_b found.visited.clear() # force sqlite3 cache usage shard_c = found.fetch_shard("foo") assert shard_a is not shard_c assert shard_a == shard_c with pytest.raises(conda.gateways.repodata.RepodataIsEmpty): found.fetch_shard("fake_package") # currently logs KeyError: 'packages', doesn't cache, returns decoded msgpack malo = found.fetch_shard("malformed") assert malo == {"follows_schema": False} # XXX should we return None or raise with pytest.raises(zstandard.ZstdError): found.fetch_shard("not_zstd") # unclear if all possible "bad msgpack" errors inherit from a common class # besides ValueError with pytest.raises(ValueError): found.fetch_shard("not_msgpack") def test_shards_base_url(): """ Test Shards() URL functions. """ def with_urls(url, base_url, shards_base_url): # Shards() with different url's return Shards( { "info": { "subdir": "noarch", "base_url": base_url, "shards_base_url": shards_base_url, }, "version": 1, "shards": {"fake_package": bytes.fromhex("abcd")}, }, url, None, # type: ignore ) shards = with_urls( "https://conda.anaconda.org/channel-name/noarch/", "", "https://shards.example.com/channel-name", ) assert ( shards.shard_url("fake_package") == "https://shards.example.com/channel-name/abcd.msgpack.zst" ) shards = with_urls(shards.url, "", "") assert ( shards.shard_url("fake_package") == "https://conda.anaconda.org/channel-name/noarch/abcd.msgpack.zst" ) # where packages are stored assert shards.base_url == "https://conda.anaconda.org/channel-name/noarch/" # packages on a different domain than shards.url shards = with_urls( "https://conda.anaconda.org/channel-name/noarch/", "https://prefix.dev/conda-forge/noarch/", "https://shards.example.com/channel-name", ) assert shards.base_url == "https://prefix.dev/conda-forge/noarch/" # no-trailing-/ example from prefix.dev metadata shards = with_urls( "https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst", "https://prefix.dev/conda-forge/osx-arm64", "", ) # shards_base_url is url joined with shards_base_url, suitable for string concatenation assert shards.shards_base_url == "https://prefix.dev/conda-forge/osx-arm64/" assert ( shards.shard_url("fake_package") == "https://prefix.dev/conda-forge/osx-arm64/abcd.msgpack.zst" ) # relative shards_base_url shards = with_urls( "https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst", "https://prefix.dev/conda-forge/noarch/", "./shards/", ) assert shards.shards_base_url == "https://prefix.dev/conda-forge/osx-arm64/shards/" # relative shards_base_url, with parent directory shards = with_urls( "https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst", "https://prefix.dev/conda-forge/noarch/", "../shards/", ) shards.shards_index["info"]["shards_base_url"] = "../shards" assert shards.shards_base_url == "https://prefix.dev/conda-forge/shards/" # s3 vs https shards = with_urls( "s3://index-bucket/linux-64", # shards index stored on s3 "s3://package-bucket/linux-64", # packages stored on different s3 bucket "https://example.org/shards/", # individual shards stored on https for some reason ) assert shards.shard_url("fake_package") == "https://example.org/shards/abcd.msgpack.zst" # s3 and relative base_url shards = with_urls( "s3://index-bucket/linux-64/repodata_shards.msgpack.zst", # shards index stored on s3 "s3://package-bucket/linux-64", # packages stored on different s3 bucket "./shards/", # individual shards stored on https for some reason ) assert shards.shard_url("fake_package") == "s3://index-bucket/linux-64/shards/abcd.msgpack.zst" def test_shard_mentioned_packages_2(): assert set(shard_mentioned_packages(FAKE_SHARD)) == set( ( "bar", "baz", "quux", # "splat", # omit constrains "warble", ) ) # check that the bytes hash was converted to hex assert FAKE_SHARD["packages.conda"]["foo.conda"]["sha256"] == hashlib.sha256().hexdigest() # type: ignore def test_fetch_shards_channels(prepare_shards_test: None): """ Test all channels fetch as Shards or ShardLike, depending on availability. """ channels = list(context.default_channels) print(channels) channels.append(Channel(CONDA_FORGE_WITH_SHARDS)) channel_data = fetch_channels(expand_channels(channels)) # at least one should be real shards, not repodata.json presented as shards. assert any(isinstance(channel, Shards) for channel in channel_data.values()) def test_shards_cache(tmp_path: Path): cache = shards_cache.ShardCache(tmp_path) # test copy, context manager features with cache.copy() as cache2: assert cache2.conn is not cache.conn fake_shard = {"foo": "bar"} annotated_shard = shards_cache.AnnotatedRawShard( "https://foo", "foo", zstandard.compress(msgpack.dumps(fake_shard)), # type: ignore ) cache.insert(annotated_shard) data = cache.retrieve(annotated_shard.url) assert data == fake_shard assert data is not fake_shard data2 = cache.retrieve("notfound") assert data2 is None assert (tmp_path / shards_cache.SHARD_CACHE_NAME).exists() cache.close() def test_shards_cache_recovery(tmp_path: Path): """ Test that we can recover from a bad shards database. """ db_path = tmp_path / shards_cache.SHARD_CACHE_NAME db_path.write_bytes(os.urandom(1024)) cache = shards_cache.ShardCache(tmp_path, create=False) # sqlite3 won't complain until SQL is executed, but ShardCache() creates the # schema if it doesn't exist: with pytest.raises(sqlite3.DatabaseError): cache.connect(retry=False) cache.connect(retry=True) assert cache.retrieve("notfound") is None def test_shards_cache_uses_wal(tmp_path: Path): """WAL journal mode is enabled on a fresh cache.""" with shards_cache.ShardCache(tmp_path) as cache: mode = cache.conn.execute("PRAGMA journal_mode").fetchone()[0] assert mode == "wal" def test_shards_cache_concurrent_read_write(tmp_path: Path): """Concurrent readers and writers must not raise OperationalError (#924).""" compressor = zstandard.ZstdCompressor(level=1) errors: list[Exception] = [] stop = threading.Event() def writer(base): try: with shards_cache.ShardCache(base, create=False) as cache_copy: for i in range(200): if stop.is_set(): break shard = shards_cache.AnnotatedRawShard( f"https://shard{i}", f"pkg{i}", compressor.compress(msgpack.dumps({f"pkg{i}": "data"})), ) cache_copy.insert(shard) except Exception as exc: errors.append(exc) def reader(base): try: with shards_cache.ShardCache(base, create=False) as cache_copy: for i in range(200): if stop.is_set(): break urls = [f"https://shard{j}" for j in range(i + 1)] cache_copy.retrieve_multiple(urls) except Exception as exc: errors.append(exc) with shards_cache.ShardCache(tmp_path) as cache: w = threading.Thread(target=writer, args=(cache.base,)) r = threading.Thread(target=reader, args=(cache.base,)) w.start() r.start() w.join(timeout=10) r.join(timeout=10) stop.set() # No sqlite3.OperationalError from either thread assert errors == [] NUM_FAKE_SHARDS = 64 class MockCache(NamedTuple): """ Contain all the elements needed to be returned by the `mock_cache` fixture """ num_shards: int shards: list[shards_cache.AnnotatedRawShard] cache: shards_cache.ShardCache @pytest.fixture() def mock_cache(tmp_path: Path) -> Iterator[MockCache]: """ Set up a mock shard cache that will be used by multiple benchmark tests. """ with shards_cache.ShardCache(tmp_path) as cache: NUM_FAKE_SHARDS = 64 fake_shards = [] compressor = zstandard.ZstdCompressor(level=1) for i in range(NUM_FAKE_SHARDS): fake_shard = {f"foo{i}": "bar"} annotated_shard = shards_cache.AnnotatedRawShard( f"https://foo{i}", f"foo{i}", compressor.compress(msgpack.dumps(fake_shard)), # type: ignore ) cache.insert(annotated_shard) fake_shards.append(annotated_shard) yield MockCache(num_shards=NUM_FAKE_SHARDS, shards=fake_shards, cache=cache) @pytest.fixture def shard_cache_with_data( mock_cache: MockCache, ) -> tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]]: """ ShardCache with some data already inserted. """ return mock_cache.cache, mock_cache.shards def test_shard_cache_multiple( tmp_path: Path, shard_cache_with_data: tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]], ): """ Test that retrieve_multiple() is equivalent to several retrieve() calls. """ cache, fake_shards = shard_cache_with_data none_retrieved = cache.retrieve_multiple([]) # coverage assert none_retrieved == {} start_multiple = time.monotonic_ns() retrieved = cache.retrieve_multiple([shard.url for shard in fake_shards]) end_multiple = time.monotonic_ns() assert len(retrieved) == NUM_FAKE_SHARDS print( f"retrieve {len(fake_shards)} shards in a single call: {(end_multiple - start_multiple) / 1e9:0.6f}s" ) start_single = time.monotonic_ns() for i, url in enumerate([shard.url for shard in fake_shards]): single = cache.retrieve(url) assert retrieved[url] == single end_single = time.monotonic_ns() print( f"retrieve {len(fake_shards)} shards with multiple calls: {(end_single - start_single) / 1e9:0.6f}s" ) if (end_single - start_single) != 0: # avoid ZeroDivisionError print( f"Multiple API takes {(end_multiple - start_multiple) / (end_single - start_single):.2f} times as long." ) assert (end_multiple - start_multiple) / (end_single - start_single) < 1, ( "batch API took longer" ) assert (tmp_path / shards_cache.SHARD_CACHE_NAME).exists() def test_shard_cache_clear_remove(tmp_path): """ Test clear, remove cache functions not otherwise used. """ cache = shards_cache.ShardCache(tmp_path) cache.insert(shards_cache.AnnotatedRawShard("https://bar", "bar", b"bar")) assert len(list(cache.conn.execute("SELECT * FROM SHARDS"))) == 1 cache.clear_cache() assert list(cache.conn.execute("SELECT * FROM SHARDS")) == [] assert (cache.base / shards_cache.SHARD_CACHE_NAME).exists() cache.remove_cache() assert not (cache.base / shards_cache.SHARD_CACHE_NAME).exists() cache.close() def test_shardlike(): """ ShardLike class presents repodata.json as shards in a way that is suitable for our subsetting algorithm. """ repodata = json.loads( (Path(__file__).parent / "data" / "mamba_repo" / "noarch" / "repodata.json").read_text() ) bad_repodata = repodata.copy() bad_repodata["info"] = {**bad_repodata["info"], "base_url": 4} with pytest.raises(TypeError): ShardLike(bad_repodata) # make fake packages for n in range(10): for m in range(n): # 0 test0's repodata["packages"][f"test{n}{m}.tar.bz2"] = {"name": f"test{n}"} repodata["packages.conda"][f"test{n}{m}.tar.bz2"] = {"name": f"test{n}"} as_shards = ShardLike(repodata) assert len(as_shards.repodata_no_packages) assert len(as_shards.shards) assert sorted(as_shards.shards["test4"]["packages"].keys()) == [ "test40.tar.bz2", "test41.tar.bz2", "test42.tar.bz2", "test43.tar.bz2", ] fetched_shard = as_shards.fetch_shard("test1") assert fetched_shard["packages"]["test10.tar.bz2"]["name"] == "test1" assert as_shards.url in repr(as_shards) assert "test1" in as_shards fetched_shards = as_shards.fetch_shards(("test1", "test2")) assert len(fetched_shards) == 2 assert fetched_shards["test1"] assert fetched_shards["test2"] as_shards.visited.update(fetched_shards) as_shards.visited["package-that-does-not-exist"] = None repodata = as_shards.build_repodata() assert len(repodata["packages"]) == 3 assert len(repodata["packages.conda"]) == 3 def test_shardlike_repr(): """ Code coverage for ShardLike.__repr__() """ shardlike = ShardLike( { "packages": {}, "packages.conda": {}, "info": {"base_url": "", "shards_base_url": "", "subdir": "noarch"}, "repodata_version": 1, }, "https://conda.anaconda.org/", ) cls, url, *_ = repr(shardlike).split() assert "ShardLike" in cls assert shardlike.url == url def test_shard_hash_as_array(): """ Test that shard hashes can be bytes or list[int], for rattler compatibility. """ name = "package" fake_shard: ShardsIndexDict = { "info": {"subdir": "noarch", "base_url": "", "shards_base_url": ""}, "repodata_version": 1, "shards": { name: list(hashlib.sha256().digest()), # type: ignore }, } fake_shard_2 = fake_shard.copy() fake_shard_2["shards"] = fake_shard["shards"].copy() fake_shard_2["shards"][name] = hashlib.sha256().digest() assert isinstance(fake_shard["shards"][name], list) assert isinstance(fake_shard_2["shards"][name], bytes) index = Shards(fake_shard, "", None) # type: ignore index_2 = Shards(fake_shard_2, "", None) # type: ignore shard_url = index.shard_url(name) shard_url_2 = index_2.shard_url(name) assert shard_url == shard_url_2 def test_shards_coverage(): """ Call Shards() methods that are not otherwise called. """ shard = shards.Shards( { "info": {"subdir": "noarch", "base_url": "", "shards_base_url": "./shards/"}, "version": 1, "shards": {}, }, "https://example.org/noarch/repodata_shards.msgpack.zst", ) # type: ignore with pytest.raises(KeyError): # The visit_shard() method is used for ShardLike (from monolithic # repodata) and makes a package part of the generated repodata. For # Shards() (from sharded repodata), we assign directly to visited and # don't wind up calling visit_shard(). shard.visit_package("package") shard.visited["package"] = {} # type: ignore[assign] assert shard.visit_package("package") == {} assert shard.shards_cache is None with pytest.raises(ValueError, match="shards_cache"): shard._process_fetch_result(None, None, None, None) def test_ensure_hex_hash_in_record(): """ Test that ensure_hex_hash_in_record() converts bytes to hex strings. """ name = "package" sha256_hash = hashlib.sha256() md5_hash = hashlib.md5() for sha, md5 in [ (sha256_hash.digest(), md5_hash.digest()), (list(sha256_hash.digest()), list(md5_hash.digest())), (sha256_hash.hexdigest(), md5_hash.hexdigest()), ]: record = { "name": name, "sha256": sha, "md5": md5, } updated = shards.ensure_hex_hash(record) # type: ignore assert isinstance(updated["sha256"], str) # type: ignore assert updated["sha256"] == sha256_hash.hexdigest() # type: ignore assert isinstance(updated["md5"], str) # type: ignore assert updated["md5"] == md5_hash.hexdigest() # type: ignore def test_batch_retrieve_from_cache( prepare_shards_test: None, empty_shards_cache: shards_cache.ShardCache ): """ Test single database query to fetch cached shard URLs in a batch. """ channels = [*context.default_channels, Channel(CONDA_FORGE_WITH_SHARDS)] roots = ROOT_PACKAGES[:] with _timer("repodata.json/shards index fetch"): channel_data = fetch_channels(expand_channels(channels)) with _timer("Shard fetch"): sharded = [channel for channel in channel_data.values() if isinstance(channel, Shards)] for shard in sharded: shard.shards_cache = empty_shards_cache assert sharded, "No sharded repodata found" remaining = batch_retrieve_from_cache(sharded, roots) print(f"{len(remaining)} shards to fetch from network") # execute "no sharded channels" branch remaining = batch_retrieve_from_cache([], ["python"]) assert remaining == [] @pytest.mark.benchmark @pytest.mark.parametrize("retrieval_type", ["retrieve_multiple", "retrieve_single"]) def test_shard_cache_multiple_profile(retrieval_type, mock_cache: MockCache): """ Measure the difference between `shards_cache.retrieve_multiple` and `shards_cache.retrieve`. `shards_cache.retrieve_multiple should be faster than `shards_cache.retrieve`. """ if retrieval_type == "retrieve_multiple": retrieved = mock_cache.cache.retrieve_multiple([shard.url for shard in mock_cache.shards]) assert len(retrieved) == mock_cache.num_shards elif retrieval_type == "retrieve_single": retrieved = {} for i, url in enumerate([shard.url for shard in mock_cache.shards]): single = mock_cache.cache.retrieve(url) retrieved[url] = single assert len(retrieved) == mock_cache.num_shards def test_shards_connections(monkeypatch): """ Test _shards_connections() and execute all its code. """ assert context.repodata_threads is None assert _shards_connections() == 10 # requests' default monkeypatch.setattr(shards, "SHARDS_CONNECTIONS_DEFAULT", 7) assert _shards_connections() == 7 monkeypatch.setattr(context, "_repodata_threads", 4) assert _shards_connections() == 4 def test_filter_packages_simple(): simple = { "packages": {"a.tar.bz2": {}, "b.tar.bz2": {}}, "packages.conda": { "a.conda": {}, }, } trimmed = shards_subset.filter_redundant_packages(simple) # type: ignore assert trimmed["packages"] == {"b.tar.bz2": {}} assert shards_subset.filter_redundant_packages(simple, use_only_tar_bz2=True) is simple # type: ignore # the function under test is not particularly slow but downloads large repodata # unnecessarily. Useful if remove_legacy_packages needs to be debugged. @pytest.mark.skip(reason="slow") @pytest.mark.benchmark @pytest.mark.parametrize( "channel", ("conda-forge/linux-64", "https://repo.anaconda.com/pkgs/main/linux-64") ) def test_filter_packages_repodata(channel, benchmark): repodata, _ = SubdirData(Channel(channel)).repo_fetch.fetch_latest_parsed() print( f"Original {channel} has {len(repodata['packages'])} .tar.bz2 packages and {len(repodata['packages.conda'])} .conda packages" ) repodata_trimmed = {} def remove(): nonlocal repodata_trimmed repodata_trimmed = shards_subset.filter_redundant_packages(repodata) # type: ignore benchmark(remove) print( f"Trimmed {channel} has {len(repodata_trimmed['packages'])} .tar.bz2 packages and {len(repodata['packages.conda'])} .conda packages" ) def test_offline_mode_expired_cache(http_server_shards, monkeypatch, tmp_path): """ Test that expired cached shards are used when offline mode is enabled. """ # Guarantee clean cache to avoid interference from previous tests monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) # Populate cache found = fetch_shards_index(subdir_data, None) assert found is not None # Fetch a shard to populate the sqlite3 cache. Install shards cache, since found will have None cache. with shards_subset._install_shards_cache([found]): found.fetch_shard("foo") repo_cache = subdir_data.repo_fetch.repo_cache assert repo_cache.cache_path_shards.exists() # Make cache stale by setting refresh_ns to 1 day ago cache_state = repo_cache.state cache_state["refresh_ns"] = time.time_ns() - (24 * 60 * 60 * 1_000_000_000) # Persist stale timestamp with repo_cache.lock("r+") as state_file: state_file.seek(0) state_file.truncate() state_dict = dict(cache_state) json.dump(state_dict, state_file) assert repo_cache.stale() # Enable offline mode monkeypatch.setattr(context, "offline", True) reset_context() found_offline = fetch_shards_index(subdir_data, None) assert found_offline is not None subset = RepodataSubset([found_offline]) subset.reachable_pipelined(("foo",)) repodata = found_offline.build_repodata() assert len(repodata["packages"]) + len(repodata["packages.conda"]) > 0, "no package records" def test_offline_mode_no_cache(http_server_shards, empty_shards_cache, monkeypatch, tmp_path): """ Test that offline mode falls back gracefully when no cache exists. When offline and no cache exists, the system should fall back to non-sharded repodata rather than failing. """ # Guarantee empty cache as to not interfere with other tests. monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) # Remove cache if it exists repo_cache = subdir_data.repo_fetch.repo_cache assert not repo_cache.cache_path_shards.exists() # Enable offline mode monkeypatch.setattr(context, "offline", True) reset_context() # Try to fetch shards index in offline mode without cache # Should return None (fallback to non-sharded repodata) found = fetch_shards_index(subdir_data, empty_shards_cache) assert found is None def test_offline_mode_missing_shard_in_cache( http_server_shards, empty_shards_cache, tmp_path, monkeypatch ): """ Test that offline mode handles missing shards gracefully when the package exists in the shard index but the shard is not cached. When offline and a package is in the shard index but not in cache, offline_nofetch_thread should return an empty shard rather than failing. """ # Guarantee empty cache; the other 'test_offline...' test can cause 'assert # found is not None' to fail. monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) # Fetch the shards index (so "bar" is in the index) found = fetch_shards_index(subdir_data, empty_shards_cache) assert found is not None # Verify "bar" is in the index assert "bar" in found # Fetch "foo" shard to ensure cache exists, but don't fetch "bar" found.fetch_shard("foo") # Verify "bar" shard is not in the cache bar_shard_url = found.shard_url("bar") cache = shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) assert cache.retrieve(bar_shard_url) is None, "bar shard should not be in cache" # Enable offline mode monkeypatch.setattr(context, "offline", True) reset_context() # Fetch shards index again in offline mode (should use cached index) found_offline = fetch_shards_index(subdir_data, empty_shards_cache) assert found_offline is not None # Try to reach "bar" which is in index but not in cache # In offline mode, this should return an empty shard gracefully subset = RepodataSubset([found_offline]) subset.reachable_pipelined(("bar",)) # Build repodata - should complete without crashing repodata = found_offline.build_repodata() # The repodata may be empty since "bar" is not cached and returns empty shard assert isinstance(repodata, dict) def test_repodata_shards_sends_etag(monkeypatch, tmp_path): """ Test that repodata_shards(), normally only called by fetch_shards_index, can send etag. (Our test web server doesn't use etag). """ # Guarantee clean cache to avoid interference from previous tests monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() class MockSession: proxies = None get_count = 0 def __call__(self, *args): return self def get(self, url, headers, **kwargs): self.url = url self.headers = headers self.kwargs = kwargs raise NotImplementedError() mock_session = MockSession() monkeypatch.setattr(shards, "get_session", mock_session) channel = Channel("http://localhost/mock/noarch") subdir_data = SubdirData(channel) repo_cache = subdir_data.repo_cache repo_cache.load_state() repo_cache.state["etag"] = "etag" with pytest.raises(NotImplementedError): _repodata_shards(channel.url(), repo_cache) assert mock_session.headers == {"If-None-Match": "etag"} @pytest.mark.parametrize( "base_url,relative_url,expected", [ # HTTP URLs - standard urljoin behavior ( "https://repo.anaconda.com/pkgs/main/linux-64", "", "https://repo.anaconda.com/pkgs/main/", ), ( "https://repo.anaconda.com/pkgs/main/linux-64", "subdir", "https://repo.anaconda.com/pkgs/main/", ), # Realistic file URLs: in practice, base_url is a repodata file URL, # and urljoin(url, ".") strips the filename to get the directory. ( "https://repo.anaconda.com/pkgs/main/linux-64/repodata_shards.msgpack.zst", "", "https://repo.anaconda.com/pkgs/main/linux-64/", ), ( "s3://bucket-name/linux-64/repodata_shards.msgpack.zst", "", "s3://bucket-name/linux-64/", ), ( "s3://bucket-name/linux-64/repodata_shards.msgpack.zst", ".", "s3://bucket-name/linux-64/", ), ( "file:///path/to/channel/linux-64/repodata_shards.msgpack.zst", "", "file:///path/to/channel/linux-64/", ), ( "ftp://ftp.example.com/pub/linux-64/repodata_shards.msgpack.zst", "", "ftp://ftp.example.com/pub/linux-64/", ), # Trailing-slash directory URLs are preserved as-is for all schemes ("s3://bucket-name/linux-64/", "", "s3://bucket-name/linux-64/"), ("file:///path/to/channel/linux-64/", "", "file:///path/to/channel/linux-64/"), # Non-HTTP without trailing slash: urljoin treats the last segment as a # filename (consistent with HTTP behavior above) ("s3://bucket-name/linux-64", "", "s3://bucket-name/"), ("s3://bucket-name/linux-64", ".", "s3://bucket-name/"), ("file:///path/to/channel/linux-64", "", "file:///path/to/channel/"), ("ftp://ftp.example.com/pub/linux-64", "", "ftp://ftp.example.com/pub/"), ], ) def test_safe_urljoin_with_slash(base_url, relative_url, expected): """ Test _safe_urljoin_with_slash handles various URL schemes correctly. urljoin only works for schemes in ``urllib.parse.uses_relative`` (http, https, file, ftp, etc.). For unregistered schemes like s3://, it returns just ``"."`` instead of the resolved URL. This function handles those via scheme-swap. All schemes should behave consistently: the last path segment without a trailing slash is treated as a filename and stripped. See: https://github.com/conda/conda-libmamba-solver/issues/866 """ result = _safe_urljoin_with_slash(base_url, relative_url) assert result == expected ================================================ FILE: tests/test_shards_subset.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations import concurrent.futures import json import queue import random import threading import time import urllib.parse from contextlib import suppress from pathlib import Path from queue import Empty, SimpleQueue from typing import TYPE_CHECKING from unittest.mock import patch import conda.gateways.repodata import pytest import pytest_codspeed from conda.base.context import context, reset_context from conda.common.compat import on_win from conda.core.subdir_data import SubdirData from conda.models.channel import Channel from requests.exceptions import HTTPError from conda_libmamba_solver import shards_cache, shards_subset from conda_libmamba_solver.index import _package_info_from_package_dict from conda_libmamba_solver.shards import ( ShardLike, Shards, fetch_channels, fetch_shards_index, ) from conda_libmamba_solver.shards_subset import ( NodeId, RepodataSubset, build_repodata_subset, combine_batches_until_none, exception_to_queue, ) from tests.test_shards import ( FAKE_REPODATA, ROOT_PACKAGES, _timer, ensure_hex_hash, expand_channels, ) from .test_shards import CONDA_FORGE_WITH_SHARDS if TYPE_CHECKING: from collections.abc import Sequence from conda.testing.fixtures import CondaCLIFixture from pytest_benchmark.plugin import BenchmarkFixture from conda_libmamba_solver.shards_typing import ShardDict # avoid underscores in names to parse them easily TESTING_SCENARIOS = [ { "name": "python", "packages": ["python"], "prefetch_packages": [], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, { "name": "data_science_ml", "packages": ["scikit-learn", "matplotlib"], "prefetch_packages": ["python", "numpy"], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, { "name": "web_development", "packages": ["django", "celery"], "prefetch_packages": ["python", "requests"], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, { "name": "scientific_computing", "packages": ["scipy", "sympy", "pytorch"], "prefetch_packages": ["python", "numpy", "pandas"], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, { "name": "devops_automation", "packages": ["ansible", "pyyaml", "jinja2"], "prefetch_packages": ["python"], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, { "name": "vaex", "packages": ["vaex"], "prefetch_packages": ["python", "numpy", "pandas"], "channel": CONDA_FORGE_WITH_SHARDS, "platform": "linux-64", }, ] if True: # one fast, one slow-ish scenario for faster tests unless debugging. TESTING_SCENARIOS = [ scenario for scenario in TESTING_SCENARIOS if scenario["name"] in ("python", "devops_automation") ] def codspeed_supported(): """ TODO: temporary measure to skip these tests if we do not have pytest-codspeed >=4 """ try: major, minor, bug = pytest_codspeed.__version__.split(".") return int(major) >= 4 except (ValueError, AttributeError): # If this fails, it means we want to skip this test return False def clean_cache(conda_cli: CondaCLIFixture): """ Clean cache and assert it completed without error except on Windows """ out, err, return_code = conda_cli("clean", "--yes", "--all") # Windows CI runners cannot reliably remove this file, so we don't care # about this assertion on that platform. # "err" will include log.debug output on certain test runners, so we can't # check it to determine whether there was an error. if not on_win: assert not return_code, "conda clean returned {return_code} != 0" def repodata_subset_size(channel_data): """ Measure the size of a repodata subset as serialized to JSON. Discard data. """ repodata_size = 0 for _, shardlike in channel_data.items(): repodata = shardlike.build_repodata() repodata_text = json.dumps( repodata, indent=0, separators=(",", ":"), sort_keys=True, ensure_ascii=False ) repodata_size += len(repodata_text.encode("utf-8")) return repodata_size @pytest.mark.skipif(not codspeed_supported(), reason="pytest-codspeed-version-4") @pytest.mark.parametrize("cache_state", ("cold", "warm")) @pytest.mark.parametrize("algorithm", ("bfs", "pipelined")) @pytest.mark.parametrize( "scenario", TESTING_SCENARIOS, ids=[scenario["name"] for scenario in TESTING_SCENARIOS], ) def test_traversal_algorithm_benchmarks( benchmark: BenchmarkFixture, cache_state: str, algorithm: str, scenario: dict, ): """ Benchmark multiple traversal algorithms for retrieving repodata shards with a variety of parameter states (described below). cache_state: Either "cold" or "warm" representing shards available or not available in SQLite, respectively. algorithm: Method used to fetch shards scenario: List of packages to use to create an environment """ cache = shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) if cache_state == "warm": # Clean shards cache just once for "warm"; leave index cache intact. cache.remove_cache() def setup(): if cache_state != "warm": # For "cold", we want to clean shards cache before each round of benchmarking cache.remove_cache() channels = [Channel(f"{scenario['channel']}/{scenario['platform']}")] channel_data = fetch_channels(expand_channels(channels)) assert channel_data is not None assert len(channel_data) in (2, 4), "Expected 2 or 4 channels fetched" subset = RepodataSubset((*channel_data.values(),)) return (subset,), {} def target(subset: RepodataSubset): with _timer(""): subset.reachable(scenario["packages"], strategy=algorithm) warmup_rounds = 1 if cache_state == "warm" else 0 benchmark.pedantic(target, setup=setup, rounds=1, warmup_rounds=warmup_rounds) @pytest.mark.parametrize( "scenario", TESTING_SCENARIOS, ids=[scenario["name"] for scenario in TESTING_SCENARIOS], ) def test_traversal_algorithms_match(conda_cli, scenario: dict): """ Ensure that all traversal algorithms return the same repodata subset. """ channel = Channel(f"{scenario['channel']}/{scenario['platform']}") channels = expand_channels([channel]) repodata_algorithm_map = { "bfs": build_repodata_subset(scenario["packages"], channels, algorithm="bfs"), "pipelined": build_repodata_subset(scenario["packages"], channels, algorithm="pipelined"), } for subdir in repodata_algorithm_map["bfs"].keys(): repodatas = [] for algorithm, repodata_subset in repodata_algorithm_map.items(): repodatas.append(repodata_subset[subdir].build_repodata()) assert all(x == y for x, y in zip(repodatas, repodatas[1:])) # region pipelined # try with big, and empty root_packages. @pytest.mark.parametrize( "root_packages", [ROOT_PACKAGES[:] + ["vaex"], []], ids=["complex", "empty"] ) def test_build_repodata_subset_pipelined( prepare_shards_test: None, root_packages: list[str], tmp_path ): """ Build repodata subset using a worker threads dependency traversal algorithm. """ channels = [] # channels.extend(context.default_channels) channels.append(Channel(CONDA_FORGE_WITH_SHARDS)) with _timer("fetch_channels()"): channel_data = fetch_channels(expand_channels(channels)) def assert_quick(ns: int): # Check that the 1 second queue timeout doesn't happen on an empty # traversal. if not root_packages: assert (ns / 1e9) < 0.05, "Empty shard traversal should be quick." with _timer("RepodataSubset.reachable_pipelined()", assert_quick): subset = RepodataSubset((*channel_data.values(),)) subset.reachable_pipelined(root_packages) print(f"{len(subset.nodes)} (channel, package) nodes discovered") print("Channels:", ",".join(urllib.parse.urlparse(url).path[1:] for url in channel_data)) def test_shards_cache_thread( shard_cache_with_data: tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]], ): """ Test sqlite3 retrieval thread. """ cache, fake_shards = shard_cache_with_data in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue() shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]]] = SimpleQueue() network_out_queue: SimpleQueue[list[NodeId]] = SimpleQueue() # this kind of thread can crash, and we don't hear back without our own # handling. cache_thread = threading.Thread( target=shards_subset.cache_fetch_thread, args=(in_queue, shard_out_queue, network_out_queue, cache), daemon=False, ) fake_nodes = [NodeId(shard.package, channel="", shard_url=shard.url) for shard in fake_shards] # several batches, then None "finish thread" sentinel in_queue.put(fake_nodes[:1]) in_queue.put([NodeId("notfound", channel="", shard_url="https://example.com/notfound")]) in_queue.put(fake_nodes[1:3]) in_queue.put( [ NodeId("notfound2", channel="", shard_url="https://example.com/notfound2"), NodeId("notfound3", channel="", shard_url="https://example.com/notfound3"), ] ) in_queue.put(fake_nodes[3:]) in_queue.put(None) cache_thread.start() # combined into a single output batch batch = shard_out_queue.get(timeout=1) for node_id, shard in batch: assert node_id in fake_nodes assert shard == cache.retrieve(node_id.shard_url) # no "done" sentinel in shard_out_queue with pytest.raises(queue.Empty): shard_out_queue.get_nowait() while notfound := network_out_queue.get(timeout=1): for node_id in notfound: assert node_id.shard_url.startswith("https://example.com/notfound") cache_thread.join(5) def test_shards_network_thread(http_server_shards, shard_cache_with_data): """ Test network retrieval thread, meant to be chained after the sqlite3 thread by having network_in_queue = sqlite3 thread's network_out_queue. """ cache, fake_shards = shard_cache_with_data channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) found = fetch_shards_index(subdir_data, None) assert found invalid_shardlike = ShardLike( {}, # type: ignore url="file:///non-network/shard/url", ) network_in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue() shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]]] = SimpleQueue() # this kind of thread can crash, and we don't hear back without our own # handling. network_thread = threading.Thread( target=shards_subset.network_fetch_thread, args=(network_in_queue, shard_out_queue, cache, [found, invalid_shardlike]), daemon=False, ) node_ids = [NodeId(package, found.url) for package in found.package_names] # Only fetch "foo" and "bar" because these are valid shards for node_id in node_ids: if node_id.package in ("foo", "bar"): network_in_queue.put([node_id]) network_thread.start() with suppress(Empty): while batch := shard_out_queue.get(timeout=1): for url, shard in batch: assert isinstance(shard, dict) # Make sure this is either one of the two packages from above ("foo" or "bar") assert set(shard.get("packages", {}).keys()).intersection( ("foo.tar.bz2", "bar.tar.bz2") ) # Worker produces TypeError if non-network NodeId is sent and one of the # shardlikes has its url. (If no shardlike has NodeId's url, it produces # KeyError). network_in_queue.put([NodeId("nope", invalid_shardlike.url)]) assert isinstance(shard_out_queue.get(timeout=1), TypeError) # Terminate with sentinel network_in_queue.put(None) network_thread.join(5) # endregion @pytest.mark.parametrize("algorithm", ["bfs", "pipelined"]) def test_build_repodata_subset_error_propagation(http_server_shards, algorithm, mocker, tmp_path): """ Ensure errors encountered during shard fetching are properly propagated. This test uses http_server_shards to fetch the initial shards index, then mocks the actual shard fetching to simulate network errors. """ # Use http_server_shards to set up the initial channel with shards index channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] # Override cache dir location for tests; ensures it's empty mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) # Mock batch_retrieve_from_network to raise an error for bfs algorithm if algorithm == "bfs": with patch( "conda_libmamba_solver.shards_subset.batch_retrieve_from_network" ) as mock_batch: # Simulate a network error when fetching shards mock_batch.side_effect = HTTPError("Simulated network error") with pytest.raises(HTTPError, match="Simulated network error"): build_repodata_subset( root_packages, expand_channels([channel]), algorithm=algorithm ) # For pipelined algorithm, mock the session.get to raise an error elif algorithm == "pipelined": # Patch at the module level before threads start original_executor = shards_subset.ThreadPoolExecutor def mock_executor(*args, **kwargs): executor = original_executor(*args, **kwargs) original_submit = executor.submit def mock_submit(fn, *fn_args, **fn_kwargs): if fn.__name__ == "fetch": raise HTTPError("Simulated network error during pipelined fetch") return original_submit(fn, *fn_args, **fn_kwargs) executor.submit = mock_submit return executor with patch("conda_libmamba_solver.shards_subset.ThreadPoolExecutor", mock_executor): # The pipelined algorithm should propagate this error with pytest.raises(HTTPError, match="Simulated network error during pipelined fetch"): build_repodata_subset( root_packages, expand_channels([channel]), algorithm=algorithm ) @pytest.mark.parametrize("algorithm", ["bfs", "pipelined"]) def test_build_repodata_subset_package_not_found(http_server_shards, algorithm, tmp_path, mocker): """ Ensure packages that cannot be found result in empty repodata. This test uses http_server_shards to fetch the initial shards index, and then tests the code to make sure an empty repodata is produced at the end. """ # Use http_server_shards to set up the initial channel with shards index channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["404-package-not-found"] # Override cache dir location for tests; ensures it's empty mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm=algorithm ) for shardlike in channel_data.values(): assert not shardlike.build_repodata().get("packages") @pytest.mark.parametrize("algorithm", ["bfs", "pipelined"]) def test_build_repodata_subset_local_server(http_server_shards, algorithm, monkeypatch, tmp_path): """ Ensure we can fetch and build a valid repodata subset from our mock local server. """ # Guarantee clean cache to avoid interference from previous tests monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) reset_context() channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] expected_repodata = ensure_hex_hash(FAKE_REPODATA) expected_repodata = shards_subset.filter_redundant_packages(expected_repodata) # type: ignore channel_data = build_repodata_subset( root_packages, {channel.url() or "": channel}, algorithm=algorithm ) for shardlike in channel_data.values(): # expanded in fetch_channels() "channel.urls(True, context.subdirs)" if "/noarch/" not in shardlike.url: continue actual_repodata = shardlike.build_repodata() assert actual_repodata == expected_repodata, ( "actual", actual_repodata, "expected", expected_repodata, ) def test_build_repodata_subset_no_shards(http_server_shards): """ If no channel has repodata_shards.msgpack.zst, build_repodata_subset() returns None. """ channels = expand_channels([Channel(http_server_shards + "/notfound")]) assert build_repodata_subset([], channels) is None def test_build_repodata_subset(prepare_shards_test: None, tmp_path): """ Build repodata subset, convert it into libmamba objects, and compute the size if the subset was serialized as repodata.json. """ # installed, plus what we want to add (twine) root_packages = ROOT_PACKAGES[:] channels = list(context.default_channels) channels.append(Channel(CONDA_FORGE_WITH_SHARDS)) channel_dict = expand_channels(channels) with _timer("build_repodata_subset()"): channel_data = build_repodata_subset(root_packages, channel_dict) # convert to PackageInfo for libmamba, without temporary files package_info = [] for channel, shardlike in channel_data.items(): repodata = shardlike.build_repodata() # Don't like going back and forth between channel objects and URLs; # build_repodata_subset() expands channels into per-subdir URLs as # part of fetch: channel_object = Channel(channel) channel_id = str(channel_object) for package_group in ("packages", "packages.conda"): for filename, record in repodata.get(package_group, {}).items(): package_info.append( _package_info_from_package_dict( record, filename, url=shardlike.url, channel_id=channel_id, ) ) assert len(package_info), "no packages in subset" print(f"{len(package_info)} packages in subset") with _timer("write_repodata_subset()"): repodata_size = repodata_subset_size(channel_data) print(f"Repodata subset would be {repodata_size} bytes as json") # e.g. this for noarch and osx-arm64 # % curl https://conda.anaconda.org/conda-forge-sharded/noarch/repodata.json.zst | zstd -d | wc full_repodata_benchmark = 138186556 + 142680224 print( f"Versus only noarch and osx-arm64 full repodata: {repodata_size / full_repodata_benchmark:.02f} times as large" ) print("Channels:", ",".join(urllib.parse.urlparse(url).path[1:] for url in channel_data)) @pytest.mark.parametrize("only_tar_bz2", (True, False)) @pytest.mark.parametrize("strategy", ("pipelined", "bfs")) def test_only_tar_bz2(http_server_shards, tmp_path, only_tar_bz2, strategy): """ Ensure we avoid tar_bz2 in "use .conda" mode. Should we exclude all .conda in "only .tar.bz2" mode? Can we drop this legacy mode? """ channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] channel_data = fetch_channels({channel.url() or "": channel}) subset = RepodataSubset((*channel_data.values(),)) subset._use_only_tar_bz2 = only_tar_bz2 subset.reachable(root_packages, strategy=strategy) repodata = json.dumps(subset.shardlikes[0].build_repodata(), indent=True) if only_tar_bz2: assert len(subset.shardlikes[0].build_repodata()["packages"]) > 0, repodata else: assert set(subset.shardlikes[0].build_repodata()["packages"]) == { "no-matching-conda.tar.bz2" }, repodata def test_pipelined_with_slow_queue_operations(http_server_shards, mocker, tmp_path): """ Test that simulates slow queue operations which can trigger race conditions where the main thread might timeout waiting for results. """ channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] # Override cache dir location for tests mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) # Create a custom queue that adds delays class SlowQueue(SimpleQueue): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.put_count = 0 def put(self, item, *args, **kwargs): self.put_count += 1 # Add delay every few puts to simulate slow operations if self.put_count % 3 == 0: time.sleep(0.05) return super().put(item, *args, **kwargs) def slow_simple_queue_factory(*args, **kwargs): # Only slow down shard_out_queue (not all queues) return SlowQueue(*args, **kwargs) mocker.patch("conda_libmamba_solver.shards_subset.SimpleQueue", slow_simple_queue_factory) # This should complete despite slow queue operations channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm="pipelined" ) # Verify results found_packages = False for shardlike in channel_data.values(): if "/noarch/" in shardlike.url and shardlike.build_repodata().get("packages"): found_packages = True assert found_packages def test_pipelined_shutdown_race_condition(http_server_shards, mocker, tmp_path): """ Test the specific race condition where the main thread checks pending/in_flight and finds them empty, but worker threads are still processing items. """ channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) # Track when drain_pending is called original_drain_pending = RepodataSubset.drain_pending drain_count = {"count": 0} def tracked_drain_pending(self, pending, shardlikes_by_url): drain_count["count"] += 1 result = original_drain_pending(self, pending, shardlikes_by_url) # Add delay after drain to increase chance of race condition if drain_count["count"] > 1: time.sleep(0.1) return result mocker.patch.object(RepodataSubset, "drain_pending", tracked_drain_pending) # Run multiple times to increase chance of hitting race condition for _ in range(10): channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm="pipelined" ) # Verify we got valid results found_packages = False for shardlike in channel_data.values(): if "/noarch/" in shardlike.url and shardlike.build_repodata().get("packages"): found_packages = True assert found_packages def test_pipelined_timeout(http_server_shards, monkeypatch, tmp_path): """ Test that pipelined times out if a URL is never fetched. """ # Guarantee clean cache to avoid interference from previous tests monkeypatch.setenv("CONDA_PKGS_DIRS", str(tmp_path)) monkeypatch.setenv("CONDA_REMOTE_READ_TIMEOUT_SECS", "1") monkeypatch.setenv("CONDA_REMOTE_MAX_RETRIES", "0") reset_context() channel = Channel.from_url(f"{http_server_shards}/noarch/") root_packages = ["foo"] # fetch_channels() will expand noarch/ to include context.subdirs, but we only want a single subdir here. # shardlikes = fetch_channels([channel]) channel = Channel.from_url(f"{http_server_shards}/noarch") subdir_data = SubdirData(channel) shardlikes = [fetch_shards_index(subdir_data, None)] queue = SimpleQueue() # a slow and ineffective get() monkeypatch.setattr( "conda.gateways.connection.session.CondaSession.get", lambda *args, **kwargs: queue.get() ) # faster failure monkeypatch.setattr("conda_libmamba_solver.shards_subset.REACHABLE_PIPELINED_MAX_TIMEOUTS", 1) monkeypatch.setattr("conda_libmamba_solver.shards_subset.THREAD_WAIT_TIMEOUT", 0) assert len(shardlikes) == 1, "test expects a single channel" assert all(isinstance(shardlike, Shards) for shardlike in shardlikes), ( "test expects real sharded channel" ) subset = RepodataSubset(shardlikes) with pytest.raises(TimeoutError, match="shard"): subset.reachable_pipelined(root_packages) queue.put(None) def test_combine_batches_blocking_scenario(): """ Test the scenario where combine_batches_until_none would block indefinitely without the timeout fix. This simulates the case where: 1. Producer sends a few items 2. Producer crashes or stops sending before sending None 3. Consumer blocks forever waiting for more items """ test_queue: SimpleQueue[Sequence[NodeId] | None] = SimpleQueue() # Put some items in the queue test_queue.put([NodeId("package1", "channel1")]) test_queue.put([NodeId("package2", "channel2")]) # Simulate producer failure - don't send None sentinel # Without timeout fix, this would block forever received = [] timeout_occurred = False def consumer(): nonlocal timeout_occurred try: for batch in combine_batches_until_none(test_queue): received.extend(batch) # After processing existing items, iterator should timeout # rather than block forever except Exception: timeout_occurred = True consumer_thread = threading.Thread(target=consumer, daemon=True) consumer_thread.start() # Wait for consumer to process existing items consumer_thread.join(timeout=2) # With the timeout fix, the thread should still be alive (waiting) # but not blocking indefinitely - it will timeout periodically # Let's verify it processed the items we sent assert len(received) == 2 assert any(node.package == "package1" for node in received) @pytest.mark.integration def test_pipelined_extreme_race_conditions( prepare_shards_test, http_server_shards, mocker, tmp_path, ): """ Introduce random delays in Queue operations to look for race conditions. This test: - Adds random delays at multiple points - Runs many iterations - Uses smaller timeouts - Simulates thread scheduling variability """ channel = Channel("conda-forge-sharded/linux-64") root_packages = ["python", "vaex"] mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) # Create a chaotic queue class that adds random delays class ChaoticQueue(SimpleQueue): def get(self, block=True, timeout=None): # Random delay before get if random.random() < 0.3: # 30% chance time.sleep(random.uniform(0.001, 0.02)) return super().get(block=block, timeout=timeout) def put(self, item, block=True, timeout=None): # Random delay before put if random.random() < 0.3: # 30% chance time.sleep(random.uniform(0.001, 0.02)) return super().put(item, block=block, timeout=timeout) # Patch at module level mocker.patch("conda_libmamba_solver.shards_subset.SimpleQueue", ChaoticQueue) # Run multiple iterations to increase chance of hitting race condition failures = [] for iteration in range(20): try: channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm="pipelined" ) # Verify we got results found = any( "/noarch/" in s.url and s.build_repodata().get("packages") for s in channel_data.values() ) assert found, f"Iteration {iteration}: No packages found" except Exception as e: failures.append((iteration, str(e))) # With our fixes, there should be no failures assert not failures, f"Failed on iterations: {failures}" @pytest.mark.parametrize("num_threads", [1, 2, 5]) def test_pipelined_concurrent_stress(http_server_shards, mocker, tmp_path, num_threads): """ Run pipelined algorithm from multiple threads concurrently. This can expose race conditions in shared state or thread coordination. (Actually the concurrency issues happen in fetch_channels() which deals with reading, writing repodata_shards.msgpack.zst to disk.) """ channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) errors = [] def run_subset(): try: channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm="pipelined" ) # Verify results for shardlike in channel_data.values(): if "/noarch/" in shardlike.url: packages = shardlike.build_repodata().get("packages", {}) if packages: return True return False except Exception as e: errors.append(e) raise # Run multiple instances concurrently with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: futures = [executor.submit(run_subset) for _ in range(num_threads)] results = [f.result(timeout=30) for f in futures] assert not errors, f"Errors occurred: {errors}" assert all(results), "Some runs didn't find packages" def test_worker_thread_exception_propagation(): """ Test that exceptions in worker threads are properly propagated to main thread. Without proper exception handling, the main thread could timeout waiting for results that will never arrive. """ in_queue = SimpleQueue() out_queue = SimpleQueue() @exception_to_queue def failing_worker(in_q, out_q): # Process one item successfully item = in_q.get() out_q.put(f"processed: {item}") # Then raise an exception raise ValueError("Simulated worker failure") # Put test data in_queue.put("test_item") # Run worker in thread worker = threading.Thread(target=failing_worker, args=(in_queue, out_queue), daemon=True) worker.start() # Should get the successful result first result = out_queue.get(timeout=1) assert result == "processed: test_item" # Should get the exception propagated exception = out_queue.get(timeout=1) assert isinstance(exception, ValueError) assert "Simulated worker failure" in str(exception) # Worker should also send None to in_queue to signal termination sentinel = in_queue.get(timeout=1) assert sentinel is None def test_shutdown_with_pending_work(http_server_shards, mocker, tmp_path): """ Test the race condition where main thread initiates shutdown while worker threads still have work in their queues. """ channel = Channel.from_url(f"{http_server_shards}/noarch") root_packages = ["foo"] mocker.patch("conda.gateways.repodata.create_cache_dir", return_value=str(tmp_path)) # Track shutdown events shutdown_events = [] class TrackShutdownQueue(SimpleQueue): def put(self, item, *args, **kwargs): if item is None: shutdown_events.append( { "time": time.time(), "thread": threading.current_thread().name, } ) return super().put(item, *args, **kwargs) # Patch at module level mocker.patch("conda_libmamba_solver.shards_subset.SimpleQueue", TrackShutdownQueue) # Run the algorithm channel_data = build_repodata_subset( root_packages, expand_channels([channel]), algorithm="pipelined" ) # Verify we got results found = any( "/noarch/" in s.url and s.build_repodata().get("packages") for s in channel_data.values() ) assert found # Verify shutdown was initiated (None was sent to queues) assert len(shutdown_events) > 0, "Shutdown was never initiated" def test_repodata_subset_misc(): """ Test utility functions on RepodataSubset. """ assert tuple( RepodataSubset.has_strategy(strategy) for strategy in ("bfs", "pipelined", "squirrel") ) == (True, True, False) ================================================ FILE: tests/test_solver.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations import json import os import re import sys from itertools import chain, permutations, repeat from pathlib import Path from subprocess import check_call, run from textwrap import dedent from typing import TYPE_CHECKING import pytest from conda.base.context import context, reset_context from conda.common.compat import on_linux, on_mac, on_win from conda.core.prefix_data import PrefixData from conda.exceptions import ( DryRunExit, PackagesNotFoundError, SpecsConfigurationConflictError, UnsatisfiableError, ) from conda.testing.integration import package_is_installed from conda_libmamba_solver.exceptions import LibMambaUnsatisfiableError from conda_libmamba_solver.solver import LibMambaSolver as Solver from .utils import conda_subprocess, python_site_packages_path_support if TYPE_CHECKING: from conda.testing.fixtures import CondaCLIFixture, TmpEnvFixture from pytest import MonkeyPatch def test_python_downgrade_reinstalls_noarch_packages( tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture, ) -> None: """ Reported in https://github.com/conda/conda/issues/11346 See also test_create::test_noarch_python_package_reinstall_on_pyver_change in conda/conda test suite. Note that we use conda-forge here deliberately; defaults at the time of writing (March 2022) packages pip as a non-noarch build, which means it has a different name across Python versions. conda-forge uses noarch here, so the package is the same across Python versions. Probably why upstream didn't catch this error before. """ with tmp_env( "--override-channels", "--channel=conda-forge", "--solver=libmamba", "pip", "python=3.11", ) as prefix: assert PrefixData(prefix).get("python").version.startswith("3.11") if on_win: pip = str(prefix / "Scripts" / "pip.exe") else: pip = str(prefix / "bin" / "pip") check_call([pip, "--version"]) conda_cli( "install", f"--prefix={prefix}", "--solver=libmamba", "--override-channels", "--channel=conda-forge", "--yes", "python=3.10", ) PrefixData._cache_.clear() assert PrefixData(prefix).get("python").version.startswith("3.10") check_call([pip, "--version"]) def test_defaults_specs_work(conda_cli: CondaCLIFixture) -> None: """ See https://github.com/conda/conda-libmamba-solver/issues/173 `conda install defaults::` fails with libmamba due to a mapping issue between conda and libmamba.Repo channel names. defaults is secretly (main, r and msys2), and repos are built using those actual channels. A bug in libmamba fails to map this relationship. We are testing our workaround (https://github.com/conda/conda-libmamba-solver/issues/173) works for now, but we should probably help fix this in libmamba. """ out, err, rc = conda_cli( "create", "--dry-run", "--json", "--solver=libmamba", "--override-channels", "--channel=conda-forge", "python=3.10", "defaults::libarchive", raises=DryRunExit, ) data = json.loads(out) assert data.get("success") is True for link in data["actions"]["LINK"]: if link["name"] == "libarchive": assert link["channel"] in ("defaults", "pkgs/main") break else: raise AssertionError("libarchive not found in LINK actions") def test_determinism(tmpdir): "Based on https://github.com/conda/conda-libmamba-solver/issues/75" env = os.environ.copy() env.pop("PYTHONHASHSEED", None) env["CONDA_PKGS_DIRS"] = str(tmpdir / "pkgs") installed_bokeh_versions = [] common_args = ( sys.executable, "-mconda", "create", "--name=unused", "--dry-run", "--yes", "--json", "--solver=libmamba", "--channel=conda-forge", "--override-channels", ) pkgs = ("python=3.8", "bokeh", "hvplot") # Two things being tested in the same loop: # - Repeated attempts of the same input should give the same result # - Input order (from the user side) should not matter, and should give the same result for i, pkg_list in enumerate(chain(repeat(pkgs, 10), permutations(pkgs, len(pkgs)))): offline = ("--offline",) if i else () process = run([*common_args, *offline, *pkg_list], env=env, text=True, capture_output=True) if process.returncode: print("Attempt:", i) print(process.stdout) print(process.stderr, file=sys.stderr) process.check_returncode() data = json.loads(process.stdout) assert data["success"] is True for pkg in data["actions"]["LINK"]: if pkg["name"] == "bokeh": installed_bokeh_versions.append(pkg["version"]) break else: raise AssertionError("Didn't find bokeh!") assert len(set(installed_bokeh_versions)) == 1 def test_update_from_latest_not_downgrade( tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture, ) -> None: """Based on two issues where an upgrade caused a downgrade in a given package Suppose we have two python versions 3.11.2 and 3.11.3. The bug is when: $ conda install python | grep python python 3.11.3 $ conda update python | grep python python 3.11.2 Update should not downgrade the package - https://github.com/conda/conda-libmamba-solver/issues/71 - https://github.com/conda/conda-libmamba-solver/issues/156 """ with tmp_env( "--override-channels", "--channel=conda-forge", "--solver=libmamba", "python", ) as prefix: original_python = PrefixData(prefix).get("python") conda_cli( "update", f"--prefix={prefix}", "--solver=libmamba", "--override-channels", "--channel=conda-forge", "python", ) update_python = PrefixData(prefix).get("python") assert original_python.version == update_python.version @pytest.mark.skipif(not on_linux, reason="Linux only") def test_too_aggressive_update_to_conda_forge_packages(tmp_env: TmpEnvFixture) -> None: """ Comes from report in https://github.com/conda/conda-libmamba-solver/issues/240 We expect a minimum change to the 'base' environment if we only ask for a single package. conda classic would just change a few (<5) packages, but libmamba seemed to upgrade EVERYTHING it can to conda-forge. In July 2024 this test was updated so it updates ca-certificates instead of libzlib to account for differences in how conda-forge and defaults package this library. """ with tmp_env("conda", "python", "--override-channels", "--channel=defaults") as prefix: cmd = ( "install", "-p", prefix, "-c", "conda-forge", "ca-certificates", "--json", "--dry-run", "-y", "-vvv", ) env = os.environ.copy() env.pop("CONDA_SOLVER", None) # libmamba seems to take these more seriously than conda... by default the aggressive # update list is ca-certificates, openssl and certifi. We clear it in this test so we # can only test the CLI specs _we_ pass. env["CONDA_AGGRESSIVE_UPDATE_PACKAGES"] = "" p_classic = conda_subprocess(*cmd, "--solver=classic", explain=True, env=env) p_libmamba = conda_subprocess(*cmd, "--solver=libmamba", explain=True, env=env) data_classic = json.loads(p_classic.stdout) data_libmamba = json.loads(p_libmamba.stdout) assert ( len(data_libmamba.get("actions", {}).get("LINK", ())) <= len(data_classic.get("actions", {}).get("LINK", ())) <= 1 ) @pytest.mark.skipif(context.subdir != "linux-64", reason="Linux-64 only") def test_pinned_with_cli_build_string(tmp_env: TmpEnvFixture) -> None: specs = ( "scipy=1.7.3=py37hf2a6cf1_0", "python=3.7.3", "pandas=1.2.5=py37h295c915_0", ) channels = ( "--override-channels", "--channel=conda-forge", "--channel=defaults", ) with tmp_env(*specs, *channels) as prefix: Path(prefix, "conda-meta").mkdir(exist_ok=True) Path(prefix, "conda-meta", "pinned").write_text( dedent( """ python ==3.7.3 pandas ==1.2.5 py37h295c915_0 scipy ==1.7.3 py37hf2a6cf1_0 """ ).lstrip() ) # We ask for the same packages or name-only, it should be compatible for valid_specs in (specs, ("python", "pandas", "scipy")): p = conda_subprocess( "install", "-p", prefix, *valid_specs, *channels, "--dry-run", "--json", explain=True, check=False, ) data = json.loads(p.stdout) assert data.get("success") assert data["message"] == "All requested packages already installed." # However if we ask for a different version, it should fail invalid_specs = ("python=3.8", "pandas=1.2.4", "scipy=1.7.2") p = conda_subprocess( "install", "-p", prefix, *invalid_specs, *channels, "--dry-run", "--json", explain=True, check=False, ) data = json.loads(p.stdout) assert not data.get("success") assert data["exception_name"] == "SpecsConfigurationConflictError" non_existing_specs = ("python=0", "pandas=1000", "scipy=24") p = conda_subprocess( "install", "-p", prefix, *non_existing_specs, *channels, "--dry-run", "--json", explain=True, check=False, ) data = json.loads(p.stdout) assert not data.get("success") # Conda 2026 1Q renames exception to PackagesNotFoundInChannelError assert re.match("PackagesNotFound.*Error", data["exception_name"]) def test_constraining_pin_and_requested(): env = os.environ.copy() env["CONDA_PINNED_PACKAGES"] = "python=3.10" # This should fail because it contradicts the pinned packages p = conda_subprocess( "create", "-n", "unused", "--dry-run", "--json", "python=3.11", "--override-channels", "-c", "conda-forge", env=env, explain=True, check=False, ) data = json.loads(p.stdout) assert not data.get("success") assert data["exception_name"] == "SpecsConfigurationConflictError" # This is ok because it's a no-op p = conda_subprocess( "create", "-n", "unused", "--dry-run", "--json", "python", env=env, explain=True, check=False, ) data = json.loads(p.stdout) assert data.get("success") assert data.get("dry_run") def test_locking_pins( monkeypatch: MonkeyPatch, tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture, ) -> None: monkeypatch.setenv("CONDA_PINNED_PACKAGES", "zlib") with tmp_env("zlib") as prefix: # Should install just fine zlib = PrefixData(prefix).get("zlib") assert zlib # This should fail because it contradicts the lock packages out, err, retcode = conda_cli( "install", f"--prefix={prefix}", "--dry-run", "zlib=1.2.11", "--json", raises=SpecsConfigurationConflictError, ) assert str(zlib) in retcode.value.dump_map()["error"] # This is a no-op and ok. It won't involve changes. try: out, err, retcode = conda_cli( "install", f"--prefix={prefix}", "zlib", "--dry-run", "--json", ) except DryRunExit: assert True else: data = json.loads(out) assert data.get("success") assert data["message"] == "All requested packages already installed." def test_ca_certificates_pins(tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture) -> None: ca_certificates_pin = "ca-certificates=2023" with tmp_env() as prefix: Path(prefix, "conda-meta").mkdir(exist_ok=True) Path(prefix, "conda-meta", "pinned").write_text(f"{ca_certificates_pin}\n") for cli_spec in ( "ca-certificates", "ca-certificates=2023", "ca-certificates>0", "ca-certificates<2024", "ca-certificates!=2022", ): out, err, retcode = conda_cli( "install", f"--prefix={prefix}", cli_spec, "--dry-run", "--json", "--override-channels", "--channel=conda-forge", raises=DryRunExit, ) data = json.loads(out) assert data.get("success") assert data.get("dry_run") for pkg in data["actions"]["LINK"]: if pkg["name"] == "ca-certificates": assert pkg["version"].startswith("2023."), cli_spec break else: raise AssertionError("ca-certificates not found in LINK actions") @pytest.mark.skipif( context.subdir == "osx-arm64", reason="python=2.7 not available in this platform" ) def test_python_update_should_not_uninstall_history( tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture, ) -> None: """ https://github.com/conda/conda-libmamba-solver/issues/341 Original report complained about an upgrade to Python 3.12 removing numpy from the (originally) py311 environment because at that point in time numpy for py312 was not yet available in defaults. Since at some point it will be, we will test for similar behavior here, but in a way that we know will never be reverted: typing_extensions being available for Python 2.7. Given a Python 3.8 + typing-extensions environment, the solver should not allow us to change to Python 2.7 because typing-extensions is in history, and the only solution to get Python 2.7 is to remove it. Hence, we expect a conflict that mentions both. """ channels = "--override-channels", "-c", "conda-forge" solver = "--solver", "libmamba" with tmp_env("python=3.8", "typing_extensions>=4.8", *channels, *solver) as prefix: assert package_is_installed(prefix, "python=3.8") assert package_is_installed(prefix, "typing_extensions>=4.8") with pytest.raises( LibMambaUnsatisfiableError, match=r"python 2\.7.|\n*typing_extensions", ): conda_cli( "install", f"--prefix={prefix}", "python=2.7", *channels, *solver, "--dry-run", ) def test_python_downgrade_with_pins_removes_truststore(tmp_env: TmpEnvFixture) -> None: """ https://github.com/conda/conda-libmamba-solver/issues/354 """ channels = "--override-channels", "-c", "conda-forge" solver = "--solver", "libmamba" with tmp_env("python=3.10", "conda", *channels, *solver) as prefix: zstd_version = PrefixData(prefix).get("zstd").version for pin in (None, "zstd", f"zstd={zstd_version}"): env = os.environ.copy() if pin: env["CONDA_PINNED_PACKAGES"] = pin p = conda_subprocess( "install", f"--prefix={prefix}", *channels, *solver, "--dry-run", "--json", "python=3.9", env=env, check=False, ) data = json.loads(p.stdout) assert p.returncode == 0 assert data.get("success") assert data.get("dry_run") link_dict = {pkg["name"]: pkg for pkg in data["actions"]["LINK"]} unlink_dict = {pkg["name"]: pkg for pkg in data["actions"]["UNLINK"]} assert link_dict["python"]["version"].startswith("3.9.") assert "truststore" in unlink_dict if pin: # shouldn't have changed! assert "zstd" not in link_dict assert "zstd" not in unlink_dict @pytest.mark.parametrize("spec", ("__glibc", "__unix", "__linux", "__osx", "__win")) def test_install_virtual_packages(conda_cli: CondaCLIFixture, spec: str) -> None: """ Ensures a solver knows how to deal with virtual specs in the CLI. This mean succeeding only if the virtual package is available. https://github.com/conda/conda-libmamba-solver/issues/480 TODO: Remove once https://github.com/conda/conda/pull/13784 is merged """ if any( [ on_linux and spec in ("__glibc", "__unix", "__linux"), on_mac and spec in ("__unix", "__osx"), on_win and spec == "__win", ] ): raises = DryRunExit # success else: raises = (UnsatisfiableError, PackagesNotFoundError) conda_cli("create", "--dry-run", "--offline", spec, raises=raises) def test_urls_are_percent_decoded(tmp_path: Path) -> None: solver = Solver( prefix=tmp_path, channels=["conda-forge"], specs_to_add=["x264"], command="create" ) records = solver.solve_final_state() for record in records: if record.name == "x264": print(record.url) assert "!" in record.url assert "%" not in record.url break else: pytest.fail("Solution didn't include x264") def test_prune_existing_env( conda_cli: CondaCLIFixture, tmp_path: Path, tmp_env: TmpEnvFixture, ) -> None: """ https://github.com/conda/conda-libmamba-solver/issues/595 """ (tmp_path / "env.yml").write_text( dedent( """ channels: - defaults dependencies: - ca-certificates """ ) ) with tmp_env("zstd") as prefix: out, err, rc = conda_cli( "env", "update", f"--prefix={prefix}", f"--file={tmp_path / 'env.yml'}", "--prune", ) assert rc == 0 PrefixData._cache_.clear() assert not PrefixData(prefix).get("zstd", None) assert PrefixData(prefix).get("ca-certificates") def test_prune_existing_env_dependencies_are_solved( conda_cli: CondaCLIFixture, tmp_path: Path, tmp_env: TmpEnvFixture, ) -> None: """ https://github.com/conda/conda-libmamba-solver/issues/595 """ (tmp_path / "env.yml").write_text( dedent( """ channels: - conda-forge dependencies: - python=3.13 - numpy=2.2.2 """ ) ) with tmp_env("python=3.13") as prefix: out, err, rc = conda_cli( "env", "update", f"--prefix={prefix}", f"--file={tmp_path / 'env.yml'}", "--prune", "-vv", ) print(out) print(err, file=sys.stderr) assert rc == 0 PrefixData._cache_.clear() assert PrefixData(prefix).get("python").version.startswith("3.13") assert PrefixData(prefix).get("numpy") out, err, rc = conda_cli("run", f"--prefix={prefix}", "python", "-c", "import numpy") print(out) print(err, file=sys.stderr) assert rc == 0 def test_satisfied_skip_solve_matchspec( conda_cli: CondaCLIFixture, tmp_env: TmpEnvFixture ) -> None: with tmp_env("ca-certificates") as prefix: conda_cli( "install", f"--prefix={prefix}", "--satisfied-skip-solve", "ca-certificates>10000", raises=PackagesNotFoundError, ) # @pytest.mark.skipif(context.subdir != "linux-64", reason="Linux x64 only") @pytest.mark.parametrize( "specs", ( pytest.param(("pytorch", "torchvision>0.12"), id="pytorch"), pytest.param(("pytorch>0", "torchvision>0.12"), id="pytorch>0"), pytest.param(("pytorch=2", "torchvision>0.12"), id="pytorch=2"), ), ) def test_pytorch_gpu(specs): """ https://github.com/conda/conda-libmamba-solver/issues/646 This test must run in a subprocess because it's sensitive to side effects from other tests. There must be some global state in the libmamba Database / Pool objects. When run in isolation, it always passed. """ env = os.environ.copy() env["CONDA_OVERRIDE_CUDA"] = "12.6" env["CONDA_OVERRIDE_GLIBC"] = "2.30" env["CONDA_OVERRIDE_LINUX"] = "5.15.167.4" env["CONDA_OVERRIDE_ARCHSPEC"] = "skylake" p = conda_subprocess( "create", "--dry-run", "--override-channels", "--channel=conda-forge", "--platform=linux-64", "--json", *specs, env=env, ) result = json.loads(p.stdout) assert result["success"] for record in result["actions"]["LINK"]: if record["name"] == "pytorch": print(record) assert "cuda" in record["build_string"] break else: raise AssertionError("No pytorch found") _CROSS_PLATFORM_TARGET = "linux-64" if context.subdir != "linux-64" else "win-64" @pytest.mark.parametrize( "subdirs,expected_platform", ( pytest.param( (_CROSS_PLATFORM_TARGET, "noarch"), _CROSS_PLATFORM_TARGET, id="cross-platform-target", ), pytest.param( ("noarch",), context.subdir, id="noarch-only-fallback", ), ), ) def test_cross_platform_spinner_message( tmp_path: Path, subdirs: tuple[str, ...], expected_platform: str, ) -> None: """ https://github.com/conda/conda-libmamba-solver/pull/911 The ``Platform:`` line of the metadata-collection spinner message should show the first non-``noarch`` entry of ``self.subdirs`` (the actual target platform during cross-platform export) and fall back to ``context.subdir`` when ``self.subdirs`` only contains ``noarch``. """ from conda.models.channel import Channel solver = Solver( prefix=tmp_path, channels=["conda-forge"], specs_to_add=["tzdata"], command="create", ) # Assign after construction so the noarch-only case bypasses the # ``next(s for s in self.subdirs if s != "noarch")`` call in ``__init__``. solver.subdirs = subdirs message = solver._collect_all_metadata_spinner_message(channels=[Channel("conda-forge")]) assert f"Platform: {expected_platform}" in message assert "Platform: noarch" not in message def test_channel_subdir_set_correctly(tmp_env: TmpEnvFixture) -> None: """ https://github.com/conda/conda-libmamba-solver/issues/662 """ with tmp_env( "--override-channels", "--channel=conda-forge", "--solver=libmamba", "tzdata", "bzip2", ) as prefix: cm_path: Path = prefix / "conda-meta" for prec_path in cm_path.glob("*.json"): if prec_path.name.startswith("bzip2-"): payload = json.loads(prec_path.read_text()) assert not payload["channel"].endswith("noarch") if prec_path.name.startswith("tzdata-"): payload = json.loads(prec_path.read_text()) assert payload["channel"].endswith("noarch") def test_python_site_packages_path(tmp_env: TmpEnvFixture) -> None: with tmp_env( "--override-channels", "--channel=conda-forge", "--solver=libmamba", "python-freethreading=3.13", ) as prefix: PrefixData._cache_.clear() prec = PrefixData(prefix).get("python") assert prec.name == "python" assert prec.version.startswith("3.13") if python_site_packages_path_support: if context.subdir.startswith("win"): assert prec.python_site_packages_path == "Lib/site-packages" else: assert prec.python_site_packages_path == "lib/python3.13t/site-packages" else: assert prec.python_site_packages_path is None @pytest.mark.skipif(on_win, reason="Missing free-threaded Python build?") @pytest.mark.parametrize("shards", (True, False)) def test_track_features_recorded_correctly(tmp_env, monkeypatch, shards): monkeypatch.setenv("CONDA_PLUGINS_USE_SHARDED_REPODATA", "1" if shards else "0") reset_context() with tmp_env("python=3.14=*_cp314t", "--override-channels", "-c", "conda-forge") as prefix: python = PrefixData(prefix).get("python") print( json.dumps( {k: v for k, v in python.dump().items() if k not in ("files", "paths_data")}, indent=2, ) ) tf = python.track_features assert tf == ("py_freethreading",) ================================================ FILE: tests/test_solver_differences.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ This module collects examples of environments that were hard to solve, required workarounds or didn't meet users' expectations... specially if compared to conda classic. """ import json import os import pytest from conda.common.compat import on_linux from .repodata_time_machine import repodata_time_machine from .utils import conda_subprocess @pytest.mark.skip(reason="Fixed by #381. v1.8.2 is now found.") def test_pydantic_182_not_on_python_311(): """ See daico007's report on https://github.com/conda/conda-libmamba-solver/issues/115 - The original environment file didn't specify a Python version. - conda classic does find that Python 3.10 and pydantic 1.8.2 are compatible - libsolv has to try all Python versions, starting with 3.11 as of writing, and then tries different pydantic versions. It finds 0.18.2 is compatible, but because it's noarch with an open-ended upper bound. - If we do specify that we want a Python version for which pydantic 1.8.2 is available, libsolv correctly finds it. After #381, where stricter specs are ordered first in the solver task, the solver does find the correct pydantic as classic does. """ env = os.environ.copy() env["CONDA_SUBDIR"] = "linux-64" args = ( "create", "-n", "unused", "--dry-run", "--override-channels", "-c", "conda-forge", "--json", ) pkgs = ( "numpy", "sympy", "unyt<=2.8", "boltons", "lxml", "pydantic<1.9.0", "networkx", "ele>=0.2.0", "forcefield-utilities", ) p = conda_subprocess( *args, "--solver=classic", *pkgs, env=env, ) data = json.loads(p.stdout) pydantic = next(pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "pydantic") assert pydantic["version"] == "1.8.2" p = conda_subprocess( *args, "--solver=libmamba", *pkgs, ) data = json.loads(p.stdout) pydantic = next(pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "pydantic") assert pydantic["version"] != "1.8.2" # this was the bug, now fixed p = conda_subprocess( *args, "--solver=libmamba", *pkgs, "python<3.11", ) data = json.loads(p.stdout) pydantic = next(pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "pydantic") assert pydantic["version"] == "1.8.2" @pytest.mark.skipif(not on_linux, reason="Only relevant on Linux") def test_gpu_cpu_mutexes(): """ See: - https://github.com/conda/conda-libmamba-solver/issues/115#issuecomment-1399040871 - https://github.com/conda/conda-libmamba-solver/issues/115#issuecomment-1399040867 - https://github.com/conda/conda-libmamba-solver/issues/131 This behaviour difference is known and explained at https://github.com/conda/conda-libmamba-solver/issues/131#issuecomment-1440745813. If at some point this changes (e.g. libmamba fix), this test will capture it. """ args = ( "create", "-n", "unused", "--dry-run", "--json", "--override-channels", "-c", "conda-forge", "-c", "pyg", "-c", "pytorch", ) pkgs = ( "cpuonly", "pyg=2.1.0", "python=3.9", "pytorch::pytorch=1.12", ) env = os.environ.copy() env["CONDA_SUBDIR"] = "linux-64" p = conda_subprocess( *args, "--solver=classic", *pkgs, env=env, ) data = json.loads(p.stdout) found = 0 target_pkgs = ("pytorch", "pyg") for pkg in data["actions"]["LINK"]: if pkg["name"] in target_pkgs: found += 1 assert "cpu" in pkg["build_string"] elif pkg["name"] == "cudatoolkit": raise AssertionError("CUDA shouldn't be installed due to 'cpuonly'") assert found == len(target_pkgs) p = conda_subprocess( *args, "--solver=libmamba", *pkgs, env=env, ) data = json.loads(p.stdout) # This should not happen, but it does. See docstring. assert next(pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "cudatoolkit") # This was working correctly between Oct-Dec 2025, but broke again when # `__cuda=0=0` was removed from non-cuda systems # https://github.com/conda/conda/commit/8d36401a0c8b378720db1dc786c0e026bb621fb0 p = conda_subprocess( *args, "--solver=libmamba", "cpuonly", "pyg=2.1.0", "python=3.9", "pytorch::pytorch", # more recent pytorch versions seem to be properly packaged env=env, ) data = json.loads(p.stdout) # This should not happen, but it does. See docstring. assert not next((pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "cudatoolkit"), None) @pytest.mark.skipif(not on_linux, reason="Slow test, only run on Linux") def test_old_panel(tmp_path): """ https://github.com/conda/conda-libmamba-solver/issues/64 We could not reproduce this test until #381. Note this is not a problem in the non-time-machine'd repodata (as of 2023-11-16 at least). """ os.chdir(tmp_path) print("Patching repodata...") old_repodata = os.path.abspath( repodata_time_machine( channels=["conda-forge", "pyviz/label/dev"], timestamp_str="2022-06-16 12:31:00", subdirs=("osx-64", "noarch"), ) ) with open(f"{old_repodata}/conda-forge/osx-64/repodata.json") as f: for line in f: # Make sure we have patched the repodata correctly # Python 3.11 only appeared in October 2022 assert '"python-3.11.0-' not in line channel_prefix = f"file://{old_repodata}/" env = os.environ.copy() env["CONDA_SUBDIR"] = "osx-64" env["CONDA_REPODATA_THREADS"] = "1" env["CONDA_DEFAULT_THREADS"] = "1" env["CONDA_FETCH_THREADS"] = "1" env["CONDA_REMOTE_CONNECT_TIMEOUT_SECS"] = "1" env["CONDA_REMOTE_MAX_RETRIES"] = "1" env["CONDA_REMOTE_BACKOFF_FACTOR"] = "1" env["CONDA_REMOTE_READ_TIMEOUT_SECS"] = "1" args = ( "create", "-n", "unused", "--dry-run", "--json", "--override-channels", "-c", f"{channel_prefix}pyviz/label/dev", "-c", f"{channel_prefix}conda-forge", "--repodata-fn=repodata.json", ) pkgs = ( "python=3.8", "lumen", ) for solver in ("classic", "libmamba"): print("Solving with", solver) p = conda_subprocess( *args, "--solver", solver, *pkgs, env=env, ) data = json.loads(p.stdout) panel = next(pkg for pkg in data["actions"]["LINK"] if pkg["name"] == "panel") assert panel["version"] == "0.14.0a2" ================================================ FILE: tests/test_user_agent.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause """ Ensure the right User-Agent headers are set by `conda.context`. These will be sent to the server on each request. """ import json import os from importlib.metadata import version from subprocess import check_output import pytest @pytest.mark.parametrize("solver", ("classic", "libmamba")) def test_user_agent_conda_info(solver): env = os.environ.copy() env["CONDA_SOLVER"] = solver out = check_output(["conda", "info", "--json"], env=env) info = json.loads(out) assert "conda/" in info["user_agent"] if solver == "classic": assert "solver/" not in info["user_agent"] elif solver == "libmamba": assert "solver/libmamba" in info["user_agent"] assert f"conda-libmamba-solver/{version('conda-libmamba-solver')}" in info["user_agent"] assert f"libmambapy/{version('libmambapy')}" in info["user_agent"] ================================================ FILE: tests/test_workarounds.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause import asyncio import ctypes import json import signal import subprocess as sp import sys import pytest from conda.common.compat import on_win def test_matchspec_star_version(): """ Specs like `libblas=*=*mkl` choked on `MatchSpec.conda_build_form()`. We work around that with `.utils.safe_conda_build_form()`. Reported in https://github.com/conda/conda/issues/11347 """ sp.check_call( [ sys.executable, "-m", "conda", "create", "-p", "UNUSED", "--dry-run", "--override-channels", "-c", "conda-test", "--solver=libmamba", "activate_deactivate_package=*=*0", ] ) def test_build_string_filters(): process = sp.run( [ sys.executable, "-m", "conda", "create", "-p", "UNUSED", "--dry-run", "--solver=libmamba", "numpy=*=*py38*", "--json", ], stdout=sp.PIPE, text=True, ) print(process.stdout) process.check_returncode() data = json.loads(process.stdout) assert data["success"] for pkg in data["actions"]["LINK"]: if pkg["name"] == "python": assert pkg["version"].startswith("3.8") if pkg["name"] == "numpy": assert "py38" in pkg["build_string"] @pytest.mark.trouble @pytest.mark.parametrize("shards", (True, False), ids=["shards", "noshards"]) @pytest.mark.parametrize("stage", ["Collecting package metadata", "Solving environment"]) def test_ctrl_c(stage, shards): TIMEOUT = 20 async def run() -> tuple[str, str, int]: loop = asyncio.get_running_loop() deadline = loop.time() + TIMEOUT env = { "CONDA_PLUGINS_USE_SHARDED_REPODATA": str(shards), "PYTHONHASHSEED": str(0xAD792856), } p = await asyncio.create_subprocess_exec( sys.executable, "-m", "conda", "create", "-p", "UNUSED", "--dry-run", "--solver=libmamba", "--override-channels", "--channel=conda-forge", "--quiet", "vaex", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, env=env, ) lines: list[str] = [] while True: remaining = deadline - loop.time() if remaining <= 0: break try: chunk = await asyncio.wait_for(p.stdout.readline(), timeout=remaining) except asyncio.TimeoutError: break if not chunk: break line = chunk.decode() lines.append(line) print(line.strip()) if stage in line: break if loop.time() >= deadline: stdout_text = "".join(lines) raise RuntimeError(f"Timeout after {TIMEOUT} seconds\n{stdout_text}") # works around Windows' awkward CTRL-C signal handling # https://stackoverflow.com/a/64357453 if on_win: try: kernel = ctypes.windll.kernel32 kernel.FreeConsole() kernel.AttachConsole(p.pid) kernel.SetConsoleCtrlHandler(None, 1) kernel.GenerateConsoleCtrlEvent(0, 0) remaining = deadline - loop.time() await asyncio.wait_for(p.wait(), timeout=remaining) finally: kernel.SetConsoleCtrlHandler(None, 0) else: p.send_signal(signal.SIGINT) remaining = deadline - loop.time() await asyncio.wait_for(p.wait(), timeout=remaining) remaining = deadline - loop.time() if remaining <= 0: raise RuntimeError(f"Timeout after {TIMEOUT} seconds") stdout_tail = await asyncio.wait_for(p.stdout.read(), timeout=remaining) stderr_tail = await asyncio.wait_for(p.stderr.read(), timeout=remaining) stdout_text = "".join(lines) + stdout_tail.decode() stderr_text = stderr_tail.decode() return stdout_text, stderr_text, p.returncode stdout_text, stderr_text, returncode = asyncio.run(run()) assert returncode != 0 assert "KeyboardInterrupt" in stdout_text + stderr_text ================================================ FILE: tests/utils.py ================================================ # Copyright (C) 2022 Anaconda, Inc # Copyright (C) 2023 conda # SPDX-License-Identifier: BSD-3-Clause import sys from pathlib import Path from subprocess import CompletedProcess, run from libmambapy.specs import PackageInfo from ruamel.yaml import YAML python_site_packages_path_support = getattr(PackageInfo, "python_site_packages_path", False) def conda_subprocess(*args, explain=False, capture_output=True, **kwargs) -> CompletedProcess: cmd = [sys.executable, "-m", "conda", *[str(a) for a in args]] check = kwargs.pop("check", True) if explain: print("+", " ".join(cmd)) p = run( cmd, capture_output=capture_output, text=kwargs.pop("text", capture_output), check=False, **kwargs, ) if capture_output and (explain or p.returncode): print(p.stdout) print(p.stderr, file=sys.stderr) if check: p.check_returncode() return p def write_env_config(prefix, force=False, **kwargs): condarc = Path(prefix) / ".condarc" if condarc.is_file() and not force: raise RuntimeError(f"File {condarc} already exists. Use force=True to overwrite.") yaml = YAML(typ="full", pure=True) with open(condarc, "w") as f: yaml.dump(kwargs, f)