From 6820042fdbf2645971d1208a54c9588e8bf8f063 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 14:45:50 +0100 Subject: [PATCH 01/70] ci: merge backend and testsuite repos into Pixi --- .../workflows/backends-python-bindings.yml | 48 + .github/workflows/backends-ros.yml | 46 + .github/workflows/backends-rust.yml | 54 + Cargo.lock | 1161 +- Cargo.toml | 21 +- crates/pixi-build-backend/Cargo.toml | 53 + crates/pixi-build-backend/src/cache.rs | 31 + crates/pixi-build-backend/src/cli.rs | 106 + .../src/common/configuration.rs | 66 + crates/pixi-build-backend/src/common/mod.rs | 8 + .../src/common/requirements.rs | 58 + .../pixi-build-backend/src/common/variants.rs | 31 + crates/pixi-build-backend/src/compilers.rs | 174 + crates/pixi-build-backend/src/consts.rs | 1 + crates/pixi-build-backend/src/dependencies.rs | 487 + .../src/encoded_source_spec_url.rs | 182 + .../src/generated_recipe.rs | 277 + .../src/intermediate_backend.rs | 877 + crates/pixi-build-backend/src/lib.rs | 27 + crates/pixi-build-backend/src/protocol.rs | 46 + .../src/rattler_build_integration.rs | 184 + crates/pixi-build-backend/src/server.rs | 286 + ...ilers__tests__compiler_requirements_c.snap | 5 + ...ers__tests__compiler_requirements_cxx.snap | 5 + ..._tests__compiler_requirements_fortran.snap | 5 + ...__tests__compiler_requirements_python.snap | 5 + ...rs__tests__compiler_requirements_rust.snap | 5 + crates/pixi-build-backend/src/source.rs | 70 + .../src/specs_conversion.rs | 423 + crates/pixi-build-backend/src/tools.rs | 375 + crates/pixi-build-backend/src/traits/mod.rs | 16 + .../src/traits/package_spec.rs | 251 + .../pixi-build-backend/src/traits/project.rs | 91 + .../pixi-build-backend/src/traits/targets.rs | 211 + crates/pixi-build-backend/src/utils/mod.rs | 4 + .../src/utils/temporary_recipe.rs | 53 + crates/pixi-build-backend/src/utils/test.rs | 101 + crates/pixi-build-backend/src/variants.rs | 39 + ...fault_minimal_project_model_for_build.json | 25 + .../tests/fixtures/minimal_project_model.json | 38 + .../minimal_project_model_for_build.json | 38 + .../tests/integration/common/mod.rs | 1 + .../tests/integration/common/model.rs | 206 + .../tests/integration/main.rs | 3 + .../tests/integration/protocol.rs | 146 + ...integration__protocol__conda_build_v1.snap | 10 + crates/pixi-build-cmake/Cargo.toml | 31 + crates/pixi-build-cmake/debug/recipe.yaml | 47 + .../debug/recipe/659f713/recipe.yaml | 46 + .../debug/recipe/659f713/variants.yaml | 2 + .../debug/recipe/7a5450d/recipe.yaml | 47 + .../debug/recipe/7a5450d/variants.yaml | 2 + .../debug/recipe/a543858/recipe.yaml | 47 + .../debug/recipe/a543858/variants.yaml | 2 + crates/pixi-build-cmake/debug/variants.yaml | 8 + crates/pixi-build-cmake/pixi.toml | 10 + crates/pixi-build-cmake/src/build_script.j2 | 58 + crates/pixi-build-cmake/src/build_script.rs | 73 + crates/pixi-build-cmake/src/config.rs | 185 + crates/pixi-build-cmake/src/main.rs | 665 + ...ld_script@unix-nopython-no-extra-args.snap | 21 + ..._script@unix-nopython-with-extra-args.snap | 22 + ...uild_script@unix-python-no-extra-args.snap | 22 + ...ld_script@unix-python-with-extra-args.snap | 23 + ...script@windows-nopython-no-extra-args.snap | 23 + ...ript@windows-nopython-with-extra-args.snap | 24 + ...d_script@windows-python-no-extra-args.snap | 24 + ...script@windows-python-with-extra-args.snap | 25 + ...__tests__cxx_is_in_build_requirements.snap | 31 + ...s_not_added_if_gcc_is_already_present.snap | 30 + ..._build_cmake__tests__env_vars_are_set.snap | 8 + ...ts__has_python_is_set_in_build_script.snap | 9 + ...sts__input_globs_includes_extra_globs.snap | 12 + crates/pixi-build-mojo/Cargo.toml | 30 + crates/pixi-build-mojo/pixi.toml | 10 + crates/pixi-build-mojo/src/build_script.j2 | 22 + crates/pixi-build-mojo/src/build_script.rs | 23 + crates/pixi-build-mojo/src/config.rs | 695 + crates/pixi-build-mojo/src/main.rs | 643 + ...ts__compiler_is_in_build_requirements.snap | 28 + ..._added_if_compiler_is_already_present.snap | 29 + ...i_build_mojo__tests__env_vars_are_set.snap | 8 + ...sts__input_globs_includes_extra_globs.snap | 10 + ...xi_build_mojo__tests__mojo_bin_is_set.snap | 31 + ...xi_build_mojo__tests__mojo_pkg_is_set.snap | 31 + crates/pixi-build-python/Cargo.toml | 37 + crates/pixi-build-python/debug/recipe.yaml | 36 + .../debug/recipe/a048693/recipe.yaml | 36 + .../debug/recipe/a048693/variants.yaml | 2 + .../debug/recipe/c3a871a/recipe.yaml | 36 + .../debug/recipe/c3a871a/variants.yaml | 2 + crates/pixi-build-python/debug/variants.yaml | 8 + crates/pixi-build-python/pixi.toml | 10 + crates/pixi-build-python/src/build_script.j2 | 24 + crates/pixi-build-python/src/build_script.rs | 63 + crates/pixi-build-python/src/config.rs | 296 + crates/pixi-build-python/src/main.rs | 1048 + crates/pixi-build-python/src/metadata.rs | 914 + crates/pixi-build-python/src/pypi_mapping.rs | 1291 + ...ated_recipe_contains_pyproject_values.snap | 32 + ..._c_compilers_create_extra_input_globs.snap | 19 + ...xx_compilers_create_extra_input_globs.snap | 19 + ...build_python__tests__env_vars_are_set.snap | 8 + ...sts__input_globs_includes_extra_globs.snap | 19 + ...t_globs_includes_extra_globs_editable.snap | 17 + ...n__tests__pip_is_in_host_requirements.snap | 32 + ...ython_is_not_added_if_already_present.snap | 32 + ...st_compilers_create_extra_input_globs.snap | 20 + crates/pixi-build-rattler-build/Cargo.toml | 30 + crates/pixi-build-rattler-build/pixi.toml | 10 + crates/pixi-build-rattler-build/src/config.rs | 220 + crates/pixi-build-rattler-build/src/main.rs | 13 + .../pixi-build-rattler-build/src/protocol.rs | 1199 + .../src/rattler_build.rs | 93 + ...s__conda_outputs@boltons__recipe.yaml.snap | 47 + ...puts@custom-build-string__recipe.yaml.snap | 27 + ...@pin-subpackage-variants__recipe.yaml.snap | 169 + ...a_outputs@pin-subpackage__recipe.yaml.snap | 54 + ...__conda_outputs@variants__recipe.yaml.snap | 106 + crates/pixi-build-rust/Cargo.toml | 38 + crates/pixi-build-rust/pixi.toml | 10 + crates/pixi-build-rust/src/build_script.j2 | 24 + crates/pixi-build-rust/src/build_script.rs | 89 + crates/pixi-build-rust/src/config.rs | 221 + crates/pixi-build-rust/src/main.rs | 924 + crates/pixi-build-rust/src/metadata.rs | 869 + ...build_script__test__build_script@bash.snap | 5 + ...ild_script__test__build_script@cmdexe.snap | 6 + ...ust__build_script__test__openssl@bash.snap | 7 + ...t__build_script__test__openssl@cmdexe.snap | 8 + ...ust__build_script__test__sccache@bash.snap | 9 + ...t__build_script__test__sccache@cmdexe.snap | 10 + ...i_build_rust__tests__env_vars_are_set.snap | 8 + ..._tests__rust_is_in_build_requirements.snap | 29 + ..._rust_is_not_added_if_already_present.snap | 29 + ...build_rust__tests__sccache_is_enabled.snap | 34 + crates/recipe-stage0/Cargo.toml | 18 + crates/recipe-stage0/src/lib.rs | 5 + crates/recipe-stage0/src/marked_yaml.rs | 385 + crates/recipe-stage0/src/matchspec.rs | 222 + crates/recipe-stage0/src/recipe.rs | 864 + crates/recipe-stage0/src/requirements.rs | 57 + ...stage0__recipe__tests__recipe_to_yaml.snap | 45 + docs/build/backends.md | 93 +- docs/build/backends/pixi-build-cmake.md | 226 + docs/build/backends/pixi-build-mojo.md | 332 + docs/build/backends/pixi-build-python.md | 423 + .../backends/pixi-build-rattler-build.md | 151 + docs/build/backends/pixi-build-ros.md | 319 + docs/build/backends/pixi-build-rust.md | 284 + docs/build/key_concepts/compilers.md | 184 + mkdocs.yml | 11 +- .../backends/pixi-build-ros/README.md | 35 + .../backends/pixi-build-ros/pixi.lock | 2898 ++ .../backends/pixi-build-ros/pixi.toml | 84 + .../backends/pixi-build-ros/pyproject.toml | 48 + .../backends/pixi-build-ros/robostack.yaml | 1049 + .../src/pixi_build_ros/__init__.py | 0 .../src/pixi_build_ros/build_script.py | 82 + .../src/pixi_build_ros/config.py | 249 + .../src/pixi_build_ros/distro.py | 37 + .../pixi-build-ros/src/pixi_build_ros/main.py | 8 + .../src/pixi_build_ros/metadata_provider.py | 230 + .../src/pixi_build_ros/ros_generator.py | 188 + .../src/pixi_build_ros/utils.py | 345 + .../templates/bld_ament_cmake.bat | 58 + .../templates/bld_ament_python.bat | 34 + .../pixi-build-ros/templates/bld_catkin.bat | 86 + .../templates/bld_catkin_merge.bat | 34 + .../templates/bld_colcon_merge.bat | 38 + .../templates/build_ament_cmake.sh | 80 + .../templates/build_ament_python.sh | 25 + .../pixi-build-ros/templates/build_catkin.sh | 153 + .../tests/__snapshots__/test_package_xml.ambr | 135 + .../test_version_constraints.ambr | 310 + .../backends/pixi-build-ros/tests/conftest.py | 53 + .../tests/data/other_package_map.yaml | 8 + .../tests/data/package_xmls/broken.xml | 18 + .../tests/data/package_xmls/custom_ros.xml | 20 + .../data/package_xmls/demo_nodes_cpp.xml | 53 + .../demos_action_tutorials_interfaces.xml | 28 + .../data/package_xmls/version_constraints.xml | 22 + .../pixi-build-ros/tests/test_distro.py | 45 + .../tests/test_distro_detection.py | 96 + .../tests/test_meta_data_provider.py | 103 + .../pixi-build-ros/tests/test_package_map.py | 170 + .../pixi-build-ros/tests/test_package_xml.py | 442 + .../pixi-build-ros/tests/test_spec_merging.py | 56 + .../tests/test_version_constraints.py | 206 + .../py-pixi-build-backend/.gitattributes | 2 + .../py-pixi-build-backend/.gitignore | 79 + .../py-pixi-build-backend/Cargo.lock | 7535 +++++ .../py-pixi-build-backend/Cargo.toml | 81 + .../py-pixi-build-backend/build.rs | 3 + .../pixi_build_python/__init__.py | 0 .../pixi_build_python/build_script.py | 78 + .../pixi_build_python/main.py | 8 + .../pixi_build_python/python_generator.py | 118 + .../pixi_build_python/utils.py | 155 + .../examples/pixi-build-python/pyproject.toml | 58 + .../py-pixi-build-backend/pixi.lock | 1620 ++ .../py-pixi-build-backend/pixi.toml | 81 + .../pixi_build_backend/__init__.py | 3 + .../pixi_build_backend/main.py | 29 + .../pixi_build_backend/types/__init__.py | 2 + .../pixi_build_backend/types/conditional.py | 73 + .../types/generated_recipe.py | 98 + .../types/intermediate_recipe.py | 913 + .../pixi_build_backend/types/item.py | 187 + .../types/metadata_provider.py | 50 + .../pixi_build_backend/types/platform.py | 117 + .../pixi_build_backend/types/project_model.py | 145 + .../pixi_build_backend/types/python_params.py | 73 + .../pixi_build_backend/types/requirements.py | 82 + .../py-pixi-build-backend/pyproject.toml | 58 + .../py-pixi-build-backend/src/cli/mod.rs | 43 + .../py-pixi-build-backend/src/error.rs | 44 + .../py-pixi-build-backend/src/lib.rs | 135 + .../src/recipe_stage0/conditional.rs | 462 + .../recipe_stage0/conditional_requirements.rs | 197 + .../src/recipe_stage0/mod.rs | 4 + .../src/recipe_stage0/recipe.rs | 1029 + .../src/recipe_stage0/requirements.rs | 327 + .../py-pixi-build-backend/src/types/config.rs | 67 + .../src/types/generated_recipe.rs | 311 + .../src/types/metadata_provider.rs | 182 + .../py-pixi-build-backend/src/types/mod.rs | 14 + .../src/types/platform.rs | 74 + .../src/types/project_model.rs | 147 + .../src/types/python_params.rs | 51 + .../py-pixi-build-backend/tests/__init__.py | 0 .../py-pixi-build-backend/tests/conftest.py | 0 .../tests/data/boltons_recipe.yaml | 30 + .../tests/data/project_model_example.json | 38 + .../tests/unit/__init__.py | 0 .../__snapshots__/test_generated_recipe.ambr | 32 + .../test_intermediate_recipe.ambr | 43 + .../__snapshots__/test_project_model.ambr | 13 + .../tests/unit/test_conditional.py | 44 + .../tests/unit/test_generated_recipe.py | 79 + .../tests/unit/test_intermediate_recipe.py | 56 + .../tests/unit/test_platform.py | 11 + .../tests/unit/test_project_model.py | 33 + .../recipe/pixi-build-api-version/pixi.toml | 5 + .../recipe/pixi-build-api-version/recipe.yaml | 27 + .../recipe/pixi-build-cmake/recipe.yaml | 65 + .../recipe/pixi-build-mojo/recipe.yaml | 65 + .../recipe/pixi-build-python/recipe.yaml | 65 + .../pixi-build-rattler-build/recipe.yaml | 65 + .../recipe/pixi-build-ros/recipe.yaml | 47 + .../recipe/pixi-build-rust/recipe.yaml | 65 + .../recipe/py-pixi-build-backend/recipe.yaml | 57 + .../recipe/testsuite-backends/recipe.yaml | 207 + pixi-build-backends/recipe/variants.yaml | 52 + pixi.toml | 7 + .../.condapackageignore | 1 + .../package-unix-0.1.0-hb0f4dca_0.conda | Bin 0 -> 1203 bytes .../linux-64/repodata.json | 1 + .../noarch/repodata.json | 1 + .../package-unix-0.1.0-h0dc7051_0.conda | Bin 0 -> 1201 bytes .../osx-64/repodata.json | 1 + .../package-unix-0.1.0-h60d57d3_0.conda | Bin 0 -> 1201 bytes .../osx-arm64/repodata.json | 1 + .../rattler-build-log.txt | 4 + .../package-windows-0.1.0-h9490d1a_0.conda | Bin 0 -> 1219 bytes .../win-64/repodata.json | 1 + tests/data/channels/mappings.toml | 1 + .../recipes/target_specific_channel_1.yaml | 23 + .../corp-pinning/conda_build_config.yaml | 4 + .../pixi.toml | 32 + .../pyproject.toml | 12 + .../variant_conda_config_python/__init__.py | 3 + .../corp-pinning/conda_build_config.yaml | 4 + .../pixi.toml | 24 + .../recipe.yaml | 21 + .../corp-pinning/config.yaml | 6 + .../build-variant-files-python/pixi.toml | 32 + .../build-variant-files-python/pyproject.toml | 12 + .../src/variant_files_python/__init__.py | 3 + .../corp-pinning/config.yaml | 6 + .../pixi.toml | 24 + .../recipe.yaml | 21 + .../build-variant-manifest-python/pixi.toml | 32 + .../pyproject.toml | 15 + .../src/variant_manifest_python/__init__.py | 3 + .../pixi.toml | 24 + .../recipe.yaml | 21 + .../pixi-build/cpp-with-git-source/.gitignore | 5 + .../pixi-build/cpp-with-git-source/README.md | 14 + .../pixi-build/cpp-with-git-source/pixi.lock | 1291 + .../pixi-build/cpp-with-git-source/pixi.toml | 39 + .../cpp-with-path-to-source/.gitignore | 5 + .../cpp-with-path-to-source/README.md | 14 + .../cpp-with-path-to-source/pixi.lock | 1234 + .../cpp-with-path-to-source/pixi.toml | 37 + .../project/CMakeLists.txt | 27 + .../project/src/main.cc | 94 + .../pixi-build/editable-pyproject/.gitignore | 2 + .../pixi-build/editable-pyproject/pixi.lock | 779 + .../editable-pyproject/pyproject.toml | 52 + .../src/editable_pyproject/__init__.py | 23 + .../env-config-cmake-test/CMakeLists.txt | 10 + .../env-config-cmake-test/pixi.toml | 22 + .../env-config-invalid-test/CMakeLists.txt | 5 + .../env-config-invalid-test/pixi.toml | 22 + .../CMakeLists.txt | 11 + .../env-config-target-cmake-test/pixi.toml | 28 + .../CMakeLists.txt | 5 + .../env-config-target-invalid-test/pixi.toml | 22 + .../pixi-build/log-example/failing/pixi.lock | 55 + .../pixi-build/log-example/failing/pixi.toml | 22 + .../log-example/failing/recipe.yaml | 13 + .../pixi-build/log-example/working/pixi.lock | 59 + .../pixi-build/log-example/working/pixi.toml | 22 + .../log-example/working/recipe.yaml | 8 + .../pixi-build/manifests/workspace_git.toml | 9 + tests/data/pixi-build/maturin/Cargo.lock | 164 + tests/data/pixi-build/maturin/Cargo.toml | 11 + .../pixi-build/maturin/fast_math/__main__.py | 9 + tests/data/pixi-build/maturin/pixi.toml | 30 + tests/data/pixi-build/maturin/pyproject.toml | 16 + tests/data/pixi-build/maturin/src/lib.rs | 14 + .../pixi-build-cmake/CMakeLists.txt | 14 + .../pixi-build-cmake/pixi.toml | 22 + .../pixi-build-cmake/src/main.cpp | 6 + .../pixi-build-python/pixi.lock | 776 + .../pixi-build-python/pixi.toml | 25 + .../pixi-build-python/pyproject.toml | 10 + .../pixi-build-python/simple_app/__init__.py | 2 + .../pixi-build-rattler-build/pixi.toml | 22 + .../pixi-build-rattler-build/recipe.yaml | 21 + .../pixi-build-rust/Cargo.toml | 6 + .../pixi-build-rust/pixi.toml | 25 + .../pixi-build-rust/src/main.rs | 3 + .../pixi-build/multi-output/recipe/pixi.toml | 9 +- .../name-and-version-less-package/Cargo.toml | 4 + .../name-and-version-less-package/pixi.lock | 7 + .../name-and-version-less-package/pixi.toml | 15 + .../data/pixi-build/python-builddir/pixi.lock | 778 + .../data/pixi-build/python-builddir/pixi.toml | 31 + .../python-builddir/src/meson.build | 3 + .../python-builddir/src/pyproject.toml | 9 + .../src/simple_meson_app/__init__.py | 2 + .../src/simple_meson_app/meson.build | 1 + .../array-api-extra/pixi.toml | 21 + .../array-api-extra/recipe.yaml | 29 + .../rattler-build-backend/smokey/pixi.toml | 24 + .../rattler-build-backend/smokey/recipe.yaml | 5 + .../rattler-build-backend/smokey2/pixi.toml | 24 + .../rattler-build-backend/smokey2/recipe.yaml | 5 + .../source-dependency/a/pixi.toml | 6 + .../source-dependency/a/recipe.yaml | 13 + .../source-dependency/b/pixi.toml | 9 + .../source-dependency/b/recipe.yaml | 19 + .../source-dependency/c/recipe.yaml | 3 + .../source-dependency/pixi.lock | 59 + .../source-dependency/pixi.toml | 10 + .../recursive_source_build_dep/.gitattributes | 2 + .../recursive_source_build_dep/.gitignore | 4 + .../package_a/CMakeLists.txt | 20 + .../package_a/pixi.toml | 19 + .../package_a/src/main.cpp | 15 + .../package_b/CMakeLists.txt | 50 + .../package_b/pixi.toml | 11 + .../package_b/src/package_b.cpp | 10 + .../package_b/src/package_b.h | 21 + .../recursive_source_build_dep/pixi.toml | 13 + .../recursive_source_run_dep/.gitattributes | 2 + .../recursive_source_run_dep/.gitignore | 4 + .../package_a/pixi.toml | 17 + .../package_a/pyproject.toml | 13 + .../package_a/src/package_a/__init__.py | 6 + .../package_b/pixi.toml | 11 + .../package_b/recipe.yaml | 17 + .../recursive_source_run_dep/pixi.lock | 668 + .../recursive_source_run_dep/pixi.toml | 12 + tests/data/pixi-build/rich_example/.gitignore | 4 + tests/data/pixi-build/rich_example/pixi.lock | 847 + tests/data/pixi-build/rich_example/pixi.toml | 28 + .../pixi-build/rich_example/pyproject.toml | 10 + .../rich_example/src/rich_example/__init__.py | 30 + tests/data/pixi-build/ros-workspace/pixi.lock | 23210 ++++++++++++++++ tests/data/pixi-build/ros-workspace/pixi.toml | 27 + .../distro_less_package/__init__.py | 0 .../distro_less_package.py | 9 + .../src/distro_less_package/package.xml | 20 + .../src/distro_less_package/pixi.toml | 6 + .../resource/distro_less_package | 0 .../src/distro_less_package/setup.cfg | 4 + .../src/distro_less_package/setup.py | 22 + .../src/navigator/CMakeLists.txt | 41 + .../ros-workspace/src/navigator/package.xml | 22 + .../ros-workspace/src/navigator/pixi.toml | 6 + .../src/navigator/src/navigator.cpp | 94 + .../src/navigator_implicit/CMakeLists.txt | 41 + .../src/navigator_implicit/package.xml | 22 + .../src/navigator_implicit/src/navigator.cpp | 94 + .../src/navigator_py/navigator_py/__init__.py | 0 .../navigator_py/navigator_py/navigator.py | 91 + .../src/navigator_py/package.xml | 18 + .../ros-workspace/src/navigator_py/pixi.toml | 7 + .../src/navigator_py/resource/navigator_py | 0 .../ros-workspace/src/navigator_py/setup.cfg | 4 + .../ros-workspace/src/navigator_py/setup.py | 22 + .../data/pixi-build/simple-package/pixi.toml | 8 +- .../target-specific/foo/__init__.py | 2 + .../data/pixi-build/target-specific/pixi.toml | 25 + .../pixi-build/target-specific/pyproject.toml | 8 + .../integration_python/pixi_build/__init__.py | 0 tests/integration_python/pixi_build/common.py | 169 + .../integration_python/pixi_build/conftest.py | 111 + .../pixi_build/test_backends.py | 49 + .../pixi_build/test_build.py | 615 + .../pixi_build/test_config.py | 128 + .../integration_python/pixi_build/test_git.py | 277 + .../pixi_build/test_global.py | 341 + .../integration_python/pixi_build/test_log.py | 54 + .../pixi_build/test_multi_output.py | 67 + .../integration_python/pixi_build/test_ros.py | 157 + .../test_specified_build_source/__init__.py | 0 .../test_specified_build_source/conftest.py | 90 + .../test_specified_build_source/test_git.py | 417 + .../pixi_build/test_variants.py | 197 + tests/recipe/boltons/recipe.yaml | 34 + tests/recipe/custom-build-string/recipe.yaml | 20 + .../pin-subpackage-variants/recipe.yaml | 27 + .../pin-subpackage-variants/variants.yaml | 4 + tests/recipe/pin-subpackage/recipe.yaml | 24 + tests/recipe/variants/recipe.yaml | 9 + tests/recipe/variants/variants.yaml | 4 + 430 files changed, 79402 insertions(+), 235 deletions(-) create mode 100644 .github/workflows/backends-python-bindings.yml create mode 100644 .github/workflows/backends-ros.yml create mode 100644 .github/workflows/backends-rust.yml create mode 100644 crates/pixi-build-backend/Cargo.toml create mode 100644 crates/pixi-build-backend/src/cache.rs create mode 100644 crates/pixi-build-backend/src/cli.rs create mode 100644 crates/pixi-build-backend/src/common/configuration.rs create mode 100644 crates/pixi-build-backend/src/common/mod.rs create mode 100644 crates/pixi-build-backend/src/common/requirements.rs create mode 100644 crates/pixi-build-backend/src/common/variants.rs create mode 100644 crates/pixi-build-backend/src/compilers.rs create mode 100644 crates/pixi-build-backend/src/consts.rs create mode 100644 crates/pixi-build-backend/src/dependencies.rs create mode 100644 crates/pixi-build-backend/src/encoded_source_spec_url.rs create mode 100644 crates/pixi-build-backend/src/generated_recipe.rs create mode 100644 crates/pixi-build-backend/src/intermediate_backend.rs create mode 100644 crates/pixi-build-backend/src/lib.rs create mode 100644 crates/pixi-build-backend/src/protocol.rs create mode 100644 crates/pixi-build-backend/src/rattler_build_integration.rs create mode 100644 crates/pixi-build-backend/src/server.rs create mode 100644 crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_c.snap create mode 100644 crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_cxx.snap create mode 100644 crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_fortran.snap create mode 100644 crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_python.snap create mode 100644 crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_rust.snap create mode 100644 crates/pixi-build-backend/src/source.rs create mode 100644 crates/pixi-build-backend/src/specs_conversion.rs create mode 100644 crates/pixi-build-backend/src/tools.rs create mode 100644 crates/pixi-build-backend/src/traits/mod.rs create mode 100644 crates/pixi-build-backend/src/traits/package_spec.rs create mode 100644 crates/pixi-build-backend/src/traits/project.rs create mode 100644 crates/pixi-build-backend/src/traits/targets.rs create mode 100644 crates/pixi-build-backend/src/utils/mod.rs create mode 100644 crates/pixi-build-backend/src/utils/temporary_recipe.rs create mode 100644 crates/pixi-build-backend/src/utils/test.rs create mode 100644 crates/pixi-build-backend/src/variants.rs create mode 100644 crates/pixi-build-backend/tests/fixtures/default_minimal_project_model_for_build.json create mode 100644 crates/pixi-build-backend/tests/fixtures/minimal_project_model.json create mode 100644 crates/pixi-build-backend/tests/fixtures/minimal_project_model_for_build.json create mode 100644 crates/pixi-build-backend/tests/integration/common/mod.rs create mode 100644 crates/pixi-build-backend/tests/integration/common/model.rs create mode 100644 crates/pixi-build-backend/tests/integration/main.rs create mode 100644 crates/pixi-build-backend/tests/integration/protocol.rs create mode 100644 crates/pixi-build-backend/tests/integration/snapshots/integration__protocol__conda_build_v1.snap create mode 100644 crates/pixi-build-cmake/Cargo.toml create mode 100644 crates/pixi-build-cmake/debug/recipe.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml create mode 100644 crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml create mode 100644 crates/pixi-build-cmake/debug/variants.yaml create mode 100644 crates/pixi-build-cmake/pixi.toml create mode 100644 crates/pixi-build-cmake/src/build_script.j2 create mode 100644 crates/pixi-build-cmake/src/build_script.rs create mode 100644 crates/pixi-build-cmake/src/config.rs create mode 100644 crates/pixi-build-cmake/src/main.rs create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-no-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-with-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-no-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-with-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-no-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-with-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-no-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-with-extra-args.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_in_build_requirements.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_not_added_if_gcc_is_already_present.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__env_vars_are_set.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__has_python_is_set_in_build_script.snap create mode 100644 crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__input_globs_includes_extra_globs.snap create mode 100644 crates/pixi-build-mojo/Cargo.toml create mode 100644 crates/pixi-build-mojo/pixi.toml create mode 100644 crates/pixi-build-mojo/src/build_script.j2 create mode 100644 crates/pixi-build-mojo/src/build_script.rs create mode 100644 crates/pixi-build-mojo/src/config.rs create mode 100644 crates/pixi-build-mojo/src/main.rs create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_in_build_requirements.snap create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_not_added_if_compiler_is_already_present.snap create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__env_vars_are_set.snap create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__input_globs_includes_extra_globs.snap create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_bin_is_set.snap create mode 100644 crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_pkg_is_set.snap create mode 100644 crates/pixi-build-python/Cargo.toml create mode 100644 crates/pixi-build-python/debug/recipe.yaml create mode 100644 crates/pixi-build-python/debug/recipe/a048693/recipe.yaml create mode 100644 crates/pixi-build-python/debug/recipe/a048693/variants.yaml create mode 100644 crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml create mode 100644 crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml create mode 100644 crates/pixi-build-python/debug/variants.yaml create mode 100644 crates/pixi-build-python/pixi.toml create mode 100644 crates/pixi-build-python/src/build_script.j2 create mode 100644 crates/pixi-build-python/src/build_script.rs create mode 100644 crates/pixi-build-python/src/config.rs create mode 100644 crates/pixi-build-python/src/main.rs create mode 100644 crates/pixi-build-python/src/metadata.rs create mode 100644 crates/pixi-build-python/src/pypi_mapping.rs create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__metadata__tests__generated_recipe_contains_pyproject_values.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__c_compilers_create_extra_input_globs.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__cxx_compilers_create_extra_input_globs.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__env_vars_are_set.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs_editable.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__pip_is_in_host_requirements.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__python_is_not_added_if_already_present.snap create mode 100644 crates/pixi-build-python/src/snapshots/pixi_build_python__tests__rust_compilers_create_extra_input_globs.snap create mode 100644 crates/pixi-build-rattler-build/Cargo.toml create mode 100644 crates/pixi-build-rattler-build/pixi.toml create mode 100644 crates/pixi-build-rattler-build/src/config.rs create mode 100644 crates/pixi-build-rattler-build/src/main.rs create mode 100644 crates/pixi-build-rattler-build/src/protocol.rs create mode 100644 crates/pixi-build-rattler-build/src/rattler_build.rs create mode 100644 crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@boltons__recipe.yaml.snap create mode 100644 crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@custom-build-string__recipe.yaml.snap create mode 100644 crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage-variants__recipe.yaml.snap create mode 100644 crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage__recipe.yaml.snap create mode 100644 crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@variants__recipe.yaml.snap create mode 100644 crates/pixi-build-rust/Cargo.toml create mode 100644 crates/pixi-build-rust/pixi.toml create mode 100644 crates/pixi-build-rust/src/build_script.j2 create mode 100644 crates/pixi-build-rust/src/build_script.rs create mode 100644 crates/pixi-build-rust/src/config.rs create mode 100644 crates/pixi-build-rust/src/main.rs create mode 100644 crates/pixi-build-rust/src/metadata.rs create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@bash.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@cmdexe.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@bash.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@cmdexe.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@bash.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@cmdexe.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__env_vars_are_set.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_in_build_requirements.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_not_added_if_already_present.snap create mode 100644 crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__sccache_is_enabled.snap create mode 100644 crates/recipe-stage0/Cargo.toml create mode 100644 crates/recipe-stage0/src/lib.rs create mode 100644 crates/recipe-stage0/src/marked_yaml.rs create mode 100644 crates/recipe-stage0/src/matchspec.rs create mode 100644 crates/recipe-stage0/src/recipe.rs create mode 100644 crates/recipe-stage0/src/requirements.rs create mode 100644 crates/recipe-stage0/src/snapshots/recipe_stage0__recipe__tests__recipe_to_yaml.snap create mode 100644 docs/build/backends/pixi-build-cmake.md create mode 100644 docs/build/backends/pixi-build-mojo.md create mode 100644 docs/build/backends/pixi-build-python.md create mode 100644 docs/build/backends/pixi-build-rattler-build.md create mode 100644 docs/build/backends/pixi-build-ros.md create mode 100644 docs/build/backends/pixi-build-rust.md create mode 100644 docs/build/key_concepts/compilers.md create mode 100644 pixi-build-backends/backends/pixi-build-ros/README.md create mode 100644 pixi-build-backends/backends/pixi-build-ros/pixi.lock create mode 100644 pixi-build-backends/backends/pixi-build-ros/pixi.toml create mode 100644 pixi-build-backends/backends/pixi-build-ros/pyproject.toml create mode 100644 pixi-build-backends/backends/pixi-build-ros/robostack.yaml create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/__init__.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/build_script.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/config.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/distro.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/main.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/utils.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_cmake.bat create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_python.bat create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin.bat create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin_merge.bat create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/bld_colcon_merge.bat create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh create mode 100644 pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_package_xml.ambr create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_version_constraints.ambr create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/conftest.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/other_package_map.yaml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/broken.xml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/custom_ros.xml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demo_nodes_cpp.xml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demos_action_tutorials_interfaces.xml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/version_constraints.xml create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_distro.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_distro_detection.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_meta_data_provider.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_package_map.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_package_xml.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_spec_merging.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/test_version_constraints.py create mode 100644 pixi-build-backends/py-pixi-build-backend/.gitattributes create mode 100644 pixi-build-backends/py-pixi-build-backend/.gitignore create mode 100644 pixi-build-backends/py-pixi-build-backend/Cargo.lock create mode 100644 pixi-build-backends/py-pixi-build-backend/Cargo.toml create mode 100644 pixi-build-backends/py-pixi-build-backend/build.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/__init__.py create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/build_script.py create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/main.py create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/python_generator.py create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/utils.py create mode 100644 pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi.lock create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi.toml create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/__init__.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/main.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/__init__.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/conditional.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/generated_recipe.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/intermediate_recipe.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/item.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/metadata_provider.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/platform.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/project_model.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/python_params.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/requirements.py create mode 100644 pixi-build-backends/py-pixi-build-backend/pyproject.toml create mode 100644 pixi-build-backends/py-pixi-build-backend/src/cli/mod.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/error.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/lib.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional_requirements.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/mod.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/recipe.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/requirements.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/config.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/generated_recipe.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/metadata_provider.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/mod.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/platform.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/src/types/python_params.rs create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/__init__.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/conftest.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/data/boltons_recipe.yaml create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/data/project_model_example.json create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/__init__.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_generated_recipe.ambr create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_intermediate_recipe.ambr create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_project_model.ambr create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/test_conditional.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/test_generated_recipe.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/test_intermediate_recipe.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/test_platform.py create mode 100644 pixi-build-backends/py-pixi-build-backend/tests/unit/test_project_model.py create mode 100644 pixi-build-backends/recipe/pixi-build-api-version/pixi.toml create mode 100644 pixi-build-backends/recipe/pixi-build-api-version/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-cmake/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-mojo/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-python/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-rattler-build/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-ros/recipe.yaml create mode 100644 pixi-build-backends/recipe/pixi-build-rust/recipe.yaml create mode 100644 pixi-build-backends/recipe/py-pixi-build-backend/recipe.yaml create mode 100644 pixi-build-backends/recipe/testsuite-backends/recipe.yaml create mode 100644 pixi-build-backends/recipe/variants.yaml create mode 100644 tests/data/channels/channels/target_specific_channel_1/.condapackageignore create mode 100644 tests/data/channels/channels/target_specific_channel_1/linux-64/package-unix-0.1.0-hb0f4dca_0.conda create mode 100644 tests/data/channels/channels/target_specific_channel_1/linux-64/repodata.json create mode 100644 tests/data/channels/channels/target_specific_channel_1/noarch/repodata.json create mode 100644 tests/data/channels/channels/target_specific_channel_1/osx-64/package-unix-0.1.0-h0dc7051_0.conda create mode 100644 tests/data/channels/channels/target_specific_channel_1/osx-64/repodata.json create mode 100644 tests/data/channels/channels/target_specific_channel_1/osx-arm64/package-unix-0.1.0-h60d57d3_0.conda create mode 100644 tests/data/channels/channels/target_specific_channel_1/osx-arm64/repodata.json create mode 100644 tests/data/channels/channels/target_specific_channel_1/rattler-build-log.txt create mode 100644 tests/data/channels/channels/target_specific_channel_1/win-64/package-windows-0.1.0-h9490d1a_0.conda create mode 100644 tests/data/channels/channels/target_specific_channel_1/win-64/repodata.json create mode 100644 tests/data/channels/recipes/target_specific_channel_1.yaml create mode 100644 tests/data/pixi-build/build-variant-conda-config-python/corp-pinning/conda_build_config.yaml create mode 100644 tests/data/pixi-build/build-variant-conda-config-python/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-conda-config-python/pyproject.toml create mode 100644 tests/data/pixi-build/build-variant-conda-config-python/src/variant_conda_config_python/__init__.py create mode 100644 tests/data/pixi-build/build-variant-conda-config-rattler-build/corp-pinning/conda_build_config.yaml create mode 100644 tests/data/pixi-build/build-variant-conda-config-rattler-build/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-conda-config-rattler-build/recipe.yaml create mode 100644 tests/data/pixi-build/build-variant-files-python/corp-pinning/config.yaml create mode 100644 tests/data/pixi-build/build-variant-files-python/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-files-python/pyproject.toml create mode 100644 tests/data/pixi-build/build-variant-files-python/src/variant_files_python/__init__.py create mode 100644 tests/data/pixi-build/build-variant-files-rattler-build/corp-pinning/config.yaml create mode 100644 tests/data/pixi-build/build-variant-files-rattler-build/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-files-rattler-build/recipe.yaml create mode 100644 tests/data/pixi-build/build-variant-manifest-python/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-manifest-python/pyproject.toml create mode 100644 tests/data/pixi-build/build-variant-manifest-python/src/variant_manifest_python/__init__.py create mode 100644 tests/data/pixi-build/build-variant-manifest-rattler-build/pixi.toml create mode 100644 tests/data/pixi-build/build-variant-manifest-rattler-build/recipe.yaml create mode 100644 tests/data/pixi-build/cpp-with-git-source/.gitignore create mode 100644 tests/data/pixi-build/cpp-with-git-source/README.md create mode 100644 tests/data/pixi-build/cpp-with-git-source/pixi.lock create mode 100644 tests/data/pixi-build/cpp-with-git-source/pixi.toml create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/.gitignore create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/README.md create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/pixi.lock create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/pixi.toml create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/project/CMakeLists.txt create mode 100644 tests/data/pixi-build/cpp-with-path-to-source/project/src/main.cc create mode 100644 tests/data/pixi-build/editable-pyproject/.gitignore create mode 100644 tests/data/pixi-build/editable-pyproject/pixi.lock create mode 100644 tests/data/pixi-build/editable-pyproject/pyproject.toml create mode 100644 tests/data/pixi-build/editable-pyproject/src/editable_pyproject/__init__.py create mode 100644 tests/data/pixi-build/env-config-cmake-test/CMakeLists.txt create mode 100644 tests/data/pixi-build/env-config-cmake-test/pixi.toml create mode 100644 tests/data/pixi-build/env-config-invalid-test/CMakeLists.txt create mode 100644 tests/data/pixi-build/env-config-invalid-test/pixi.toml create mode 100644 tests/data/pixi-build/env-config-target-cmake-test/CMakeLists.txt create mode 100644 tests/data/pixi-build/env-config-target-cmake-test/pixi.toml create mode 100644 tests/data/pixi-build/env-config-target-invalid-test/CMakeLists.txt create mode 100644 tests/data/pixi-build/env-config-target-invalid-test/pixi.toml create mode 100644 tests/data/pixi-build/log-example/failing/pixi.lock create mode 100644 tests/data/pixi-build/log-example/failing/pixi.toml create mode 100644 tests/data/pixi-build/log-example/failing/recipe.yaml create mode 100644 tests/data/pixi-build/log-example/working/pixi.lock create mode 100644 tests/data/pixi-build/log-example/working/pixi.toml create mode 100644 tests/data/pixi-build/log-example/working/recipe.yaml create mode 100644 tests/data/pixi-build/manifests/workspace_git.toml create mode 100644 tests/data/pixi-build/maturin/Cargo.lock create mode 100644 tests/data/pixi-build/maturin/Cargo.toml create mode 100644 tests/data/pixi-build/maturin/fast_math/__main__.py create mode 100644 tests/data/pixi-build/maturin/pixi.toml create mode 100644 tests/data/pixi-build/maturin/pyproject.toml create mode 100644 tests/data/pixi-build/maturin/src/lib.rs create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/CMakeLists.txt create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/pixi.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/src/main.cpp create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.lock create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pyproject.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/simple_app/__init__.py create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/pixi.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/recipe.yaml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/pixi.toml create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/src/main.rs create mode 100644 tests/data/pixi-build/name-and-version-less-package/Cargo.toml create mode 100644 tests/data/pixi-build/name-and-version-less-package/pixi.lock create mode 100644 tests/data/pixi-build/name-and-version-less-package/pixi.toml create mode 100644 tests/data/pixi-build/python-builddir/pixi.lock create mode 100644 tests/data/pixi-build/python-builddir/pixi.toml create mode 100644 tests/data/pixi-build/python-builddir/src/meson.build create mode 100644 tests/data/pixi-build/python-builddir/src/pyproject.toml create mode 100644 tests/data/pixi-build/python-builddir/src/simple_meson_app/__init__.py create mode 100644 tests/data/pixi-build/python-builddir/src/simple_meson_app/meson.build create mode 100644 tests/data/pixi-build/rattler-build-backend/array-api-extra/pixi.toml create mode 100644 tests/data/pixi-build/rattler-build-backend/array-api-extra/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/smokey/pixi.toml create mode 100644 tests/data/pixi-build/rattler-build-backend/smokey/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/smokey2/pixi.toml create mode 100644 tests/data/pixi-build/rattler-build-backend/smokey2/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/a/pixi.toml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/a/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/b/pixi.toml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/b/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/c/recipe.yaml create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.lock create mode 100644 tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_build_dep/.gitattributes create mode 100644 tests/data/pixi-build/recursive_source_build_dep/.gitignore create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_a/CMakeLists.txt create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_a/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_a/src/main.cpp create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_b/CMakeLists.txt create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_b/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.cpp create mode 100644 tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.h create mode 100644 tests/data/pixi-build/recursive_source_build_dep/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_run_dep/.gitattributes create mode 100644 tests/data/pixi-build/recursive_source_run_dep/.gitignore create mode 100644 tests/data/pixi-build/recursive_source_run_dep/package_a/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_run_dep/package_a/pyproject.toml create mode 100644 tests/data/pixi-build/recursive_source_run_dep/package_a/src/package_a/__init__.py create mode 100644 tests/data/pixi-build/recursive_source_run_dep/package_b/pixi.toml create mode 100644 tests/data/pixi-build/recursive_source_run_dep/package_b/recipe.yaml create mode 100644 tests/data/pixi-build/recursive_source_run_dep/pixi.lock create mode 100644 tests/data/pixi-build/recursive_source_run_dep/pixi.toml create mode 100644 tests/data/pixi-build/rich_example/.gitignore create mode 100644 tests/data/pixi-build/rich_example/pixi.lock create mode 100644 tests/data/pixi-build/rich_example/pixi.toml create mode 100644 tests/data/pixi-build/rich_example/pyproject.toml create mode 100644 tests/data/pixi-build/rich_example/src/rich_example/__init__.py create mode 100644 tests/data/pixi-build/ros-workspace/pixi.lock create mode 100644 tests/data/pixi-build/ros-workspace/pixi.toml create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/__init__.py create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/resource/distro_less_package create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg create mode 100644 tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator/package.xml create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/__init__.py create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/resource/navigator_py create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg create mode 100644 tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py create mode 100644 tests/data/pixi-build/target-specific/foo/__init__.py create mode 100644 tests/data/pixi-build/target-specific/pixi.toml create mode 100644 tests/data/pixi-build/target-specific/pyproject.toml create mode 100644 tests/integration_python/pixi_build/__init__.py create mode 100644 tests/integration_python/pixi_build/common.py create mode 100644 tests/integration_python/pixi_build/conftest.py create mode 100644 tests/integration_python/pixi_build/test_backends.py create mode 100644 tests/integration_python/pixi_build/test_build.py create mode 100644 tests/integration_python/pixi_build/test_config.py create mode 100644 tests/integration_python/pixi_build/test_git.py create mode 100644 tests/integration_python/pixi_build/test_global.py create mode 100644 tests/integration_python/pixi_build/test_log.py create mode 100644 tests/integration_python/pixi_build/test_multi_output.py create mode 100644 tests/integration_python/pixi_build/test_ros.py create mode 100644 tests/integration_python/pixi_build/test_specified_build_source/__init__.py create mode 100644 tests/integration_python/pixi_build/test_specified_build_source/conftest.py create mode 100644 tests/integration_python/pixi_build/test_specified_build_source/test_git.py create mode 100644 tests/integration_python/pixi_build/test_variants.py create mode 100644 tests/recipe/boltons/recipe.yaml create mode 100644 tests/recipe/custom-build-string/recipe.yaml create mode 100644 tests/recipe/pin-subpackage-variants/recipe.yaml create mode 100644 tests/recipe/pin-subpackage-variants/variants.yaml create mode 100644 tests/recipe/pin-subpackage/recipe.yaml create mode 100644 tests/recipe/variants/recipe.yaml create mode 100644 tests/recipe/variants/variants.yaml diff --git a/.github/workflows/backends-python-bindings.yml b/.github/workflows/backends-python-bindings.yml new file mode 100644 index 0000000000..09892ba737 --- /dev/null +++ b/.github/workflows/backends-python-bindings.yml @@ -0,0 +1,48 @@ +name: Backends - Python Bindings + +on: + push: + branches: [main] + paths: + - crates/pixi-build-backend/** + - Cargo.* + - pixi-build-backends/py-pixi-build-backend/** + - .github/workflows/backends-python-bindings.yml + pull_request: + paths: + - crates/pixi-build-backend/** + - Cargo.* + - pixi-build-backends/py-pixi-build-backend/** + - .github/workflows/backends-python-bindings.yml + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +env: + PYTHONIOENCODING: utf-8 + +jobs: + format_lint_test: + name: Test the Python bindings + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: prefix-dev/setup-pixi@main + with: + manifest-path: pixi-build-backends/py-pixi-build-backend/pixi.toml + environments: ci + - name: Run clippy + run: | + cd pixi-build-backends/py-pixi-build-backend + pixi run -e ci lint + - name: Run tests + run: | + cd pixi-build-backends/py-pixi-build-backend + pixi run -e ci test --color=yes diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml new file mode 100644 index 0000000000..41b78abd84 --- /dev/null +++ b/.github/workflows/backends-ros.yml @@ -0,0 +1,46 @@ +name: Backends - ROS + +on: + push: + branches: [main] + paths: + - crates/pixi-build-backend/** + - Cargo.* + - pixi-build-backends/py-pixi-build-backend/** + - pixi-build-backends/backends/pixi-build-ros/** + - .github/workflows/backends-ros.yml + pull_request: + paths: + - crates/pixi-build-backend/** + - Cargo.* + - pixi-build-backends/py-pixi-build-backend/** + - pixi-build-backends/backends/pixi-build-ros/** + - .github/workflows/backends-ros.yml + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + test: + name: Test the pixi-build-ros package + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: prefix-dev/setup-pixi@main + with: + manifest-path: pixi-build-backends/backends/pixi-build-ros/pixi.toml + - name: Run mypy + run: | + cd pixi-build-backends/backends/pixi-build-ros + pixi run lint + - name: Run tests + run: | + cd pixi-build-backends/backends/pixi-build-ros + pixi run test --color=yes diff --git a/.github/workflows/backends-rust.yml b/.github/workflows/backends-rust.yml new file mode 100644 index 0000000000..e027404af9 --- /dev/null +++ b/.github/workflows/backends-rust.yml @@ -0,0 +1,54 @@ +on: + push: + branches: + - "main" + paths: + - crates/pixi-build-*/** + - crates/recipe-stage0/** + - .github/workflows/backends-rust.yml + pull_request: + paths: + - crates/pixi-build-*/** + - crates/recipe-stage0/** + - .github/workflows/backends-rust.yml + +name: Backends - Rust + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + RUST_LOG: info + RUST_BACKTRACE: 1 + RUSTFLAGS: "-D warnings" + CARGO_TERM_COLOR: always + +jobs: + test: + name: Test Backend Crates + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + - uses: prefix-dev/setup-pixi@main + with: + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + - uses: Swatinem/rust-cache@v2 + with: + workspaces: ". -> target/pixi" + key: ${{ hashFiles('pixi.lock') }} + save-if: ${{ github.ref == 'refs/heads/main' }} + - name: Run backend crate tests + run: | + pixi run cargo test -p pixi-build-backend + pixi run cargo test -p pixi-build-python + pixi run cargo test -p pixi-build-cmake + pixi run cargo test -p pixi-build-rust + pixi run cargo test -p pixi-build-mojo + pixi run cargo test -p pixi-build-rattler-build + pixi run cargo test -p recipe-stage0 diff --git a/Cargo.lock b/Cargo.lock index 727e3e3801..3e87bfa0a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,7 +23,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "cipher", "cpufeatures", ] @@ -34,7 +34,7 @@ version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "getrandom 0.3.4", "once_cell", "version_check", @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0a8acea8c2f1c60f0a92a8cd26bf96ca97db56f10bbcab238bbe0cceba659ee" dependencies = [ "nom 7.1.3", - "vte", + "vte 0.14.1", ] [[package]] @@ -120,7 +120,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -131,7 +131,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -220,7 +220,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9db67cd9cf4f56a10d2cbae6a3b552e5bd36701fd37b74a18c14a231bdf446c7" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "itertools 0.12.1", "libc", "serde", @@ -234,6 +234,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03918c3dbd7701a85c6b9887732e2921175f26c350b4563841d0958c21d57e6d" +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + [[package]] name = "arrayvec" version = "0.7.6" @@ -325,7 +331,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7569377d7062165f6f7834d9cb3051974a2d141433cc201c2f94c149e993cccf" dependencies = [ "async-trait", - "cfg-if", + "cfg-if 1.0.4", "pin-project", "rustix 0.38.44", "thiserror 1.0.69", @@ -351,7 +357,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ "autocfg", - "cfg-if", + "cfg-if 1.0.4", "concurrent-queue", "futures-io", "futures-lite", @@ -391,7 +397,7 @@ dependencies = [ "async-signal", "async-task", "blocking", - "cfg-if", + "cfg-if 1.0.4", "event-listener", "futures-lite", "rustix 1.1.3", @@ -417,7 +423,7 @@ dependencies = [ "async-io", "async-lock", "atomic-waker", - "cfg-if", + "cfg-if 1.0.4", "futures-core", "futures-io", "rustix 1.1.3", @@ -459,7 +465,7 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tokio-stream", - "tokio-util", + "tokio-util 0.7.17", "tracing", ] @@ -474,7 +480,7 @@ dependencies = [ "pin-project", "thiserror 1.0.69", "tokio", - "tokio-util", + "tokio-util 0.7.17", ] [[package]] @@ -788,7 +794,7 @@ dependencies = [ "aws-smithy-types", "h2", "http 1.4.0", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-util", "pin-project-lite", @@ -892,7 +898,7 @@ dependencies = [ "serde", "time", "tokio", - "tokio-util", + "tokio-util 0.7.17", ] [[package]] @@ -931,7 +937,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-util", "itoa", "matchit", @@ -988,7 +994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.4", "libc", "miniz_oxide", "object", @@ -1009,7 +1015,7 @@ dependencies = [ name = "barrier_cell" version = "0.1.0" dependencies = [ - "parking_lot", + "parking_lot 0.12.5", "thiserror 2.0.17", "tokio", ] @@ -1084,6 +1090,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" @@ -1331,6 +1343,16 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml", +] + [[package]] name = "cbc" version = "0.1.2" @@ -1358,6 +1380,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.4" @@ -1414,6 +1442,17 @@ dependencies = [ "clap_derive", ] +[[package]] +name = "clap-verbosity-flag" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d92b1fab272fe943881b77cc6e920d6543e5b1bfadbd5ed81c7c5a755742394" +dependencies = [ + "clap", + "log", + "tracing-core", +] + [[package]] name = "clap_builder" version = "4.5.53" @@ -1609,6 +1648,15 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "content_inspector" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +dependencies = [ + "memchr", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1646,9 +1694,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -1687,7 +1735,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", ] [[package]] @@ -1730,10 +1778,10 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "crossterm_winapi", "document-features", - "parking_lot", + "parking_lot 0.12.5", "rustix 1.1.3", "winapi", ] @@ -1825,7 +1873,7 @@ version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "cpufeatures", "curve25519-dalek-derive", "digest", @@ -1887,12 +1935,12 @@ version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "crossbeam-utils", "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.12", ] [[package]] @@ -2097,7 +2145,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2106,7 +2154,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags", + "bitflags 2.10.0", "block2", "libc", "objc2", @@ -2129,9 +2177,9 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6738d2e996274e499bc7b0d693c858b7720b9cd2543a0643a3087e6cb0a4fa16" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2143,6 +2191,12 @@ dependencies = [ "const-random", ] +[[package]] +name = "doc-comment" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" + [[package]] name = "document-features" version = "0.2.12" @@ -2282,7 +2336,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", ] [[package]] @@ -2375,7 +2429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2384,7 +2438,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26c7b13d0780cb82722fd59f6f57f925e143427e4a75313a6c77243bf5326ae6" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "home", "windows-sys 0.59.0", ] @@ -2490,7 +2544,7 @@ version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "libc", "libredox", "windows-sys 0.60.2", @@ -2519,6 +2573,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flickzeug" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "407eaf1e36f361cbf10ad2f3f4f834e5d7fec6c481b16798c333d33f353e3d27" +dependencies = [ + "nu-ansi-term 0.50.3", + "strsim", + "thiserror 2.0.17", +] + [[package]] name = "float-cmp" version = "0.10.0" @@ -2754,7 +2819,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "js-sys", "libc", "wasi", @@ -2767,7 +2832,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "js-sys", "libc", "r-efi", @@ -2806,7 +2871,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags", + "bitflags 2.10.0", "ignore", "walkdir", ] @@ -2989,7 +3054,7 @@ dependencies = [ "indexmap 2.12.1", "slab", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", ] @@ -3037,6 +3102,15 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -3214,6 +3288,19 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66cdb727cec723cee65912a74a7f9f0c3ad0c6f9df4f03d05a5c7a15398bbad1" +[[package]] +name = "http-range-client" +version = "0.9.1" +source = "git+https://github.com/pka/http-range-client.git#fccfa852dbe7e875a50802c55ee6c5f69c634827" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "read-logger", + "reqwest", + "thiserror 1.0.69", +] + [[package]] name = "http-serde" version = "2.1.1" @@ -3257,6 +3344,29 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.8.1" @@ -3287,7 +3397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.4.0", - "hyper", + "hyper 1.8.1", "hyper-util", "log", "rustls", @@ -3305,7 +3415,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper", + "hyper 1.8.1", "hyper-util", "pin-project-lite", "tokio", @@ -3320,7 +3430,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -3341,12 +3451,12 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.1", "system-configuration", "tokio", "tower-service", @@ -3535,6 +3645,7 @@ dependencies = [ "portable-atomic", "unicode-width 0.2.2", "unit-prefix", + "vt100", "web-time", ] @@ -3574,6 +3685,15 @@ dependencies = [ "walkdir", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if 1.0.4", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -3656,7 +3776,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3692,7 +3812,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", - "cfg-if", + "cfg-if 1.0.4", "combine", "jni-sys", "log", @@ -3749,6 +3869,68 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures", + "hyper 0.14.32", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + +[[package]] +name = "jsonrpc-stdio-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6878586767497326eb3d011bd6dbb583e9f008b11528f82fd47798ec46bb6c26" +dependencies = [ + "futures", + "jsonrpc-core", + "log", + "tokio", + "tokio-util 0.6.10", +] + [[package]] name = "jsonrpsee" version = "0.26.0" @@ -3783,7 +3965,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tokio-rustls", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", ] @@ -3822,7 +4004,7 @@ checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" dependencies = [ "base64 0.22.1", "http-body 1.0.1", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-util", "jsonrpsee-core", @@ -3929,7 +4111,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d463f34ca3c400fde3a054da0e0b8c6ffa21e4590922f3e18281bb5eeef4cbdc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3991,7 +4173,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "windows-link 0.2.1", ] @@ -4017,9 +4199,9 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags", + "bitflags 2.10.0", "libc", - "redox_syscall", + "redox_syscall 0.5.18", ] [[package]] @@ -4031,6 +4213,18 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "line-ending" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834e592123b39b7b3ba3fdc4b7e4822fad3ced449010f8229f843fe6dd1a33f1" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4100,6 +4294,10 @@ name = "lzma-rust2" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48172246aa7c3ea28e423295dd1ca2589a24617cc4e588bb8cfe177cb2c54d95" +dependencies = [ + "crc", + "sha2", +] [[package]] name = "lzma-sys" @@ -4123,6 +4321,17 @@ dependencies = [ "quoted_printable", ] +[[package]] +name = "marked-yaml" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76cf4e66a8ffccfce983161b0faafe61a5ef03fe875ef2e3deb897e4e915fa" +dependencies = [ + "doc-comment", + "hashlink", + "yaml-rust2", +] + [[package]] name = "matchers" version = "0.1.0" @@ -4144,7 +4353,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "digest", ] @@ -4201,7 +4410,7 @@ checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" dependencies = [ "backtrace", "backtrace-ext", - "cfg-if", + "cfg-if 1.0.4", "miette-derive 7.6.0", "owo-colors", "serde", @@ -4279,7 +4488,9 @@ version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ea9ac0a51fb5112607099560fdf0f90366ab088a2a9e6e8ae176794e9806aa" dependencies = [ + "aho-corasick", "serde", + "serde_json", ] [[package]] @@ -4315,7 +4526,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a95346f08" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4370,6 +4581,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi", +] + [[package]] name = "netrc-rs" version = "0.1.2" @@ -4382,8 +4604,8 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags", - "cfg-if", + "bitflags 2.10.0", + "cfg-if 1.0.4", "cfg_aliases", "libc", "memoffset", @@ -4395,8 +4617,8 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags", - "cfg-if", + "bitflags 2.10.0", + "cfg-if 1.0.4", "cfg_aliases", "libc", "memoffset", @@ -4449,6 +4671,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "num" version = "0.4.3" @@ -4570,7 +4801,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags", + "bitflags 2.10.0", ] [[package]] @@ -4644,8 +4875,8 @@ version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags", - "cfg-if", + "bitflags 2.10.0", + "cfg-if 1.0.4", "foreign-types", "libc", "once_cell", @@ -4735,7 +4966,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.45.0", + "windows-sys 0.61.2", ] [[package]] @@ -4806,6 +5037,17 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -4813,7 +5055,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.4", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -4822,9 +5078,9 @@ version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] @@ -4852,9 +5108,9 @@ checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" [[package]] name = "path_resolver" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01693f3eaa8c61226a6def42ca70616c1c06736f1233a6c5d26cb13523e2aad3" +checksum = "39f279d8937b0838a32da6187ea638735b7cd97251cbc1b513f2e8715a111cf2" dependencies = [ "ahash", "fs-err", @@ -5060,7 +5316,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit", + "toml_edit 0.23.9", "tracing", "tracing-subscriber", "typed-path", @@ -5074,59 +5330,216 @@ dependencies = [ ] [[package]] -name = "pixi_allocator" -version = "0.1.0" -dependencies = [ - "mimalloc", - "tikv-jemallocator", -] - -[[package]] -name = "pixi_api" -version = "0.1.0" +name = "pixi-build-backend" +version = "0.1.5" dependencies = [ - "console 0.16.2", - "dunce", - "fancy_display", + "async-trait", + "chrono", + "clap", + "clap-verbosity-flag", "fs-err", "indexmap 2.12.1", + "insta", "itertools 0.14.0", + "jsonrpc-core", + "jsonrpc-http-server", + "jsonrpc-stdio-server", "miette 7.6.0", "minijinja", - "pep508_rs", - "pixi_config", - "pixi_consts", - "pixi_core", - "pixi_manifest", - "pixi_pypi_spec", - "pixi_spec", - "pixi_utils", + "ordermap", + "pathdiff", + "pixi_build_types", + "rattler-build", "rattler_conda_types", - "rattler_lock", - "rattler_repodata_gateway", - "regex", - "same-file", + "rattler_digest", + "rattler_virtual_packages", + "recipe-stage0", "serde", - "strsim", + "serde_json", + "serde_yaml", "tempfile", + "thiserror 2.0.17", "tokio", + "toml", + "toml_edit 0.24.0+spec-1.1.0", "tracing", + "tracing-subscriber", "url", - "uv-normalize", -] - -[[package]] -name = "pixi_auth" -version = "0.1.0" -dependencies = [ - "pixi_config", - "rattler_networking", - "tracing", ] [[package]] -name = "pixi_build_backend_passthrough" -version = "0.1.0" +name = "pixi-build-cmake" +version = "0.3.7" +dependencies = [ + "async-trait", + "fs-err", + "indexmap 2.12.1", + "insta", + "miette 7.6.0", + "minijinja", + "pixi-build-backend", + "pixi_build_types", + "rattler-build", + "rattler_conda_types", + "recipe-stage0", + "rstest", + "serde", + "serde_json", + "strum", + "tempfile", + "tokio", +] + +[[package]] +name = "pixi-build-mojo" +version = "0.1.7" +dependencies = [ + "async-trait", + "indexmap 2.12.1", + "insta", + "miette 7.6.0", + "minijinja", + "pixi-build-backend", + "pixi_build_types", + "rattler-build", + "rattler_conda_types", + "recipe-stage0", + "rstest", + "serde", + "serde_json", + "tempfile", + "tokio", +] + +[[package]] +name = "pixi-build-python" +version = "0.4.4" +dependencies = [ + "async-trait", + "fs-err", + "indexmap 2.12.1", + "insta", + "miette 7.6.0", + "minijinja", + "once_cell", + "pep508_rs", + "pixi-build-backend", + "pixi_build_types", + "pyproject-toml", + "rattler_conda_types", + "recipe-stage0", + "reqwest", + "serde", + "serde_json", + "spdx 0.10.9", + "tempfile", + "thiserror 2.0.17", + "tokio", + "toml", + "tracing", + "url", +] + +[[package]] +name = "pixi-build-rattler-build" +version = "0.3.6" +dependencies = [ + "async-trait", + "chrono", + "insta", + "miette 7.6.0", + "pathdiff", + "pixi-build-backend", + "pixi_build_types", + "rattler-build", + "rattler_conda_types", + "serde", + "serde_json", + "tempfile", + "tokio", + "tracing", +] + +[[package]] +name = "pixi-build-rust" +version = "0.4.4" +dependencies = [ + "async-trait", + "cargo_toml", + "fs-err", + "indexmap 2.12.1", + "insta", + "miette 7.6.0", + "minijinja", + "once_cell", + "pathdiff", + "pixi-build-backend", + "pixi_build_types", + "rattler_conda_types", + "recipe-stage0", + "rstest", + "serde", + "serde_json", + "temp-env", + "tempfile", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "pixi_allocator" +version = "0.1.0" +dependencies = [ + "mimalloc", + "tikv-jemallocator", +] + +[[package]] +name = "pixi_api" +version = "0.1.0" +dependencies = [ + "console 0.16.2", + "dunce", + "fancy_display", + "fs-err", + "indexmap 2.12.1", + "itertools 0.14.0", + "miette 7.6.0", + "minijinja", + "pep508_rs", + "pixi_config", + "pixi_consts", + "pixi_core", + "pixi_manifest", + "pixi_pypi_spec", + "pixi_spec", + "pixi_utils", + "rattler_conda_types", + "rattler_lock", + "rattler_repodata_gateway", + "regex", + "same-file", + "serde", + "strsim", + "tempfile", + "tokio", + "tracing", + "url", + "uv-normalize", +] + +[[package]] +name = "pixi_auth" +version = "0.1.0" +dependencies = [ + "pixi_config", + "rattler_networking", + "tracing", +] + +[[package]] +name = "pixi_build_backend_passthrough" +version = "0.1.0" dependencies = [ "fs-err", "itertools 0.14.0", @@ -5183,7 +5596,7 @@ dependencies = [ "serde_json", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", ] @@ -5291,8 +5704,8 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", - "toml_edit", + "tokio-util 0.7.17", + "toml_edit 0.23.9", "tracing", "tracing-subscriber", "typed-path", @@ -5368,7 +5781,7 @@ dependencies = [ "text_trees", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "typed-path", "url", @@ -5397,7 +5810,7 @@ dependencies = [ "serde_ignored", "serde_json", "thiserror 2.0.17", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", ] @@ -5480,7 +5893,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit", + "toml_edit 0.23.9", "tracing", "tracing-test", "typed-path", @@ -5576,7 +5989,7 @@ dependencies = [ "insta", "itertools 0.14.0", "memchr", - "parking_lot", + "parking_lot 0.12.5", "rattler_digest", "rstest", "serde", @@ -5636,7 +6049,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "toml-span", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", "zstd", @@ -5738,13 +6151,13 @@ dependencies = [ "serde", "serde-value", "serde_json", - "spdx", + "spdx 0.10.9", "strsim", "strum", "tempfile", "thiserror 2.0.17", "toml-span", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", ] @@ -5764,7 +6177,7 @@ name = "pixi_progress" version = "0.1.0" dependencies = [ "indicatif", - "parking_lot", + "parking_lot 0.12.5", ] [[package]] @@ -5793,7 +6206,7 @@ dependencies = [ "serde_json", "thiserror 2.0.17", "toml-span", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", ] @@ -5840,7 +6253,7 @@ dependencies = [ "indexmap 2.12.1", "indicatif", "itertools 0.14.0", - "parking_lot", + "parking_lot 0.12.5", "pixi_command_dispatcher", "pixi_git", "pixi_progress", @@ -5881,7 +6294,7 @@ dependencies = [ "serde_with", "thiserror 2.0.17", "toml-span", - "toml_edit", + "toml_edit 0.23.9", "tracing", "typed-path", "url", @@ -5991,7 +6404,7 @@ dependencies = [ "rattler_networking", "reqwest", "reqwest-middleware", - "sevenz-rust2", + "sevenz-rust2 0.19.4", "tar", "tempfile", "thiserror 2.0.17", @@ -6168,7 +6581,7 @@ version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "concurrent-queue", "hermit-abi", "pin-project-lite", @@ -6257,7 +6670,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.9", ] [[package]] @@ -6275,7 +6688,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags", + "bitflags 2.10.0", "flate2", "hex", "procfs-core", @@ -6288,7 +6701,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags", + "bitflags 2.10.0", "hex", ] @@ -6300,7 +6713,7 @@ checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.10.0", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -6486,7 +6899,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", + "socket2 0.6.1", "thiserror 2.0.17", "tokio", "tracing", @@ -6523,7 +6936,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] @@ -6634,9 +7047,9 @@ dependencies = [ [[package]] name = "rattler" -version = "0.39.6" +version = "0.39.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f38d4388230d7d3654a461425dd438a0fb51258e93f53cd8d44b678922ccb0" +checksum = "72d1ba55a3b27eab97c7efe333c64fc410864532d29192dace2fc1d35709f7b3" dependencies = [ "anyhow", "clap", @@ -6652,7 +7065,7 @@ dependencies = [ "memchr", "memmap2 0.9.9", "once_cell", - "parking_lot", + "parking_lot 0.12.5", "path_resolver", "rattler_cache", "rattler_conda_types", @@ -6677,11 +7090,106 @@ dependencies = [ "uuid", ] +[[package]] +name = "rattler-build" +version = "0.55.1" +source = "git+https://github.com/prefix-dev/rattler-build?branch=main#86ffb08d00b4a32dc45caaa3d545f58fa050e43f" +dependencies = [ + "anyhow", + "async-once-cell", + "async-recursion", + "base64 0.22.1", + "bzip2 0.6.1", + "chrono", + "clap", + "clap-verbosity-flag", + "clap_complete", + "clap_complete_nushell", + "comfy-table", + "console 0.16.2", + "content_inspector", + "dialoguer", + "dunce", + "flate2", + "flickzeug", + "fs-err", + "futures", + "globset", + "goblin", + "hex", + "http-range-client", + "ignore", + "indexmap 2.12.1", + "indicatif", + "itertools 0.14.0", + "lazy_static", + "line-ending", + "lzma-rust2", + "marked-yaml", + "memchr", + "memmap2 0.9.9", + "miette 7.6.0", + "minijinja", + "num_cpus", + "pathdiff", + "petgraph", + "rattler", + "rattler_cache", + "rattler_conda_types", + "rattler_config", + "rattler_digest", + "rattler_index", + "rattler_menuinst", + "rattler_networking", + "rattler_package_streaming", + "rattler_redaction", + "rattler_repodata_gateway", + "rattler_shell", + "rattler_solve", + "rattler_upload", + "rattler_virtual_packages", + "rayon", + "reflink-copy", + "regex", + "reqwest", + "reqwest-middleware", + "reqwest-retry 0.8.0", + "retry-policies 0.5.1", + "scroll", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "serde_yaml", + "sevenz-rust2 0.20.1", + "sha1", + "sha2", + "spdx 0.13.3", + "strum", + "tar", + "tempfile", + "terminal_size", + "text-stub-library", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "toml", + "tracing", + "tracing-core", + "tracing-subscriber", + "unicode-normalization", + "url", + "walkdir", + "which", + "zip 6.0.0", + "zstd", +] + [[package]] name = "rattler_cache" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a29965498c078084a82930bc868065a4ac2441ce79b5995ab09ea9503a539048" +checksum = "29aa34704fc5970a2fc7565ba7a2d7efef9ef10a80b0c0dbb0328e0f310bf37a" dependencies = [ "ahash", "anyhow", @@ -6692,7 +7200,7 @@ dependencies = [ "fs4", "futures", "itertools 0.14.0", - "parking_lot", + "parking_lot 0.12.5", "rattler_conda_types", "rattler_digest", "rattler_networking", @@ -6712,9 +7220,9 @@ dependencies = [ [[package]] name = "rattler_conda_types" -version = "0.42.3" +version = "0.42.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3850be1f8879c4580f5c3d3a649afc5f46efa14be3c64957fa790c97d6c7c34a" +checksum = "a02606220a75836c766cd41e610bfe885379e40a5a11683f93c0cc7ae83b6fc8" dependencies = [ "ahash", "chrono", @@ -6755,9 +7263,9 @@ dependencies = [ [[package]] name = "rattler_config" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12cabcb8dd512fea07a95d71e2a91db09090cefda992253d87e1f72bdb31226" +checksum = "d16dac75c65740910c2222d8fef6855522ea1e2327fe9eb40b84be27a94aee30" dependencies = [ "console 0.16.2", "fs-err", @@ -6773,9 +7281,9 @@ dependencies = [ [[package]] name = "rattler_digest" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2a29fc465890f5bca54ed506df1ffb19b282fd591598d8f10d05abda964996" +checksum = "e4109fd4ea54f1e34812f9db9166013325418ba92ff5693136afe681a56039fe" dependencies = [ "blake2", "digest", @@ -6790,11 +7298,48 @@ dependencies = [ "url", ] +[[package]] +name = "rattler_index" +version = "0.27.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0877bcddba54e340c5662fc1dc4aed7092209ca835f140092a409acfa5505bdc" +dependencies = [ + "ahash", + "anyhow", + "bytes", + "chrono", + "clap", + "clap-verbosity-flag", + "console 0.16.2", + "fs-err", + "futures", + "indexmap 2.12.1", + "indicatif", + "opendal", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "rattler_s3", + "reqwest", + "retry-policies 0.5.1", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "tar", + "tokio", + "tracing", + "tracing-subscriber", + "url", + "zstd", +] + [[package]] name = "rattler_lock" -version = "0.26.8" +version = "0.26.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74210faf20624f2043a76ead894777325b51c97ad11eedcf764dcbdba2e584b1" +checksum = "e1a29c9d0c943189a1ac29f7729ded9be7370822f062f46f7ebdc6992c4fc5cf" dependencies = [ "ahash", "chrono", @@ -6818,9 +7363,9 @@ dependencies = [ [[package]] name = "rattler_macros" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "988d5d7ace4fb1d7549008236cf08de95e8ea2f1f80754109324a08c31e6dc6a" +checksum = "18d0d45ce3ae00333421569d2fafa4b877708a901c3cb217f8d4acfab4328df0" dependencies = [ "quote", "syn", @@ -6828,9 +7373,9 @@ dependencies = [ [[package]] name = "rattler_menuinst" -version = "0.2.41" +version = "0.2.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a16c104335ff2948837d216799b7a05a1771f3b85cbe9c0d6c8e6be79bca0d5a" +checksum = "2915a162d56d28115991832c3e509daae2f451ae39c8a5720ae6288ffd0f19a4" dependencies = [ "chrono", "configparser", @@ -6859,9 +7404,9 @@ dependencies = [ [[package]] name = "rattler_networking" -version = "0.25.28" +version = "0.25.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50fbf0e3a98ecd105df3ff76c9ccb50f8f00497269e38101d8626edc7fc4030d" +checksum = "3c4cc5d9bb601b4b079bbf80ff270af2dd56f404c8e9b836a624dec284d42e52" dependencies = [ "anyhow", "async-once-cell", @@ -6892,9 +7437,9 @@ dependencies = [ [[package]] name = "rattler_package_streaming" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e009ea293947e9fc0d986ae819bd5990ed610eeebbfa17482fc04c24405995f1" +checksum = "f47fd135ff54d04a8d5ab380968637f85455930c0117e35ad92118d3047fc42e" dependencies = [ "astral-tokio-tar", "async-compression", @@ -6917,7 +7462,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", "zip 6.0.0", @@ -6926,9 +7471,9 @@ dependencies = [ [[package]] name = "rattler_pty" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86a84e6b351c46c7588bb8f5c90994be23d5c3c31cf87f9ec903cd91d9fc4246" +checksum = "0374bb3bc0e91d769aefc2f306f869d05043772cafbea4999bb2f54a865b4cae" dependencies = [ "libc", "nix 0.30.1", @@ -6938,9 +7483,9 @@ dependencies = [ [[package]] name = "rattler_redaction" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aa5057629aeb20861919e9ae56875985d58028f3c6f433a20b5ded086e1cec5" +checksum = "961121cad9792daafc176a7f4caafc0fc889fb17507c23a4c86e1777a8b5e179" dependencies = [ "reqwest", "reqwest-middleware", @@ -6949,9 +7494,9 @@ dependencies = [ [[package]] name = "rattler_repodata_gateway" -version = "0.25.6" +version = "0.25.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e4fbd2f0eb24a7081a0df9df4b945bb6a8fad34ad1168bd800b25147bd68c9" +checksum = "c185f69e7582288938b24efb49f53065bd5594d10ddf55fdeabcf1b84a44250a" dependencies = [ "anyhow", "async-compression", @@ -6960,7 +7505,7 @@ dependencies = [ "blake2", "bytes", "cache_control", - "cfg-if", + "cfg-if 1.0.4", "chrono", "coalesced_map", "dashmap", @@ -6978,7 +7523,7 @@ dependencies = [ "json-patch", "libc", "memmap2 0.9.9", - "parking_lot", + "parking_lot 0.12.5", "pin-project-lite", "rattler_cache", "rattler_conda_types", @@ -7000,7 +7545,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", "wasmtimer", @@ -7010,9 +7555,9 @@ dependencies = [ [[package]] name = "rattler_s3" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2b85238aa5a8bf17093aa6f8f4d25c29a6a51f039591152e386703f2448678" +checksum = "27bcefdba34350af4b9fa2261f7057674e1393fb8545a87a6b0e5b5d04cba0ad" dependencies = [ "aws-config", "aws-credential-types", @@ -7027,9 +7572,9 @@ dependencies = [ [[package]] name = "rattler_shell" -version = "0.25.14" +version = "0.25.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fdcb7e9b510969b27d6312b305cf2ffa0babbfe3285b51d900527bbddfb54" +checksum = "17339388f615ec26d0bb48d4e118792d3a72746b1f6b45112eb4fc562e866698" dependencies = [ "anyhow", "enum_dispatch", @@ -7048,9 +7593,9 @@ dependencies = [ [[package]] name = "rattler_solve" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1eb6e2f7fdb3513fe6733ac363814615dbcc90b1ace75e98b8c7ef45a27eeb8" +checksum = "6bcb44026943936653b4a22b489edb7a69fc69bfb258ad4ffa01908488cb89b7" dependencies = [ "chrono", "futures", @@ -7067,9 +7612,9 @@ dependencies = [ [[package]] name = "rattler_upload" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921e9151bfc7048d4edf872719028d4d4fbb57e06239b520dddc24f7e3740134" +checksum = "16749d225293db2c3d486c27a1894fc97262acb7ac564da5889ef426930d0a6e" dependencies = [ "base64 0.22.1", "clap", @@ -7096,16 +7641,16 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", ] [[package]] name = "rattler_virtual_packages" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5453f17909e31bff3c9a6ece45b34ab9b392107ee6bff96ccc9999f1a59294f" +checksum = "14d5a0a0e7ca274bf6885f8da96d21b45b3ab67097861963237603bdba015931" dependencies = [ "archspec", "libloading", @@ -7140,13 +7685,47 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "read-logger" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7f715a23c7db804b71eb9162a9cf210b89e99db9c3649a2a038d13b7594a99" +dependencies = [ + "log", +] + +[[package]] +name = "recipe-stage0" +version = "0.1.1" +dependencies = [ + "hashlink", + "indexmap 2.12.1", + "insta", + "itertools 0.14.0", + "marked-yaml", + "rattler-build", + "rattler_conda_types", + "serde", + "serde_yaml", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.10.0", ] [[package]] @@ -7186,7 +7765,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23bbed272e39c47a095a5242218a67412a220006842558b03fe2935e8f3d7b92" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "libc", "rustix 1.1.3", "windows 0.62.2", @@ -7391,6 +7970,7 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", @@ -7398,12 +7978,13 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-tls", "hyper-util", "js-sys", "log", + "mime", "mime_guess", "native-tls", "percent-encoding", @@ -7419,7 +8000,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls", - "tokio-util", + "tokio-util 0.7.17", "tower", "tower-http", "tower-service", @@ -7455,7 +8036,7 @@ dependencies = [ "futures", "getrandom 0.2.16", "http 1.4.0", - "hyper", + "hyper 1.8.1", "reqwest", "reqwest-middleware", "retry-policies 0.4.0", @@ -7476,7 +8057,7 @@ dependencies = [ "futures", "getrandom 0.2.16", "http 1.4.0", - "hyper", + "hyper 1.8.1", "reqwest", "reqwest-middleware", "retry-policies 0.5.1", @@ -7549,7 +8130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.4", "getrandom 0.2.16", "libc", "untrusted", @@ -7655,7 +8236,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "glob", "proc-macro-crate", "proc-macro2", @@ -7673,7 +8254,7 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "ordered-multimap", ] @@ -7714,7 +8295,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -7727,11 +8308,11 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -8002,7 +8583,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -8015,7 +8596,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -8247,9 +8828,27 @@ dependencies = [ [[package]] name = "sevenz-rust2" -version = "0.20.0" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611081ec4fc67633b979fc0c24385de90fa60acd18126d796c8758a24294a950" +checksum = "414256b6bb303a2a38ad800096664c3b332295c17b7ef0674bf0acf44284036c" +dependencies = [ + "aes", + "bzip2 0.6.1", + "cbc", + "crc32fast", + "getrandom 0.3.4", + "js-sys", + "lzma-rust2", + "ppmd-rust", + "sha2", + "wasm-bindgen", +] + +[[package]] +name = "sevenz-rust2" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65126b94d6f5a6d727b1e35b0a796685a79062ceaf5fa45321315e62b65251a2" dependencies = [ "aes", "bzip2 0.6.1", @@ -8269,7 +8868,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "cpufeatures", "digest", ] @@ -8280,7 +8879,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "cpufeatures", "digest", ] @@ -8291,7 +8890,7 @@ version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "cpufeatures", "digest", "sha2-asm", @@ -8468,6 +9067,16 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "socket2" version = "0.6.1" @@ -8502,6 +9111,15 @@ dependencies = [ "smallvec", ] +[[package]] +name = "spdx" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afd765179d12cdd06192e02b1d8c6b0d46bd26de9bf16ce04c881428ca2cc7ed" +dependencies = [ + "smallvec", +] + [[package]] name = "spin" version = "0.9.8" @@ -8693,7 +9311,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags", + "bitflags 2.10.0", "byteorder", "enum-as-inner", "libc", @@ -8721,7 +9339,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -8775,7 +9393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96374855068f47402c3121c6eed88d29cb1de8f3ab27090e273e420bdabcf050" dependencies = [ "futures", - "parking_lot", + "parking_lot 0.12.5", ] [[package]] @@ -8788,7 +9406,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.3", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -8801,6 +9419,17 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "text-stub-library" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48070939e80c2662b5dd403a0b09cb97e8467a248d67e373e23f85dbdacd882" +dependencies = [ + "serde", + "serde_yaml", + "yaml-rust", +] + [[package]] name = "text_trees" version = "0.1.2" @@ -8864,7 +9493,7 @@ version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", ] [[package]] @@ -8966,9 +9595,10 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.1", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -9014,7 +9644,21 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", - "tokio-util", + "tokio-util 0.7.17", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", ] [[package]] @@ -9059,9 +9703,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ "serde_core", ] @@ -9081,20 +9725,33 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.24.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c740b185920170a6d9191122cafef7010bd6270a3824594bff6784c04d7f09e" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.4" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" [[package]] name = "tonic" @@ -9110,12 +9767,12 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "socket2", + "socket2 0.6.1", "sync_wrapper", "tokio", "tokio-stream", @@ -9149,7 +9806,7 @@ dependencies = [ "slab", "sync_wrapper", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tower-layer", "tower-service", "tracing", @@ -9162,7 +9819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags", + "bitflags 2.10.0", "bytes", "futures-core", "futures-util", @@ -9172,7 +9829,7 @@ dependencies = [ "iri-string", "pin-project-lite", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tower", "tower-layer", "tower-service", @@ -9234,6 +9891,16 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.19" @@ -9241,15 +9908,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term", + "nu-ansi-term 0.46.0", "once_cell", "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] @@ -9499,7 +10169,7 @@ dependencies = [ "schemars 1.1.0", "serde", "sha2", - "spdx", + "spdx 0.10.9", "tar", "thiserror 2.0.17", "toml", @@ -9538,7 +10208,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit", + "toml_edit 0.23.9", "tracing", "uv-cache-key", "uv-configuration", @@ -9641,7 +10311,7 @@ dependencies = [ "thiserror 2.0.17", "tl", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", "uv-auth", @@ -9766,7 +10436,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "toml", "tracing", "url", @@ -9817,7 +10487,7 @@ version = "0.0.1" source = "git+https://github.com/astral-sh/uv?tag=0.9.5#d5f39331a73d5042e70ab770463dff632e20c127" dependencies = [ "arcstr", - "bitflags", + "bitflags 2.10.0", "fs-err", "http 1.4.0", "itertools 0.14.0", @@ -9870,7 +10540,7 @@ dependencies = [ "tar", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "uv-configuration", "uv-distribution-filename", @@ -9886,7 +10556,7 @@ name = "uv-flags" version = "0.0.1" source = "git+https://github.com/astral-sh/uv?tag=0.9.5#d5f39331a73d5042e70ab770463dff632e20c127" dependencies = [ - "bitflags", + "bitflags 2.10.0", ] [[package]] @@ -10080,7 +10750,7 @@ dependencies = [ "futures", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "uv-distribution-filename", "uv-normalize", @@ -10192,7 +10862,7 @@ name = "uv-preview" version = "0.0.1" source = "git+https://github.com/astral-sh/uv?tag=0.9.5#d5f39331a73d5042e70ab770463dff632e20c127" dependencies = [ - "bitflags", + "bitflags 2.10.0", "thiserror 2.0.17", "uv-warnings", ] @@ -10215,7 +10885,7 @@ dependencies = [ "serde", "serde-untagged", "thiserror 2.0.17", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", "uv-cache-key", @@ -10259,7 +10929,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "tokio-util", + "tokio-util 0.7.17", "tracing", "url", "uv-cache", @@ -10388,7 +11058,7 @@ dependencies = [ "tokio", "tokio-stream", "toml", - "toml_edit", + "toml_edit 0.23.9", "tracing", "url", "uv-cache-key", @@ -10635,7 +11305,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "toml", - "toml_edit", + "toml_edit 0.23.9", "tracing", "uv-build-backend", "uv-cache-key", @@ -10698,6 +11368,17 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "vt100" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ff75fb8fa83e609e685106df4faeffdf3a735d3c74ebce97ec557d5d36fd9" +dependencies = [ + "itoa", + "unicode-width 0.2.2", + "vte 0.15.0", +] + [[package]] name = "vte" version = "0.14.1" @@ -10708,6 +11389,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "vte" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" +dependencies = [ + "arrayvec", + "memchr", +] + [[package]] name = "wait-timeout" version = "0.2.1" @@ -10757,7 +11448,7 @@ version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "once_cell", "rustversion", "wasm-bindgen-macro", @@ -10770,7 +11461,7 @@ version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ - "cfg-if", + "cfg-if 1.0.4", "js-sys", "once_cell", "wasm-bindgen", @@ -10830,7 +11521,7 @@ checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot", + "parking_lot 0.12.5", "pin-utils", "slab", "wasm-bindgen", @@ -10917,7 +11608,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -11588,6 +12279,26 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + [[package]] name = "yoke" version = "0.8.1" diff --git a/Cargo.toml b/Cargo.toml index 6ddf11bc44..6217a40ab3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,8 @@ assert_matches = "1.5.0" async-fd-lock = "0.2.0" async-once-cell = "0.5.4" async-trait = "0.1.86" +cargo_toml = "0.22.3" +clap-verbosity-flag = "3.0.2" axum = "0.8" barrier_cell = { path = "crates/barrier_cell" } base64 = "0.22.1" @@ -35,6 +37,8 @@ clap_complete_nushell = "4.5.5" coalesced_map = "0.1.2" comfy-table = "7.2.1" console = "0.16.1" +# Force crc to 3.3.0 to satisfy both lzma-rs (^3.0.0) and lzma-rust2 (=3.3.0) +crc = "=3.3.0" console-subscriber = "0.5.0" crossbeam-channel = "0.5.14" csv = "1.3.1" @@ -52,6 +56,7 @@ flate2 = "1.1.0" fs-err = { version = "3.1.0" } fs_extra = "1.3.0" futures = "0.3.31" +hashlink = "0.10.0" hex = "0.4.3" http = "1.3.1" http-cache-reqwest = "0.16.0" @@ -63,8 +68,12 @@ insta = "1.42.1" is_executable = "1.0.4" itertools = "0.14.0" jiff = "0.2.8" +jsonrpc-core = "18.0.0" +jsonrpc-http-server = "18.0.0" +jsonrpc-stdio-server = "18.0.0" jsonrpsee = "=0.26.0" libc = { version = "0.2.170", default-features = false } +marked-yaml = "0.8.0" memchr = "2.7.4" miette = { version = "7.6.0" } minijinja = "2.7.0" @@ -114,6 +123,13 @@ pixi_utils = { path = "crates/pixi_utils", default-features = false } pixi_uv_context = { path = "crates/pixi_uv_context" } pixi_uv_conversions = { path = "crates/pixi_uv_conversions" } pixi_variant = { path = "crates/pixi_variant" } +# Pixi build backends +pixi-build-backend = { path = "crates/pixi-build-backend" } +pixi-build-cmake = { path = "crates/pixi-build-cmake" } +pixi-build-mojo = { path = "crates/pixi-build-mojo" } +pixi-build-python = { path = "crates/pixi-build-python" } +pixi-build-rattler-build = { path = "crates/pixi-build-rattler-build" } +pixi-build-rust = { path = "crates/pixi-build-rust" } pypi_mapping = { path = "crates/pypi_mapping" } pypi_modifiers = { path = "crates/pypi_modifiers" } pyproject-toml = "0.13.7" @@ -138,7 +154,9 @@ rattler_upload = { version = "0.4.5", default-features = false, features = [ "s3", ] } rattler_virtual_packages = { version = "2.3.0", default-features = false } +rattler-build = { git = "https://github.com/prefix-dev/rattler-build", branch = "main", default-features = false } rayon = "1.10.0" +recipe-stage0 = { path = "crates/recipe-stage0" } regex = "1.11.1" reqwest = { version = "0.12.12", default-features = false } retry-policies = "0.4" @@ -160,7 +178,7 @@ serde_ignored = "0.1.10" serde_json = "1.0.139" serde_with = "=3.16.1" serde_yaml = "0.9.34" -sevenz-rust2 = "0.20.0" +sevenz-rust2 = "0.19.4" shlex = "1.3.0" signal-hook = "0.3.17" simple_spawn_blocking = { version = "1.1.0", default-features = false } @@ -176,6 +194,7 @@ text_trees = "0.1.2" thiserror = "2.0.12" tokio = "1.43.0" tokio-util = "0.7.13" +toml = "0.9.8" toml-span = "0.6.0" toml_edit = "0.23.0" tracing = "0.1.41" diff --git a/crates/pixi-build-backend/Cargo.toml b/crates/pixi-build-backend/Cargo.toml new file mode 100644 index 0000000000..abb9c2bc32 --- /dev/null +++ b/crates/pixi-build-backend/Cargo.toml @@ -0,0 +1,53 @@ +[package] +name = "pixi-build-backend" +version = "0.1.5" +edition.workspace = true + +[features] +default = ["rustls-tls"] +# Use rustls for TLS (pure Rust implementation) +rustls-tls = ["rattler-build/rustls-tls"] +# Use native-tls/OpenSSL for TLS +native-tls = ["rattler-build/native-tls"] + +[dependencies] +async-trait = { workspace = true } +chrono = { workspace = true } +clap = { workspace = true, features = ["derive", "env"] } +clap-verbosity-flag = { workspace = true } +fs-err = { workspace = true } +indexmap = { workspace = true } +ordermap = { workspace = true } +itertools = { workspace = true } +miette = { workspace = true } +minijinja = { workspace = true } +rattler_conda_types = { workspace = true } +rattler_virtual_packages = { workspace = true } +rattler-build = { workspace = true } +rattler_digest = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_yaml = { workspace = true } +serde_json = { workspace = true } +tempfile = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +tracing-subscriber = { workspace = true } +tracing = { workspace = true } +url = { workspace = true } +pathdiff = { workspace = true } +thiserror = { workspace = true } + +pixi_build_types = { workspace = true } + +jsonrpc-stdio-server = { workspace = true } +jsonrpc-http-server = { workspace = true } +jsonrpc-core = { workspace = true } +recipe-stage0 = { workspace = true } + + +[dev-dependencies] +insta = { version = "1.42.1", features = ["yaml", "redactions", "filters"] } +toml_edit = { version = "0.24.0" } +toml = { version = "0.9.0" } + +[package.metadata.cargo-shear] +ignored = ["async-trait"] diff --git a/crates/pixi-build-backend/src/cache.rs b/crates/pixi-build-backend/src/cache.rs new file mode 100644 index 0000000000..7f2280eb84 --- /dev/null +++ b/crates/pixi-build-backend/src/cache.rs @@ -0,0 +1,31 @@ +use std::collections::HashMap; + +use itertools::Itertools; + +use crate::{ProjectModel, Targets, traits::Dependencies}; + +pub fn sccache_tools() -> Vec { + vec!["sccache".to_string()] +} + +/// Return environment variables that are used by sccache. +pub fn sccache_envs(env: &HashMap) -> Option> { + let res = env + .keys() + .filter(|k| k.starts_with("SCCACHE")) + .map(|k| k.as_str()) + .collect_vec(); + if res.is_empty() { None } else { Some(res) } +} + +pub fn add_sccache<'a, P: ProjectModel>( + dependencies: &mut Dependencies<'a, ::Spec>, + sccache_tools: &'a [String], + empty_spec: &'a <

::Targets as Targets>::Spec, +) { + for cache_tool in sccache_tools { + if !dependencies.build.contains_key(&cache_tool) { + dependencies.build.insert(cache_tool, empty_spec); + } + } +} diff --git a/crates/pixi-build-backend/src/cli.rs b/crates/pixi-build-backend/src/cli.rs new file mode 100644 index 0000000000..a39aa5dd3e --- /dev/null +++ b/crates/pixi-build-backend/src/cli.rs @@ -0,0 +1,106 @@ +use clap::{Parser, Subcommand}; +use clap_verbosity_flag::{InfoLevel, Verbosity}; +use miette::IntoDiagnostic; +use pixi_build_types::{ + BackendCapabilities, FrontendCapabilities, + procedures::negotiate_capabilities::NegotiateCapabilitiesParams, +}; +use rattler_build::console_utils::{LoggingOutputHandler, get_default_env_filter}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; + +use crate::{protocol::ProtocolInstantiator, server::Server}; + +#[allow(missing_docs)] +#[derive(Parser)] +pub struct App { + /// The subcommand to run. + #[clap(subcommand)] + command: Option, + + /// The port to expose the json-rpc server on. If not specified will + /// communicate with stdin/stdout. + #[clap(long)] + http_port: Option, + + /// Enable verbose logging. + #[command(flatten)] + verbose: Verbosity, +} + +#[derive(Subcommand, Debug)] +pub enum Commands { + /// Get the capabilities of the backend. + Capabilities, +} + +/// Run the sever on the specified port or over stdin/stdout. +async fn run_server(port: Option, protocol: T) -> miette::Result<()> { + let server = Server::new(protocol); + if let Some(port) = port { + server.run_over_http(port) + } else { + // running over stdin/stdout + server.run().await + } +} + +/// The actual implementation of the main function that runs the CLI. +pub(crate) async fn main_impl T>( + factory: F, + args: App, +) -> miette::Result<()> { + // Setup logging + let log_handler = LoggingOutputHandler::default(); + + let registry = tracing_subscriber::registry() + .with(get_default_env_filter(args.verbose.log_level_filter()).into_diagnostic()?); + + registry.with(log_handler.clone()).init(); + + let factory = factory(log_handler); + + match args.command { + None => run_server(args.http_port, factory).await, + Some(Commands::Capabilities) => { + let backend_capabilities = capabilities::().await?; + eprintln!( + "Supports {}: {}", + pixi_build_types::procedures::conda_outputs::METHOD_NAME, + backend_capabilities.provides_conda_outputs() + ); + eprintln!( + "Supports {}: {}", + pixi_build_types::procedures::conda_build_v1::METHOD_NAME, + backend_capabilities.provides_conda_build_v1() + ); + Ok(()) + } + } +} + +/// The entry point for the CLI which should be called from the backends implementation. +pub async fn main T>( + factory: F, +) -> miette::Result<()> { + let args = App::parse(); + main_impl(factory, args).await +} + +/// The entry point for the CLI which should be called from the backends implementation. +pub async fn main_ext T>( + factory: F, + args: Vec, +) -> miette::Result<()> { + let args = App::parse_from(args); + main_impl(factory, args).await +} + +/// Returns the capabilities of the backend. +async fn capabilities() -> miette::Result { + let result = Factory::negotiate_capabilities(NegotiateCapabilitiesParams { + capabilities: FrontendCapabilities {}, + }) + .await?; + + Ok(result.capabilities) +} diff --git a/crates/pixi-build-backend/src/common/configuration.rs b/crates/pixi-build-backend/src/common/configuration.rs new file mode 100644 index 0000000000..593f9e0897 --- /dev/null +++ b/crates/pixi-build-backend/src/common/configuration.rs @@ -0,0 +1,66 @@ +use std::collections::BTreeMap; + +use miette::IntoDiagnostic; +use pixi_build_types::PlatformAndVirtualPackages; +use rattler_build::{ + NormalizedKey, metadata::PlatformWithVirtualPackages, recipe::variable::Variable, + types::Directories, +}; +use rattler_conda_types::ChannelUrl; +use rattler_virtual_packages::VirtualPackageOverrides; +use url::Url; + +/// Returns the [`BuildConfigurationParams`] that will be used to construct a BuildConfiguration +pub fn build_configuration( + channels: Vec, + build_platform: Option, + host_platform: Option, + variant: BTreeMap, + directories: Directories, +) -> miette::Result { + let build_platform = build_platform.map(|p| PlatformWithVirtualPackages { + platform: p.platform, + virtual_packages: p.virtual_packages.unwrap_or_default(), + }); + + let host_platform = host_platform.map(|p| PlatformWithVirtualPackages { + platform: p.platform, + virtual_packages: p.virtual_packages.unwrap_or_default(), + }); + + let (build_platform, host_platform) = match (build_platform, host_platform) { + (Some(build_platform), Some(host_platform)) => (build_platform, host_platform), + (build_platform, host_platform) => { + let current_platform = rattler_build::metadata::PlatformWithVirtualPackages::detect( + &VirtualPackageOverrides::from_env(), + ) + .into_diagnostic()?; + ( + build_platform.unwrap_or_else(|| current_platform.clone()), + host_platform.unwrap_or(current_platform), + ) + } + }; + + let channels = channels.into_iter().map(Into::into).collect(); + + let params = BuildConfigurationParams { + channels, + build_platform, + host_platform, + variant, + directories, + }; + + Ok(params) +} + +/// The parameters used to construct a BuildConfiguration +#[derive(Debug)] +pub struct BuildConfigurationParams { + pub channels: Vec, + pub build_platform: PlatformWithVirtualPackages, + pub host_platform: PlatformWithVirtualPackages, + pub variant: BTreeMap, + pub directories: Directories, +} diff --git a/crates/pixi-build-backend/src/common/mod.rs b/crates/pixi-build-backend/src/common/mod.rs new file mode 100644 index 0000000000..279e525e71 --- /dev/null +++ b/crates/pixi-build-backend/src/common/mod.rs @@ -0,0 +1,8 @@ +//! Common utilities that are shared between the different build backends. +mod configuration; +mod requirements; +mod variants; + +pub use configuration::{BuildConfigurationParams, build_configuration}; +pub use requirements::{PackageRequirements, SourceRequirements, requirements}; +pub use variants::compute_variants; diff --git a/crates/pixi-build-backend/src/common/requirements.rs b/crates/pixi-build-backend/src/common/requirements.rs new file mode 100644 index 0000000000..9202ce9165 --- /dev/null +++ b/crates/pixi-build-backend/src/common/requirements.rs @@ -0,0 +1,58 @@ +use std::collections::{BTreeMap, HashMap}; + +use rattler_build::{ + NormalizedKey, + recipe::{parser::Requirements, variable::Variable}, +}; +use serde::Serialize; + +use crate::{ + PackageSpec, ProjectModel, Targets, dependencies::ExtractedDependencies, traits::Dependencies, +}; + +pub struct PackageRequirements { + /// Requirements for rattler-build + pub requirements: Requirements, + + /// The source requirements + pub source: SourceRequirements

, +} + +#[derive(Debug, Serialize)] +#[serde(bound( + serialize = "<::Spec as PackageSpec>::SourceSpec: Serialize" +))] +pub struct SourceRequirements { + /// Source package specification for build dependencies + pub build: HashMap::Spec as PackageSpec>::SourceSpec>, + + /// Source package specification for host dependencies + pub host: HashMap::Spec as PackageSpec>::SourceSpec>, + + /// Source package specification for runtime dependencies + pub run: HashMap::Spec as PackageSpec>::SourceSpec>, +} + +/// Return requirements for the given project model +pub fn requirements( + dependencies: Dependencies<::Spec>, + variant: &BTreeMap, +) -> miette::Result> { + let build = ExtractedDependencies::from_dependencies(dependencies.build, variant)?; + let host = ExtractedDependencies::from_dependencies(dependencies.host, variant)?; + let run = ExtractedDependencies::from_dependencies(dependencies.run, variant)?; + + Ok(PackageRequirements { + requirements: Requirements { + build: build.dependencies, + host: host.dependencies, + run: run.dependencies, + ..Default::default() + }, + source: SourceRequirements { + build: build.sources, + host: host.sources, + run: run.sources, + }, + }) +} diff --git a/crates/pixi-build-backend/src/common/variants.rs b/crates/pixi-build-backend/src/common/variants.rs new file mode 100644 index 0000000000..1bb0559b8d --- /dev/null +++ b/crates/pixi-build-backend/src/common/variants.rs @@ -0,0 +1,31 @@ +//! Variants trait +//! +use std::collections::BTreeMap; + +use miette::IntoDiagnostic; +use rattler_build::{NormalizedKey, recipe::variable::Variable, variant_config::VariantConfig}; +use rattler_conda_types::Platform; + +use crate::ProjectModel; + +/// Return variants for the given project model +pub fn compute_variants( + project_model: &P, + input_variant_configuration: Option>>, + host_platform: Platform, +) -> miette::Result>> { + // Create a variant config from the variant configuration in the parameters. + let variant_config = VariantConfig { + variants: input_variant_configuration.unwrap_or_default(), + pin_run_as_build: None, + zip_keys: None, + }; + + // Determine the variant keys that are used in the recipe. + let used_variants = project_model.used_variants(Some(host_platform)); + + // Determine the combinations of the used variants. + variant_config + .combinations(&used_variants, None) + .into_diagnostic() +} diff --git a/crates/pixi-build-backend/src/compilers.rs b/crates/pixi-build-backend/src/compilers.rs new file mode 100644 index 0000000000..22d4cade42 --- /dev/null +++ b/crates/pixi-build-backend/src/compilers.rs @@ -0,0 +1,174 @@ +//! We could expose the `default_compiler` function from the `rattler-build` +//! crate + +use std::{collections::HashSet, fmt::Display, ops::Deref}; + +use itertools::Itertools; +use rattler_build::NormalizedKey; +use rattler_conda_types::Platform; +use recipe_stage0::{ + matchspec::PackageDependency, + recipe::{Item, Value}, +}; + +pub enum Language<'a> { + C, + Cxx, + Fortran, + Rust, + Other(&'a str), +} + +impl Display for Language<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Language::C => write!(f, "c"), + Language::Cxx => write!(f, "cxx"), + Language::Fortran => write!(f, "fortran"), + Language::Rust => write!(f, "rust"), + Language::Other(name) => write!(f, "{name}"), + } + } +} + +pub fn default_compiler(platform: &Platform, language: &str) -> String { + match language { + // Platform agnostic compilers + "fortran" => "gfortran", + // Platform specific compilers + "c" | "cxx" => { + if platform.is_windows() { + match language { + "c" => "vs2019", + "cxx" => "vs2019", + _ => unreachable!(), + } + } else if platform.is_osx() { + match language { + "c" => "clang", + "cxx" => "clangxx", + _ => unreachable!(), + } + } else if matches!(platform, Platform::EmscriptenWasm32) { + match language { + "c" => "emscripten", + "cxx" => "emscripten", + _ => unreachable!(), + } + } else { + match language { + "c" => "gcc", + "cxx" => "gxx", + _ => unreachable!(), + } + } + } + _ => language, + } + .to_string() +} + +/// Returns the compiler template function for the specified language. +pub fn compiler_requirement(language: &Language) -> Item { + format!("${{{{ compiler('{language}') }}}}") + .parse() + .expect("Failed to parse compiler requirement") +} + +/// Add configured compilers to build requirements if they are not already +/// present. +/// +/// # Arguments +/// * `compilers` - List of compiler names (e.g., ["c", "cxx", "rust", "cuda"]) +/// * `requirements` - Mutable reference to the requirements to modify +/// * `dependencies` - The Dependencies struct containing build/host/run dependencies +/// * `host_platform` - The target platform for determining default compiler +/// names +pub fn add_compilers_to_requirements( + compilers: &[String], + requirements: &mut Vec>, + dependencies: &crate::traits::targets::Dependencies, + host_platform: &Platform, +) { + for compiler_str in compilers { + // Check if the specific compiler is already present in build dependencies + let language_compiler = default_compiler(host_platform, compiler_str); + let source_package_name = pixi_build_types::SourcePackageName::from(language_compiler); + + if !dependencies.build.contains_key(&source_package_name) { + let template = format!("${{{{ compiler('{compiler_str}') }}}}"); + requirements.push(Item::Value(Value::Template(template))); + } + } +} + +/// Returns the standard library for a given language, if applicable. +/// +/// The implementation just always returns `c` for all languages except for some +/// exceptions. +fn stdlib_for_language(lang: &str) -> Option<&'static str> { + match lang { + "go-nocgo" => None, + _ => Some("c"), + } +} + +pub fn add_stdlib_to_requirements( + compilers: &[String], + requirements: &mut Vec>, + variants: &HashSet, +) { + // For each compiler check if there is a variant stdlib(compiler) key. + for stdlib in compilers + .iter() + .map(Deref::deref) + .filter_map(stdlib_for_language) + .unique() + { + let stdlib_key = format!("{stdlib}_stdlib"); + if !variants.contains(&NormalizedKey(stdlib_key)) { + continue; + } + + // If the stdlib key exists, add it to the requirements + let template = format!("${{{{ stdlib('{stdlib}') }}}}"); + requirements.push(Item::Value(Value::Template(template))); + } +} + +#[cfg(test)] +mod tests { + use insta::assert_yaml_snapshot; + + use super::*; + + #[test] + fn test_compiler_requirements_fortran() { + let result = compiler_requirement(&Language::Fortran); + assert_yaml_snapshot!(result); + } + + #[test] + fn test_compiler_requirements_c() { + let result = compiler_requirement(&Language::C); + assert_yaml_snapshot!(result); + } + + #[test] + fn test_compiler_requirements_cxx() { + let result = compiler_requirement(&Language::Cxx); + assert_yaml_snapshot!(result); + } + + #[test] + fn test_compiler_requirements_rust() { + let result = compiler_requirement(&Language::Other("rust")); + assert_yaml_snapshot!(result); + } + + #[test] + fn test_compiler_requirements_python() { + let result = compiler_requirement(&Language::Other("python")); + assert_yaml_snapshot!(result); + } +} diff --git a/crates/pixi-build-backend/src/consts.rs b/crates/pixi-build-backend/src/consts.rs new file mode 100644 index 0000000000..128e714064 --- /dev/null +++ b/crates/pixi-build-backend/src/consts.rs @@ -0,0 +1 @@ +pub const DEBUG_OUTPUT_DIR: &str = "debug"; diff --git a/crates/pixi-build-backend/src/dependencies.rs b/crates/pixi-build-backend/src/dependencies.rs new file mode 100644 index 0000000000..ab41026685 --- /dev/null +++ b/crates/pixi-build-backend/src/dependencies.rs @@ -0,0 +1,487 @@ +use std::{ + collections::{BTreeMap, HashMap}, + str::FromStr, +}; + +use miette::{Context, Diagnostic, IntoDiagnostic}; +use pixi_build_types as pbt; +use pixi_build_types::{BinaryPackageSpec, NamedSpec}; +use rattler_build::render::pin::PinBound; +use rattler_build::{ + NormalizedKey, + recipe::{parser::Dependency, variable::Variable}, + render::{ + pin::PinError, + resolved_dependencies::{ + DependencyInfo, PinCompatibleDependency, PinSubpackageDependency, ResolveError, + SourceDependency, VariantDependency, + }, + }, + types::PackageIdentifier, +}; +use rattler_conda_types::{ + MatchSpec, NamelessMatchSpec, PackageName, PackageNameMatcher, PackageRecord, + ParseStrictness::Strict, +}; +use thiserror::Error; + +use crate::{ + specs_conversion::{convert_variant_from_pixi_build_types, from_source_url_to_source_package}, + traits::PackageSpec, +}; + +/// A helper struct to extract match specs from a manifest. +#[derive(Default)] +pub struct MatchspecExtractor<'a> { + variant: Option<&'a BTreeMap>, +} + +pub struct ExtractedMatchSpecs { + pub specs: Vec, + pub sources: HashMap, +} + +impl<'a> MatchspecExtractor<'a> { + pub fn new() -> Self { + Self::default() + } + + /// Sets the variant to use for the match specs. + pub fn with_variant(self, variant: &'a BTreeMap) -> Self { + Self { + variant: Some(variant), + } + } + + /// Extracts match specs from the given set of dependencies. + pub fn extract<'b, S>( + &self, + dependencies: impl IntoIterator, + ) -> miette::Result> + where + S: PackageSpec + 'b, + { + let mut specs = Vec::new(); + let mut source_specs = HashMap::new(); + for (name, spec) in dependencies.into_iter() { + let name = PackageName::from_str(name.as_str()).into_diagnostic()?; + // If we have a variant override, we should use that instead of the spec. + if spec.can_be_used_as_variant() + && let Some(variant_value) = self + .variant + .as_ref() + .and_then(|variant| variant.get(&NormalizedKey::from(&name))) + { + let spec = NamelessMatchSpec::from_str( + variant_value.as_ref().as_str().wrap_err_with(|| { + miette::miette!("Variant {variant_value} needs to be a string") + })?, + Strict, + ) + .into_diagnostic() + .context("failed to convert variant to matchspec")?; + specs.push(MatchSpec::from_nameless( + spec, + Some(PackageNameMatcher::Exact(name)), + )); + continue; + } + + // Match on supported packages + let (match_spec, source_spec) = spec.to_match_spec(name.clone())?; + + specs.push(match_spec); + if let Some(source_spec) = source_spec { + source_specs.insert(name.as_normalized().to_owned(), source_spec); + } + } + + Ok(ExtractedMatchSpecs { + specs, + sources: source_specs, + }) + } +} + +pub struct ExtractedDependencies { + pub dependencies: Vec, + pub sources: HashMap, +} + +impl ExtractedDependencies { + pub fn from_dependencies<'a>( + dependencies: impl IntoIterator, + variant: &BTreeMap, + ) -> miette::Result + where + T: 'a, + { + let extracted_specs = MatchspecExtractor::new() + .with_variant(variant) + .extract(dependencies)?; + + Ok(Self { + dependencies: extracted_specs + .specs + .into_iter() + .map(Dependency::Spec) + .collect(), + sources: extracted_specs.sources, + }) + } +} + +/// Converts the input variant configuration passed from pixi to something that +/// rattler build can deal with. +pub fn convert_input_variant_configuration( + variants: Option>>, +) -> Option>> { + variants.map(|v| { + v.into_iter() + .map(|(k, v)| { + ( + k.into(), + v.into_iter() + .map(convert_variant_from_pixi_build_types) + .collect(), + ) + }) + .collect() + }) +} + +#[derive(Debug, Error, Diagnostic)] +pub enum ConvertDependencyError { + #[error("only matchspecs with defined package names are supported")] + MissingName, + + #[error("could not parse version spec for variant key {0}: {1}")] + VariantSpecParseError(String, rattler_conda_types::ParseMatchSpecError), + + #[error("could not apply pin. The following subpackage is not available: {0:?}")] + SubpackageNotFound(PackageName), + + #[error("could not apply pin: {0}")] + PinApplyError(PinError), +} + +fn convert_nameless_matchspec(spec: NamelessMatchSpec) -> pbt::BinaryPackageSpec { + pbt::BinaryPackageSpec { + version: spec.version, + build: spec.build, + build_number: spec.build_number, + file_name: spec.file_name, + channel: spec.channel.map(|c| c.base_url.clone().into()), + subdir: spec.subdir, + md5: spec.md5, + sha256: spec.sha256, + url: spec.url, + license: spec.license, + } +} + +/// Checks if it is applicable to apply a variant on the specified match spec. A +/// variant can be applied if it has a name and no other fields set. Returns the +/// name of the variant that should be used. +fn can_apply_variant(spec: &MatchSpec) -> Option<&PackageName> { + match &spec { + MatchSpec { + name: Some(name), + version: None, + build: None, + build_number: None, + file_name: None, + extras: None, + channel: None, + subdir: None, + namespace: None, + md5: None, + sha256: None, + license: None, + url: None, + condition: None, + } => name.as_exact(), + _ => None, + } +} + +fn apply_variant_and_convert( + spec: &MatchSpec, + variant: &BTreeMap, +) -> Result>, ConvertDependencyError> { + let Some(name) = can_apply_variant(spec) else { + return Ok(None); + }; + let Some(version) = variant.get(&name.into()).map(Variable::to_string) else { + return Ok(None); + }; + + // if the variant starts with an alphanumeric character, + // we have to add a '=' to the version spec + let mut spec = version.to_string(); + + // check if all characters are alphanumeric or ., in that case add + // a '=' to get "startswith" behavior + if spec.chars().all(|c| c.is_alphanumeric() || c == '.') { + spec = format!("={spec}"); + } + + let variant = name.as_normalized().to_string(); + let spec: NamelessMatchSpec = spec + .parse() + .map_err(|e| ConvertDependencyError::VariantSpecParseError(variant.clone(), e))?; + + Ok(Some(pbt::NamedSpec { + name: name.as_source().to_owned(), + spec: convert_nameless_matchspec(spec), + })) +} + +fn convert_dependency( + dependency: Dependency, + variant: &BTreeMap, + subpackages: &HashMap, + sources: &HashMap, +) -> Result, ConvertDependencyError> { + let match_spec = match dependency { + Dependency::Spec(spec) => { + // Convert back to source spec if it is a source spec. + if let Some(source_package) = + spec.url.clone().and_then(from_source_url_to_source_package) + { + let Some(name_matcher) = spec.name else { + return Err(ConvertDependencyError::MissingName); + }; + let Some(name) = name_matcher.as_exact() else { + return Err(ConvertDependencyError::MissingName); + }; + return Ok(pbt::NamedSpec { + name: name.as_source().into(), + spec: pbt::PackageSpec::Source(source_package), + }); + } + + // Apply a variant if it is applicable. + if let Some(NamedSpec { name, spec }) = apply_variant_and_convert(&spec, variant)? { + return Ok(pbt::NamedSpec { + name, + spec: pbt::PackageSpec::Binary(spec), + }); + } + spec + } + Dependency::PinSubpackage(pin) => { + let name = &pin.pin_value().name; + let subpackage = subpackages + .get(name) + .ok_or(ConvertDependencyError::SubpackageNotFound(name.to_owned()))?; + pin.pin_value() + .apply(&subpackage.version, &subpackage.build_string) + .map_err(ConvertDependencyError::PinApplyError)? + } + Dependency::PinCompatible(pin) => { + let pin = pin.pin_value(); + let name = &pin.name; + let args = &pin.args; + return Ok(pbt::NamedSpec { + name: name.as_source().to_owned(), + spec: pbt::PackageSpec::PinCompatible(pbt::PinCompatibleSpec { + lower_bound: args.lower_bound.clone().map(convert_pin_bound), + upper_bound: args.upper_bound.clone().map(convert_pin_bound), + exact: args.exact, + build: args.build.clone(), + }), + }); + } + }; + + let (Some(name_matcher), spec) = match_spec.into_nameless() else { + return Err(ConvertDependencyError::MissingName); + }; + let Some(name) = name_matcher.as_exact() else { + return Err(ConvertDependencyError::MissingName); + }; + + if let Some(source_spec) = sources + .get(name.as_source()) + .or_else(|| sources.get(name.as_normalized())) + { + let mut source_spec = source_spec.clone(); + // Merge in the spec details + source_spec.version = spec.version.or(source_spec.version); + source_spec.build = spec.build.or(source_spec.build); + source_spec.build_number = spec.build_number.or(source_spec.build_number); + source_spec.subdir = spec.subdir.or(source_spec.subdir); + source_spec.license = spec.license.or(source_spec.license); + + Ok(pbt::NamedSpec { + name: name.as_source().to_owned(), + spec: pbt::PackageSpec::Source(source_spec), + }) + } else { + Ok(pbt::NamedSpec { + name: name.as_source().to_owned(), + spec: pbt::PackageSpec::Binary(convert_nameless_matchspec(spec)), + }) + } +} + +fn convert_pin_bound(pin_bound: PinBound) -> pbt::PinBound { + match pin_bound { + PinBound::Expression(expr) => { + pbt::PinBound::Expression(pbt::PinExpression(expr.to_string())) + } + PinBound::Version(v) => pbt::PinBound::Version(v), + } +} + +fn convert_constraint_dependency( + dependency: Dependency, + variant: &BTreeMap, + subpackages: &HashMap, +) -> Result, ConvertDependencyError> { + let match_spec = match dependency { + Dependency::Spec(spec) => { + // Apply a variant if it is applicable. + if let Some(NamedSpec { spec, name }) = apply_variant_and_convert(&spec, variant)? { + return Ok(NamedSpec { + spec: pbt::ConstraintSpec::Binary(spec), + name, + }); + } + spec + } + Dependency::PinSubpackage(pin) => { + let name = &pin.pin_value().name; + let subpackage = subpackages + .get(name) + .ok_or(ConvertDependencyError::SubpackageNotFound(name.to_owned()))?; + pin.pin_value() + .apply(&subpackage.version, &subpackage.build_string) + .map_err(ConvertDependencyError::PinApplyError)? + } + _ => todo!("Handle other dependency types"), + }; + + // Apply a variant if it is applicable. + if let Some(NamedSpec { spec, name }) = apply_variant_and_convert(&match_spec, variant)? { + return Ok(NamedSpec { + spec: pbt::ConstraintSpec::Binary(spec), + name, + }); + } + + let (Some(name_matcher), spec) = match_spec.into_nameless() else { + return Err(ConvertDependencyError::MissingName); + }; + let Some(name) = name_matcher.as_exact() else { + return Err(ConvertDependencyError::MissingName); + }; + + Ok(pbt::NamedSpec { + name: name.as_source().to_owned(), + spec: pbt::ConstraintSpec::Binary(convert_nameless_matchspec(spec)), + }) +} + +pub fn convert_dependencies( + dependencies: Vec, + variant: &BTreeMap, + subpackages: &HashMap, + sources: &HashMap, +) -> Result>, ConvertDependencyError> { + dependencies + .into_iter() + .map(|spec| convert_dependency(spec, variant, subpackages, sources)) + .collect() +} + +pub fn convert_constraint_dependencies( + dependencies: Vec, + variant: &BTreeMap, + subpackages: &HashMap, +) -> Result>, ConvertDependencyError> { + dependencies + .into_iter() + .map(|spec| convert_constraint_dependency(spec, variant, subpackages)) + .collect() +} + +/// Apply a variant to a dependency list and resolve all pin_subpackage and +/// compiler dependencies +pub fn apply_variant( + raw_specs: &[Dependency], + variant: &BTreeMap, + subpackages: &HashMap, + compatibility_specs: &HashMap, + build_time: bool, +) -> Result, ResolveError> { + raw_specs + .iter() + .map(|s| { + match s { + Dependency::Spec(m) => { + let m = m.clone(); + if build_time + && m.version.is_none() + && m.build.is_none() + && let Some(name_matcher) = &m.name + && let Some(exact_name) = name_matcher.as_exact() + && let Some(version) = variant.get(&exact_name.into()) + { + // if the variant starts with an alphanumeric character, + // we have to add a '=' to the version spec + let mut spec = version.to_string(); + + // check if all characters are alphanumeric or ., in that case add + // a '=' to get "startswith" behavior + if spec.chars().all(|c| c.is_alphanumeric() || c == '.') { + spec = format!("={spec}"); + } + + let variant = exact_name.as_normalized().to_string(); + let spec: NamelessMatchSpec = spec + .parse() + .map_err(|e| ResolveError::VariantSpecParseError(variant.clone(), e))?; + + let spec = MatchSpec::from_nameless(spec, Some(name_matcher.clone())); + + return Ok(VariantDependency { spec, variant }.into()); + } + Ok(SourceDependency { spec: m }.into()) + } + Dependency::PinSubpackage(pin) => { + let name = &pin.pin_value().name; + let subpackage = subpackages + .get(name) + .ok_or(ResolveError::PinSubpackageNotFound(name.to_owned()))?; + let pinned = pin + .pin_value() + .apply(&subpackage.version, &subpackage.build_string)?; + Ok(PinSubpackageDependency { + spec: pinned, + name: name.as_normalized().to_string(), + args: pin.pin_value().args.clone(), + } + .into()) + } + Dependency::PinCompatible(pin) => { + let name = &pin.pin_value().name; + let pin_package = compatibility_specs + .get(name) + .ok_or(ResolveError::PinCompatibleNotFound(name.to_owned()))?; + + let pinned = pin + .pin_value() + .apply(&pin_package.version, &pin_package.build)?; + Ok(PinCompatibleDependency { + spec: pinned, + name: name.as_normalized().to_string(), + args: pin.pin_value().args.clone(), + } + .into()) + } + } + }) + .collect() +} diff --git a/crates/pixi-build-backend/src/encoded_source_spec_url.rs b/crates/pixi-build-backend/src/encoded_source_spec_url.rs new file mode 100644 index 0000000000..537c93518c --- /dev/null +++ b/crates/pixi-build-backend/src/encoded_source_spec_url.rs @@ -0,0 +1,182 @@ +use std::{collections::HashMap, str::FromStr}; + +use pixi_build_types::{GitReference, GitSpec, SourcePackageSpec, UrlSpec}; +use url::Url; + +/// An internal type that supports converting a source dependency into a valid +/// URL and back. +/// +/// This type is only used internally, it is not serialized. Therefore, +/// stability of how the URL is encoded is not important. +pub(crate) struct EncodedSourceSpecUrl(Url); + +impl From for Url { + fn from(value: EncodedSourceSpecUrl) -> Self { + value.0 + } +} + +impl From for EncodedSourceSpecUrl { + fn from(url: Url) -> Self { + // Ensure the URL is a file URL + assert_eq!(url.scheme(), "source", "URL must be a file URL"); + Self(url) + } +} + +impl From for SourcePackageSpec { + fn from(value: EncodedSourceSpecUrl) -> Self { + let url = value.0; + assert_eq!(url.scheme(), "source", "URL must be a file URL"); + let mut pairs: HashMap<_, _> = url.query_pairs().collect(); + if let Some(path) = pairs.remove("path") { + pixi_build_types::PathSpec { + path: path.into_owned(), + } + .into() + } else if let Some(url) = pairs.remove("url") { + let url = Url::from_str(&url).expect("must be a valid URL"); + let md5 = pairs + .remove("md5") + .and_then(|s| rattler_digest::parse_digest_from_hex::(&s)); + let sha256 = pairs + .remove("sha256") + .and_then(|s| rattler_digest::parse_digest_from_hex::(&s)); + let subdirectory = pairs.remove("subdirectory").map(|s| s.into_owned()); + UrlSpec { + url, + md5, + sha256, + subdirectory, + } + .into() + } else if let Some(git) = pairs.remove("git") { + let git_url = Url::from_str(&git).expect("must be a valid URL"); + let rev = if let Some(rev) = pairs.remove("rev") { + Some(GitReference::Rev(rev.into_owned())) + } else if let Some(branch) = pairs.remove("branch") { + Some(GitReference::Branch(branch.into_owned())) + } else { + pairs + .remove("tag") + .map(|tag| GitReference::Tag(tag.into_owned())) + }; + + let subdirectory = pairs.remove("subdirectory").map(|s| s.into_owned()); + GitSpec { + git: git_url, + rev, + subdirectory, + } + .into() + } else { + panic!("URL must contain either 'path', 'url', or 'git' query parameters"); + } + } +} + +impl From for EncodedSourceSpecUrl { + fn from(value: SourcePackageSpec) -> Self { + let mut url = Url::from_str("source://").expect("must be a valid URL"); + let mut query_pairs = url.query_pairs_mut(); + match value.location { + pixi_build_types::SourcePackageLocationSpec::Url(url_spec) => { + query_pairs.append_pair("url", url_spec.url.as_str()); + if let Some(md5) = &url_spec.md5 { + query_pairs.append_pair("md5", &format!("{md5:x}")); + } + if let Some(sha256) = &url_spec.sha256 { + query_pairs.append_pair("sha256", &format!("{sha256:x}")); + } + if let Some(subdirectory) = &url_spec.subdirectory { + query_pairs.append_pair("subdirectory", subdirectory); + } + } + pixi_build_types::SourcePackageLocationSpec::Git(git) => { + query_pairs.append_pair("git", git.git.as_str()); + if let Some(subdirectory) = &git.subdirectory { + query_pairs.append_pair("subdirectory", subdirectory); + } + match &git.rev { + Some(GitReference::Branch(branch)) => { + query_pairs.append_pair("branch", branch); + } + Some(GitReference::Rev(rev)) => { + query_pairs.append_pair("rev", rev); + } + Some(GitReference::Tag(tag)) => { + query_pairs.append_pair("tag", tag); + } + _ => {} + } + } + pixi_build_types::SourcePackageLocationSpec::Path(path) => { + query_pairs.append_pair("path", &path.path); + } + }; + drop(query_pairs); + Self(url) + } +} + +#[cfg(test)] +mod test { + use rattler_digest::{Md5, Sha256}; + + use super::*; + + #[test] + fn test_conversion() { + let specs: Vec = vec![ + pixi_build_types::PathSpec { + path: "..\\test\\path".into(), + } + .into(), + pixi_build_types::PathSpec { + path: "../test/path".into(), + } + .into(), + pixi_build_types::PathSpec { + path: "test/path".into(), + } + .into(), + pixi_build_types::PathSpec { + path: "/absolute/test/path".into(), + } + .into(), + pixi_build_types::PathSpec { + path: "C://absolute/win/path".into(), + } + .into(), + pixi_build_types::GitSpec { + git: "https://github.com/some/repo.git".parse().unwrap(), + rev: Some(GitReference::Rev("1234567890abcdef".into())), + subdirectory: Some("subdir".into()), + } + .into(), + pixi_build_types::UrlSpec { + url: "https://example.com/some/file.tar.gz".parse().unwrap(), + md5: Some( + rattler_digest::parse_digest_from_hex::( + "d41d8cd98f00b204e9800998ecf8427e", + ) + .unwrap(), + ), + sha256: Some( + rattler_digest::parse_digest_from_hex::( + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ) + .unwrap(), + ), + subdirectory: None, + } + .into(), + ]; + + for spec in specs { + let url: EncodedSourceSpecUrl = spec.clone().into(); + let converted_spec: SourcePackageSpec = url.into(); + assert_eq!(spec, converted_spec); + } + } +} diff --git a/crates/pixi-build-backend/src/generated_recipe.rs b/crates/pixi-build-backend/src/generated_recipe.rs new file mode 100644 index 0000000000..63180a0e8a --- /dev/null +++ b/crates/pixi-build-backend/src/generated_recipe.rs @@ -0,0 +1,277 @@ +use miette::Diagnostic; +use pixi_build_types::ProjectModel; +use rattler_build::{NormalizedKey, recipe::variable::Variable}; +use rattler_conda_types::{ChannelUrl, Platform, Version}; +use recipe_stage0::recipe::{About, IntermediateRecipe, Package, Value}; +use serde::de::DeserializeOwned; +use std::collections::HashSet; +use std::{ + collections::{BTreeMap, BTreeSet}, + convert::Infallible, + fmt::Debug, + path::{Path, PathBuf}, +}; +use thiserror::Error; + +use crate::specs_conversion::from_targets_v1_to_conditional_requirements; + +#[derive(Debug, Clone, Default)] +pub struct PythonParams { + // Returns whether the build is editable or not. + // Default to false + pub editable: bool, +} + +/// The trait is responsible of converting a certain [`ProjectModel`] (or +/// others in the future) into an [`IntermediateRecipe`]. +/// By implementing this trait, you can create a new backend for `pixi-build`. +/// +/// It also uses a [`BackendConfig`] to provide additional configuration +/// options. +/// +/// +/// An instance of this trait is used by the [`IntermediateBackend`] +/// in order to generate the recipe. +#[async_trait::async_trait] +pub trait GenerateRecipe { + type Config: BackendConfig; + + /// Generates an [`IntermediateRecipe`] from a [`ProjectModel`]. + /// + /// # Parameters + /// + /// * `model` - The project model to convert into a recipe + /// * `config` - Backend-specific configuration options + /// * `manifest_path` - Path to the project manifest file + /// * `host_platform` - The host platform will be removed in the future. + /// Right now it is used to determine if certain dependencies are present + /// for the host platform. Instead, we should rely on recipe selectors and + /// offload all the evaluation logic to the rattler-build. + /// * `python_params` - Used only by python backend right now and may + /// be removed when profiles will be implemented. + /// * `variants` - The variant names that are available to the recipe. This might + /// influence how the recipe is generated. + /// * `channels` - The channels that are being used for this build. This can be + /// used for backend-specific logic that depends on which channels are available. + /// * `cache_dir` - Optional cache directory for storing cached data (e.g., HTTP responses). + #[allow(clippy::too_many_arguments)] + async fn generate_recipe( + &self, + model: &ProjectModel, + config: &Self::Config, + manifest_path: PathBuf, + host_platform: Platform, + python_params: Option, + variants: &HashSet, + channels: Vec, + cache_dir: Option, + ) -> miette::Result; + + /// Returns a list of globs that should be used to find the input files + /// for the build process. + /// For example, this could be a list of source files or configuration files + /// used by Cmake. + fn extract_input_globs_from_build( + &self, + _config: &Self::Config, + _workdir: impl AsRef, + _editable: bool, + ) -> miette::Result> { + Ok(BTreeSet::new()) + } + + /// Returns "default" variants for the given host platform. This allows + /// backends to set some default variant configuration that can be + /// completely overwritten by the user. + /// + /// This can be useful to change the default behavior of rattler-build with + /// regard to compilers. But it also allows setting up default build + /// matrices. + fn default_variants( + &self, + _host_platform: Platform, + ) -> miette::Result>> { + Ok(BTreeMap::new()) + } +} + +pub trait BackendConfig: DeserializeOwned + Clone { + /// Debug dir provided by the backend config + fn debug_dir(&self) -> Option<&Path>; + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values typically override base values. + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result; +} + +#[derive(Debug, Error, Diagnostic)] +pub enum GenerateRecipeError { + #[error("There was no name defined for the recipe")] + NoNameDefined, + #[error("There was no version defined for the recipe")] + NoVersionDefined, + #[error("An error occurred while querying the {0}")] + MetadataProviderError( + String, + #[diagnostic_source] + #[source] + MetadataProviderError, + ), +} + +#[derive(Default, Clone)] +pub struct GeneratedRecipe { + pub recipe: IntermediateRecipe, + pub metadata_input_globs: BTreeSet, + pub build_input_globs: BTreeSet, +} + +impl GeneratedRecipe { + /// Creates a new [`GeneratedRecipe`] from a [`ProjectModel`]. + /// A default implementation that doesn't take into account the + /// build scripts or other fields. + pub fn from_model( + model: ProjectModel, + provider: &mut M, + ) -> Result> { + // If the name is not defined in the model, we try to get it from the provider. + // If the provider cannot provide a name, we return an error. + let name = match model.name { + Some(name) => { + if name.trim().is_empty() { + return Err(GenerateRecipeError::NoNameDefined); + } else { + name + } + } + None => provider + .name() + .map_err(|e| GenerateRecipeError::MetadataProviderError(String::from("name"), e))? + .ok_or(GenerateRecipeError::NoNameDefined)?, + }; + + // Recipes only allow lowercase names + let name = name.to_lowercase(); + + // If the version is not defined in the model, we try to get it from the + // provider. If the provider cannot provide a version, we return an + // error. + let version = match model.version { + Some(v) => v, + None => provider + .version() + .map_err(|e| { + GenerateRecipeError::MetadataProviderError(String::from("version"), e) + })? + .ok_or(GenerateRecipeError::NoVersionDefined)?, + }; + + let package = Package { + name: Value::Concrete(name), + version: Value::Concrete(version.to_string()), + }; + + let requirements = + from_targets_v1_to_conditional_requirements(&model.targets.unwrap_or_default()); + + macro_rules! derive_value { + ($ident:ident) => { + match model.$ident { + Some(v) => Some(v.to_string()), + None => provider.$ident().map_err(|e| { + GenerateRecipeError::MetadataProviderError( + String::from(stringify!($ident)), + e, + ) + })?, + } + }; + } + + let about = About { + homepage: derive_value!(homepage).map(Value::Concrete), + license: derive_value!(license).map(Value::Concrete), + description: derive_value!(description).map(Value::Concrete), + documentation: derive_value!(documentation).map(Value::Concrete), + repository: derive_value!(repository).map(Value::Concrete), + license_file: match model.license_file { + Some(v) => Some(Value::Concrete(v.display().to_string())), + None => provider + .license_files() + .map_err(|e| { + GenerateRecipeError::MetadataProviderError(String::from("license-files"), e) + })? + .map(|files| Value::Concrete(files.join(", "))), + }, + summary: provider + .summary() + .map_err(|e| { + GenerateRecipeError::MetadataProviderError(String::from("summary"), e) + })? + .map(Value::Concrete), + }; + + let ir = IntermediateRecipe { + package, + requirements, + about: Some(about), + ..Default::default() + }; + + Ok(GeneratedRecipe { + recipe: ir, + // TODO: extract real input globs from the model + ..Default::default() + }) + } +} + +#[derive(Debug, Error, Diagnostic)] +pub enum MetadataProviderError { + #[error("The metadata provider cannot provide an about section for the recipe")] + CannotParseVersion(#[from] rattler_conda_types::ParseVersionError), +} + +pub trait MetadataProvider { + type Error: Diagnostic; + + /// Returns the name of the package or `None` if the provider does not + /// provide a name. + fn name(&mut self) -> Result, Self::Error> { + Ok(None) + } + + /// Returns the version of the package or `None` if the provider does not + /// provide a version. + fn version(&mut self) -> Result, Self::Error> { + Ok(None) + } + + fn homepage(&mut self) -> Result, Self::Error> { + Ok(None) + } + fn license(&mut self) -> Result, Self::Error> { + Ok(None) + } + fn license_files(&mut self) -> Result>, Self::Error> { + Ok(None) + } + fn summary(&mut self) -> Result, Self::Error> { + Ok(None) + } + fn description(&mut self) -> Result, Self::Error> { + Ok(None) + } + fn documentation(&mut self) -> Result, Self::Error> { + Ok(None) + } + fn repository(&mut self) -> Result, Self::Error> { + Ok(None) + } +} + +pub struct DefaultMetadataProvider; + +impl MetadataProvider for DefaultMetadataProvider { + type Error = Infallible; +} diff --git a/crates/pixi-build-backend/src/intermediate_backend.rs b/crates/pixi-build-backend/src/intermediate_backend.rs new file mode 100644 index 0000000000..b7f60af4b6 --- /dev/null +++ b/crates/pixi-build-backend/src/intermediate_backend.rs @@ -0,0 +1,877 @@ +use std::{ + collections::{BTreeMap, HashMap}, + path::{Path, PathBuf}, + sync::Arc, +}; + +use indexmap::{IndexMap, IndexSet}; +use itertools::Itertools; +use miette::{Context, IntoDiagnostic}; +use ordermap::OrderMap; +use pixi_build_types::{ + BackendCapabilities, PathSpec, ProjectModel, SourcePackageSpec, TargetSelector, + procedures::{ + conda_build_v1::{CondaBuildV1Output, CondaBuildV1Params, CondaBuildV1Result}, + conda_outputs::{ + CondaOutput, CondaOutputDependencies, CondaOutputIgnoreRunExports, CondaOutputMetadata, + CondaOutputRunExports, CondaOutputsParams, CondaOutputsResult, + }, + initialize::{InitializeParams, InitializeResult}, + negotiate_capabilities::{NegotiateCapabilitiesParams, NegotiateCapabilitiesResult}, + }, +}; +use rattler_build::{ + NormalizedKey, + build::{WorkingDirectoryBehavior, run_build}, + console_utils::LoggingOutputHandler, + hash::HashInfo, + metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages}, + recipe::{ParsingError, Recipe, parser::find_outputs_from_src}, + selectors::SelectorConfig, + source_code::Source, + tool_configuration::Configuration, + types::{Directories, PackageIdentifier, PackagingSettings}, + variant_config::{DiscoveredOutput, ParseErrors, VariantConfig}, +}; +use rattler_conda_types::{Platform, compression_level::CompressionLevel, package::ArchiveType}; + +use serde::Deserialize; +use tracing::warn; + +use crate::{ + consts::DEBUG_OUTPUT_DIR, + dependencies::{ + convert_constraint_dependencies, convert_dependencies, convert_input_variant_configuration, + }, + generated_recipe::{BackendConfig, GenerateRecipe, PythonParams}, + protocol::{Protocol, ProtocolInstantiator}, + specs_conversion::{ + convert_variant_from_pixi_build_types, convert_variant_to_pixi_build_types, + from_build_v1_args_to_finalized_dependencies, + }, + tools::{OneOrMultipleOutputs, output_directory}, + traits::targets::TargetSelector as _, +}; + +use fs_err::tokio as tokio_fs; + +#[derive(Debug, Default, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct IntermediateBackendConfig { + /// Environment Variables + #[serde(default)] + pub env: IndexMap, + /// If set, internal state will be logged as files in that directory + pub debug_dir: Option, +} + +pub struct IntermediateBackendInstantiator { + logging_output_handler: LoggingOutputHandler, + + generator: Arc, +} + +impl IntermediateBackendInstantiator { + pub fn new(logging_output_handler: LoggingOutputHandler, instance: Arc) -> Self { + Self { + logging_output_handler, + generator: instance, + } + } +} + +pub struct IntermediateBackend { + pub(crate) logging_output_handler: LoggingOutputHandler, + pub(crate) source_dir: PathBuf, + /// The path to the manifest file relative to the source directory. + pub(crate) manifest_rel_path: PathBuf, + pub(crate) project_model: ProjectModel, + pub(crate) generate_recipe: Arc, + pub(crate) config: T::Config, + pub(crate) target_config: OrderMap, + pub(crate) cache_dir: Option, +} +impl IntermediateBackend { + #[allow(clippy::too_many_arguments)] + pub fn new( + manifest_path: PathBuf, + source_dir: Option, + project_model: ProjectModel, + generate_recipe: Arc, + config: serde_json::Value, + target_config: OrderMap, + logging_output_handler: LoggingOutputHandler, + cache_dir: Option, + ) -> miette::Result { + // Determine the root directory of the manifest + let (source_dir, manifest_rel_path) = match source_dir { + None => { + let source_dir = manifest_path + .parent() + .ok_or_else(|| { + miette::miette!("the project manifest must reside in a directory") + })? + .to_path_buf(); + let manifest_rel_path = manifest_path + .file_name() + .map(Path::new) + .expect("we already validated that the manifest path is a file") + .to_path_buf(); + (source_dir, manifest_rel_path) + } + Some(source_dir) => { + let manifest_rel_path = pathdiff::diff_paths(&manifest_path, &source_dir) + .ok_or_else(|| { + miette::miette!( + "the manifest: {} is not relative to the source directory: {}", + manifest_path.display(), + source_dir.display() + ) + })?; + (source_dir, manifest_rel_path) + } + }; + + let config = serde_json::from_value::(config) + .into_diagnostic() + .context("failed to parse configuration")?; + + if let Some(path) = config.debug_dir() { + warn!( + path = %path.display(), + "`debug-dir` backend configuration is deprecated and ignored; debug data is now written to the build work directory." + ); + } + + let target_config = target_config + .into_iter() + .map(|(target, config)| { + let config = serde_json::from_value::(config) + .into_diagnostic() + .wrap_err_with(|| { + format!("failed to parse target configuration for {target}") + })?; + Ok((target, config)) + }) + .collect::>()?; + + Ok(Self { + source_dir, + manifest_rel_path, + project_model, + generate_recipe, + config, + target_config, + logging_output_handler, + cache_dir, + }) + } +} + +#[async_trait::async_trait] +impl ProtocolInstantiator for IntermediateBackendInstantiator +where + T: GenerateRecipe + Clone + Send + Sync + 'static, + T::Config: Send + Sync + 'static, +{ + async fn initialize( + &self, + params: InitializeParams, + ) -> miette::Result<(Box, InitializeResult)> { + let project_model = params + .project_model + .ok_or_else(|| miette::miette!("project model is required"))?; + + let config = if let Some(config) = params.configuration { + config + } else { + serde_json::Value::Object(Default::default()) + }; + + let target_config = params.target_configuration.unwrap_or_default(); + + let instance = IntermediateBackend::::new( + params.manifest_path, + params.source_directory, + project_model, + self.generator.clone(), + config, + target_config, + self.logging_output_handler.clone(), + params.cache_directory, + )?; + + Ok((Box::new(instance), InitializeResult {})) + } + + async fn negotiate_capabilities( + _params: NegotiateCapabilitiesParams, + ) -> miette::Result { + // Returns the capabilities of this backend based on the capabilities of + // the frontend. + Ok(NegotiateCapabilitiesResult { + capabilities: default_capabilities(), + }) + } +} + +#[async_trait::async_trait] +impl Protocol for IntermediateBackend +where + T: GenerateRecipe + Clone + Send + Sync + 'static, + T::Config: BackendConfig + Send + Sync + 'static, +{ + async fn conda_outputs( + &self, + params: CondaOutputsParams, + ) -> miette::Result { + let build_platform = params.host_platform; + + let config = self + .target_config + .iter() + .find(|(selector, _)| selector.matches(params.host_platform)) + .map(|(_, target_config)| self.config.merge_with_target_config(target_config)) + .unwrap_or_else(|| Ok(self.config.clone()))?; + + let selector_config_for_variants = SelectorConfig { + target_platform: params.host_platform, + host_platform: params.host_platform, + build_platform, + hash: None, + variant: Default::default(), + experimental: false, + allow_undefined: false, + recipe_path: Some(self.source_dir.join(&self.manifest_rel_path)), + }; + + let mut variants = self + .generate_recipe + .default_variants(params.host_platform)?; + + // Construct a `VariantConfig` based on the input parameters. This is a + // combination of defaults provided by the generator (lowest priority), + // variants loaded from external files, and finally the user supplied + // variants (highest priority). + let variant_files = params.variant_files.unwrap_or_default(); + let mut variant_config = + VariantConfig::from_files(&variant_files, &selector_config_for_variants)?; + variants.append(&mut variant_config.variants); + variant_config.variants = variants; + + let mut param_variants = + convert_input_variant_configuration(params.variant_configuration.clone()) + .unwrap_or_default(); + variant_config.variants.append(&mut param_variants); + + // Construct the intermediate recipe + let generated_recipe = self + .generate_recipe + .generate_recipe( + &self.project_model, + &config, + self.source_dir.clone(), + params.host_platform, + Some(PythonParams { editable: false }), + &variant_config.variants.keys().cloned().collect(), + params.channels, + self.cache_dir.clone(), + ) + .await?; + + // Convert the recipe to source code. + // TODO(baszalmstra): In the future it would be great if we could just + // immediately use the intermediate recipe for some of this rattler-build + // functions. + let recipe_path = self.source_dir.join(&self.manifest_rel_path); + let named_source = Source { + name: self.manifest_rel_path.display().to_string(), + code: Arc::from( + generated_recipe + .recipe + .to_yaml_pretty() + .into_diagnostic()? + .as_str(), + ), + path: recipe_path.clone(), + }; + + // Determine the different outputs that are supported by the recipe by expanding + // all the different variant combinations. + // + // TODO(baszalmstra): The selector config we pass in here doesnt have all values + // filled in. This is on purpose because at this point we dont yet know all + // values like the variant. We should introduce a new type of selector config + // for this particular case. + let outputs = find_outputs_from_src(named_source.clone())?; + let discovered_outputs = variant_config.find_variants( + &outputs, + named_source.clone(), + &selector_config_for_variants, + )?; + + // Construct a mapping that for packages that we want from source. + // + // By default, this includes all the outputs in the recipe. These should all be + // build from source, in particular from the current source. + let local_source_packages: HashMap = discovered_outputs + .iter() + .map(|output| (output.name.clone(), PathSpec { path: ".".into() }.into())) + .collect(); + + let mut subpackages = HashMap::new(); + let mut outputs = Vec::new(); + + let num_of_outputs = discovered_outputs.len(); + + let mut variants_saved = false; + + for discovered_output in discovered_outputs { + let variant = discovered_output.used_vars; + let hash = HashInfo::from_variant(&variant, &discovered_output.noarch_type); + + // Construct the selector config for this particular output. We base this on the + // selector config that was used to determine the variants. + let selector_config = SelectorConfig { + variant: variant.clone(), + hash: Some(hash.clone()), + target_platform: discovered_output.target_platform, + ..selector_config_for_variants.clone() + }; + + // Convert this discovered output into a recipe. + let recipe = Recipe::from_node(&discovered_output.node, selector_config.clone()) + .map_err(|err| { + let errs: ParseErrors<_> = err + .into_iter() + .map(|err| ParsingError::from_partial(named_source.clone(), err)) + .collect::>() + .into(); + errs + })?; + + // Skip this output if the recipe is marked as skipped + if recipe.build().skip() { + continue; + } + + let build_number = recipe.build().number; + + let directories = output_directory( + if num_of_outputs == 1 { + OneOrMultipleOutputs::Single(discovered_output.name.clone()) + } else { + OneOrMultipleOutputs::OneOfMany(discovered_output.name.clone()) + }, + params.work_directory.clone(), + &named_source.path, + ); + + // Save intermediate recipe and the used variant + // in the debug dir by hash of the variant + // and entire variants.yaml at the root of debug_dir + let debug_dir = &directories.build_dir.join("debug"); + + let recipe_path = debug_dir.join("recipe.yaml"); + let variants_path = debug_dir.join("variants.yaml"); + + let package_debug_dir = debug_dir.join("recipe").join(&hash.hash); + let package_recipe_path = package_debug_dir.join("recipe.yaml"); + let package_variant_path = package_debug_dir.join("variants.yaml"); + + tokio_fs::create_dir_all(&package_debug_dir) + .await + .into_diagnostic()?; + + let recipe_yaml = generated_recipe.recipe.to_yaml_pretty().into_diagnostic()?; + + tokio_fs::write(&package_recipe_path, &recipe_yaml) + .await + .into_diagnostic()?; + + let variant_yaml = serde_yaml::to_string(&variant) + .into_diagnostic() + .context("failed to serialize variant to YAML")?; + + tokio_fs::write(&package_variant_path, variant_yaml) + .await + .into_diagnostic()?; + + // write the entire variants.yaml at the root of debug_dir + if !variants_saved { + let variants = serde_yaml::to_string(&variant_config) + .into_diagnostic() + .context("failed to serialize variant config to YAML")?; + + tokio_fs::write(&variants_path, variants) + .await + .into_diagnostic()?; + + tokio_fs::write(&recipe_path, recipe_yaml) + .await + .into_diagnostic()?; + + variants_saved = true; + } + + subpackages.insert( + recipe.package().name().clone(), + PackageIdentifier { + name: recipe.package().name().clone(), + version: recipe.package().version().clone(), + build_string: discovered_output.build_string.clone(), + }, + ); + + outputs.push(CondaOutput { + metadata: CondaOutputMetadata { + name: recipe.package().name().clone(), + version: recipe.package.version().clone(), + build: discovered_output.build_string.clone(), + build_number, + subdir: discovered_output.target_platform, + license: recipe.about.license.map(|l| l.to_string()), + license_family: recipe.about.license_family, + noarch: recipe.build.noarch, + purls: None, + python_site_packages_path: None, + variant: variant + .iter() + .map(|(key, value)| { + Ok(( + key.0.clone(), + convert_variant_to_pixi_build_types(value.clone()).into_diagnostic() + .with_context(|| { + format!("the output {}/{}={}={} contains a variant for '{}' which cannot be converted to pixi types: {}", + discovered_output.target_platform, + discovered_output.name, + discovered_output.version, + discovered_output.build_string, + key.0, + value) + })? + )) + }) + .collect::>()?, + }, + build_dependencies: Some(CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.build, + &variant, + &subpackages, + &local_source_packages, + )?, + constraints: Vec::new(), + }), + host_dependencies: Some(CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.host, + &variant, + &subpackages, + &local_source_packages, + )?, + constraints: Vec::new(), + }), + run_dependencies: CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.run, + &BTreeMap::default(), // Variants are not applied to run dependencies + &subpackages, + &local_source_packages, + )?, + constraints: convert_constraint_dependencies( + recipe.requirements.run_constraints, + &BTreeMap::default(), // Variants are not applied to run constraints + &subpackages, + )?, + }, + ignore_run_exports: CondaOutputIgnoreRunExports { + by_name: recipe + .requirements + .ignore_run_exports + .by_name + .into_iter() + .collect(), + from_package: recipe + .requirements + .ignore_run_exports + .from_package + .into_iter() + .collect(), + }, + run_exports: CondaOutputRunExports { + weak: convert_dependencies( + recipe.requirements.run_exports.weak, + &variant, + &subpackages, + &local_source_packages, + )?, + strong: convert_dependencies( + recipe.requirements.run_exports.strong, + &variant, + &subpackages, + &local_source_packages, + )?, + noarch: convert_dependencies( + recipe.requirements.run_exports.noarch, + &variant, + &subpackages, + &local_source_packages, + )?, + weak_constrains: convert_constraint_dependencies( + recipe.requirements.run_exports.weak_constraints, + &variant, + &subpackages, + )?, + strong_constrains: convert_constraint_dependencies( + recipe.requirements.run_exports.strong_constraints, + &variant, + &subpackages, + )?, + }, + + // The input globs are the same for all outputs + input_globs: None, + // TODO: Implement caching + }); + } + + Ok(CondaOutputsResult { + outputs, + input_globs: generated_recipe.metadata_input_globs, + }) + } + + async fn conda_build_v1( + &self, + params: CondaBuildV1Params, + ) -> miette::Result { + let host_platform = params + .host_prefix + .as_ref() + .map_or_else(Platform::current, |prefix| prefix.platform); + let build_platform = params + .build_prefix + .as_ref() + .map_or_else(Platform::current, |prefix| prefix.platform); + + let config = self + .target_config + .iter() + .find(|(selector, _)| selector.matches(host_platform)) + .map(|(_, target_config)| self.config.merge_with_target_config(target_config)) + .unwrap_or_else(|| Ok(self.config.clone()))?; + + // Construct the variants based on the input parameters. We only + // have a single variant here so we can just use the variant from the + // parameters. + let variants: BTreeMap<_, _> = params + .output + .variant + .iter() + .map(|(k, v)| { + ( + k.as_str().into(), + vec![convert_variant_from_pixi_build_types(v.clone())], + ) + }) + .collect(); + + // Construct the intermediate recipe + let mut recipe = self + .generate_recipe + .generate_recipe( + &self.project_model, + &config, + self.source_dir.clone(), + host_platform, + Some(PythonParams { + editable: params.editable.unwrap_or_default(), + }), + &variants.keys().cloned().collect(), + params.channels, + self.cache_dir.clone(), + ) + .await?; + + // Convert the recipe to source code. + // TODO(baszalmstra): In the future it would be great if we could just + // immediately use the intermediate recipe for some of this rattler-build + // functions. + let recipe_path = self.source_dir.join(&self.manifest_rel_path); + let named_source = Source { + name: self.manifest_rel_path.display().to_string(), + code: Arc::from(recipe.recipe.to_yaml_pretty().into_diagnostic()?.as_str()), + path: recipe_path.clone(), + }; + + // Determine the different outputs that are supported by the recipe. + let selector_config_for_variants = SelectorConfig { + target_platform: host_platform, + host_platform, + build_platform, + hash: None, + variant: Default::default(), + experimental: false, + allow_undefined: false, + recipe_path: Some(self.source_dir.join(&self.manifest_rel_path)), + }; + let outputs = find_outputs_from_src(named_source.clone())?; + + let variant_config = VariantConfig { + variants, + pin_run_as_build: None, + zip_keys: None, + }; + let discovered_outputs = variant_config.find_variants( + &outputs, + named_source.clone(), + &selector_config_for_variants, + )?; + let discovered_output = find_matching_output(¶ms.output, discovered_outputs)?; + + // Set up the proper directories for the build. + let directories = conda_build_v1_directories( + params.host_prefix.as_ref().map(|p| p.prefix.as_path()), + params.build_prefix.as_ref().map(|p| p.prefix.as_path()), + params.work_directory.clone(), + self.cache_dir.as_deref(), + params.output_directory.as_deref(), + recipe_path, + ); + + // Save intermediate recipe and the used variant + // in the debug dir by hash of the variant + let variant = discovered_output.used_vars; + + // Save intermediate recipe and the used variant + // in the debug dir by hash of the variant + // and entire variants.yaml at the root of debug_dir + let debug_dir = &directories.build_dir.join(DEBUG_OUTPUT_DIR); + + let recipe_path = debug_dir.join("recipe.yaml"); + let variants_path = debug_dir.join("variants.yaml"); + + let package_dir = debug_dir.join("recipe").join(&discovered_output.hash.hash); + + let package_recipe_path = package_dir.join("recipe.yaml"); + let package_variant_path = package_dir.join("variants.yaml"); + + tokio_fs::create_dir_all(&package_dir) + .await + .into_diagnostic()?; + + let recipe_yaml = recipe.recipe.to_yaml_pretty().into_diagnostic()?; + + tokio_fs::write(&package_recipe_path, &recipe_yaml) + .await + .into_diagnostic()?; + + let variant_yaml = serde_yaml::to_string(&variant) + .into_diagnostic() + .context("failed to serialize variant to YAML")?; + + tokio_fs::write(&package_variant_path, variant_yaml) + .await + .into_diagnostic()?; + + // write the entire variants.yaml at the root of debug_dir + let variants = serde_yaml::to_string(&variant_config) + .into_diagnostic() + .context("failed to serialize variant config to YAML")?; + + tokio_fs::write(&variants_path, variants) + .await + .into_diagnostic()?; + + tokio_fs::write(&recipe_path, recipe_yaml) + .await + .into_diagnostic()?; + + let tool_config = Configuration::builder() + .with_opt_cache_dir(self.cache_dir.clone()) + .with_logging_output_handler(self.logging_output_handler.clone()) + .with_testing(false) + // Pixi is incremental so keep the build + .with_keep_build(true) + // This indicates that the environments are externally managed, e.g. they are already + // prepared. + .with_environments_externally_managed(true) + .finish(); + + let output = Output { + recipe: discovered_output.recipe, + build_configuration: BuildConfiguration { + target_platform: discovered_output.target_platform, + host_platform: PlatformWithVirtualPackages { + platform: host_platform, + virtual_packages: vec![], + }, + build_platform: PlatformWithVirtualPackages { + platform: build_platform, + virtual_packages: vec![], + }, + hash: discovered_output.hash, + variant, + directories, + channels: vec![], + channel_priority: Default::default(), + solve_strategy: Default::default(), + timestamp: chrono::Utc::now(), + subpackages: BTreeMap::new(), + packaging_settings: PackagingSettings::from_args( + ArchiveType::Conda, + CompressionLevel::default(), + ), + store_recipe: false, + force_colors: true, + sandbox_config: None, + debug: Debug::new(false), + exclude_newer: None, + }, + finalized_dependencies: Some(from_build_v1_args_to_finalized_dependencies( + params.build_prefix, + params.host_prefix, + params.run_dependencies, + params.run_constraints, + params.run_exports, + )), + finalized_sources: None, + finalized_cache_dependencies: None, + finalized_cache_sources: None, + build_summary: Arc::default(), + system_tools: Default::default(), + extra_meta: None, + }; + + let (output, output_path) = + run_build(output, &tool_config, WorkingDirectoryBehavior::Preserve).await?; + + // Extract the input globs from the build and recipe + let mut input_globs = self.generate_recipe.extract_input_globs_from_build( + &config, + ¶ms.work_directory, + params.editable.unwrap_or_default(), + )?; + input_globs.append(&mut recipe.build_input_globs); + + Ok(CondaBuildV1Result { + output_file: output_path, + input_globs, + name: output.name().as_normalized().to_string(), + version: output.version().clone(), + build: output.build_string().into_owned(), + subdir: *output.target_platform(), + }) + } +} + +pub fn find_matching_output( + expected_output: &CondaBuildV1Output, + mut discovered_outputs: IndexSet, +) -> miette::Result { + // Filter all outputs that are skipped or dont match the name + discovered_outputs.retain(|output| { + !output.recipe.build.skip() && output.name == expected_output.name.as_normalized() + }); + + if discovered_outputs.is_empty() { + // There is no output with the expected name + return Err(miette::miette!( + "there is no output defined for the package '{}'", + expected_output.name.as_source(), + )); + } + + // Check if there is a output that has matching variant keys. + let expected_used_vars: BTreeMap = expected_output + .variant + .iter() + .map(|(k, v)| { + ( + k.as_str().into(), + convert_variant_from_pixi_build_types(v.clone()), + ) + }) + .collect(); + if let Ok((output_idx, _)) = discovered_outputs + .iter() + .enumerate() + .filter(|(_idx, output)| { + expected_used_vars + .iter() + .all(|(key, value)| output.used_vars.get(key) == Some(value)) + }) + .exactly_one() + { + return Ok(discovered_outputs + .swap_remove_index(output_idx) + .expect("index must exist")); + } + + // Otherwise, match on version, build and subdir. + discovered_outputs + .into_iter() + .find(|output| { + expected_output + .build + .as_ref() + .is_none_or(|build_string| build_string == &output.build_string) + && expected_output + .version + .as_ref() + .is_none_or(|version| version == &output.recipe.package.version) + && expected_output.subdir == output.target_platform + }) + .ok_or_else(|| { + miette::miette!( + "the requested output {}/{}={}@{} was not found in the recipe", + expected_output.name.as_source(), + expected_output + .version + .as_ref() + .map_or_else(|| String::from("??"), |v| v.as_str().into_owned()), + expected_output.build.as_deref().unwrap_or("??"), + expected_output.subdir + ) + }) +} + +pub fn conda_build_v1_directories( + host_prefix: Option<&Path>, + build_prefix: Option<&Path>, + work_directory: PathBuf, + cache_dir: Option<&Path>, + output_dir: Option<&Path>, + recipe_path: PathBuf, +) -> Directories { + Directories { + recipe_dir: recipe_path + .parent() + .expect("recipe path must have a parent") + .to_path_buf(), + recipe_path, + cache_dir: cache_dir + .map(Path::to_path_buf) + .unwrap_or_else(|| work_directory.join("cache")), + host_prefix: host_prefix + .map(Path::to_path_buf) + .unwrap_or_else(|| work_directory.join("host")), + build_prefix: build_prefix + .map(Path::to_path_buf) + .unwrap_or_else(|| work_directory.join("build")), + work_dir: work_directory.join("work"), + output_dir: output_dir + .map(Path::to_path_buf) + .unwrap_or_else(|| work_directory.join("output")), + build_dir: work_directory, + } +} + +/// Returns the capabilities for this backend +fn default_capabilities() -> BackendCapabilities { + BackendCapabilities { + provides_conda_outputs: Some(true), + provides_conda_build_v1: Some(true), + } +} diff --git a/crates/pixi-build-backend/src/lib.rs b/crates/pixi-build-backend/src/lib.rs new file mode 100644 index 0000000000..34ae56ac25 --- /dev/null +++ b/crates/pixi-build-backend/src/lib.rs @@ -0,0 +1,27 @@ +pub mod cli; +pub mod generated_recipe; +pub mod intermediate_backend; +pub mod protocol; +pub mod rattler_build_integration; +pub mod server; +pub mod specs_conversion; + +pub mod cache; +pub mod common; +pub mod compilers; +pub mod dependencies; +mod encoded_source_spec_url; +pub mod source; +pub mod tools; +pub mod traits; +pub mod utils; +pub mod variants; + +pub mod consts; + +pub use traits::{PackageSourceSpec, PackageSpec, ProjectModel, TargetSelector, Targets}; + +pub use cli::main_ext as cli_main; + +pub use rattler_build::NormalizedKey; +pub use rattler_build::recipe::variable::Variable; diff --git a/crates/pixi-build-backend/src/protocol.rs b/crates/pixi-build-backend/src/protocol.rs new file mode 100644 index 0000000000..c141f1f33f --- /dev/null +++ b/crates/pixi-build-backend/src/protocol.rs @@ -0,0 +1,46 @@ +use pixi_build_types::procedures::conda_build_v1::{CondaBuildV1Params, CondaBuildV1Result}; +use pixi_build_types::procedures::conda_outputs::{CondaOutputsParams, CondaOutputsResult}; +use pixi_build_types::procedures::{ + initialize::{InitializeParams, InitializeResult}, + negotiate_capabilities::{NegotiateCapabilitiesParams, NegotiateCapabilitiesResult}, +}; + +/// A trait that is used to instantiate a new protocol connection +/// and endpoint that can handle the RPC calls. +#[async_trait::async_trait] +pub trait ProtocolInstantiator: Send + Sync + 'static { + /// Called when negotiating capabilities with the client. + /// This is determine how the rest of the initialization will proceed. + async fn negotiate_capabilities( + params: NegotiateCapabilitiesParams, + ) -> miette::Result; + + /// Called when the client requests initialization. + /// Returns the protocol endpoint and the result of the initialization. + async fn initialize( + &self, + params: InitializeParams, + ) -> miette::Result<(Box, InitializeResult)>; +} + +/// A trait that defines the protocol for a pixi build backend. +/// These are implemented by the different backends. Which +/// server as an endpoint for the RPC calls. +#[async_trait::async_trait] +pub trait Protocol { + /// Called when the client requests outputs for a Conda package. + async fn conda_outputs( + &self, + _params: CondaOutputsParams, + ) -> miette::Result { + unimplemented!("conda_outputs not implemented"); + } + + /// Called when the client calls `conda/build_v1`. + async fn conda_build_v1( + &self, + _params: CondaBuildV1Params, + ) -> miette::Result { + unimplemented!("conda_build_v1 not implemented"); + } +} diff --git a/crates/pixi-build-backend/src/rattler_build_integration.rs b/crates/pixi-build-backend/src/rattler_build_integration.rs new file mode 100644 index 0000000000..8654a7edf3 --- /dev/null +++ b/crates/pixi-build-backend/src/rattler_build_integration.rs @@ -0,0 +1,184 @@ +use std::{collections::BTreeMap, path::PathBuf, str::FromStr, sync::Arc}; + +use miette::IntoDiagnostic; +use rattler_build::{ + NormalizedKey, + metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages}, + recipe::parser::find_outputs_from_src, + render::resolved_dependencies::RunExportsDownload, + selectors::SelectorConfig, + source_code::Source, + system_tools::SystemTools, + tool_configuration, + types::{Directories, PackageIdentifier, PackagingSettings}, + variant_config::VariantConfig, +}; +use rattler_conda_types::compression_level::CompressionLevel; +use rattler_conda_types::{GenericVirtualPackage, NamedChannelOrUrl, package::ArchiveType}; +use url::Url; + +use crate::{generated_recipe::GeneratedRecipe, utils::TemporaryRenderedRecipe}; + +/// A very similar function to `get_build_output` from rattler-build. +/// The difference is that in rattler-build, the function should load the recipe from a file. +/// Here, we already have the recipe in memory as a `GeneratedRecipe` and try to ingest it +/// to rattler-build as a string. +/// As a future work, `get_build_output` from rattler-build should be refactored to +/// use the `IntermediateRecipe` directly. +#[allow(clippy::too_many_arguments)] +pub async fn get_build_output( + generated_recipe: &GeneratedRecipe, + tool_config: Arc, + selector_config: SelectorConfig, + host_virtual_packages: Option>, + build_virtual_packages: Option>, + channel_base_urls: Option>, + recipe_folder: PathBuf, + output_dir: PathBuf, +) -> miette::Result> { + let recipe_path = recipe_folder.join("recipe.yaml"); + + // First find all outputs from the recipe + let named_source = Source { + name: "recipe".to_string(), + code: Arc::from( + generated_recipe + .recipe + .to_yaml_pretty() + .into_diagnostic()? + .as_str(), + ), + path: recipe_path.clone(), + }; + + let outputs = find_outputs_from_src(named_source.clone()).into_diagnostic()?; + + let variant_config = VariantConfig::default(); + + let outputs_and_variants = + variant_config.find_variants(&outputs, named_source, &selector_config)?; + + let mut subpackages = BTreeMap::new(); + let mut outputs = Vec::new(); + + let global_build_name = outputs_and_variants + .first() + .map(|o| o.name.clone()) + .unwrap_or_default(); + + for discovered_output in outputs_and_variants { + let recipe = &discovered_output.recipe; + + if recipe.build().skip() { + continue; + } + + subpackages.insert( + recipe.package().name().clone(), + PackageIdentifier { + name: recipe.package().name().clone(), + version: recipe.package().version().clone(), + build_string: discovered_output.build_string.clone(), + }, + ); + + let build_name = if recipe.cache.is_some() { + global_build_name.clone() + } else { + recipe.package().name().as_normalized().to_string() + }; + + let variant_channels = if let Some(channel_sources) = discovered_output + .used_vars + .get(&NormalizedKey("channel_sources".to_string())) + { + Some( + channel_sources + .to_string() + .split(',') + .map(str::trim) + .map(|s| NamedChannelOrUrl::from_str(s).into_diagnostic()) + .collect::>>()?, + ) + } else { + None + }; + + let channels = variant_channels.unwrap_or_else(|| { + channel_base_urls + .as_ref() + .map(|arg| arg.iter().cloned().map(NamedChannelOrUrl::Url).collect()) + .unwrap_or_else(|| vec![NamedChannelOrUrl::Name("conda-forge".to_string())]) + }); + + let channels = channels + .into_iter() + .map(|c| c.into_base_url(&tool_config.channel_config)) + .collect::, _>>() + .into_diagnostic()?; + + let timestamp = chrono::Utc::now(); + + let output = Output { + recipe: recipe.clone(), + build_configuration: BuildConfiguration { + target_platform: discovered_output.target_platform, + host_platform: PlatformWithVirtualPackages { + platform: selector_config.host_platform, + virtual_packages: host_virtual_packages.clone().unwrap_or_default(), + }, + build_platform: PlatformWithVirtualPackages { + platform: selector_config.build_platform, + virtual_packages: build_virtual_packages.clone().unwrap_or_default(), + }, + hash: discovered_output.hash.clone(), + variant: discovered_output.used_vars.clone(), + directories: Directories::setup( + &build_name, + &recipe_path, + &output_dir, + true, + ×tamp, + recipe.build().merge_build_and_host_envs, + ) + .into_diagnostic()?, + channels, + channel_priority: tool_config.channel_priority, + timestamp, + subpackages: subpackages.clone(), + packaging_settings: PackagingSettings::from_args( + ArchiveType::Conda, + CompressionLevel::default(), + ), + store_recipe: false, + force_colors: false, + sandbox_config: None, + debug: Debug::default(), + solve_strategy: Default::default(), + exclude_newer: None, + }, + finalized_dependencies: None, + finalized_sources: None, + finalized_cache_dependencies: None, + finalized_cache_sources: None, + system_tools: SystemTools::default(), + build_summary: Arc::default(), + extra_meta: None, + }; + + let temp_recipe = TemporaryRenderedRecipe::from_output(&output)?; + let tool_config = tool_config.clone(); + let output = temp_recipe + .within_context_async(move || async move { + output + .resolve_dependencies(&tool_config, RunExportsDownload::DownloadMissing) + .await + .into_diagnostic() + }) + .await?; + + outputs.push(output); + } + + Ok(outputs) +} diff --git a/crates/pixi-build-backend/src/server.rs b/crates/pixi-build-backend/src/server.rs new file mode 100644 index 0000000000..d461cb589a --- /dev/null +++ b/crates/pixi-build-backend/src/server.rs @@ -0,0 +1,286 @@ +use std::{net::SocketAddr, path::Path, sync::Arc}; + +use fs_err::tokio as tokio_fs; +use jsonrpc_core::{Error, IoHandler, Params, serde_json, to_value}; +use miette::{Context, IntoDiagnostic, JSONReportHandler}; +use pixi_build_types::{ + ProjectModel, + procedures::{ + self, + conda_build_v1::{CondaBuildV1Params, CondaBuildV1Result}, + conda_outputs::{CondaOutputsParams, CondaOutputsResult}, + initialize::InitializeParams, + negotiate_capabilities::NegotiateCapabilitiesParams, + }, +}; +use serde::Serialize; +use tokio::sync::{Mutex, RwLock}; + +use crate::consts::DEBUG_OUTPUT_DIR; +use crate::protocol::{Protocol, ProtocolInstantiator}; + +/// A JSONRPC server that can be used to communicate with a client. +pub struct Server { + instatiator: T, +} + +enum ServerState { + /// Server has not been initialized yet. + Uninitialized(T), + /// Server has been initialized, with a protocol. + Initialized(Box), +} + +impl ServerState { + /// Convert to a protocol, if the server has been initialized. + pub fn as_endpoint( + &self, + ) -> Result<&(dyn Protocol + Send + Sync + 'static), jsonrpc_core::Error> { + match self { + Self::Initialized(protocol) => Ok(protocol.as_ref()), + _ => Err(Error::invalid_request()), + } + } +} + +impl Server { + pub fn new(instatiator: T) -> Self { + Self { instatiator } + } + + /// Run the server, communicating over stdin/stdout. + pub async fn run(self) -> miette::Result<()> { + let io = self.setup_io(); + jsonrpc_stdio_server::ServerBuilder::new(io).build().await; + Ok(()) + } + + /// Run the server, communicating over HTTP. + pub fn run_over_http(self, port: u16) -> miette::Result<()> { + let io = self.setup_io(); + jsonrpc_http_server::ServerBuilder::new(io) + .start_http(&SocketAddr::from(([127, 0, 0, 1], port))) + .into_diagnostic()? + .wait(); + Ok(()) + } + + /// Setup the IO inner handler. + fn setup_io(self) -> IoHandler { + // Construct a server + let mut io = IoHandler::new(); + io.add_method( + procedures::negotiate_capabilities::METHOD_NAME, + move |params: Params| async move { + let params: NegotiateCapabilitiesParams = params.parse()?; + let result = T::negotiate_capabilities(params) + .await + .map_err(convert_error)?; + Ok(to_value(result).expect("failed to convert to json")) + }, + ); + + let project_model = Arc::new(Mutex::new(None)); + + let state = Arc::new(RwLock::new(ServerState::Uninitialized(self.instatiator))); + let initialize_state = state.clone(); + let initialize_project_model = project_model.clone(); + io.add_method( + procedures::initialize::METHOD_NAME, + move |params: Params| { + let pm = initialize_project_model.clone(); + let state = initialize_state.clone(); + + async move { + let params: InitializeParams = params.parse()?; + + if let Some(project_model) = ¶ms.project_model { + let mut lock = pm.lock().await; + *lock = Some(project_model.clone()); + } + + let mut state = state.write().await; + let ServerState::Uninitialized(initializer) = &mut *state else { + return Err(Error::invalid_request()); + }; + + let (protocol_endpoint, result) = initializer + .initialize(params) + .await + .map_err(convert_error)?; + *state = ServerState::Initialized(protocol_endpoint); + + Ok(to_value(result).expect("failed to convert to json")) + } + }, + ); + + let conda_outputs = state.clone(); + let conda_outputs_project_model = project_model.clone(); + io.add_method( + procedures::conda_outputs::METHOD_NAME, + move |params: Params| { + let pm = conda_outputs_project_model.clone(); + let state = conda_outputs.clone(); + + async move { + let params: CondaOutputsParams = params.parse()?; + let state = state.read().await; + let endpoint = state.as_endpoint()?; + + let debug_dir = params.work_directory.join(DEBUG_OUTPUT_DIR); + + if let Some(project_model) = pm.lock().await.take() { + log_project_model(&debug_dir, project_model) + .await + .map_err(convert_error)?; + } + + log_conda_outputs(&debug_dir, ¶ms) + .await + .map_err(convert_error)?; + + match endpoint.conda_outputs(params).await { + Ok(result) => { + log_conda_outputs_response(&debug_dir, &result) + .await + .map_err(convert_error)?; + + Ok(to_value(result).expect("failed to convert to json")) + } + Err(err) => { + let json_error = convert_error(err); + log_conda_outputs_error(&debug_dir, &json_error) + .await + .map_err(convert_error)?; + Err(json_error) + } + } + } + }, + ); + + let conda_build_v1 = state.clone(); + let conda_build_project_model = project_model.clone(); + io.add_method( + procedures::conda_build_v1::METHOD_NAME, + move |params: Params| { + let pm = conda_build_project_model.clone(); + let state = conda_build_v1.clone(); + + async move { + let params: CondaBuildV1Params = params.parse()?; + let state = state.read().await; + let endpoint = state.as_endpoint()?; + + let debug_dir = params.work_directory.join(DEBUG_OUTPUT_DIR); + + if let Some(project_model) = pm.lock().await.take() { + log_project_model(&debug_dir, project_model) + .await + .map_err(convert_error)?; + } + + log_conda_build_v1(&debug_dir, ¶ms) + .await + .map_err(convert_error)?; + + match endpoint.conda_build_v1(params).await { + Ok(result) => { + log_conda_build_v1_response(&debug_dir, &result) + .await + .map_err(convert_error)?; + + Ok(to_value(result).expect("failed to convert to json")) + } + Err(err) => { + let json_error = convert_error(err); + log_conda_build_v1_error(&debug_dir, &json_error) + .await + .map_err(convert_error)?; + Err(json_error) + } + } + } + }, + ); + + io + } +} + +fn convert_error(err: miette::Report) -> jsonrpc_core::Error { + let rendered = JSONReportHandler::new(); + let mut json_str = String::new(); + rendered + .render_report(&mut json_str, err.as_ref()) + .expect("failed to convert error to json"); + let data = serde_json::from_str(&json_str).expect("failed to parse json error"); + jsonrpc_core::Error { + code: jsonrpc_core::ErrorCode::ServerError(-32000), + message: err.to_string(), + data: Some(data), + } +} + +async fn log_project_model(debug_dir: &Path, project_model: ProjectModel) -> miette::Result<()> { + write_json_file(debug_dir, "project_model.json", &project_model).await +} + +async fn log_conda_outputs(debug_dir: &Path, params: &CondaOutputsParams) -> miette::Result<()> { + write_json_file(debug_dir, "conda_outputs_params.json", params).await +} + +async fn log_conda_outputs_response( + debug_dir: &Path, + result: &CondaOutputsResult, +) -> miette::Result<()> { + write_json_file(debug_dir, "conda_outputs_response.json", result).await +} + +async fn log_conda_outputs_error( + debug_dir: &Path, + error: &jsonrpc_core::Error, +) -> miette::Result<()> { + write_json_file(debug_dir, "conda_outputs_error.json", error).await +} + +async fn log_conda_build_v1(debug_dir: &Path, params: &CondaBuildV1Params) -> miette::Result<()> { + write_json_file(debug_dir, "conda_build_v1_params.json", params).await +} + +async fn log_conda_build_v1_response( + debug_dir: &Path, + result: &CondaBuildV1Result, +) -> miette::Result<()> { + write_json_file(debug_dir, "conda_build_v1_response.json", result).await +} + +async fn log_conda_build_v1_error( + debug_dir: &Path, + error: &jsonrpc_core::Error, +) -> miette::Result<()> { + write_json_file(debug_dir, "conda_build_v1_error.json", error).await +} + +async fn write_json_file( + debug_dir: &Path, + file_name: &str, + value: &T, +) -> miette::Result<()> { + tokio_fs::create_dir_all(debug_dir) + .await + .into_diagnostic() + .context("failed to create debug directory")?; + + let json = serde_json::to_string_pretty(value) + .into_diagnostic() + .context("failed to serialize value to JSON")?; + + let path = debug_dir.join(file_name); + tokio_fs::write(&path, json) + .await + .into_diagnostic() + .context("failed to write JSON to file")?; + Ok(()) +} diff --git a/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_c.snap b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_c.snap new file mode 100644 index 0000000000..320c452a6a --- /dev/null +++ b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_c.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-backend/src/compilers.rs +expression: result +--- +"${{ compiler('c') }}" diff --git a/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_cxx.snap b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_cxx.snap new file mode 100644 index 0000000000..7e8c845e50 --- /dev/null +++ b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_cxx.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-backend/src/compilers.rs +expression: result +--- +"${{ compiler('cxx') }}" diff --git a/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_fortran.snap b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_fortran.snap new file mode 100644 index 0000000000..b73fbcd689 --- /dev/null +++ b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_fortran.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-backend/src/compilers.rs +expression: result +--- +"${{ compiler('fortran') }}" diff --git a/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_python.snap b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_python.snap new file mode 100644 index 0000000000..506554967c --- /dev/null +++ b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_python.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-backend/src/compilers.rs +expression: result +--- +"${{ compiler('python') }}" diff --git a/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_rust.snap b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_rust.snap new file mode 100644 index 0000000000..229893942e --- /dev/null +++ b/crates/pixi-build-backend/src/snapshots/pixi_build_backend__compilers__tests__compiler_requirements_rust.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-backend/src/compilers.rs +expression: result +--- +"${{ compiler('rust') }}" diff --git a/crates/pixi-build-backend/src/source.rs b/crates/pixi-build-backend/src/source.rs new file mode 100644 index 0000000000..8bc22d58ab --- /dev/null +++ b/crates/pixi-build-backend/src/source.rs @@ -0,0 +1,70 @@ +use miette::{MietteError, MietteSpanContents, SourceCode, SourceSpan, SpanContents}; +use std::path::PathBuf; +use std::{path::Path, sync::Arc}; + +/// The contents of a specific source file together with the name of the source +/// file. +/// +/// The name of the source file is used to identify the source file in error +/// messages. +#[derive(Debug, Clone)] +pub struct Source { + /// The name of the source. + pub name: String, + /// The source code. + pub code: Arc, + /// The actual path to the source file. + pub path: PathBuf, +} + +impl Source { + /// Constructs a new instance by loading the source code from a file. + /// + /// The root directory is used to calculate the relative path of the source + /// which is then used as the name of the source. + pub fn from_rooted_path(root_dir: &Path, path: PathBuf) -> std::io::Result { + let relative_path = pathdiff::diff_paths(&path, root_dir); + let name = relative_path + .as_deref() + .map(|path| path.as_os_str()) + .or_else(|| path.file_name()) + .map(|p| p.to_string_lossy()) + .unwrap_or_default() + .into_owned(); + + let contents = fs_err::read_to_string(&path)?; + Ok(Self { + name, + code: Arc::from(contents.as_str()), + path, + }) + } +} + +impl AsRef for Source { + fn as_ref(&self) -> &str { + self.code.as_ref() + } +} + +impl SourceCode for Source { + fn read_span<'a>( + &'a self, + span: &SourceSpan, + context_lines_before: usize, + context_lines_after: usize, + ) -> Result + 'a>, MietteError> { + let inner_contents = + self.as_ref() + .read_span(span, context_lines_before, context_lines_after)?; + let contents = MietteSpanContents::new_named( + self.name.clone(), + inner_contents.data(), + *inner_contents.span(), + inner_contents.line(), + inner_contents.column(), + inner_contents.line_count(), + ); + Ok(Box::new(contents)) + } +} diff --git a/crates/pixi-build-backend/src/specs_conversion.rs b/crates/pixi-build-backend/src/specs_conversion.rs new file mode 100644 index 0000000000..38a48f319c --- /dev/null +++ b/crates/pixi-build-backend/src/specs_conversion.rs @@ -0,0 +1,423 @@ +use std::sync::Arc; + +use minijinja::Value; +use ordermap::OrderMap; +use pixi_build_types::{ + BinaryPackageSpec, PackageSpec, SourcePackageSpec, Target, TargetSelector, Targets, + procedures::conda_build_v1::{ + CondaBuildV1Dependency, CondaBuildV1DependencySource, CondaBuildV1Prefix, + CondaBuildV1RunExports, + }, +}; +use rattler_build::{ + recipe::variable::Variable, + render::resolved_dependencies::{ + DependencyInfo, FinalizedDependencies, FinalizedRunDependencies, ResolvedDependencies, + RunExportDependency, SourceDependency, + }, +}; +use rattler_conda_types::{ + Channel, MatchSpec, PackageName, PackageNameMatcher, package::RunExportsJson, +}; +use recipe_stage0::{ + matchspec::{PackageDependency, SourceMatchSpec}, + recipe::{Conditional, ConditionalList, ConditionalRequirements, Item, ListOrItem}, + requirements::PackageSpecDependencies, +}; +use serde::Deserialize; +use url::Url; + +use crate::encoded_source_spec_url::EncodedSourceSpecUrl; + +pub fn from_source_url_to_source_package(source_url: Url) -> Option { + match source_url.scheme() { + "source" => Some(EncodedSourceSpecUrl::from(source_url).into()), + _ => None, + } +} + +pub fn from_source_matchspec_into_package_spec( + source_matchspec: SourceMatchSpec, +) -> miette::Result { + from_source_url_to_source_package(source_matchspec.location) + .ok_or_else(|| miette::miette!("Only file, http/https and git are supported for now")) +} + +#[derive(Debug, Clone)] +pub enum PlatformKind { + Build, + Host, + Target, +} + +impl std::fmt::Display for PlatformKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + PlatformKind::Build => write!(f, "build"), + PlatformKind::Host => write!(f, "host"), + PlatformKind::Target => write!(f, "target"), + } + } +} + +pub fn convert_variant_from_pixi_build_types(variant: pixi_build_types::VariantValue) -> Variable { + match variant { + pixi_build_types::VariantValue::String(s) => Variable::from(s), + pixi_build_types::VariantValue::Int(i) => Variable::from(i), + pixi_build_types::VariantValue::Bool(b) => Variable::from(b), + } +} + +pub fn convert_variant_to_pixi_build_types( + variant: Variable, +) -> Result { + let value = Value::from(variant); + pixi_build_types::VariantValue::deserialize(value) +} + +pub fn to_rattler_build_selector(selector: &TargetSelector, platform_kind: PlatformKind) -> String { + match selector { + TargetSelector::Platform(p) => format!("{platform_kind}_platform == '{p}'"), + _ => selector.to_string(), + } +} + +pub fn from_targets_v1_to_conditional_requirements(targets: &Targets) -> ConditionalRequirements { + let mut build_items = ConditionalList::new(); + let mut host_items = ConditionalList::new(); + let mut run_items = ConditionalList::new(); + let run_constraints_items = ConditionalList::new(); + + // Add default target + if let Some(default_target) = &targets.default_target { + let package_requirements = target_to_package_spec(default_target); + + // source_target_requirements.default_target = source_requirements; + + build_items.extend( + package_requirements + .build + .into_iter() + .map(|spec| spec.1) + .map(Item::from), + ); + + host_items.extend( + package_requirements + .host + .into_iter() + .map(|spec| spec.1) + .map(Item::from), + ); + + run_items.extend( + package_requirements + .run + .into_iter() + .map(|spec| spec.1) + .map(Item::from), + ); + } + + // Add specific targets + if let Some(specific_targets) = &targets.targets { + for (selector, target) in specific_targets { + let package_requirements = target_to_package_spec(target); + + // Add the binary requirements + // Use host_platform for all dependency types to match the actual target platform + build_items.extend( + package_requirements + .build + .into_iter() + .map(|spec| spec.1) + .map(|spec| { + Conditional { + condition: to_rattler_build_selector(selector, PlatformKind::Host), + then: ListOrItem(vec![spec]), + else_value: ListOrItem::default(), + } + .into() + }), + ); + host_items.extend( + package_requirements + .host + .into_iter() + .map(|spec| spec.1) + .map(|spec| { + Conditional { + condition: to_rattler_build_selector(selector, PlatformKind::Host), + then: ListOrItem(vec![spec]), + else_value: ListOrItem::default(), + } + .into() + }), + ); + run_items.extend( + package_requirements + .run + .into_iter() + .map(|spec| spec.1) + .map(|spec| { + Conditional { + condition: to_rattler_build_selector(selector, PlatformKind::Host), + then: ListOrItem(vec![spec]), + else_value: ListOrItem::default(), + } + .into() + }), + ); + } + } + + ConditionalRequirements { + build: build_items, + host: host_items, + run: run_items, + run_constraints: run_constraints_items, + } +} + +pub(crate) fn source_package_spec_to_package_dependency( + name: PackageName, + source_spec: SourcePackageSpec, +) -> miette::Result { + let spec = MatchSpec { + name: Some(PackageNameMatcher::Exact(name)), + ..Default::default() + }; + + Ok(SourceMatchSpec { + spec, + location: EncodedSourceSpecUrl::from(source_spec).into(), + }) +} + +fn binary_package_spec_to_package_dependency( + name: PackageName, + binary_spec: BinaryPackageSpec, +) -> PackageDependency { + let BinaryPackageSpec { + version, + build, + build_number, + file_name, + channel, + subdir, + md5, + sha256, + url, + license, + } = binary_spec; + + // If the version is "*", we treat it as None + // so later rattler-build can detect the PackageDependency as a variant. + let version = version.filter(|v| v != &rattler_conda_types::VersionSpec::Any); + + PackageDependency::Binary(MatchSpec { + name: Some(PackageNameMatcher::Exact(name)), + version, + build, + build_number, + file_name, + extras: None, + channel: channel.map(Channel::from_url).map(Arc::new), + subdir, + namespace: None, + md5, + sha256, + url, + license, + condition: None, + }) +} + +fn package_spec_to_package_dependency( + name: PackageName, + spec: PackageSpec, +) -> miette::Result { + match spec { + PackageSpec::Binary(binary_spec) => { + Ok(binary_package_spec_to_package_dependency(name, binary_spec)) + } + PackageSpec::Source(source_spec) => Ok(PackageDependency::Source( + source_package_spec_to_package_dependency(name, source_spec)?, + )), + PackageSpec::PinCompatible(_) => { + miette::bail!("PinCompatible package specs are not yet supported in this context") + } + } +} + +pub(crate) fn package_specs_to_package_dependency( + specs: OrderMap, +) -> miette::Result> { + specs + .into_iter() + .map(|(name, spec)| { + package_spec_to_package_dependency(PackageName::new_unchecked(name), spec) + }) + .collect() +} + +// TODO: Should it be a From implementation? +pub fn target_to_package_spec(target: &Target) -> PackageSpecDependencies { + let build_reqs = target + .clone() + .build_dependencies + .map(|deps| package_specs_to_package_dependency(deps).unwrap()) + .unwrap_or_default(); + + let host_reqs = target + .clone() + .host_dependencies + .map(|deps| package_specs_to_package_dependency(deps).unwrap()) + .unwrap_or_default(); + + let run_reqs = target + .clone() + .run_dependencies + .map(|deps| package_specs_to_package_dependency(deps).unwrap()) + .unwrap_or_default(); + + let mut bin_reqs = PackageSpecDependencies::default(); + + for spec in build_reqs.iter() { + bin_reqs.build.insert(spec.package_name(), spec.clone()); + } + + for spec in host_reqs.iter() { + bin_reqs.host.insert(spec.package_name(), spec.clone()); + } + + for spec in run_reqs.iter() { + bin_reqs.run.insert(spec.package_name(), spec.clone()); + } + + bin_reqs +} + +pub(crate) fn from_build_v1_dependency_to_dependency_info( + spec: CondaBuildV1Dependency, +) -> DependencyInfo { + match spec.source { + Some(CondaBuildV1DependencySource::RunExport(run_export)) => { + DependencyInfo::RunExport(RunExportDependency { + spec: spec.spec, + from: run_export.from, + source_package: run_export.package_name.as_normalized().to_string(), + }) + } + None => DependencyInfo::Source(SourceDependency { spec: spec.spec }), + } +} + +pub(crate) fn from_build_v1_run_exports_to_run_exports( + run_exports: CondaBuildV1RunExports, +) -> RunExportsJson { + RunExportsJson { + weak: run_exports + .weak + .into_iter() + .map(|dep| dep.spec.to_string()) + .collect(), + strong: run_exports + .strong + .into_iter() + .map(|dep| dep.spec.to_string()) + .collect(), + noarch: run_exports + .noarch + .into_iter() + .map(|dep| dep.spec.to_string()) + .collect(), + strong_constrains: run_exports + .strong_constrains + .into_iter() + .map(|dep| dep.spec.to_string()) + .collect(), + weak_constrains: run_exports + .weak_constrains + .into_iter() + .map(|dep| dep.spec.to_string()) + .collect(), + } +} + +pub fn from_build_v1_args_to_finalized_dependencies( + build_prefix: Option, + host_prefix: Option, + run_dependencies: Option>, + run_constraints: Option>, + run_exports: Option, +) -> FinalizedDependencies { + FinalizedDependencies { + build: build_prefix.map(|prefix| ResolvedDependencies { + specs: prefix + .dependencies + .into_iter() + .map(from_build_v1_dependency_to_dependency_info) + .collect(), + resolved: prefix + .packages + .into_iter() + .map(|pkg| pkg.repodata_record) + .collect(), + }), + host: host_prefix.map(|prefix| ResolvedDependencies { + specs: prefix + .dependencies + .into_iter() + .map(from_build_v1_dependency_to_dependency_info) + .collect(), + resolved: prefix + .packages + .into_iter() + .map(|pkg| pkg.repodata_record) + .collect(), + }), + run: FinalizedRunDependencies { + depends: run_dependencies + .unwrap_or_default() + .into_iter() + .map(from_build_v1_dependency_to_dependency_info) + .collect(), + constraints: run_constraints + .unwrap_or_default() + .into_iter() + .map(from_build_v1_dependency_to_dependency_info) + .collect(), + run_exports: run_exports + .map(from_build_v1_run_exports_to_run_exports) + .unwrap_or_default(), + }, + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_binary_package_conversion() { + let name = PackageName::new_unchecked("foobar"); + let spec = BinaryPackageSpec { + version: Some("3.12.*".parse().unwrap()), + ..BinaryPackageSpec::default() + }; + let match_spec = binary_package_spec_to_package_dependency(name, spec); + assert_eq!(match_spec.to_string(), "foobar 3.12.*"); + } + + #[test] + fn test_binary_package_conversion_any_is_treated_as_none() { + let name = PackageName::new_unchecked("python"); + let spec = BinaryPackageSpec { + version: Some("*".parse().unwrap()), + ..BinaryPackageSpec::default() + }; + let match_spec = binary_package_spec_to_package_dependency(name, spec); + assert_eq!(match_spec.to_string(), "python"); + } +} diff --git a/crates/pixi-build-backend/src/tools.rs b/crates/pixi-build-backend/src/tools.rs new file mode 100644 index 0000000000..2d355f0cbb --- /dev/null +++ b/crates/pixi-build-backend/src/tools.rs @@ -0,0 +1,375 @@ +use std::{ + collections::{BTreeMap, BTreeSet}, + path::{Path, PathBuf}, + sync::Arc, +}; + +use indexmap::IndexSet; +use itertools::Itertools; +use miette::IntoDiagnostic; +use rattler_build::{ + hash::HashInfo, + metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages}, + recipe::{ + Jinja, ParsingError, Recipe, + parser::{BuildString, GlobVec, find_outputs_from_src}, + }, + selectors::SelectorConfig, + system_tools::SystemTools, + types::{Directories, PackageIdentifier, PackagingSettings}, + variant_config::{DiscoveredOutput, ParseErrors, VariantConfig, VariantConfigError}, +}; +use rattler_conda_types::compression_level::CompressionLevel; +use rattler_conda_types::{GenericVirtualPackage, Platform, package::ArchiveType}; +use rattler_virtual_packages::VirtualPackageOverrides; +use url::Url; + +use crate::{source::Source, specs_conversion::convert_variant_from_pixi_build_types}; + +/// A `recipe.yaml` file might be accompanied by a `variants.toml` file from +/// which we can read variant configuration for that specific recipe.. +pub const VARIANTS_CONFIG_FILE: &str = "variants.yaml"; + +/// A struct that contains all the configuration needed +/// for `rattler-build` in order to build a recipe. +/// The principal concepts is that all rattler-build concepts +/// should be hidden behind this struct and all pixi-build-backends +/// should only interact with this struct. +pub struct RattlerBuild { + /// The source of the recipe + pub recipe_source: Source, + /// The selector configuration. + pub selector_config: SelectorConfig, + /// The directory where the build should happen. + pub work_directory: PathBuf, +} + +/// Variant configuration that was loaded from the recipe. +#[derive(Debug)] +pub struct LoadedVariantConfig { + /// The variant configuration that was loaded. + pub variant_config: VariantConfig, + + /// Input globs that identity the files that were loaded. + pub input_globs: BTreeSet, +} + +impl LoadedVariantConfig { + /// Load variant configuration from a recipe path. This checks if there is a + /// `variants.yaml` and loads it alongside the recipe. + #[allow(clippy::result_large_err)] + pub fn from_recipe_path<'a>( + source_dir: &Path, + recipe_path: &Path, + selector_config: &SelectorConfig, + additional_variant_files: impl Iterator, + ) -> Result>> { + let mut variant_files = Vec::new(); + let mut input_globs = BTreeSet::new(); + + // Check if there is a `variants.yaml` file next to the recipe that we should + // potentially use. + if let Some(variant_path) = recipe_path + .parent() + .map(|parent| parent.join(VARIANTS_CONFIG_FILE)) + { + if let Some(path) = pathdiff::diff_paths(&variant_path, source_dir) { + // Normalize paths on windows + let normalized_path = if cfg!(target_os = "windows") { + path.to_string_lossy().replace("\\", "/") + } else { + path.to_string_lossy().to_string() + }; + input_globs.insert(normalized_path); + } + if variant_path.is_file() { + variant_files.push(variant_path); + } + }; + + // Add additional variant files + variant_files.extend(additional_variant_files.map(|p| p.to_path_buf())); + + Ok(Self { + variant_config: VariantConfig::from_files(&variant_files, selector_config)?, + input_globs, + }) + } + + pub fn extend_with_input_variants( + mut self, + input_variant_configuration: BTreeMap>, + ) -> Self { + for (k, v) in input_variant_configuration { + let variables = v + .into_iter() + .map(convert_variant_from_pixi_build_types) + .collect(); + self.variant_config.variants.insert(k.into(), variables); + } + self + } +} + +pub enum OneOrMultipleOutputs { + Single(String), + OneOfMany(String), +} + +impl RattlerBuild { + /// Create a new `RattlerBuild` instance. + pub fn new(source: Source, selector_config: SelectorConfig, work_directory: PathBuf) -> Self { + Self { + recipe_source: source, + selector_config, + work_directory, + } + } + + /// Discover the outputs from the recipe. + pub fn discover_outputs( + &self, + variant_files: &[PathBuf], + variant_config_input: &Option>>, + ) -> miette::Result> { + // First find all outputs from the recipe + let outputs = find_outputs_from_src(self.recipe_source.clone())?; + + // Check if there is a `variants.yaml` file next to the recipe that we should + // potentially use. + let mut variant_config_paths = Vec::new(); + if let Some(variant_path) = self + .recipe_source + .path + .parent() + .map(|parent| parent.join(VARIANTS_CONFIG_FILE)) + && variant_path.is_file() + { + variant_config_paths.push(variant_path); + }; + + variant_config_paths.extend(variant_files.iter().cloned()); + + let mut variant_config = + VariantConfig::from_files(&variant_config_paths, &self.selector_config)?; + + if let Some(variant_config_input) = variant_config_input { + for (k, v) in variant_config_input.iter() { + let variables = v.iter().map(|v| v.clone().into()).collect(); + variant_config.variants.insert(k.as_str().into(), variables); + } + } + + Ok(variant_config.find_variants( + &outputs, + self.recipe_source.clone(), + &self.selector_config, + )?) + } + + /// Get the outputs from the recipe. + pub fn get_outputs( + &self, + discovered_outputs: &IndexSet, + channels: Vec, + build_vpkgs: Vec, + host_vpkgs: Vec, + host_platform: Platform, + build_platform: Platform, + ) -> miette::Result> { + let mut outputs = Vec::new(); + + let mut subpackages = BTreeMap::new(); + + let channels = channels.into_iter().map(Into::into).collect_vec(); + for discovered_output in discovered_outputs { + let hash = HashInfo::from_variant( + &discovered_output.used_vars, + &discovered_output.noarch_type, + ); + + let selector_config = SelectorConfig { + variant: discovered_output.used_vars.clone(), + hash: Some(hash.clone()), + target_platform: self.selector_config.target_platform, + host_platform: self.selector_config.host_platform, + build_platform: self.selector_config.build_platform, + experimental: true, + allow_undefined: false, + recipe_path: Some(self.recipe_source.path.clone()), + }; + + let mut recipe = Recipe::from_node(&discovered_output.node, selector_config.clone()) + .map_err(|err| { + let errs: ParseErrors<_> = err + .into_iter() + .map(|err| ParsingError::from_partial(self.recipe_source.clone(), err)) + .collect::>() + .into(); + errs + })?; + + recipe.build.string = BuildString::Resolved(BuildString::compute( + &discovered_output.hash, + recipe.build.number, + )); + + for source in &mut recipe.source { + if let rattler_build::recipe::parser::Source::Path(path_source) = source { + let include = path_source + .filter + .include_globs() + .iter() + .map(|g| g.source()) + .collect(); + let exclude = path_source + .filter + .exclude_globs() + .iter() + .map(|g| g.source()) + .chain([".pixi"]) + .collect(); + path_source.filter = GlobVec::from_vec(include, Some(exclude)); + } + } + + if recipe.build().skip() { + eprintln!( + "Skipping build for variant: {:#?}", + discovered_output.used_vars + ); + continue; + } + + let jinja = Jinja::new(selector_config); + + subpackages.insert( + recipe.package().name().clone(), + PackageIdentifier { + name: recipe.package().name().clone(), + version: recipe.package().version().version().clone().into(), + build_string: recipe + .build() + .string() + .resolve(&hash, recipe.build().number(), &jinja) + .into_owned(), + }, + ); + + outputs.push(Output { + recipe, + build_configuration: BuildConfiguration { + target_platform: discovered_output.target_platform, + host_platform: PlatformWithVirtualPackages { + platform: host_platform, + virtual_packages: host_vpkgs.clone(), + }, + build_platform: PlatformWithVirtualPackages { + platform: build_platform, + virtual_packages: build_vpkgs.clone(), + }, + hash, + variant: discovered_output.used_vars.clone(), + directories: output_directory( + if discovered_outputs.len() == 1 { + OneOrMultipleOutputs::Single(discovered_output.name.clone()) + } else { + OneOrMultipleOutputs::OneOfMany(discovered_output.name.clone()) + }, + self.work_directory.clone(), + &self.recipe_source.path, + ), + channels: channels.clone(), + channel_priority: Default::default(), + solve_strategy: Default::default(), + timestamp: chrono::Utc::now(), + subpackages: subpackages.clone(), + packaging_settings: PackagingSettings::from_args( + ArchiveType::Conda, + CompressionLevel::default(), + ), + store_recipe: false, + force_colors: true, + sandbox_config: None, + debug: Debug::new(false), + exclude_newer: None, + }, + finalized_dependencies: None, + finalized_cache_dependencies: None, + finalized_cache_sources: None, + finalized_sources: None, + system_tools: SystemTools::new(), + build_summary: Default::default(), + extra_meta: None, + }); + } + + Ok(outputs) + } + + /// Detect the virtual packages. + pub fn detect_virtual_packages( + vpkgs: Option>, + ) -> miette::Result> { + let vpkgs = match vpkgs { + Some(vpkgs) => vpkgs, + None => { + PlatformWithVirtualPackages::detect(&VirtualPackageOverrides::from_env()) + .into_diagnostic()? + .virtual_packages + } + }; + Ok(vpkgs) + } +} + +/// Constructs a `Directories` which tells rattler-build where to place all the +/// different build folders. +/// +/// This tries to reduce the number of characters in the path to avoid being too +/// long on Windows. +pub fn output_directory( + output: OneOrMultipleOutputs, + work_dir: PathBuf, + recipe_path: &Path, +) -> Directories { + let build_dir = match output { + OneOrMultipleOutputs::Single(_name) => work_dir, + OneOrMultipleOutputs::OneOfMany(name) => work_dir.join(name), + }; + + let cache_dir = build_dir.join("cache"); + let recipe_dir = recipe_path + .parent() + .expect("a recipe *file* must always have a parent directory") + .to_path_buf(); + + let host_prefix = if cfg!(target_os = "windows") { + build_dir.join("host") + } else { + let placeholder_template = "_placehold"; + let mut placeholder = String::new(); + let placeholder_length: usize = 255; + + while placeholder.len() < placeholder_length { + placeholder.push_str(placeholder_template); + } + + let placeholder = placeholder + [0..placeholder_length - build_dir.join("host_env").as_os_str().len()] + .to_string(); + + build_dir.join(format!("host_env{placeholder}")) + }; + + Directories { + build_dir: build_dir.clone(), + build_prefix: build_dir.join("bld"), + cache_dir, + host_prefix, + work_dir: build_dir.join("work"), + recipe_dir, + recipe_path: recipe_path.to_path_buf(), + output_dir: build_dir, + } +} diff --git a/crates/pixi-build-backend/src/traits/mod.rs b/crates/pixi-build-backend/src/traits/mod.rs new file mode 100644 index 0000000000..2ecfb74858 --- /dev/null +++ b/crates/pixi-build-backend/src/traits/mod.rs @@ -0,0 +1,16 @@ +//! Collection of traits for package specifications and project models +//! +//! The main entry point is the [`ProjectModel`] trait which defines the core +//! interface for a project model. +//! +//! Any backend that will deal with Project (from pixi frontend as example) +//! should implement this. +#![deny(missing_docs)] + +pub mod package_spec; +pub mod project; +pub mod targets; + +pub use package_spec::{AnyVersion, BinarySpecExt, PackageSourceSpec, PackageSpec}; +pub use project::ProjectModel; +pub use targets::{Dependencies, TargetSelector, Targets}; diff --git a/crates/pixi-build-backend/src/traits/package_spec.rs b/crates/pixi-build-backend/src/traits/package_spec.rs new file mode 100644 index 0000000000..4bc9ebe7b0 --- /dev/null +++ b/crates/pixi-build-backend/src/traits/package_spec.rs @@ -0,0 +1,251 @@ +//! Package specification traits +//! +//! # Key components +//! +//! * [`PackageSpec`] - Core trait for package specification behavior +//! * [`AnyVersion`] - Trait for creating wildcard version specifications that +//! can match any version +//! * [`BinarySpecExt`] - Extension for converting binary specs to nameless +//! match specs + +use std::{fmt::Debug, sync::Arc}; + +use pixi_build_types::{self as pbt}; +use rattler_conda_types::{Channel, MatchSpec, NamelessMatchSpec, PackageName, PackageNameMatcher}; + +/// Get the * version for the version type, that is currently being used +pub trait AnyVersion { + /// Get the * version for the version type, that is currently being used + fn any() -> Self; +} + +/// Convert a binary spec to a nameless match spec +pub trait BinarySpecExt { + /// Return a NamelessMatchSpec from the binary spec + fn to_nameless(&self) -> NamelessMatchSpec; +} + +/// A trait that define the package spec interface +pub trait PackageSpec: Send { + /// Source representation of a package + type SourceSpec: PackageSourceSpec; + + /// Returns true if the specified [`PackageSpec`] is a valid variant spec. + fn can_be_used_as_variant(&self) -> bool; + + /// Converts the package spec to a match spec. + fn to_match_spec( + &self, + name: PackageName, + ) -> miette::Result<(MatchSpec, Option)>; +} + +/// A trait that defines the package source spec interface +pub trait PackageSourceSpec: Debug + Send { + /// Convert this instance into a v1 instance. + fn to_v1(self) -> pbt::SourcePackageSpec; +} + +impl PackageSpec for pbt::PackageSpec { + type SourceSpec = pbt::SourcePackageSpec; + + fn can_be_used_as_variant(&self) -> bool { + match self { + pbt::PackageSpec::Binary(spec) => { + let pbt::BinaryPackageSpec { + version, + build, + build_number, + file_name, + channel, + subdir, + md5, + sha256, + url, + license, + } = spec; + + version == &Some(rattler_conda_types::VersionSpec::Any) + && build.is_none() + && build_number.is_none() + && file_name.is_none() + && channel.is_none() + && subdir.is_none() + && md5.is_none() + && sha256.is_none() + && url.is_none() + && license.is_none() + } + _ => false, + } + } + + fn to_match_spec( + &self, + name: PackageName, + ) -> miette::Result<(MatchSpec, Option)> { + match self { + pbt::PackageSpec::Binary(binary_spec) => { + // Always use to_nameless() to preserve all fields including build constraints + let match_spec = MatchSpec::from_nameless( + binary_spec.to_nameless(), + Some(PackageNameMatcher::Exact(name)), + ); + Ok((match_spec, None)) + } + pbt::PackageSpec::Source(source_spec) => Ok(( + MatchSpec { + name: Some(PackageNameMatcher::Exact(name)), + ..MatchSpec::default() + }, + Some(source_spec.clone()), + )), + pbt::PackageSpec::PinCompatible(_) => { + miette::bail!("PinCompatible package specs are not yet supported in this context") + } + } + } +} + +impl AnyVersion for pbt::PackageSpec { + fn any() -> Self { + pbt::PackageSpec::Binary(rattler_conda_types::VersionSpec::Any.into()) + } +} + +impl BinarySpecExt for pbt::BinaryPackageSpec { + fn to_nameless(&self) -> NamelessMatchSpec { + NamelessMatchSpec { + version: self.version.clone(), + build: self.build.clone(), + build_number: self.build_number.clone(), + file_name: self.file_name.clone(), + channel: self + .channel + .as_ref() + .map(|url| Arc::new(Channel::from_url(url.clone()))), + subdir: self.subdir.clone(), + md5: self.md5, + sha256: self.sha256, + url: self.url.clone(), + license: self.license.clone(), + extras: None, + namespace: None, + condition: None, + } + } +} + +impl PackageSourceSpec for pbt::SourcePackageSpec { + fn to_v1(self) -> pbt::SourcePackageSpec { + self + } +} + +#[cfg(test)] +mod tests { + use super::*; + use rattler_conda_types::{ParseStrictness, StringMatcher, VersionSpec}; + + #[test] + fn test_to_match_spec_preserves_build_constraint_with_wildcard_version() { + // Test case: dependency with wildcard version and build constraint + // e.g., tk = { build = "xft*" } + let build_matcher: StringMatcher = "xft*".parse().unwrap(); + let binary_spec = pbt::BinaryPackageSpec { + version: Some(VersionSpec::Any), + build: Some(build_matcher.clone()), + build_number: None, + file_name: None, + channel: None, + subdir: None, + md5: None, + sha256: None, + url: None, + license: None, + }; + + let package_spec = pbt::PackageSpec::Binary(binary_spec); + let package_name = PackageName::try_from("tk").unwrap(); + + let (match_spec, _) = package_spec.to_match_spec(package_name).unwrap(); + + // Verify the build constraint is preserved + assert_eq!( + match_spec.name, + Some(PackageNameMatcher::Exact( + PackageName::try_from("tk").unwrap() + )) + ); + assert_eq!(match_spec.version, Some(VersionSpec::Any)); + assert_eq!(match_spec.build, Some(build_matcher)); + } + + #[test] + fn test_to_match_spec_preserves_build_constraint_with_specific_version() { + // Test case: dependency with specific version and build constraint + // e.g., tk = { version = "8.6.13", build = "xft*" } + let version = VersionSpec::from_str("8.6.13", ParseStrictness::Lenient).unwrap(); + let build_matcher: StringMatcher = "xft*".parse().unwrap(); + let binary_spec = pbt::BinaryPackageSpec { + version: Some(version.clone()), + build: Some(build_matcher.clone()), + build_number: None, + file_name: None, + channel: None, + subdir: None, + md5: None, + sha256: None, + url: None, + license: None, + }; + + let package_spec = pbt::PackageSpec::Binary(binary_spec); + let package_name = PackageName::try_from("tk").unwrap(); + + let (match_spec, _) = package_spec.to_match_spec(package_name).unwrap(); + + // Verify both version and build constraint are preserved + assert_eq!( + match_spec.name, + Some(PackageNameMatcher::Exact( + PackageName::try_from("tk").unwrap() + )) + ); + assert_eq!(match_spec.version, Some(version)); + assert_eq!(match_spec.build, Some(build_matcher)); + } + + #[test] + fn test_to_match_spec_without_build_constraint() { + // Test case: dependency with wildcard version but no build constraint + // e.g., python = "*" + let binary_spec = pbt::BinaryPackageSpec { + version: Some(VersionSpec::Any), + build: None, + build_number: None, + file_name: None, + channel: None, + subdir: None, + md5: None, + sha256: None, + url: None, + license: None, + }; + + let package_spec = pbt::PackageSpec::Binary(binary_spec); + let package_name = PackageName::try_from("python").unwrap(); + + let (match_spec, _) = package_spec.to_match_spec(package_name).unwrap(); + + // Verify the match spec is correct + assert_eq!( + match_spec.name, + Some(PackageNameMatcher::Exact( + PackageName::try_from("python").unwrap() + )) + ); + assert_eq!(match_spec.version, Some(VersionSpec::Any)); + assert_eq!(match_spec.build, None); + } +} diff --git a/crates/pixi-build-backend/src/traits/project.rs b/crates/pixi-build-backend/src/traits/project.rs new file mode 100644 index 0000000000..f68a93d4a7 --- /dev/null +++ b/crates/pixi-build-backend/src/traits/project.rs @@ -0,0 +1,91 @@ +//! Project behaviour traits. +//! +//! # Key components +//! +//! * [`ProjectModel`] - Core trait for project model interface + +use std::collections::HashSet; + +use itertools::Itertools; +use pixi_build_types::{self as pbt}; +use rattler_build::NormalizedKey; +use rattler_conda_types::{Platform, Version}; + +use super::{Dependencies, PackageSpec, targets::Targets}; + +/// A trait that defines the project model interface +pub trait ProjectModel { + /// The targets type of the project model + type Targets: Targets; + + /// Return the targets of the project model + fn targets(&self) -> Option<&Self::Targets>; + + /// Return the dependencies of the project model + fn dependencies( + &self, + platform: Option, + ) -> Dependencies<'_, <::Targets as Targets>::Spec> { + self.targets() + .map(|t| t.dependencies(platform)) + .unwrap_or_default() + } + + /// Return the used variants of the project model + fn used_variants(&self, platform: Option) -> HashSet; + + /// Return the name of the project model + fn name(&self) -> Option<&String>; + + /// Return the version of the project model + fn version(&self) -> &Option; +} + +impl ProjectModel for pbt::ProjectModel { + type Targets = pbt::Targets; + + fn targets(&self) -> Option<&Self::Targets> { + self.targets.as_ref() + } + + fn name(&self) -> Option<&String> { + self.name.as_ref() + } + + fn version(&self) -> &Option { + &self.version + } + + fn used_variants(&self, platform: Option) -> HashSet { + let build_dependencies = self + .targets() + .iter() + .flat_map(|target| target.build_dependencies(platform)) + .collect_vec(); + + let host_dependencies = self + .targets() + .iter() + .flat_map(|target| target.host_dependencies(platform)) + .collect_vec(); + + let run_dependencies = self + .targets() + .iter() + .flat_map(|target| target.run_dependencies(platform)) + .collect_vec(); + + build_dependencies + .iter() + .chain(host_dependencies.iter()) + .chain(run_dependencies.iter()) + .filter(|(_, spec)| spec.can_be_used_as_variant()) + .map(|(name, _)| name.as_str().into()) + .collect() + } +} + +/// Return a spec of a project model that matches any version +pub fn new_spec() -> <

::Targets as Targets>::Spec { + P::Targets::empty_spec() +} diff --git a/crates/pixi-build-backend/src/traits/targets.rs b/crates/pixi-build-backend/src/traits/targets.rs new file mode 100644 index 0000000000..f2d7c3fe37 --- /dev/null +++ b/crates/pixi-build-backend/src/traits/targets.rs @@ -0,0 +1,211 @@ +//! Targets behaviour traits. +//! +//! # Key components +//! +//! * [`Targets`] - A project target trait. +//! * [`TargetSelector`] - An extension trait that extends the target selector with additional functionality. +//! * [`Dependencies`] - A wrapper struct that contains all dependencies for a target. +use indexmap::IndexMap; +use itertools::{Either, Itertools}; +use pixi_build_types::SourcePackageName; +use rattler_conda_types::Platform; + +use crate::PackageSpec; +use pixi_build_types::{self as pbt}; + +/// A trait that extend the target selector with additional functionality. +pub trait TargetSelector { + /// Does the target selector match the platform? + fn matches(&self, platform: Platform) -> bool; +} + +#[derive(Debug)] +/// A wrapper struct that contains all dependencies for a target +pub struct Dependencies<'a, S> { + /// The run dependencies + pub run: IndexMap<&'a SourcePackageName, &'a S>, + /// The host dependencies + pub host: IndexMap<&'a SourcePackageName, &'a S>, + /// The build dependencies + pub build: IndexMap<&'a SourcePackageName, &'a S>, +} + +impl Default for Dependencies<'_, S> { + fn default() -> Self { + Self::empty() + } +} + +impl<'a, S> Dependencies<'a, S> { + /// Create a new Dependencies + pub fn new( + run: IndexMap<&'a SourcePackageName, &'a S>, + host: IndexMap<&'a SourcePackageName, &'a S>, + build: IndexMap<&'a SourcePackageName, &'a S>, + ) -> Self { + Self { run, host, build } + } + + /// Return an empty Dependencies + pub fn empty() -> Self { + Self { + run: IndexMap::new(), + host: IndexMap::new(), + build: IndexMap::new(), + } + } + + /// Return true if the dependencies contains the given package name + pub fn contains(&self, name: &SourcePackageName) -> bool { + self.run.contains_key(name) || self.host.contains_key(name) || self.build.contains_key(name) + } + + /// Return an iterator of all package names from build and host dependencies. + /// This is useful for checking build tools and compilers. + pub fn build_and_host_names(&self) -> impl Iterator { + self.build + .keys() + .chain(self.host.keys()) + .map(|name| name.as_ref() as &str) + .unique() + } +} + +/// A trait that represent a project target. +pub trait Targets { + /// The selector, in pixi this is something like `[target.linux-64] + type Selector: TargetSelector; + /// The target it is resolving to + type Target; + + /// The Spec type that is used in the package spec + type Spec: PackageSpec; + + /// Returns the default target. + fn default_target(&self) -> Option<&Self::Target>; + + /// Return a spec that matches any version + fn empty_spec() -> Self::Spec; + + /// Returns all targets + fn targets(&self) -> impl Iterator; + + /// Return all dependencies for the given platform + fn dependencies(&self, platform: Option) -> Dependencies<'_, Self::Spec>; + + /// Return the run dependencies for the given platform + fn run_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &Self::Spec>; + + /// Return the host dependencies for the given platform + fn host_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &Self::Spec>; + + /// Return the build dependencies for the given platform + fn build_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &Self::Spec>; + + /// Resolve the target for the given platform. + fn resolve(&self, platform: Option) -> impl Iterator { + if let Some(platform) = platform { + let iter = self + .default_target() + .into_iter() + .chain(self.targets().filter_map(move |(selector, target)| { + if selector.matches(platform) { + Some(target) + } else { + None + } + })); + Either::Right(iter) + } else { + Either::Left(self.default_target().into_iter()) + } + } +} + +// === Below here are the implementations for v1 === +impl TargetSelector for pbt::TargetSelector { + fn matches(&self, platform: Platform) -> bool { + match self { + pbt::TargetSelector::Platform(p) => p == &platform.to_string(), + pbt::TargetSelector::Linux => platform.is_linux(), + pbt::TargetSelector::Unix => platform.is_unix(), + pbt::TargetSelector::Win => platform.is_windows(), + pbt::TargetSelector::MacOs => platform.is_osx(), + } + } +} + +impl Targets for pbt::Targets { + type Selector = pbt::TargetSelector; + type Target = pbt::Target; + + type Spec = pbt::PackageSpec; + + fn default_target(&self) -> Option<&pbt::Target> { + self.default_target.as_ref() + } + + fn targets(&self) -> impl Iterator { + self.targets.iter().flatten() + } + + fn empty_spec() -> pbt::PackageSpec { + pbt::PackageSpec::Binary(rattler_conda_types::VersionSpec::Any.into()) + } + + fn run_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &pbt::PackageSpec> { + let targets = self.resolve(platform).collect_vec(); + + targets + .iter() + .flat_map(|t| t.run_dependencies.iter()) + .flatten() + .collect::>() + } + + fn host_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &pbt::PackageSpec> { + let targets = self.resolve(platform).collect_vec(); + + targets + .iter() + .flat_map(|t| t.host_dependencies.iter()) + .flatten() + .collect::>() + } + + fn build_dependencies( + &self, + platform: Option, + ) -> IndexMap<&SourcePackageName, &pbt::PackageSpec> { + let targets = self.resolve(platform).collect_vec(); + + targets + .iter() + .flat_map(|t| t.build_dependencies.iter()) + .flatten() + .collect::>() + } + + fn dependencies(&self, platform: Option) -> Dependencies<'_, Self::Spec> { + let build_deps = self.build_dependencies(platform); + let host_deps = self.host_dependencies(platform); + let run_deps = self.run_dependencies(platform); + + Dependencies::new(run_deps, host_deps, build_deps) + } +} diff --git a/crates/pixi-build-backend/src/utils/mod.rs b/crates/pixi-build-backend/src/utils/mod.rs new file mode 100644 index 0000000000..dce8a7c8d0 --- /dev/null +++ b/crates/pixi-build-backend/src/utils/mod.rs @@ -0,0 +1,4 @@ +mod temporary_recipe; +pub mod test; + +pub use temporary_recipe::TemporaryRenderedRecipe; diff --git a/crates/pixi-build-backend/src/utils/temporary_recipe.rs b/crates/pixi-build-backend/src/utils/temporary_recipe.rs new file mode 100644 index 0000000000..cd2dba6db6 --- /dev/null +++ b/crates/pixi-build-backend/src/utils/temporary_recipe.rs @@ -0,0 +1,53 @@ +use miette::{IntoDiagnostic, WrapErr}; +use rattler_build::metadata::Output; +use std::future::Future; +use std::io::BufWriter; +use std::path::PathBuf; + +/// A helper struct that owns a temporary file containing a rendered recipe. +/// If `finish` is not called, the temporary file will stay on disk for +/// debugging purposes. +pub struct TemporaryRenderedRecipe { + file: PathBuf, +} + +impl TemporaryRenderedRecipe { + pub fn from_output(output: &Output) -> miette::Result { + // Ensure that the output directory exists + std::fs::create_dir_all(&output.build_configuration.directories.output_dir) + .into_diagnostic() + .context("failed to create output directory")?; + + let (recipe_file, recipe_path) = tempfile::Builder::new() + .prefix(".rendered-recipe") + .suffix(".yaml") + .tempfile_in(&output.build_configuration.directories.output_dir) + .into_diagnostic() + .context("failed to create temporary file for recipe")? + .into_parts(); + + // Write the recipe back to a file + serde_yaml::to_writer(BufWriter::new(recipe_file), &output.recipe) + .into_diagnostic() + .context("failed to write recipe to temporary file")?; + + Ok(Self { + file: recipe_path.keep().unwrap(), + }) + } + + pub async fn within_context_async< + R, + Fut: Future>, + F: FnOnce() -> Fut, + >( + self, + operation: F, + ) -> miette::Result { + let result = operation().await?; + std::fs::remove_file(self.file) + .into_diagnostic() + .context("failed to remove temporary recipe file")?; + Ok(result) + } +} diff --git a/crates/pixi-build-backend/src/utils/test.rs b/crates/pixi-build-backend/src/utils/test.rs new file mode 100644 index 0000000000..805fe83924 --- /dev/null +++ b/crates/pixi-build-backend/src/utils/test.rs @@ -0,0 +1,101 @@ +use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; + +use pixi_build_types::{ + VariantValue, + procedures::{ + conda_outputs::{CondaOutputsParams, CondaOutputsResult}, + initialize::InitializeParams, + }, +}; +use rattler_build::console_utils::LoggingOutputHandler; +use rattler_conda_types::Platform; +use serde_json::Value; + +use crate::{ + generated_recipe::GenerateRecipe, intermediate_backend::IntermediateBackendInstantiator, + protocol::ProtocolInstantiator, +}; + +/// A utility function to remove empty values from a JSON object. +pub(crate) fn remove_empty_values(value: &mut Value) { + fn keep_value(value: &Value) -> bool { + match value { + Value::Object(map) => !map.is_empty(), + Value::Array(arr) => !arr.is_empty(), + Value::Null => false, + _ => true, + } + } + + match value { + Value::Object(map) => { + map.retain(|_, v| { + remove_empty_values(v); + keep_value(v) + }); + } + Value::Array(arr) => { + arr.retain_mut(|v| { + remove_empty_values(v); + keep_value(v) + }); + } + _ => {} + } +} + +/// Prepares and calls the `conda/outputs` procedure of the `IntermediateBackend` for the +/// given recipe general and with the given project model. +pub async fn intermediate_conda_outputs( + project_model: Option, + source_dir: Option, + host_platform: Platform, + variant_configuration: Option>>, + variant_files: Option>, +) -> CondaOutputsResult +where + T: GenerateRecipe + Default + Clone + Send + Sync + 'static, + ::Config: Send + Sync + 'static, +{ + let manifest_path = match &source_dir { + Some(dir) => dir.join("pixi.toml"), + None => PathBuf::from("pixi.toml"), + }; + + let (protocol, _result) = IntermediateBackendInstantiator::::new( + LoggingOutputHandler::default(), + Arc::new(T::default()), + ) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: source_dir, + manifest_path, + project_model, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let current_dir = std::env::current_dir().unwrap(); + protocol + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform, + build_platform: host_platform, + variant_configuration, + variant_files, + work_directory: current_dir, + }) + .await + .unwrap() +} + +/// A function to convert a `CondaOutputsResult` into a pretty-printed JSON +/// string. +pub fn conda_outputs_snapshot(result: CondaOutputsResult) -> String { + let mut value = serde_json::to_value(result).unwrap(); + remove_empty_values(&mut value); + serde_json::to_string_pretty(&value).unwrap() +} diff --git a/crates/pixi-build-backend/src/variants.rs b/crates/pixi-build-backend/src/variants.rs new file mode 100644 index 0000000000..66e1eec28f --- /dev/null +++ b/crates/pixi-build-backend/src/variants.rs @@ -0,0 +1,39 @@ +use pixi_build_types as pbt; +use rattler_conda_types::VersionSpec; + +pub use rattler_build::NormalizedKey; + +/// Returns true if the specified [`pbt::PackageSpec`] is a valid variant +/// spec. +/// +/// At the moment, a spec that allows any version is considered a variant spec. +pub fn can_be_used_as_variant(spec: &pbt::PackageSpec) -> bool { + match spec { + pbt::PackageSpec::Binary(spec) => { + let pbt::BinaryPackageSpec { + version, + build, + build_number, + file_name, + channel, + subdir, + md5, + sha256, + url, + license, + } = spec; + + version == &Some(VersionSpec::Any) + && build.is_none() + && build_number.is_none() + && file_name.is_none() + && channel.is_none() + && subdir.is_none() + && md5.is_none() + && sha256.is_none() + && url.is_none() + && license.is_none() + } + _ => false, + } +} diff --git a/crates/pixi-build-backend/tests/fixtures/default_minimal_project_model_for_build.json b/crates/pixi-build-backend/tests/fixtures/default_minimal_project_model_for_build.json new file mode 100644 index 0000000000..d125e55cf8 --- /dev/null +++ b/crates/pixi-build-backend/tests/fixtures/default_minimal_project_model_for_build.json @@ -0,0 +1,25 @@ +{ + "name": "minimal-package", + "version": "1.0.0", + "description": null, + "authors": null, + "license": null, + "license_file": null, + "readme": null, + "homepage": null, + "repository": null, + "documentation": null, + "targets": { + "default_target": { + "host_dependencies": {}, + "build_dependencies": {}, + "run_dependencies": { + "python": { + "binary": { + "version": ">=3.8" + } + } + } + } + } +} diff --git a/crates/pixi-build-backend/tests/fixtures/minimal_project_model.json b/crates/pixi-build-backend/tests/fixtures/minimal_project_model.json new file mode 100644 index 0000000000..a9f98ec182 --- /dev/null +++ b/crates/pixi-build-backend/tests/fixtures/minimal_project_model.json @@ -0,0 +1,38 @@ +{ + "name": "minimal-package", + "version": "1.0.0", + "description": null, + "authors": null, + "license": null, + "license_file": null, + "readme": null, + "homepage": null, + "repository": null, + "documentation": null, + "targets": { + "default_target": { + "host_dependencies": {}, + "build_dependencies": {}, + "run_dependencies": { + "python": { + "binary": { + "version": ">=3.8" + } + } + } + }, + "targets": { + "Linux": { + "host_dependencies": { + "rich": { + "binary": { + "version": ">=10.0" + } + } + }, + "build_dependencies": {}, + "run_dependencies": {} + } + } + } +} diff --git a/crates/pixi-build-backend/tests/fixtures/minimal_project_model_for_build.json b/crates/pixi-build-backend/tests/fixtures/minimal_project_model_for_build.json new file mode 100644 index 0000000000..1a566b3d41 --- /dev/null +++ b/crates/pixi-build-backend/tests/fixtures/minimal_project_model_for_build.json @@ -0,0 +1,38 @@ +{ + "name": "minimal-package", + "version": "1.0.0", + "description": null, + "authors": null, + "license": null, + "license_file": null, + "readme": null, + "homepage": null, + "repository": null, + "documentation": null, + "targets": { + "default_target": { + "host_dependencies": {}, + "build_dependencies": {}, + "run_dependencies": { + "python": { + "binary": { + "version": ">=3.8" + } + } + } + }, + "targets": { + "Linux": { + "host_dependencies": { + "boltons": { + "binary": { + "version": ">=1.0" + } + } + }, + "build_dependencies": {}, + "run_dependencies": {} + } + } + } +} diff --git a/crates/pixi-build-backend/tests/integration/common/mod.rs b/crates/pixi-build-backend/tests/integration/common/mod.rs new file mode 100644 index 0000000000..65880be0e3 --- /dev/null +++ b/crates/pixi-build-backend/tests/integration/common/mod.rs @@ -0,0 +1 @@ +pub mod model; diff --git a/crates/pixi-build-backend/tests/integration/common/model.rs b/crates/pixi-build-backend/tests/integration/common/model.rs new file mode 100644 index 0000000000..d7ac78a1b6 --- /dev/null +++ b/crates/pixi-build-backend/tests/integration/common/model.rs @@ -0,0 +1,206 @@ +/// This file contains the test model, which is a minimal example of a ProjectModel +/// that can be used to create a ProjectModel from a JSON fixture file. +use pixi_build_types::{ + BinaryPackageSpec as PbtBinaryPackageSpec, PackageSpec as PbtPackageSpec, PathSpec, + ProjectModel, Target as PbtTarget, TargetSelector as PbtTargetSelector, Targets as PbtTargets, +}; + +use rattler_conda_types::{ParseStrictness, Version, VersionSpec}; + +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, path::PathBuf}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TestProjectModel { + pub name: String, + pub version: String, + pub description: Option, + pub authors: Option>, + pub license: Option, + pub license_file: Option, + pub readme: Option, + pub homepage: Option, + pub repository: Option, + pub documentation: Option, + pub targets: Targets, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Targets { + pub default_target: Target, + pub targets: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Target { + pub host_dependencies: HashMap, + pub build_dependencies: HashMap, + pub run_dependencies: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PackageSpec { + Binary(BinaryPackageSpec), + Source(SourcePackageSpec), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BinaryPackageSpec { + pub binary: BinarySpec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BinarySpec { + pub version: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SourcePackageSpec { + pub source: SourceSpec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SourceSpec { + pub version: Option, + pub path: Option, + pub git: Option, + pub url: Option, +} + +/// Represents a target selector. Currently, we only support explicit platform +/// selection. +#[derive(Debug, Clone, Deserialize, Serialize, Hash, Eq, PartialEq)] +pub enum TargetSelector { + // Platform specific configuration + Unix, + Linux, + Win, + MacOs, + Platform(String), +} + +/// Helper function to load a test ProjectModel from a JSON fixture file +pub(crate) fn load_project_model_from_json(filename: &str) -> TestProjectModel { + let fixture_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("fixtures") + .join(filename); + + let json_content = std::fs::read_to_string(&fixture_path) + .unwrap_or_else(|e| panic!("Failed to read JSON fixture '{filename}': {e}")); + + serde_json::from_str(&json_content) + .unwrap_or_else(|e| panic!("Failed to parse JSON fixture '{filename}': {e}")) +} + +/// Converts a TestProjectModel into a ProjectModel +pub(crate) fn convert_test_model_to_project_model_v1(test_model: TestProjectModel) -> ProjectModel { + use std::str::FromStr; + + // Convert the targets + let targets_v1 = PbtTargets { + default_target: Some(convert_target_to_v1(&test_model.targets.default_target)), + targets: Some( + test_model + .targets + .targets + .into_iter() + .map(|(selector, target)| { + ( + convert_target_selector_to_v1(selector), + convert_target_to_v1(&target), + ) + }) + .collect(), + ), + }; + + ProjectModel { + name: Some(test_model.name), + version: Some(Version::from_str(&test_model.version).unwrap()), + description: test_model.description, + authors: test_model.authors, + license: test_model.license, + license_file: test_model.license_file.map(PathBuf::from), + readme: test_model.readme.map(PathBuf::from), + homepage: test_model.homepage.and_then(|h| url::Url::parse(&h).ok()), + repository: test_model.repository.and_then(|r| url::Url::parse(&r).ok()), + documentation: test_model + .documentation + .and_then(|d| url::Url::parse(&d).ok()), + targets: Some(targets_v1), + build_number: None, + build_string: None, + } +} + +/// Converts a test Target to Target +fn convert_target_to_v1(target: &Target) -> PbtTarget { + PbtTarget { + build_dependencies: Some( + target + .build_dependencies + .iter() + .map(|(name, spec)| (name.clone(), convert_package_spec_to_v1(spec))) + .collect(), + ), + host_dependencies: Some( + target + .host_dependencies + .iter() + .map(|(name, spec)| (name.clone(), convert_package_spec_to_v1(spec))) + .collect(), + ), + run_dependencies: Some( + target + .run_dependencies + .iter() + .map(|(name, spec)| (name.clone(), convert_package_spec_to_v1(spec))) + .collect(), + ), + } +} + +/// Converts a test TargetSelector to TargetSelector +fn convert_target_selector_to_v1(selector: TargetSelector) -> PbtTargetSelector { + match selector { + TargetSelector::Unix => PbtTargetSelector::Unix, + TargetSelector::Linux => PbtTargetSelector::Linux, + TargetSelector::Win => PbtTargetSelector::Win, + TargetSelector::MacOs => PbtTargetSelector::MacOs, + TargetSelector::Platform(p) => PbtTargetSelector::Platform(p), + } +} + +/// Converts a test PackageSpec to PackageSpec +fn convert_package_spec_to_v1(spec: &PackageSpec) -> PbtPackageSpec { + match spec { + PackageSpec::Binary(binary_spec) => { + let version_spec = + VersionSpec::from_str(&binary_spec.binary.version, ParseStrictness::Lenient) + .unwrap_or(VersionSpec::Any); + + PbtPackageSpec::Binary(PbtBinaryPackageSpec { + version: Some(version_spec), + build: None, + build_number: None, + file_name: None, + channel: None, + subdir: None, + md5: None, + sha256: None, + url: None, + license: None, + }) + } + PackageSpec::Source(source_spec) => { + let inside_source = source_spec.source.clone(); + if let Some(path) = inside_source.path { + PbtPackageSpec::Source(PathSpec { path }.into()) + } else { + unimplemented!("Only path source specs are supported for now"); + } + } + } +} diff --git a/crates/pixi-build-backend/tests/integration/main.rs b/crates/pixi-build-backend/tests/integration/main.rs new file mode 100644 index 0000000000..a53f1d04d4 --- /dev/null +++ b/crates/pixi-build-backend/tests/integration/main.rs @@ -0,0 +1,3 @@ +mod common; + +mod protocol; diff --git a/crates/pixi-build-backend/tests/integration/protocol.rs b/crates/pixi-build-backend/tests/integration/protocol.rs new file mode 100644 index 0000000000..e45af1853b --- /dev/null +++ b/crates/pixi-build-backend/tests/integration/protocol.rs @@ -0,0 +1,146 @@ +use std::sync::Arc; + +use crate::common::model::{convert_test_model_to_project_model_v1, load_project_model_from_json}; +use imp::TestGenerateRecipe; +use pixi_build_backend::{intermediate_backend::IntermediateBackend, protocol::Protocol}; +use pixi_build_types::procedures::conda_build_v1::{CondaBuildV1Output, CondaBuildV1Params}; +use rattler_build::console_utils::LoggingOutputHandler; +use rattler_conda_types::{ChannelUrl, Platform}; +use serde_json::json; +use tempfile::TempDir; +use url::Url; + +#[cfg(test)] +mod imp { + use miette::IntoDiagnostic; + use pixi_build_backend::generated_recipe::{ + BackendConfig, DefaultMetadataProvider, GenerateRecipe, GeneratedRecipe, PythonParams, + }; + use rattler_conda_types::ChannelUrl; + use serde::{Deserialize, Serialize}; + use std::{ + collections::HashSet, + path::{Path, PathBuf}, + }; + + #[derive(Debug, Default, Serialize, Deserialize, Clone)] + #[serde(rename_all = "kebab-case")] + pub struct TestBackendConfig { + /// If set, internal state will be logged as files in that directory + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + } + + #[cfg(test)] + #[derive(Clone, Default)] + pub(crate) struct TestGenerateRecipe {} + + impl BackendConfig for TestBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + Ok(Self { + debug_dir: self.debug_dir.clone(), + }) + } + } + + #[async_trait::async_trait] + impl GenerateRecipe for TestGenerateRecipe { + type Config = TestBackendConfig; + + async fn generate_recipe( + &self, + model: &pixi_build_types::ProjectModel, + _config: &Self::Config, + _manifest_path: PathBuf, + _host_platform: rattler_conda_types::Platform, + _python_params: Option, + _variants: &HashSet, + _channels: Vec, + _cache_dir: Option, + ) -> miette::Result { + GeneratedRecipe::from_model(model.clone(), &mut DefaultMetadataProvider) + .into_diagnostic() + } + } +} + +#[tokio::test] +async fn test_conda_build_v1() { + let tmp_dir = TempDir::new().unwrap(); + let tmp_dir_path = tmp_dir.path().to_path_buf(); + + let pixi_manifest = tmp_dir_path.join("pixi.toml"); + let build_dir = tmp_dir_path.join("build"); + + // Load a model from JSON + let original_model = load_project_model_from_json("minimal_project_model_for_build.json"); + + // Serialize it back to JSON + let project_model_v1 = convert_test_model_to_project_model_v1(original_model); + + // save the pixi.toml file to a temporary location + fs_err::write(&pixi_manifest, toml::to_string(&project_model_v1).unwrap()).unwrap(); + + let channel_url = Url::parse("https://prefix.dev/conda-forge").unwrap(); + + let channel_url = ChannelUrl::from(channel_url); + + let build_params = CondaBuildV1Params { + channels: vec![channel_url], + + build_prefix: None, + host_prefix: None, + run_constraints: None, + run_dependencies: None, + run_exports: None, + output: CondaBuildV1Output { + name: "minimal-package".parse().unwrap(), + version: None, + build: None, + subdir: Platform::current(), + variant: Default::default(), + }, + work_directory: build_dir.clone(), + output_directory: None, + editable: None, + }; + + let some_config = json!({ + "debug-dir": "some_debug_dir", + }); + + let target_config = Default::default(); + + let intermediate_backend: IntermediateBackend = IntermediateBackend::new( + pixi_manifest.clone(), + Some(tmp_dir_path.clone()), + project_model_v1, + Arc::default(), + some_config, + target_config, + LoggingOutputHandler::default(), + None, + ) + .unwrap(); + + let conda_build_result = intermediate_backend + .conda_build_v1(build_params) + .await + .unwrap(); + + insta::assert_yaml_snapshot!(conda_build_result, { + ".output_file" => "[redacted]", + ".build" => "[redacted]", + ".subdir" => "[redacted]", + }); + + assert!(build_dir.join("debug").join("recipe.yaml").exists()); +} diff --git a/crates/pixi-build-backend/tests/integration/snapshots/integration__protocol__conda_build_v1.snap b/crates/pixi-build-backend/tests/integration/snapshots/integration__protocol__conda_build_v1.snap new file mode 100644 index 0000000000..0f9eb721d0 --- /dev/null +++ b/crates/pixi-build-backend/tests/integration/snapshots/integration__protocol__conda_build_v1.snap @@ -0,0 +1,10 @@ +--- +source: crates/pixi-build-backend/tests/integration/protocol.rs +expression: conda_build_result +--- +output_file: "[redacted]" +input_globs: [] +name: minimal-package +version: 1.0.0 +build: "[redacted]" +subdir: "[redacted]" diff --git a/crates/pixi-build-cmake/Cargo.toml b/crates/pixi-build-cmake/Cargo.toml new file mode 100644 index 0000000000..05555db21c --- /dev/null +++ b/crates/pixi-build-cmake/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "pixi-build-cmake" +version = "0.3.7" +description = "CMake build backend for Pixi" +edition.workspace = true + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] + +[dependencies] +async-trait = { workspace = true } +indexmap = { workspace = true } +miette = { workspace = true } +minijinja = { workspace = true } +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } +rattler-build = { workspace = true } +rattler_conda_types = { workspace = true } +recipe-stage0 = { workspace = true } +serde = { workspace = true, features = ["derive"] } +tokio = { workspace = true, features = ["macros"] } + +[dev-dependencies] +insta = { workspace = true, features = ["yaml", "redactions", "filters"] } +rstest = { workspace = true } +strum = { workspace = true } +tempfile = { workspace = true } +fs-err = { workspace = true } +serde_json = { workspace = true } diff --git a/crates/pixi-build-cmake/debug/recipe.yaml b/crates/pixi-build-cmake/debug/recipe.yaml new file mode 100644 index 0000000000..058c4b1dc5 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe.yaml @@ -0,0 +1,47 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + ninja --version + cmake --version + + mkdir -p build + pushd build + + if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "/tmp/.tmp6eLIS9" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON + fi + + cmake --build . --target install + env: {} + secrets: [] +requirements: + build: + - boltons + - ${{ compiler('cxx') }} + - cmake + - ninja + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml new file mode 100644 index 0000000000..9e0f999c57 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml @@ -0,0 +1,46 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + ninja --version + cmake --version + + mkdir -p build + pushd build + + if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON + fi + + cmake --build . --target install + env: {} + secrets: [] +requirements: + build: + - ${{ compiler('cxx') }} + - cmake + - ninja + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml b/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml new file mode 100644 index 0000000000..62c2d5a088 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml @@ -0,0 +1,2 @@ +cxx_compiler: vs2022 +target_platform: win-64 diff --git a/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml new file mode 100644 index 0000000000..1cda436251 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml @@ -0,0 +1,47 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + ninja --version + cmake --version + + mkdir -p build + pushd build + + if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "/tmp/.tmpQpbknh" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON + fi + + cmake --build . --target install + env: {} + secrets: [] +requirements: + build: + - boltons + - ${{ compiler('cxx') }} + - cmake + - ninja + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml b/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml new file mode 100644 index 0000000000..811531170c --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml @@ -0,0 +1,2 @@ +boltons: ==1.0.0 +target_platform: linux-64 diff --git a/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml new file mode 100644 index 0000000000..058c4b1dc5 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml @@ -0,0 +1,47 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + ninja --version + cmake --version + + mkdir -p build + pushd build + + if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "/tmp/.tmp6eLIS9" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON + fi + + cmake --build . --target install + env: {} + secrets: [] +requirements: + build: + - boltons + - ${{ compiler('cxx') }} + - cmake + - ninja + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml b/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml new file mode 100644 index 0000000000..10dfcaa6b8 --- /dev/null +++ b/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml @@ -0,0 +1,2 @@ +boltons: ==2.0.0 +target_platform: linux-64 diff --git a/crates/pixi-build-cmake/debug/variants.yaml b/crates/pixi-build-cmake/debug/variants.yaml new file mode 100644 index 0000000000..3c9181080d --- /dev/null +++ b/crates/pixi-build-cmake/debug/variants.yaml @@ -0,0 +1,8 @@ +pin_run_as_build: null +zip_keys: null +boltons: +- ==2.0.0 +build_platform: +- linux-64 +target_platform: +- linux-64 diff --git a/crates/pixi-build-cmake/pixi.toml b/crates/pixi-build-cmake/pixi.toml new file mode 100644 index 0000000000..db392f4861 --- /dev/null +++ b/crates/pixi-build-cmake/pixi.toml @@ -0,0 +1,10 @@ +[package.build.backend] +name = "pixi-build-rust" +version = "*" +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[package.run-dependencies] +pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-cmake/src/build_script.j2 b/crates/pixi-build-cmake/src/build_script.j2 new file mode 100644 index 0000000000..5cdaf6ddc9 --- /dev/null +++ b/crates/pixi-build-cmake/src/build_script.j2 @@ -0,0 +1,58 @@ +{%- set is_cmd_exe = build_platform == "windows" -%} +{%- macro env(key) -%} +{%- if is_cmd_exe %}{{ "%" ~ key ~ "%" }}{% else %}{{ "$" ~key }}{% endif -%} +{% endmacro -%} + +{# - Set up common variables -#} +{%- set build_dir = "build" -%} +{%- set library_prefix = "%LIBRARY_PREFIX%" if build_platform == "windows" else "$PREFIX" -%} + +{# Set up default CMake arguments -#} +{%- set cmake_args = [ + env("CMAKE_ARGS"), + "-GNinja", + "-S \"" ~ source_dir ~ "\"", + "-DCMAKE_BUILD_TYPE=Release", + "-DCMAKE_INSTALL_PREFIX=" ~ library_prefix, + "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON", + "-DBUILD_SHARED_LIBS=ON", +] + extra_args +-%} + +{# Add Python executable if available -#} +{%- if has_host_python -%} +{%- set cmake_args = cmake_args + [ + "-DPython_EXECUTABLE=" ~ env("PYTHON") +] -%} +{% endif -%} + +{#- Output version information -#} +ninja --version +cmake --version + +{# Set up the build directory -#} +{% if is_cmd_exe -%} +if not exist {{ build_dir }} mkdir {{ build_dir }} +{% else -%} +mkdir -p build +{% endif -%} +pushd build + +{# Windows -#} +{% if is_cmd_exe -%} +if not exist build.ninja ( + cmake {{ cmake_args | join(" ^\n ") }} + @if errorlevel 1 exit 1 +) + +cmake --build . --target install +@if errorlevel 1 exit 1 + +{# Non Windows #} +{% else -%} +if [ ! -f "build.ninja" ]; then + cmake {{ cmake_args | join(" \\\n ") }} +fi + +cmake --build . --target install +{% endif -%} diff --git a/crates/pixi-build-cmake/src/build_script.rs b/crates/pixi-build-cmake/src/build_script.rs new file mode 100644 index 0000000000..c64952f712 --- /dev/null +++ b/crates/pixi-build-cmake/src/build_script.rs @@ -0,0 +1,73 @@ +use minijinja::Environment; +use serde::Serialize; + +#[derive(Serialize)] +pub struct BuildScriptContext { + pub build_platform: BuildPlatform, + pub source_dir: String, + pub extra_args: Vec, + /// The package has a host dependency on Python. + /// This is used to determine if the build script + /// should include Python-related logic. + pub has_host_python: bool, +} + +#[derive(Copy, Clone, Serialize)] +#[serde(rename_all = "kebab-case")] +#[cfg_attr(test, derive(strum::Display))] +#[cfg_attr(test, strum(serialize_all = "snake_case"))] +pub enum BuildPlatform { + Windows, + Unix, +} + +impl BuildScriptContext { + pub fn render(&self) -> String { + let env = Environment::new(); + let template = env + .template_from_str(include_str!("build_script.j2")) + .unwrap(); + template.render(self).unwrap().trim().to_string() + } +} + +#[cfg(test)] +mod test { + use rstest::*; + + use super::*; + + #[rstest] + fn test_build_script( + #[values(BuildPlatform::Windows, BuildPlatform::Unix)] build_platform: BuildPlatform, + #[values(true, false)] has_host_python: bool, + #[values(vec![String::from("test-arg")], vec![])] extra_args: Vec, + ) { + let context = BuildScriptContext { + build_platform, + source_dir: String::from("my-prefix-dir"), + extra_args: extra_args.clone(), + has_host_python, + }; + let script = context.render(); + + let mut settings = insta::Settings::clone_current(); + settings.set_snapshot_suffix(format!( + "{}-{}-{}", + build_platform, + if has_host_python { + "python" + } else { + "nopython" + }, + if extra_args.is_empty() { + "no-extra-args" + } else { + "with-extra-args" + } + )); + settings.bind(|| { + insta::assert_snapshot!(script); + }); + } +} diff --git a/crates/pixi-build-cmake/src/config.rs b/crates/pixi-build-cmake/src/config.rs new file mode 100644 index 0000000000..c1a5b73eb0 --- /dev/null +++ b/crates/pixi-build-cmake/src/config.rs @@ -0,0 +1,185 @@ +use std::path::{Path, PathBuf}; + +use indexmap::IndexMap; +use pixi_build_backend::generated_recipe::BackendConfig; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +pub struct CMakeBackendConfig { + /// Extra args for CMake invocation + #[serde(default)] + pub extra_args: Vec, + /// Environment Variables + #[serde(default)] + pub env: IndexMap, + /// Deprecated. Setting this has no effect; debug data is always written to + /// the `debug` subdirectory of the work directory. + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + /// Extra input globs to include in addition to the default ones + #[serde(default)] + pub extra_input_globs: Vec, + /// List of compilers to use (e.g., ["c", "cxx", "cuda"]) + /// If not specified, a default will be used + pub compilers: Option>, +} + +impl BackendConfig for CMakeBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values override base values using the following rules: + /// - extra_args: Platform-specific completely replaces base + /// - env: Platform env vars override base, others merge + /// - debug_dir: Not allowed to have target specific value + /// - extra_input_globs: Platform-specific completely replaces base + /// - compilers: Platform-specific completely replaces base + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + Ok(Self { + extra_args: if target_config.extra_args.is_empty() { + self.extra_args.clone() + } else { + target_config.extra_args.clone() + }, + env: { + let mut merged_env = self.env.clone(); + merged_env.extend(target_config.env.clone()); + merged_env + }, + debug_dir: self.debug_dir.clone(), + extra_input_globs: if target_config.extra_input_globs.is_empty() { + self.extra_input_globs.clone() + } else { + target_config.extra_input_globs.clone() + }, + compilers: target_config + .compilers + .clone() + .or_else(|| self.compilers.clone()), + }) + } +} + +#[cfg(test)] +mod tests { + use pixi_build_backend::generated_recipe::BackendConfig; + use serde_json::json; + use std::path::PathBuf; + + use super::CMakeBackendConfig; + + #[test] + fn test_ensure_deseralize_from_empty() { + let json_data = json!({}); + serde_json::from_value::(json_data).unwrap(); + } + + #[test] + fn test_merge_with_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + base_env.insert("SHARED_VAR".to_string(), "base_shared".to_string()); + + let base_config = CMakeBackendConfig { + extra_args: vec!["--base-arg".to_string()], + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + compilers: Some(vec!["cxx".to_string()]), + }; + + let mut target_env = indexmap::IndexMap::new(); + target_env.insert("TARGET_VAR".to_string(), "target_value".to_string()); + target_env.insert("SHARED_VAR".to_string(), "target_shared".to_string()); + + let target_config = CMakeBackendConfig { + extra_args: vec!["--target-arg".to_string()], + env: target_env, + debug_dir: None, + extra_input_globs: vec!["*.target".to_string()], + compilers: Some(vec!["c".to_string(), "cuda".to_string()]), + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // extra_args should be completely overridden + assert_eq!(merged.extra_args, vec!["--target-arg".to_string()]); + + // env should merge with target taking precedence + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!( + merged.env.get("TARGET_VAR"), + Some(&"target_value".to_string()) + ); + assert_eq!( + merged.env.get("SHARED_VAR"), + Some(&"target_shared".to_string()) + ); + + // debug_dir should use base value + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + + // extra_input_globs should be completely overridden + assert_eq!(merged.extra_input_globs, vec!["*.target".to_string()]); + + // compilers should be completely overridden by target + assert_eq!( + merged.compilers, + Some(vec!["c".to_string(), "cuda".to_string()]) + ); + } + + #[test] + fn test_merge_with_empty_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + + let base_config = CMakeBackendConfig { + extra_args: vec!["--base-arg".to_string()], + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + compilers: Some(vec!["cxx".to_string()]), + }; + + let empty_target_config = CMakeBackendConfig::default(); + + let merged = base_config + .merge_with_target_config(&empty_target_config) + .unwrap(); + + // Should keep base values when target is empty + assert_eq!(merged.extra_args, vec!["--base-arg".to_string()]); + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + assert_eq!(merged.extra_input_globs, vec!["*.base".to_string()]); + assert_eq!(merged.compilers, Some(vec!["cxx".to_string()])); + } + + #[test] + fn test_merge_target_debug_dir_error() { + let base_config = CMakeBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + ..Default::default() + }; + + let target_config = CMakeBackendConfig { + debug_dir: Some(PathBuf::from("/target/debug")), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`debug_dir` cannot have a target specific value")); + } +} diff --git a/crates/pixi-build-cmake/src/main.rs b/crates/pixi-build-cmake/src/main.rs new file mode 100644 index 0000000000..f1b08c9053 --- /dev/null +++ b/crates/pixi-build-cmake/src/main.rs @@ -0,0 +1,665 @@ +mod build_script; +mod config; + +use build_script::{BuildPlatform, BuildScriptContext}; +use config::CMakeBackendConfig; +use miette::IntoDiagnostic; +use pixi_build_backend::{ + generated_recipe::{DefaultMetadataProvider, GenerateRecipe, GeneratedRecipe, PythonParams}, + intermediate_backend::IntermediateBackendInstantiator, + traits::ProjectModel, +}; +use pixi_build_types::SourcePackageName; +use rattler_build::{NormalizedKey, recipe::variable::Variable}; +use rattler_conda_types::{ChannelUrl, Platform}; +use recipe_stage0::recipe::Script; +use std::collections::HashSet; +use std::path::PathBuf; +use std::{ + collections::{BTreeMap, BTreeSet}, + path::Path, + sync::Arc, +}; + +#[derive(Default, Clone)] +pub struct CMakeGenerator {} + +#[async_trait::async_trait] +impl GenerateRecipe for CMakeGenerator { + type Config = CMakeBackendConfig; + + async fn generate_recipe( + &self, + model: &pixi_build_types::ProjectModel, + config: &Self::Config, + manifest_path: PathBuf, + host_platform: Platform, + _python_params: Option, + variants: &HashSet, + _channels: Vec, + _cache_dir: Option, + ) -> miette::Result { + // Determine the manifest root, because `manifest_path` can be + // either a direct file path or a directory path. + let manifest_root = if manifest_path.is_file() { + manifest_path + .parent() + .ok_or_else(|| { + miette::Error::msg(format!( + "Manifest path {} is a file but has no parent directory.", + manifest_path.display() + )) + })? + .to_path_buf() + } else { + manifest_path.clone() + }; + + let mut generated_recipe = + GeneratedRecipe::from_model(model.clone(), &mut DefaultMetadataProvider) + .into_diagnostic()?; + + // we need to add compilers + + let requirements = &mut generated_recipe.recipe.requirements; + + // Get the platform-specific dependencies from the project model. + // This properly handles target selectors like [target.linux-64] by using + // the ProjectModel trait's platform-aware API instead of trying to evaluate + // rattler-build selectors with simple string comparison. + let model_dependencies = model.dependencies(Some(host_platform)); + + // Get the list of compilers from config, defaulting to ["cxx"] if not specified + let compilers = config + .compilers + .clone() + .unwrap_or_else(|| vec!["cxx".to_string()]); + + // Add configured compilers to build requirements + pixi_build_backend::compilers::add_compilers_to_requirements( + &compilers, + &mut requirements.build, + &model_dependencies, + &host_platform, + ); + pixi_build_backend::compilers::add_stdlib_to_requirements( + &compilers, + &mut requirements.build, + variants, + ); + + // add necessary build tools + for tool in ["cmake", "ninja"] { + let tool_name = SourcePackageName::from(tool); + if !model_dependencies.build.contains_key(&tool_name) { + requirements.build.push(tool.parse().into_diagnostic()?); + } + } + + // Check if the host platform has a host python dependency + // This is used to determine if we need to the cmake argument for the python + // executable + let has_host_python = model_dependencies + .host + .contains_key(&SourcePackageName::from("python")); + + let build_script = BuildScriptContext { + build_platform: if Platform::current().is_windows() { + BuildPlatform::Windows + } else { + BuildPlatform::Unix + }, + source_dir: manifest_root.display().to_string(), + extra_args: config.extra_args.clone(), + has_host_python, + } + .render(); + + generated_recipe.recipe.build.script = Script { + content: build_script, + env: config.env.clone(), + ..Default::default() + }; + + Ok(generated_recipe) + } + + fn extract_input_globs_from_build( + &self, + config: &Self::Config, + _workdir: impl AsRef, + _editable: bool, + ) -> miette::Result> { + Ok([ + // Source files + "**/*.{c,cc,cxx,cpp,h,hpp,hxx}", + // CMake files + "**/*.{cmake,cmake.in}", + "**/CMakeFiles.txt", + ] + .iter() + .map(|s: &&str| s.to_string()) + .chain(config.extra_input_globs.clone()) + .collect()) + } + + fn default_variants( + &self, + host_platform: Platform, + ) -> miette::Result>> { + let mut variants = BTreeMap::new(); + + if host_platform.is_windows() { + // Default to the Visual Studio 2022 compiler on Windows + // Not 2019 due to Conda-forge switching and the mainstream support dropping in 2024. + // rattler-build will default to vs2017 which for most github runners is too + // old. + variants.insert(NormalizedKey::from("c_compiler"), vec!["vs2022".into()]); + variants.insert(NormalizedKey::from("cxx_compiler"), vec!["vs2022".into()]); + } + + Ok(variants) + } +} + +#[tokio::main] +pub async fn main() { + if let Err(err) = pixi_build_backend::cli::main(|log| { + IntermediateBackendInstantiator::::new(log, Arc::default()) + }) + .await + { + eprintln!("{err:?}"); + std::process::exit(1); + } +} + +#[cfg(test)] +mod tests { + use std::{collections::BTreeMap, path::PathBuf}; + + use indexmap::IndexMap; + use pixi_build_backend::{ + protocol::ProtocolInstantiator, utils::test::intermediate_conda_outputs, + }; + use pixi_build_types::{ + ProjectModel, VariantValue, + procedures::{conda_outputs::CondaOutputsParams, initialize::InitializeParams}, + }; + use rattler_build::console_utils::LoggingOutputHandler; + use recipe_stage0::recipe::{Item, Value}; + use tokio::fs; + + use super::*; + + #[test] + fn test_input_globs_includes_extra_globs() { + let config = CMakeBackendConfig { + extra_input_globs: vec!["custom/*.c".to_string()], + ..Default::default() + }; + + let generator = CMakeGenerator::default(); + + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + + insta::assert_debug_snapshot!(result); + } + + #[macro_export] + macro_rules! project_fixture { + ($($json:tt)+) => { + serde_json::from_value::( + serde_json::json!($($json)+) + ).expect("Failed to create TestProjectModel from JSON fixture.") + }; + } + + #[tokio::test] + async fn test_cxx_is_in_build_requirements() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig::default(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_env_vars_are_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let env = IndexMap::from([("foo".to_string(), "bar".to_string())]); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig { + env: env.clone(), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe.build.script, + { + ".content" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_has_python_is_set_in_build_script() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "hostDependencies": { + "python": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig::default(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // we want to check that + // -DPython_EXECUTABLE=$PYTHON is set in the build script + insta::assert_yaml_snapshot!(generated_recipe.recipe.build, + + { + ".script.content" => insta::dynamic_redaction(|value, _path| { + dbg!(&value); + // assert that the value looks like a uuid here + assert!(value.as_str().unwrap().lines() + .any(|c| c.contains("-DPython_EXECUTABLE")) + ); + "[content]" + }) + }); + } + + #[tokio::test] + async fn test_cxx_is_not_added_if_gcc_is_already_present() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "buildDependencies": { + "gxx": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig::default(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_windows_default_compiler() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + }); + + let factory = IntermediateBackendInstantiator::::new( + LoggingOutputHandler::default(), + Arc::default(), + ) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: PathBuf::from("pixi.toml"), + project_model: Some(project_model), + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let current_dir = std::env::current_dir().unwrap(); + let outputs = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Win64, + build_platform: Platform::Win64, + variant_configuration: None, + variant_files: None, + work_directory: current_dir, + }) + .await + .unwrap(); + + assert_eq!( + outputs.outputs[0].metadata.variant.get("cxx_compiler"), + Some(&VariantValue::from("vs2022")), + "On windows the default cxx_compiler variant should be vs2022" + ); + } + + #[tokio::test] + async fn test_intermediate_conda_outputs_snapshot() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "buildDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); + + let variant_configuration = BTreeMap::from([( + "boltons".to_string(), + Vec::from([VariantValue::from("==1.0.0")]), + )]); + + let result = intermediate_conda_outputs::( + Some(project_model), + Some(temp_dir.path().to_path_buf()), + Platform::Linux64, + Some(variant_configuration), + None, + ) + .await; + + assert_eq!( + result.outputs[0].metadata.variant["boltons"], + VariantValue::from("==1.0.0") + ); + assert_eq!( + result.outputs[0].metadata.variant["target_platform"], + VariantValue::from("linux-64") + ); + } + + #[tokio::test] + async fn test_variant_files_are_applied() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "buildDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); + + let variant_file = temp_dir.path().join("variants.yaml"); + fs::write( + &variant_file, + r#"boltons: + - "==2.0.0" +"#, + ) + .await + .expect("Failed to write variants file"); + + let result = intermediate_conda_outputs::( + Some(project_model), + Some(temp_dir.path().to_path_buf()), + Platform::Linux64, + None, + Some(vec![variant_file]), + ) + .await; + + assert_eq!( + result.outputs[0].metadata.variant["boltons"], + VariantValue::from("==2.0.0") + ); + assert_eq!( + result.outputs[0].metadata.variant["target_platform"], + VariantValue::from("linux-64") + ); + } + + #[tokio::test] + async fn test_multiple_compilers_configuration() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig { + compilers: Some(vec!["c".to_string(), "cxx".to_string(), "cuda".to_string()]), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly three compilers + assert_eq!( + compiler_templates.len(), + 3, + "Should have exactly three compilers" + ); + + // Check we have the expected compilers + assert!( + compiler_templates.contains(&"${{ compiler('c') }}".to_string()), + "C compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cxx') }}".to_string()), + "C++ compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cuda') }}".to_string()), + "CUDA compiler should be in build requirements" + ); + } + + #[tokio::test] + async fn test_default_compiler_when_not_specified() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig { + compilers: None, + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::default(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers and build tools + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly one compiler: cxx + assert_eq!( + compiler_templates.len(), + 1, + "Should have exactly one compiler when not specified" + ); + assert_eq!( + compiler_templates[0], "${{ compiler('cxx') }}", + "Default compiler should be cxx" + ); + } + + #[tokio::test] + async fn test_stdlib_is_added() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + }); + + let generated_recipe = CMakeGenerator::default() + .generate_recipe( + &project_model, + &CMakeBackendConfig { + compilers: None, + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::from_iter([NormalizedKey("c_stdlib".into())]), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers and build tools + let build_reqs = &generated_recipe.recipe.requirements.build; + let stdlib_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("stdlib") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly one compiler: cxx + assert_eq!(stdlib_templates.len(), 1, "Should have exactly one stdlib"); + assert_eq!( + stdlib_templates[0], "${{ stdlib('c') }}", + "Default stdlib should be c" + ); + } +} diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-no-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-no-extra-args.snap new file mode 100644 index 0000000000..b9b6281750 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-no-extra-args.snap @@ -0,0 +1,21 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +mkdir -p build +pushd build + +if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "my-prefix-dir" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON +fi + +cmake --build . --target install diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-with-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-with-extra-args.snap new file mode 100644 index 0000000000..f845705646 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-nopython-with-extra-args.snap @@ -0,0 +1,22 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +mkdir -p build +pushd build + +if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "my-prefix-dir" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON \ + test-arg +fi + +cmake --build . --target install diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-no-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-no-extra-args.snap new file mode 100644 index 0000000000..77b30222f5 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-no-extra-args.snap @@ -0,0 +1,22 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +mkdir -p build +pushd build + +if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "my-prefix-dir" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DPython_EXECUTABLE=$PYTHON +fi + +cmake --build . --target install diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-with-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-with-extra-args.snap new file mode 100644 index 0000000000..d09a18ebc0 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@unix-python-with-extra-args.snap @@ -0,0 +1,23 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +mkdir -p build +pushd build + +if [ ! -f "build.ninja" ]; then + cmake $CMAKE_ARGS \ + -GNinja \ + -S "my-prefix-dir" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=ON \ + test-arg \ + -DPython_EXECUTABLE=$PYTHON +fi + +cmake --build . --target install diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-no-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-no-extra-args.snap new file mode 100644 index 0000000000..6f1e302469 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-no-extra-args.snap @@ -0,0 +1,23 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +if not exist build mkdir build +pushd build + +if not exist build.ninja ( + cmake %CMAKE_ARGS% ^ + -GNinja ^ + -S "my-prefix-dir" ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ + -DBUILD_SHARED_LIBS=ON + @if errorlevel 1 exit 1 +) + +cmake --build . --target install +@if errorlevel 1 exit 1 diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-with-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-with-extra-args.snap new file mode 100644 index 0000000000..239ab60067 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-nopython-with-extra-args.snap @@ -0,0 +1,24 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +if not exist build mkdir build +pushd build + +if not exist build.ninja ( + cmake %CMAKE_ARGS% ^ + -GNinja ^ + -S "my-prefix-dir" ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ + -DBUILD_SHARED_LIBS=ON ^ + test-arg + @if errorlevel 1 exit 1 +) + +cmake --build . --target install +@if errorlevel 1 exit 1 diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-no-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-no-extra-args.snap new file mode 100644 index 0000000000..b3856915ff --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-no-extra-args.snap @@ -0,0 +1,24 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +if not exist build mkdir build +pushd build + +if not exist build.ninja ( + cmake %CMAKE_ARGS% ^ + -GNinja ^ + -S "my-prefix-dir" ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ + -DBUILD_SHARED_LIBS=ON ^ + -DPython_EXECUTABLE=%PYTHON% + @if errorlevel 1 exit 1 +) + +cmake --build . --target install +@if errorlevel 1 exit 1 diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-with-extra-args.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-with-extra-args.snap new file mode 100644 index 0000000000..a3c891d9a1 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__build_script__test__build_script@windows-python-with-extra-args.snap @@ -0,0 +1,25 @@ +--- +source: crates/pixi-build-cmake/src/build_script.rs +expression: script +--- +ninja --version +cmake --version + +if not exist build mkdir build +pushd build + +if not exist build.ninja ( + cmake %CMAKE_ARGS% ^ + -GNinja ^ + -S "my-prefix-dir" ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ + -DBUILD_SHARED_LIBS=ON ^ + test-arg ^ + -DPython_EXECUTABLE=%PYTHON% + @if errorlevel 1 exit 1 +) + +cmake --build . --target install +@if errorlevel 1 exit 1 diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_in_build_requirements.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_in_build_requirements.snap new file mode 100644 index 0000000000..a8053621ce --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_in_build_requirements.snap @@ -0,0 +1,31 @@ +--- +source: crates/pixi-build-cmake/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: + - "${{ compiler('cxx') }}" + - cmake + - ninja + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_not_added_if_gcc_is_already_present.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_not_added_if_gcc_is_already_present.snap new file mode 100644 index 0000000000..1fab70f078 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__cxx_is_not_added_if_gcc_is_already_present.snap @@ -0,0 +1,30 @@ +--- +source: crates/pixi-build-cmake/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: + - gxx + - cmake + - ninja + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__env_vars_are_set.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__env_vars_are_set.snap new file mode 100644 index 0000000000..1b45337479 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__env_vars_are_set.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi-build-cmake/src/main.rs +expression: generated_recipe.recipe.build.script +--- +content: "[ ... script ... ]" +env: + foo: bar +secrets: [] diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__has_python_is_set_in_build_script.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__has_python_is_set_in_build_script.snap new file mode 100644 index 0000000000..44093b3a86 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__has_python_is_set_in_build_script.snap @@ -0,0 +1,9 @@ +--- +source: crates/pixi-build-cmake/src/main.rs +expression: generated_recipe.recipe.build +--- +number: ~ +script: + content: "[content]" + env: {} + secrets: [] diff --git a/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__input_globs_includes_extra_globs.snap b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__input_globs_includes_extra_globs.snap new file mode 100644 index 0000000000..e0c6809a07 --- /dev/null +++ b/crates/pixi-build-cmake/src/snapshots/pixi_build_cmake__tests__input_globs_includes_extra_globs.snap @@ -0,0 +1,12 @@ +--- +source: crates/pixi-build-cmake/src/main.rs +expression: result +--- +Ok( + { + "**/*.{c,cc,cxx,cpp,h,hpp,hxx}", + "**/*.{cmake,cmake.in}", + "**/CMakeFiles.txt", + "custom/*.c", + }, +) diff --git a/crates/pixi-build-mojo/Cargo.toml b/crates/pixi-build-mojo/Cargo.toml new file mode 100644 index 0000000000..7136e14e9b --- /dev/null +++ b/crates/pixi-build-mojo/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "pixi-build-mojo" +version = "0.1.7" +edition.workspace = true + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] + +[dependencies] +async-trait = { workspace = true } +indexmap = { workspace = true } +miette = { workspace = true } +minijinja = { workspace = true } +rattler_conda_types = { workspace = true } +rattler-build = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tempfile = { workspace = true } +tokio = { workspace = true, features = ["macros"] } + +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } + +recipe-stage0 = { workspace = true } + +[dev-dependencies] +insta = { workspace = true, features = ["yaml", "redactions", "filters"] } +rstest = { workspace = true } diff --git a/crates/pixi-build-mojo/pixi.toml b/crates/pixi-build-mojo/pixi.toml new file mode 100644 index 0000000000..db392f4861 --- /dev/null +++ b/crates/pixi-build-mojo/pixi.toml @@ -0,0 +1,10 @@ +[package.build.backend] +name = "pixi-build-rust" +version = "*" +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[package.run-dependencies] +pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-mojo/src/build_script.j2 b/crates/pixi-build-mojo/src/build_script.j2 new file mode 100644 index 0000000000..a6109e4c25 --- /dev/null +++ b/crates/pixi-build-mojo/src/build_script.j2 @@ -0,0 +1,22 @@ +{%- set is_cmd_exe = build_platform == "windows" -%} +{%- macro env(key) -%} +{%- if is_cmd_exe %}{{ "%" ~ key ~ "%" }}{% else %}{{ "$" ~key }}{% endif -%} +{% endmacro -%} + +{# - Set up common variables -#} +{%- set library_prefix = "%LIBRARY_PREFIX%" if build_platform == "windows" else "$PREFIX" -%} + +mojo --version + + +{#- Build any binaries -#} +{% if bins %} +{% for bin in bins %} +mojo build {{ bin.extra_args | join(" ") }} {{ bin.path }} -o {{ library_prefix }}/bin/{{ bin.name }} +{% endfor %} +{% endif %} + +{#- Build pkg -#} +{% if pkg %} +mojo package {{ pkg.extra_args | join(" ") }} {{ pkg.path }} -o {{ library_prefix }}/lib/mojo/{{ pkg.name}}.mojopkg +{% endif %} diff --git a/crates/pixi-build-mojo/src/build_script.rs b/crates/pixi-build-mojo/src/build_script.rs new file mode 100644 index 0000000000..0b6ebdf9b0 --- /dev/null +++ b/crates/pixi-build-mojo/src/build_script.rs @@ -0,0 +1,23 @@ +use super::config::{MojoBinConfig, MojoPkgConfig}; +use minijinja::Environment; +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct BuildScriptContext { + /// The directory where the source code is located, the manifest root. + pub source_dir: String, + /// Any executable artifacts to create. + pub bins: Option>, + /// Any packages to create. + pub pkg: Option, +} + +impl BuildScriptContext { + pub fn render(&self) -> String { + let env = Environment::new(); + let template = env + .template_from_str(include_str!("build_script.j2")) + .unwrap(); + template.render(self).unwrap().trim().to_string() + } +} diff --git a/crates/pixi-build-mojo/src/config.rs b/crates/pixi-build-mojo/src/config.rs new file mode 100644 index 0000000000..458c0aec60 --- /dev/null +++ b/crates/pixi-build-mojo/src/config.rs @@ -0,0 +1,695 @@ +use std::{ + collections::{HashMap, HashSet}, + path::{Path, PathBuf}, +}; + +use indexmap::IndexMap; +use miette::Error; +use pixi_build_backend::generated_recipe::BackendConfig; +use serde::{Deserialize, Serialize}; + +/// Top level config struct for the Mojo backend. +#[derive(Debug, Default, Deserialize, Clone)] +#[serde(rename_all = "kebab-case")] +pub struct MojoBackendConfig { + /// Environment Variables + #[serde(default)] + pub env: IndexMap, + + /// Dir that can be specified for outputting pixi debug state. + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + + /// Extra input globs to include in addition to the default ones. + #[serde(default)] + pub extra_input_globs: Vec, + + /// Binary executables to produce. + pub bins: Option>, + + /// Packages to produce. + pub pkg: Option, + + /// List of compilers to use (e.g., ["mojo", "c", "cxx"]) + /// If not specified, defaults to ["mojo"] + pub compilers: Option>, +} + +impl BackendConfig for MojoBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values override base values using the following rules: + /// + /// - env: Platform env vars override base, others merge + /// - debug_dir: Not allowed to have target specific value + /// - extra_input_globs: Platform-specific completely replaces base + /// - bins: Any bins with matching not-None names will be merged, + /// Any set-settings on the platform specific pkg override base + /// Any bins found only in target_config will be kept + /// - pkg: Any set-settings on the platform specific pkg override base + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + let pkg = if target_config.pkg.is_some() { + if self.pkg.is_some() { + Some( + self.pkg + .as_ref() + .unwrap() + .merge_with_target_config(target_config.pkg.as_ref().unwrap())?, + ) + } else { + target_config.pkg.clone() + } + } else { + self.pkg.clone() + }; + + let bins = if target_config.bins.is_some() { + if self.bins.is_some() { + // Both base and target have binaries configured + // Override base with anything found in both target and base. + // If something is found only in base, drop it. + // If something is found only in target, drop it. + let base_bins: HashMap<_, _> = self + .bins + .as_ref() + .unwrap() + .iter() + .filter(|p| p.name.is_some()) + .map(|p| (p.name.clone().unwrap(), p.clone())) + .collect(); + + Some( + target_config + .bins + .as_ref() + .unwrap() + .iter() + .map(|p| match p.name.as_ref() { + Some(name) => { + if let Some(base_bin) = base_bins.get(name) { + base_bin.merge_with_target_config(p) + } else { + Ok(p.clone()) + } + } + None => Ok(p.clone()), + }) + .collect::>()?, + ) + } else { + target_config.bins.clone() + } + } else { + self.bins.clone() + }; + + Ok(Self { + env: { + let mut merged_env = self.env.clone(); + merged_env.extend(target_config.env.clone()); + merged_env + }, + debug_dir: self.debug_dir.clone(), + extra_input_globs: if target_config.extra_input_globs.is_empty() { + self.extra_input_globs.clone() + } else { + target_config.extra_input_globs.clone() + }, + bins, + pkg, + compilers: target_config + .compilers + .clone() + .or_else(|| self.compilers.clone()), + }) + } +} + +impl MojoBackendConfig { + /// Auto-derive the bins and pkg config if they have not been specified by the user, + /// or if they have only been partially specified. + /// + /// See [`MojoPkgConfig`] and [`MojoBinConfig`] for details on how they are derived. + /// The following rules are applied for choosing when to use derived configs: + /// + /// - If a `pkg` has been specified by user, don't derive `bins` + /// - If a `bin` has been specified by user, don't derive `pkg` + /// - If both a `pkg` and `bin` have been auto-derived, only keep the `bin` + pub fn auto_derive( + &self, + manifest_root: &Path, + project_name: &str, + ) -> miette::Result<(Option>, Option)> { + // Update bins configs + let (mut bins, bin_autodetected) = + MojoBinConfig::auto_derive(self.bins.as_ref(), manifest_root, project_name)?; + + // Update pkg config + let (mut pkg, pkg_autodetected) = + MojoPkgConfig::auto_derive(self.pkg.as_ref(), manifest_root, project_name)?; + + // Make sure we have at least one of the two + if bins.is_none() && pkg.is_none() { + return Err(Error::msg("No bin or pkg configuration detected.")); + } + + // If we are auto-generating both, keep only the bin + if bin_autodetected && pkg_autodetected { + pkg = None; + } + // If either wasn't auto-detected, disable auto-detection of the other + else if bin_autodetected && (!pkg_autodetected && pkg.is_some()) { + // If I'm publishing a pkg, I may not want to also publish a bin + bins = None + } else if (!bin_autodetected && bins.is_some()) && pkg_autodetected { + // If I'm publishing a bin, I may not want to publish the associated pkg + pkg = None + } + + Ok((bins, pkg)) + } +} + +/// Config object for a Mojo binary. +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct MojoBinConfig { + /// Name of the binary. + /// + /// This will default to the name of the project for the first + /// binary selected, any dashes will be replaced with `_`. + pub name: Option, + + /// Path to file that has the `main` method. + /// + /// This will default to looking for a `main.mojo` file in: + /// - `/main.mojo` + pub path: Option, + + /// Extra args to pass to the compiler. + #[serde(default, rename(serialize = "extra_args"))] + pub extra_args: Option>, +} + +impl MojoBinConfig { + /// Fill in any missing info and or try to find our default options. + /// + /// - If None, try to find a `main.mojo` file in manifest_root + /// - If any, for the first one, see if name or path need to be filled in + /// - If any, verify that there are no name collisions + pub fn auto_derive( + conf: Option<&Vec>, + manifest_root: &Path, + project_name: &str, + ) -> miette::Result<(Option>, bool)> { + let main = Self::find_main(manifest_root).map(|p| p.display().to_string()); + + // No configuration specified + if conf.is_none() { + if let Some(main) = main { + return Ok(( + Some(vec![Self { + name: Some(project_name.to_owned()), + path: Some(main), + ..Default::default() + }]), + true, + )); + } else { + return Ok((None, false)); + } + } + + // Some configuration specified + let mut conf = conf.unwrap().clone(); // checked above + if conf.is_empty() { + return Ok((None, false)); + } + + if conf[0].name.is_none() { + conf[0].name = Some(project_name.to_owned()); + } + if conf[0].path.is_none() { + if main.is_none() { + return Err(Error::msg("Could not find main.mojo for configured binary")); + } + conf[0].path = main; + } + + // Verify no name collisions and that the rest of the binaries have a name and path + let mut names = HashSet::new(); + for (i, c) in conf.iter().enumerate() { + if c.name.is_none() { + return Err(Error::msg(format!( + "Binary configuration {} is missing a name.", + i + 1 + ))); + } + if c.path.is_none() { + return Err(Error::msg(format!( + "Binary configuration {} is missing a path.", + c.name.as_ref().unwrap(), + ))); + } + if names.contains(c.name.as_deref().unwrap()) { + return Err(Error::msg(format!( + "Binary name has been used twice: {}", + c.name.as_ref().unwrap() + ))); + } + + names.insert(c.name.clone().unwrap()); + } + + Ok((Some(conf), false)) + } + + /// Try to find main.mojo in: + /// - /main.mojo + fn find_main(root: &Path) -> Option { + let mut path = root.join("main"); + for ext in ["mojo", "🔥"] { + path.set_extension(ext); + if path.exists() { + return Some(path); + } + } + None + } + + /// Merge with a target-specific configuration. + /// + /// All target-settings that are not None will override base. + /// + /// **Note** bins must have the same name to be merged. + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if self.name.is_some() && target_config.name.is_some() { + if self.name.as_ref().unwrap() != target_config.name.as_ref().unwrap() { + miette::bail!("Both bins must have a set name to be merged"); + } + } else { + miette::bail!("Both bins must have a set name to be merged"); + } + + let path = if target_config.path.is_some() { + target_config.path.clone() + } else { + self.path.clone() + }; + + let extra_args = if target_config.extra_args.is_some() { + target_config.extra_args.clone() + } else { + self.extra_args.clone() + }; + + Ok(Self { + name: self.name.clone(), + path, + extra_args, + }) + } +} + +/// Config object for a Mojo package. +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct MojoPkgConfig { + /// Name to give the mojo package (.mojopkg suffix will be added). + /// + /// This will default to the name of the project, any dashes will + /// be replaced with `_`. + pub name: Option, + + /// Path to the directory that constitutes the package. + /// + /// This will default to lookingo for a folder with an `__init__.mojo` in + /// in the following order: + /// - `//__init__.mojo` + /// - `/src/__init__.mojo` + pub path: Option, + + /// Extra args to pass to the compiler. + #[serde(default, rename(serialize = "extra_args"))] + pub extra_args: Option>, +} + +impl MojoPkgConfig { + /// Fill in any missing info anod or try to find our default options. + /// + /// - If None, try to find a `` or `src` dir with an `__init__.mojo` file in it. + /// - If Some, see if name or path need to be filled in. + pub fn auto_derive( + conf: Option<&Self>, + manifest_root: &Path, + package_name: &str, + ) -> miette::Result<(Option, bool)> { + if let Some(conf) = conf { + // A conf was given, make sure it has a name and path + let mut conf = conf.clone(); + if conf.name.is_none() { + conf.name = Some(package_name.to_owned()); + } + + let path = Self::find_init_parent(manifest_root, package_name); + if conf.path.is_none() { + if path.is_none() { + return Err(Error::msg(format!( + "Could not find valid package path for {}", + conf.name.unwrap() + ))); + } + conf.path = path.map(|p| p.display().to_string()); + } + Ok((Some(conf), false)) + } else { + // No conf given check if we can find a valid package + let path = Self::find_init_parent(manifest_root, package_name); + if path.is_none() { + return Ok((None, false)); + } + Ok(( + Some(Self { + name: Some(package_name.to_owned()), + path: path.map(|p| p.display().to_string()), + ..Default::default() + }), + true, + )) + } + } + + /// Find the parent directory of a possible package `__init__.mojo` file. + /// + /// This checks (in this order): + /// - `` + /// - src + /// + /// and returns the first one found. + fn find_init_parent(root: &Path, project_name: &str) -> Option { + for dir in [project_name, "src"] { + let mut path = root.join(dir).join("__init__"); + for ext in ["mojo", "🔥"] { + path.set_extension(ext); + if path.exists() { + return Some(root.join(dir)); + } + } + } + None + } + + /// Merge with a target-specific configuration. + /// + /// All target-settings that are not None will override base. + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + let name = if target_config.name.is_some() { + target_config.name.clone() + } else { + self.name.clone() + }; + + let path = if target_config.path.is_some() { + target_config.path.clone() + } else { + self.path.clone() + }; + + let extra_args = if target_config.extra_args.is_some() { + target_config.extra_args.clone() + } else { + self.extra_args.clone() + }; + + Ok(Self { + name, + path, + extra_args, + }) + } +} + +/// Clean the package name for use in [`MojoPkgConfig`] and [`MojoBinconfig`]. +/// +/// This just entails converting - to _. +pub fn clean_project_name(s: &str) -> String { + s.to_owned().replace("-", "_") +} + +#[cfg(test)] +mod tests { + use rstest::rstest; + use serde_json::json; + use tempfile::TempDir; + + use super::*; + + #[test] + fn test_ensure_deseralize_from_empty() { + let json_data = json!({}); + serde_json::from_value::(json_data).unwrap(); + } + + #[derive(Debug)] + enum ExpectedBinResult { + /// A possible binary name that would be found, as well as whether or not + /// it was auto-detected, or whether it was found via user configuration. + Success { + binary_name: Option<&'static str>, + autodetected: bool, + }, + /// There was some misconfiguration resulting in an error to show the user. + Error(&'static str), + } + + struct BinTestCase { + /// User specified config. + config: Option>, + /// Path to a project `main.mojo` file to be created in a temp dir. + main_file: Option<&'static str>, + /// The expected result of the test. + expected: ExpectedBinResult, + } + + #[rstest] + #[case::no_config_no_main(BinTestCase { + config: None, + main_file: None, + expected: ExpectedBinResult::Success { binary_name: None, autodetected: false } + })] + #[case::no_config_with_main_mojo(BinTestCase { + config: None, + main_file: Some("main.mojo"), + expected: ExpectedBinResult::Success { binary_name: Some("test_project"), autodetected: true } + })] + #[case::no_config_with_main_fire(BinTestCase { + config: None, + main_file: Some("main.🔥"), + expected: ExpectedBinResult::Success { binary_name: Some("test_project"), autodetected: true } + })] + #[case::empty_config(BinTestCase { + config: Some(vec![]), + main_file: None, + expected: ExpectedBinResult::Success { binary_name: None, autodetected: false } + })] + #[case::config_missing_name_and_path(BinTestCase { + config: Some(vec![MojoBinConfig::default()]), + main_file: Some("main.mojo"), + expected: ExpectedBinResult::Success { binary_name: Some("test_project"), autodetected: false } + })] + #[case::config_missing_path_no_main(BinTestCase { + config: Some(vec![MojoBinConfig::default()]), + main_file: None, + expected: ExpectedBinResult::Error("Could not find main.mojo for configured binary") + })] + #[case::multiple_bins_missing_name(BinTestCase { + config: Some(vec![ + MojoBinConfig { name: Some("bin1".to_string()), path: Some("main1.mojo".to_string()), ..Default::default() }, + MojoBinConfig { path: Some("main2.mojo".to_string()), ..Default::default() }, + ]), + main_file: None, + expected: ExpectedBinResult::Error("Binary configuration 2 is missing a name.") + })] + #[case::multiple_bins_missing_path(BinTestCase { + config: Some(vec![ + MojoBinConfig { name: Some("bin1".to_string()), path: Some("main1.mojo".to_string()), ..Default::default() }, + MojoBinConfig { name: Some("bin2".to_string()), ..Default::default() }, + ]), + main_file: None, + expected: ExpectedBinResult::Error("Binary configuration bin2 is missing a path.") + })] + #[case::duplicate_names(BinTestCase { + config: Some(vec![ + MojoBinConfig { name: Some("mybin".to_string()), path: Some("main1.mojo".to_string()), ..Default::default() }, + MojoBinConfig { name: Some("mybin".to_string()), path: Some("main2.mojo".to_string()), ..Default::default() }, + ]), + main_file: None, + expected: ExpectedBinResult::Error("Binary name has been used twice: mybin") + })] + fn test_mojo_bin_config_fill_defaults(#[case] test_case: BinTestCase) { + let temp = TempDir::new().unwrap(); + let manifest_root = temp.path().to_path_buf(); + + // Write the main.mojo file specified by test case, if present + if let Some(filename) = test_case.main_file { + std::fs::write(manifest_root.join(filename), "def main():\n pass").unwrap(); + } + + let result = + MojoBinConfig::auto_derive(test_case.config.as_ref(), &manifest_root, "test_project"); + + match test_case.expected { + ExpectedBinResult::Success { + binary_name: expected_name, + autodetected: expected_autodetected, + } => { + let (bins, autodetected) = result.unwrap(); + assert_eq!(autodetected, expected_autodetected); + + if let Some(expected_name) = expected_name { + assert!(bins.is_some()); + let bins = bins.unwrap(); + assert_eq!(bins.len(), 1); + assert_eq!(bins[0].name, Some(expected_name.to_string())); + if let Some(filename) = test_case.main_file { + assert_eq!( + bins[0].path, + Some(manifest_root.join(filename).display().to_string()) + ); + } + } else { + assert_eq!(bins, None); + } + } + ExpectedBinResult::Error(expected_error) => { + assert!(result.is_err()); + assert_eq!(result.unwrap_err().to_string(), expected_error); + } + } + } + + #[derive(Debug)] + enum ExpectedPkgResult { + /// A possible pkg name that would be found, as well as whether or not + /// it was auto-detected, or whether it was found via user configuration. + Success { + name: Option<&'static str>, + autodetected: bool, + }, + /// An expected error message that the user would be shown. + Error(&'static str), + } + + struct PkgTestCase { + /// User defined config for the pkg + config: Option, + /// Path to a `__init__.mojo` file to be created in a temp dir. + init_file: Option<(&'static str, &'static str)>, // (directory, filename) + /// Expected result of the test. + expected: ExpectedPkgResult, + } + + #[rstest] + #[case::no_config_no_init(PkgTestCase { + config: None, + init_file: None, + expected: ExpectedPkgResult::Success { name: None, autodetected: false } + })] + #[case::no_config_with_init_in_project_dir(PkgTestCase { + config: None, + init_file: Some(("test_project", "__init__.mojo")), + expected: ExpectedPkgResult::Success { name: Some("test_project"), autodetected: true } + })] + #[case::no_config_with_init_in_src(PkgTestCase { + config: None, + init_file: Some(("src", "__init__.mojo")), + expected: ExpectedPkgResult::Success { name: Some("test_project"), autodetected: true } + })] + #[case::no_config_with_init_fire_emoji(PkgTestCase { + config: None, + init_file: Some(("src", "__init__.🔥")), + expected: ExpectedPkgResult::Success { name: Some("test_project"), autodetected: true } + })] + #[case::config_missing_name_and_path(PkgTestCase { + config: Some(MojoPkgConfig::default()), + init_file: Some(("src", "__init__.mojo")), + expected: ExpectedPkgResult::Success { name: Some("test_project"), autodetected: false } + })] + #[case::config_with_all_fields(PkgTestCase { + config: Some(MojoPkgConfig { + name: Some("mypackage".to_string()), + path: Some("custom/path".to_string()), + extra_args: Some(vec!["-O3".to_string()]), + }), + init_file: None, + expected: ExpectedPkgResult::Success { name: Some("mypackage"), autodetected: false } + })] + #[case::config_missing_path_no_init(PkgTestCase { + config: Some(MojoPkgConfig::default()), + init_file: None, + expected: ExpectedPkgResult::Error("Could not find valid package path for test_project") + })] + fn test_mojo_pkg_config_fill_defaults(#[case] test_case: PkgTestCase) { + let temp = TempDir::new().unwrap(); + let manifest_root = temp.path().to_path_buf(); + + if let Some((dir, filename)) = test_case.init_file { + let init_dir = manifest_root.join(dir); + std::fs::create_dir_all(&init_dir).unwrap(); + std::fs::write(init_dir.join(filename), "").unwrap(); + } + + let result = + MojoPkgConfig::auto_derive(test_case.config.as_ref(), &manifest_root, "test_project"); + + match test_case.expected { + ExpectedPkgResult::Success { + name: expected_name, + autodetected: expected_autodetected, + } => { + let (pkg, autodetected) = result.unwrap(); + assert_eq!(autodetected, expected_autodetected); + + if let Some(expected_name) = expected_name { + assert!(pkg.is_some()); + let pkg = pkg.unwrap(); + assert_eq!(pkg.name, Some(expected_name.to_string())); + + // For the custom config case, check the custom path and args + if expected_name == "mypackage" { + assert_eq!(pkg.path, Some("custom/path".to_string())); + assert_eq!(pkg.extra_args, Some(vec!["-O3".to_string()])); + } else if let Some((dir, _)) = test_case.init_file { + assert_eq!( + pkg.path, + Some(manifest_root.join(dir).display().to_string()) + ); + } + } else { + assert_eq!(pkg, None); + } + } + ExpectedPkgResult::Error(expected_error) => { + assert!(result.is_err()); + assert_eq!(result.unwrap_err().to_string(), expected_error); + } + } + } + + #[rstest] + #[case("my-project", "my_project")] + #[case("test_project", "test_project")] + #[case("some-complex-name", "some_complex_name")] + #[case("nodashes", "nodashes")] + #[case("multiple-dashes-here", "multiple_dashes_here")] + fn test_clean_project_name(#[case] input: &str, #[case] expected: &str) { + assert_eq!(clean_project_name(input), expected); + } +} diff --git a/crates/pixi-build-mojo/src/main.rs b/crates/pixi-build-mojo/src/main.rs new file mode 100644 index 0000000000..d1fafc6db3 --- /dev/null +++ b/crates/pixi-build-mojo/src/main.rs @@ -0,0 +1,643 @@ +mod build_script; +mod config; + +use build_script::BuildScriptContext; +use config::{MojoBackendConfig, clean_project_name}; +use miette::{Error, IntoDiagnostic}; +use pixi_build_backend::generated_recipe::DefaultMetadataProvider; +use pixi_build_backend::{ + generated_recipe::{GenerateRecipe, GeneratedRecipe, PythonParams}, + intermediate_backend::IntermediateBackendInstantiator, + traits::ProjectModel, +}; +use rattler_build::{NormalizedKey, recipe::variable::Variable}; +use rattler_conda_types::{ChannelUrl, Platform}; +use recipe_stage0::recipe::Script; +use std::collections::HashSet; +use std::path::PathBuf; +use std::{ + collections::{BTreeMap, BTreeSet}, + path::Path, + sync::Arc, +}; + +#[derive(Default, Clone)] +pub struct MojoGenerator {} + +#[async_trait::async_trait] +impl GenerateRecipe for MojoGenerator { + type Config = MojoBackendConfig; + + async fn generate_recipe( + &self, + model: &pixi_build_types::ProjectModel, + config: &Self::Config, + manifest_path: PathBuf, + host_platform: Platform, + _python_params: Option, + variants: &HashSet, + _channels: Vec, + _cache_dir: Option, + ) -> miette::Result { + // Determine the manifest root, because `manifest_path` can be + // either a direct file path or a directory path. + let manifest_root = if manifest_path.is_file() { + manifest_path + .parent() + .ok_or_else(|| { + miette::Error::msg(format!( + "Manifest path {} is a file but has no parent directory.", + manifest_path.display() + )) + })? + .to_path_buf() + } else { + manifest_path.clone() + }; + + let mut generated_recipe = + GeneratedRecipe::from_model(model.clone(), &mut DefaultMetadataProvider) + .into_diagnostic()?; + + let cleaned_project_name = clean_project_name( + generated_recipe + .recipe + .package + .name + .concrete() + .ok_or(Error::msg("Package is missing a name"))?, + ); + + // Auto-derive bins and pkg fields/configs if needed + let (bins, pkg) = config.auto_derive(&manifest_root, &cleaned_project_name)?; + + // Add compiler + let requirements = &mut generated_recipe.recipe.requirements; + + // Get the platform-specific dependencies from the project model. + // This properly handles target selectors like [target.linux-64] by using + // the ProjectModel trait's platform-aware API instead of trying to evaluate + // rattler-build selectors with simple string comparison. + let model_dependencies = model.dependencies(Some(host_platform)); + + let compilers = config.compilers.clone().unwrap_or_default(); + + pixi_build_backend::compilers::add_compilers_to_requirements( + &compilers, + &mut requirements.build, + &model_dependencies, + &host_platform, + ); + pixi_build_backend::compilers::add_stdlib_to_requirements( + &compilers, + &mut requirements.build, + variants, + ); + + let build_script = BuildScriptContext { + source_dir: manifest_root.display().to_string(), + bins, + pkg, + } + .render(); + + generated_recipe.recipe.build.script = Script { + content: build_script, + env: config.env.clone(), + ..Default::default() + }; + + generated_recipe.build_input_globs = Self::globs().collect::>(); + + Ok(generated_recipe) + } + + fn extract_input_globs_from_build( + &self, + config: &Self::Config, + _workdir: impl AsRef, + _editable: bool, + ) -> miette::Result> { + Ok(Self::globs() + .chain(config.extra_input_globs.clone()) + .collect()) + } + + fn default_variants( + &self, + host_platform: Platform, + ) -> miette::Result>> { + let mut variants = BTreeMap::new(); + + if host_platform.is_windows() { + // Default to the Visual Studio 2022 compiler on Windows + // Not 2019 due to Conda-forge switching and the mainstream support dropping in 2024. + // rattler-build will default to vs2017 which for most github runners is too + // old. + variants.insert(NormalizedKey::from("c_compiler"), vec!["vs2022".into()]); + variants.insert(NormalizedKey::from("cxx_compiler"), vec!["vs2022".into()]); + } + + Ok(variants) + } +} + +impl MojoGenerator { + fn globs() -> impl Iterator { + [ + // Source files + "**/*.{mojo,🔥}", + ] + .iter() + .map(|s: &&str| s.to_string()) + } +} + +#[tokio::main] +pub async fn main() { + if let Err(err) = pixi_build_backend::cli::main(|log| { + IntermediateBackendInstantiator::::new(log, Arc::default()) + }) + .await + { + eprintln!("{err:?}"); + std::process::exit(1); + } +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use crate::config::{MojoBinConfig, MojoPkgConfig}; + use indexmap::IndexMap; + use recipe_stage0::recipe::{Item, Value}; + + use super::*; + + #[test] + fn test_input_globs_includes_extra_globs() { + let config = MojoBackendConfig { + extra_input_globs: vec![String::from("**/.c")], + ..Default::default() + }; + + let generator = MojoGenerator::default(); + + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + + insta::assert_debug_snapshot!(result); + } + + #[macro_export] + macro_rules! project_fixture { + ($($json:tt)+) => { + serde_json::from_value::( + serde_json::json!($($json)+) + ).expect("Failed to create TestProjectModel from JSON fixture.") + }; + } + + #[tokio::test] + async fn test_mojo_bin_is_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + bins: Some(vec![MojoBinConfig { + name: Some(String::from("example")), + path: Some(String::from("./main.mojo")), + extra_args: Some(vec![String::from("-I"), String::from(".")]), + }]), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + }); + } + + #[tokio::test] + async fn test_mojo_pkg_is_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + bins: Some(vec![MojoBinConfig { + name: Some(String::from("example")), + path: Some(String::from("./main.mojo")), + extra_args: Some(vec![String::from("-i"), String::from(".")]), + }]), + pkg: Some(MojoPkgConfig { + name: Some(String::from("lib")), + path: Some(String::from("mylib")), + extra_args: Some(vec![String::from("-i"), String::from(".")]), + }), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + }); + } + + #[tokio::test] + async fn test_compiler_is_in_build_requirements() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig::default(), + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_env_vars_are_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let env = IndexMap::from([("foo".to_string(), "bar".to_string())]); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + env: env.clone(), + ..Default::default() + }, + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe.build.script, + { + ".content" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_compiler_is_not_added_if_compiler_is_already_present() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + }, + "buildDependencies": { + "mojo-compiler": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig::default(), + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_mojo_with_additional_compilers() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + compilers: Some(vec!["c".to_string(), "cxx".to_string()]), + ..Default::default() + }, + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have both the mojo-compiler package and the additional compilers + let build_reqs = &generated_recipe.recipe.requirements.build; + + // Check for additional compiler templates + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly two additional compilers (c and cxx, but not mojo template) + assert_eq!( + compiler_templates.len(), + 2, + "Should have exactly two additional compilers" + ); + + // Check we have the expected additional compilers + assert!( + compiler_templates.contains(&"${{ compiler('c') }}".to_string()), + "C compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cxx') }}".to_string()), + "C++ compiler should be in build requirements" + ); + + // Ensure we don't have a mojo template (since mojo uses special package) + assert!( + !compiler_templates.contains(&"${{ compiler('mojo') }}".to_string()), + "Should not have mojo compiler template since it uses special package" + ); + } + + #[tokio::test] + async fn test_default_mojo_compiler_behavior() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + compilers: None, + ..Default::default() + }, + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have only the mojo-compiler package by default + let build_reqs = &generated_recipe.recipe.requirements.build; + + // Check that no additional compiler templates are present + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have no additional compiler templates by default + assert_eq!( + compiler_templates.len(), + 0, + "Should have no additional compiler templates by default" + ); + } + + #[tokio::test] + async fn test_opt_out_of_mojo_compiler() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + // Create a temporary directory with a main.mojo file so the test has something to build + let temp = tempfile::TempDir::new().unwrap(); + std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + + let generated_recipe = MojoGenerator::default() + .generate_recipe( + &project_model, + &MojoBackendConfig { + compilers: Some(vec!["c".to_string(), "cxx".to_string()]), + ..Default::default() + }, + temp.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that mojo-compiler is NOT present when user opts out + let build_reqs = &generated_recipe.recipe.requirements.build; + + // Check for mojo-compiler package (should NOT be present) + let has_mojo_compiler = build_reqs + .iter() + .any(|item| format!("{item:?}").contains("mojo-compiler")); + assert!( + !has_mojo_compiler, + "Should NOT have mojo-compiler package when user opts out" + ); + + // Check for other compiler templates + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly two compilers (c and cxx) + assert_eq!( + compiler_templates.len(), + 2, + "Should have exactly two compilers when opting out of mojo" + ); + + // Check we have the expected compilers + assert!( + compiler_templates.contains(&"${{ compiler('c') }}".to_string()), + "C compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cxx') }}".to_string()), + "C++ compiler should be in build requirements" + ); + } +} diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_in_build_requirements.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_in_build_requirements.snap new file mode 100644 index 0000000000..c8a4aabc1f --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_in_build_requirements.snap @@ -0,0 +1,28 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: [] + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_not_added_if_compiler_is_already_present.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_not_added_if_compiler_is_already_present.snap new file mode 100644 index 0000000000..d324462aed --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__compiler_is_not_added_if_compiler_is_already_present.snap @@ -0,0 +1,29 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: + - mojo-compiler + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__env_vars_are_set.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__env_vars_are_set.snap new file mode 100644 index 0000000000..d8a411207e --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__env_vars_are_set.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: generated_recipe.recipe.build.script +--- +content: "[ ... script ... ]" +env: + foo: bar +secrets: [] diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__input_globs_includes_extra_globs.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__input_globs_includes_extra_globs.snap new file mode 100644 index 0000000000..e0b2223470 --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__input_globs_includes_extra_globs.snap @@ -0,0 +1,10 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: result +--- +Ok( + { + "**/*.{mojo,🔥}", + "**/.c", + }, +) diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_bin_is_set.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_bin_is_set.snap new file mode 100644 index 0000000000..f77db32a88 --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_bin_is_set.snap @@ -0,0 +1,31 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: + content: "mojo --version\n\nmojo build -I . ./main.mojo -o $PREFIX/bin/example" + env: {} + secrets: [] +requirements: + build: [] + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_pkg_is_set.snap b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_pkg_is_set.snap new file mode 100644 index 0000000000..9600ba90ab --- /dev/null +++ b/crates/pixi-build-mojo/src/snapshots/pixi_build_mojo__tests__mojo_pkg_is_set.snap @@ -0,0 +1,31 @@ +--- +source: crates/pixi-build-mojo/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: + content: "mojo --version\n\nmojo build -i . ./main.mojo -o $PREFIX/bin/example\n\n\nmojo package -i . mylib -o $PREFIX/lib/mojo/lib.mojopkg" + env: {} + secrets: [] +requirements: + build: [] + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-python/Cargo.toml b/crates/pixi-build-python/Cargo.toml new file mode 100644 index 0000000000..8978114d4c --- /dev/null +++ b/crates/pixi-build-python/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "pixi-build-python" +version = "0.4.4" +edition.workspace = true + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls"] + +[dependencies] +async-trait = { workspace = true } +indexmap = { workspace = true } +miette = { workspace = true } +minijinja = { workspace = true } +rattler_conda_types = { workspace = true } +reqwest = { workspace = true, features = ["json"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +toml = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +tracing = { workspace = true } +pyproject-toml = { workspace = true } +pep508_rs = { workspace = true } +fs-err = { workspace = true } +once_cell = { workspace = true } +thiserror = { workspace = true } +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } +recipe-stage0 = { workspace = true } +spdx = { workspace = true } + +[dev-dependencies] +insta = { workspace = true, features = ["yaml", "redactions", "filters"] } +serde_json = { workspace = true } +tempfile = { workspace = true } +url = { workspace = true } diff --git a/crates/pixi-build-python/debug/recipe.yaml b/crates/pixi-build-python/debug/recipe.yaml new file mode 100644 index 0000000000..2b78d5a5d8 --- /dev/null +++ b/crates/pixi-build-python/debug/recipe.yaml @@ -0,0 +1,36 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + "$PYTHON" -m pip install --ignore-installed -vv \ + --no-deps \ + --no-build-isolation \ + \ + /tmp/.tmpwgH1t3 + env: {} + secrets: [] + noarch: python +requirements: + build: + - boltons + host: + - pip + - python + run: + - python + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml b/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml new file mode 100644 index 0000000000..2b78d5a5d8 --- /dev/null +++ b/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml @@ -0,0 +1,36 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + "$PYTHON" -m pip install --ignore-installed -vv \ + --no-deps \ + --no-build-isolation \ + \ + /tmp/.tmpwgH1t3 + env: {} + secrets: [] + noarch: python +requirements: + build: + - boltons + host: + - pip + - python + run: + - python + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-python/debug/recipe/a048693/variants.yaml b/crates/pixi-build-python/debug/recipe/a048693/variants.yaml new file mode 100644 index 0000000000..15bac2d170 --- /dev/null +++ b/crates/pixi-build-python/debug/recipe/a048693/variants.yaml @@ -0,0 +1,2 @@ +boltons: ==2.0.0 +target_platform: noarch diff --git a/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml b/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml new file mode 100644 index 0000000000..beeef268d3 --- /dev/null +++ b/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml @@ -0,0 +1,36 @@ +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: null + script: + content: |- + "$PYTHON" -m pip install --ignore-installed -vv \ + --no-deps \ + --no-build-isolation \ + \ + /tmp/.tmpvnqpYq + env: {} + secrets: [] + noarch: python +requirements: + build: + - boltons + host: + - pip + - python + run: + - python + run_constraints: [] +tests: [] +about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null +extra: null diff --git a/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml b/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml new file mode 100644 index 0000000000..9fe671617d --- /dev/null +++ b/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml @@ -0,0 +1,2 @@ +boltons: ==1.0.0 +target_platform: noarch diff --git a/crates/pixi-build-python/debug/variants.yaml b/crates/pixi-build-python/debug/variants.yaml new file mode 100644 index 0000000000..3c9181080d --- /dev/null +++ b/crates/pixi-build-python/debug/variants.yaml @@ -0,0 +1,8 @@ +pin_run_as_build: null +zip_keys: null +boltons: +- ==2.0.0 +build_platform: +- linux-64 +target_platform: +- linux-64 diff --git a/crates/pixi-build-python/pixi.toml b/crates/pixi-build-python/pixi.toml new file mode 100644 index 0000000000..db392f4861 --- /dev/null +++ b/crates/pixi-build-python/pixi.toml @@ -0,0 +1,10 @@ +[package.build.backend] +name = "pixi-build-rust" +version = "*" +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[package.run-dependencies] +pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-python/src/build_script.j2 b/crates/pixi-build-python/src/build_script.j2 new file mode 100644 index 0000000000..d26b2438ba --- /dev/null +++ b/crates/pixi-build-python/src/build_script.j2 @@ -0,0 +1,24 @@ +{% set PYTHON="%PYTHON%" if build_platform == "windows" else "$PYTHON" -%} +{% set EDITABLE_OPTION = "--editable" if editable else "" -%} +{%- set OPTIONS = [ + "-vv", + "--no-deps", + "--no-build-isolation" +] + extra_args + [EDITABLE_OPTION, manifest_root] +-%} + +{% if build_platform == "windows" -%} +{% set OPTIONS = OPTIONS | join(" ^\n ") -%} +{% else -%} +{% set OPTIONS = OPTIONS | join(" \\\n ") -%} +{% endif -%} + +{% if installer == "uv" -%} +uv pip install --python "{{ PYTHON }}" {{ OPTIONS }} +{% else %} +"{{ PYTHON }}" -m pip install --ignore-installed {{ OPTIONS }} +{% endif -%} + +{% if build_platform == "windows" -%} +if errorlevel 1 exit 1 +{% endif %} diff --git a/crates/pixi-build-python/src/build_script.rs b/crates/pixi-build-python/src/build_script.rs new file mode 100644 index 0000000000..3c0321dfe6 --- /dev/null +++ b/crates/pixi-build-python/src/build_script.rs @@ -0,0 +1,63 @@ +use std::path::PathBuf; + +use minijinja::Environment; +use serde::Serialize; + +const UV: &str = "uv"; +#[derive(Serialize)] +pub struct BuildScriptContext { + pub installer: Installer, + pub build_platform: BuildPlatform, + pub editable: bool, + pub extra_args: Vec, + pub manifest_root: PathBuf, +} + +#[derive(Default, Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum Installer { + Uv, + #[default] + Pip, +} + +impl Installer { + pub fn package_name(&self) -> &str { + match self { + Installer::Uv => "uv", + Installer::Pip => "pip", + } + } + + /// Determine the installer from an iterator of dependency package names. + /// Checks if "uv" is present in the package names. + pub fn determine_installer_from_names<'a>( + mut package_names: impl Iterator, + ) -> Installer { + // Check all dependency names for "uv" package + let has_uv = package_names.any(|name| name == UV); + + if has_uv { + Installer::Uv + } else { + Installer::Pip + } + } +} + +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum BuildPlatform { + Windows, + Unix, +} + +impl BuildScriptContext { + pub fn render(&self) -> String { + let env = Environment::new(); + let template = env + .template_from_str(include_str!("build_script.j2")) + .unwrap(); + template.render(self).unwrap().trim().to_string() + } +} diff --git a/crates/pixi-build-python/src/config.rs b/crates/pixi-build-python/src/config.rs new file mode 100644 index 0000000000..e81d62bdf0 --- /dev/null +++ b/crates/pixi-build-python/src/config.rs @@ -0,0 +1,296 @@ +use indexmap::IndexMap; +use pixi_build_backend::generated_recipe::BackendConfig; +use serde::{Deserialize, Serialize}; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +pub struct PythonBackendConfig { + /// True if the package should be build as a python noarch package. Defaults + /// to `true`. + #[serde(default)] + pub noarch: Option, + /// Extra args to pass to pip + #[serde(default)] + pub extra_args: Vec, + /// Environment Variables + #[serde(default)] + pub env: IndexMap, + /// Deprecated. Setting this has no effect; debug data is always written to + /// the `debug` subdirectory of the work directory. + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + /// Extra input globs to include in addition to the default ones + #[serde(default)] + pub extra_input_globs: Vec, + /// List of compilers to use (e.g., ["c", "cxx", "rust"]) + /// If not specified, no compilers are added (since most Python packages are pure Python) + pub compilers: Option>, + /// Ignore the pyproject.toml manifest and rely only on the project model. + #[serde(default)] + pub ignore_pyproject_manifest: Option, + /// Ignore the PyPI-to-conda mapping. When enabled, dependencies from + /// pyproject.toml will not be automatically mapped to conda packages. + /// Defaults to `true` (mapping disabled). + #[serde(default)] + pub ignore_pypi_mapping: Option, +} + +impl PythonBackendConfig { + /// Whether to build a noarch package or a platform-specific package. + pub fn noarch(&self) -> bool { + self.noarch.unwrap_or(true) + } + + /// Whether to ignore the PyPI-to-conda mapping. + /// Defaults to `true` (mapping disabled). + pub fn ignore_pypi_mapping(&self) -> bool { + self.ignore_pypi_mapping.unwrap_or(true) + } + + /// Creates a new [`PythonBackendConfig`] with default values and + /// `ignore_pyproject_manifest` set to `true`. + #[cfg(test)] + pub fn default_with_ignore_pyproject_manifest() -> Self { + Self { + ignore_pyproject_manifest: Some(true), + ..Default::default() + } + } +} + +impl BackendConfig for PythonBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values override base values using the following rules: + /// - noarch: Platform-specific takes precedence (critical for cross-platform) + /// - env: Platform env vars override base, others merge + /// - extra_args: Platform-specific completely replaces base + /// - debug_dir: Not allowed to have target specific value + /// - extra_input_globs: Platform-specific completely replaces base + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + Ok(Self { + noarch: target_config.noarch.or(self.noarch), + env: { + let mut merged_env = self.env.clone(); + merged_env.extend(target_config.env.clone()); + merged_env + }, + debug_dir: self.debug_dir.clone(), + extra_args: if target_config.extra_args.is_empty() { + self.extra_args.clone() + } else { + target_config.extra_args.clone() + }, + extra_input_globs: if target_config.extra_input_globs.is_empty() { + self.extra_input_globs.clone() + } else { + target_config.extra_input_globs.clone() + }, + compilers: target_config + .compilers + .clone() + .or_else(|| self.compilers.clone()), + ignore_pyproject_manifest: target_config + .ignore_pyproject_manifest + .or(self.ignore_pyproject_manifest), + ignore_pypi_mapping: target_config + .ignore_pypi_mapping + .or(self.ignore_pypi_mapping), + }) + } +} + +#[cfg(test)] +mod tests { + use super::PythonBackendConfig; + use pixi_build_backend::generated_recipe::BackendConfig; + use serde_json::json; + use std::path::PathBuf; + + #[test] + fn test_ensure_deseralize_from_empty() { + let json_data = json!({}); + serde_json::from_value::(json_data).unwrap(); + } + + #[test] + fn test_merge_with_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + base_env.insert("SHARED_VAR".to_string(), "base_shared".to_string()); + + let base_config = PythonBackendConfig { + noarch: Some(true), + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_args: vec!["-Cbuilddir=mybuilddir".into()], + extra_input_globs: vec!["*.base".to_string()], + compilers: Some(vec!["c".to_string()]), + ignore_pyproject_manifest: Some(true), + ignore_pypi_mapping: Some(true), + }; + + let mut target_env = indexmap::IndexMap::new(); + target_env.insert("TARGET_VAR".to_string(), "target_value".to_string()); + target_env.insert("SHARED_VAR".to_string(), "target_shared".to_string()); + + let target_config = PythonBackendConfig { + noarch: Some(false), + env: target_env, + debug_dir: None, + extra_args: vec![], + extra_input_globs: vec!["*.target".to_string()], + compilers: Some(vec!["cxx".to_string(), "rust".to_string()]), + ignore_pyproject_manifest: Some(false), + ignore_pypi_mapping: Some(false), + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // noarch should use target value + assert_eq!(merged.noarch, Some(false)); + + // env should merge with target taking precedence + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!( + merged.env.get("TARGET_VAR"), + Some(&"target_value".to_string()) + ); + assert_eq!( + merged.env.get("SHARED_VAR"), + Some(&"target_shared".to_string()) + ); + + // debug_dir should use base value + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + + // extra_input_globs should be completely overridden + assert_eq!(merged.extra_input_globs, vec!["*.target".to_string()]); + + // compilers should be completely overridden by target + assert_eq!( + merged.compilers, + Some(vec!["cxx".to_string(), "rust".to_string()]) + ); + // ignore_pyproject_manifest should use target value + assert_eq!(merged.ignore_pyproject_manifest, Some(false)); + // ignore_pypi_mapping should use target value + assert_eq!(merged.ignore_pypi_mapping, Some(false)); + } + + #[test] + fn test_merge_with_empty_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + + let base_config = PythonBackendConfig { + noarch: Some(true), + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_args: vec!["-Cbuilddir=mybuilddir".into()], + extra_input_globs: vec!["*.base".to_string()], + compilers: None, + ignore_pyproject_manifest: Some(true), + ignore_pypi_mapping: Some(true), + }; + + let empty_target_config = PythonBackendConfig::default(); + + let merged = base_config + .merge_with_target_config(&empty_target_config) + .unwrap(); + + // Should keep base values when target is empty + assert_eq!(merged.noarch, Some(true)); + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + assert_eq!(merged.extra_input_globs, vec!["*.base".to_string()]); + assert_eq!(merged.compilers, None); + assert_eq!(merged.ignore_pyproject_manifest, Some(true)); + assert_eq!(merged.ignore_pypi_mapping, Some(true)); + } + + #[test] + fn test_merge_noarch_behavior() { + let base_config = PythonBackendConfig { + noarch: Some(true), + ..Default::default() + }; + + let target_config = PythonBackendConfig { + noarch: None, + ..Default::default() + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // When target has None, should keep base value + assert_eq!(merged.noarch, Some(true)); + + // Test the reverse + let base_config = PythonBackendConfig { + noarch: None, + ..Default::default() + }; + + let target_config = PythonBackendConfig { + noarch: Some(false), + ..Default::default() + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // When target has value, should use target value + assert_eq!(merged.noarch, Some(false)); + + // Test when both have values - target should override base + let base_config = PythonBackendConfig { + noarch: Some(true), + ..Default::default() + }; + + let target_config = PythonBackendConfig { + noarch: Some(false), + ..Default::default() + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // Target value should override base value + assert_eq!(merged.noarch, Some(false)); + } + + #[test] + fn test_merge_target_debug_dir_error() { + let base_config = PythonBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + ..Default::default() + }; + + let target_config = PythonBackendConfig { + debug_dir: Some(PathBuf::from("/target/debug")), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`debug_dir` cannot have a target specific value")); + } +} diff --git a/crates/pixi-build-python/src/main.rs b/crates/pixi-build-python/src/main.rs new file mode 100644 index 0000000000..eb48a15511 --- /dev/null +++ b/crates/pixi-build-python/src/main.rs @@ -0,0 +1,1048 @@ +mod build_script; +mod config; +mod metadata; +mod pypi_mapping; + +use build_script::{BuildPlatform, BuildScriptContext, Installer}; +use config::PythonBackendConfig; +use miette::IntoDiagnostic; +use pixi_build_backend::variants::NormalizedKey; +use pixi_build_backend::{ + Variable, + generated_recipe::{GenerateRecipe, GeneratedRecipe, PythonParams}, + intermediate_backend::IntermediateBackendInstantiator, + traits::ProjectModel, +}; +use pyproject_toml::PyProjectToml; +use rattler_conda_types::{ChannelUrl, Platform, package::EntryPoint}; +use recipe_stage0::matchspec::PackageDependency; +use recipe_stage0::recipe::{Item, NoArchKind, Python, Script}; +use std::collections::HashSet; +use std::{ + collections::{BTreeMap, BTreeSet}, + path::{Path, PathBuf}, + str::FromStr, + sync::Arc, +}; + +use crate::metadata::{PyprojectManifestMode, PyprojectMetadataProvider}; +use crate::pypi_mapping::{ + detect_compilers_from_build_requirements, filter_mapped_pypi_deps, + map_requirements_with_channels, +}; + +#[derive(Default, Clone)] +pub struct PythonGenerator {} + +impl PythonGenerator { + /// Read the entry points from the pyproject.toml and return them as a list. + /// + /// If the manifest is not a pyproject.toml file no entry-points are added. + pub(crate) fn entry_points(pyproject_manifest: Option) -> Vec { + let scripts = pyproject_manifest + .as_ref() + .and_then(|p| p.project.as_ref()) + .and_then(|p| p.scripts.as_ref()); + + scripts + .into_iter() + .flatten() + .flat_map(|(name, entry_point)| { + EntryPoint::from_str(&format!("{name} = {entry_point}")) + }) + .collect() + } +} + +#[async_trait::async_trait] +impl GenerateRecipe for PythonGenerator { + type Config = PythonBackendConfig; + + async fn generate_recipe( + &self, + model: &pixi_build_types::ProjectModel, + config: &Self::Config, + manifest_path: PathBuf, + host_platform: Platform, + python_params: Option, + variants: &HashSet, + channels: Vec, + cache_dir: Option, + ) -> miette::Result { + let params = python_params.unwrap_or_default(); + + // Determine the manifest root, because `manifest_path` can be + // either a direct file path or a directory path. + let manifest_root = if manifest_path.is_file() { + manifest_path + .parent() + .ok_or_else(|| { + miette::Error::msg(format!( + "Manifest path {} is a file but has no parent directory.", + manifest_path.display() + )) + })? + .to_path_buf() + } else { + manifest_path.clone() + }; + + let mode = if config + .ignore_pyproject_manifest + .is_some_and(|ignore| ignore) + { + PyprojectManifestMode::Ignore + } else { + PyprojectManifestMode::Read + }; + let mut pyproject_metadata_provider = PyprojectMetadataProvider::new(&manifest_root, mode); + + let mut generated_recipe = + GeneratedRecipe::from_model(model.clone(), &mut pyproject_metadata_provider) + .into_diagnostic()?; + + let requirements = &mut generated_recipe.recipe.requirements; + + // Get the platform-specific dependencies from the project model. + // This properly handles target selectors like [target.linux-64] by using + // the ProjectModel trait's platform-aware API instead of trying to evaluate + // rattler-build selectors with simple string comparison. + let model_dependencies = model.dependencies(Some(host_platform)); + + // Ensure the python build tools are added to the `host` requirements. + // Please note: this is a subtle difference for python, where the build tools + // are added to the `host` requirements, while for cmake/rust they are + // added to the `build` requirements. + // We only check build and host dependencies for the installer. + let installer = + Installer::determine_installer_from_names(model_dependencies.build_and_host_names()); + + let installer_name = installer.package_name().to_string(); + let installer_pkg = pixi_build_types::SourcePackageName::from(installer_name.as_str()); + + // add installer in the host requirements + if !model_dependencies.host.contains_key(&installer_pkg) { + requirements + .host + .push(installer_name.parse().into_diagnostic()?); + } + + // Get Python requirement spec + let python_requirement_str = match pyproject_metadata_provider.requires_python() { + Ok(Some(requires_python)) => format!("python {requires_python}"), + _ => "python".to_string(), + }; + + // Add python to host and run requirements, if not already set in the package manifest + let python_pkg = pixi_build_types::SourcePackageName::from("python"); + let python_requirement: Item = + python_requirement_str.parse().into_diagnostic()?; + if !model_dependencies.host.contains_key(&python_pkg) { + requirements.host.push(python_requirement.clone()); + } + if !model_dependencies.run.contains_key(&python_pkg) { + requirements.run.push(python_requirement); + } + + // Detect compilers from build-system.requires (e.g., maturin -> rust) + // This needs to happen early so we can determine the correct platform for mapping + let auto_detected_compilers = pyproject_metadata_provider + .build_system_requires()? + .map(|reqs| detect_compilers_from_build_requirements(reqs)) + .unwrap_or_default(); + + // Merge explicit config compilers with auto-detected ones + let mut compilers = config.compilers.clone().unwrap_or_default(); + for compiler in auto_detected_compilers { + if !compilers.contains(&compiler) { + compilers.push(compiler); + } + } + + // Determine whether the package should be built as a noarch package. + // This needs to be determined early so we can use the correct platform for PyPI mapping. + let has_compilers = !compilers.is_empty(); + let is_noarch = if config.noarch == Some(true) { + // The user explicitly requested a noarch package. + true + } else if config.noarch == Some(false) { + // The user explicitly requested a non-noarch package. + false + } else if has_compilers { + // No specific user request, but we have compilers, not a noarch package. + false + } else { + // Otherwise, default to a noarch package. + // This is the default behavior for pure Python packages. + true + }; + + // Use NoArch platform for mapping if this is a noarch package + let mapping_platform = if is_noarch { + Platform::NoArch + } else { + host_platform + }; + + // Map PyPI dependencies from pyproject.toml to conda dependencies + if !config.ignore_pypi_mapping() { + if let Some(pypi_deps) = pyproject_metadata_provider.project_dependencies()? { + let mapped_deps = map_requirements_with_channels( + pypi_deps, + &channels, + &cache_dir, + "project", + mapping_platform, + ) + .await; + + let skip_packages: HashSet = + model_dependencies + .run + .keys() + .map(|k| (*k).clone()) + .collect(); + + for match_spec in filter_mapped_pypi_deps(&mapped_deps, &skip_packages) { + requirements + .run + .push(match_spec.to_string().parse().into_diagnostic()?); + } + } + + // Map build-system.requires from pyproject.toml to conda host dependencies + if let Some(build_system_deps) = pyproject_metadata_provider.build_system_requires()? { + let mapped_deps = map_requirements_with_channels( + build_system_deps, + &channels, + &cache_dir, + "build-system", + mapping_platform, + ) + .await; + + let skip_packages: HashSet = + model_dependencies + .host + .keys() + .map(|k| (*k).clone()) + .collect(); + + for match_spec in filter_mapped_pypi_deps(&mapped_deps, &skip_packages) { + requirements + .host + .push(match_spec.to_string().parse().into_diagnostic()?); + } + } + } + + pixi_build_backend::compilers::add_compilers_to_requirements( + &compilers, + &mut requirements.build, + &model_dependencies, + &host_platform, + ); + pixi_build_backend::compilers::add_stdlib_to_requirements( + &compilers, + &mut requirements.build, + variants, + ); + + let build_platform = Platform::current(); + + // TODO: remove this env var override as soon as we have profiles + let editable = std::env::var("BUILD_EDITABLE_PYTHON") + .map(|val| val == "true") + .unwrap_or(params.editable); + + let build_script = BuildScriptContext { + installer, + build_platform: if build_platform.is_windows() { + BuildPlatform::Windows + } else { + BuildPlatform::Unix + }, + editable, + extra_args: config.extra_args.clone(), + manifest_root: manifest_root.clone(), + } + .render(); + + // Convert the is_noarch boolean to the NoArchKind enum + let noarch_kind = if is_noarch { + Some(NoArchKind::Python) + } else { + None + }; + + // read pyproject.toml content if it exists + let pyproject_manifest_path = manifest_root.join("pyproject.toml"); + let pyproject_manifest = if pyproject_manifest_path.exists() { + let contents = std::fs::read_to_string(&pyproject_manifest_path).into_diagnostic()?; + generated_recipe.build_input_globs = + BTreeSet::from([pyproject_manifest_path.to_string_lossy().to_string()]); + Some(toml::from_str(&contents).into_diagnostic()?) + } else { + None + }; + + // Construct python specific settings + let python = Python { + entry_points: PythonGenerator::entry_points(pyproject_manifest), + }; + + generated_recipe.recipe.build.python = python; + generated_recipe.recipe.build.noarch = noarch_kind; + + generated_recipe.recipe.build.script = Script { + content: build_script, + env: config.env.clone(), + ..Script::default() + }; + + // Add the metadata input globs from the MetadataProvider + generated_recipe + .metadata_input_globs + .extend(pyproject_metadata_provider.input_globs()); + + // Log any warnings collected during metadata extraction + for warning in pyproject_metadata_provider.warnings() { + tracing::warn!("{}", warning); + } + + Ok(generated_recipe) + } + + /// Determines the build input globs for given python package + /// even this will be probably backend specific, e.g setuptools + /// has a different way of determining the input globs than hatch etc. + /// + /// However, lets take everything in the directory as input for now + fn extract_input_globs_from_build( + &self, + config: &Self::Config, + _workdir: impl AsRef, + editable: bool, + ) -> miette::Result> { + let base_globs = Vec::from([ + // Project configuration + "setup.py", + "setup.cfg", + "pyproject.toml", + "requirements*.txt", + "Pipfile", + "Pipfile.lock", + "poetry.lock", + "tox.ini", + ]); + let compiler_based_globs: Vec<&str> = config + .compilers + .iter() + .flatten() + .flat_map(|c| match c.as_str() { + "rust" => vec!["**/*.rs", "**/Cargo.toml"], + "cxx" => vec!["**/*.{cc,cxx,cpp,hpp,hxx}"], + "c" => vec!["**/*.{c,h}"], + _ => vec![], + }) + .collect(); + + let python_globs = if editable { + Vec::new() + } else { + Vec::from(["**/*.py", "**/*.pyx"]) + }; + + Ok(base_globs + .iter() + .chain(python_globs.iter()) + .chain(compiler_based_globs.iter()) + .map(|s| s.to_string()) + .chain(config.extra_input_globs.clone()) + .collect()) + } + + fn default_variants( + &self, + host_platform: Platform, + ) -> miette::Result>> { + let mut variants = BTreeMap::new(); + + if host_platform.is_windows() { + // Default to the Visual Studio 2022 compiler on Windows + // Not 2019 due to Conda-forge switching and the mainstream support dropping in 2024. + // rattler-build will default to vs2017 which for most github runners is too + // old. + variants.insert(NormalizedKey::from("c_compiler"), vec!["vs2022".into()]); + variants.insert(NormalizedKey::from("cxx_compiler"), vec!["vs2022".into()]); + } + + Ok(variants) + } +} + +#[tokio::main] +pub async fn main() { + if let Err(err) = pixi_build_backend::cli::main(|log| { + IntermediateBackendInstantiator::::new(log, Arc::default()) + }) + .await + { + eprintln!("{err:?}"); + std::process::exit(1); + } +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use indexmap::IndexMap; + use pixi_build_backend::utils::test::intermediate_conda_outputs; + use pixi_build_types::VariantValue; + use recipe_stage0::recipe::{Item, Value}; + use tokio::fs; + + use super::*; + + #[test] + fn test_input_globs_includes_extra_globs() { + let config = PythonBackendConfig { + extra_input_globs: vec!["custom/*.py".to_string()], + ..Default::default() + }; + + let generator = PythonGenerator::default(); + + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + + insta::assert_debug_snapshot!(result); + } + + #[test] + fn test_input_globs_includes_extra_globs_editable() { + let config = PythonBackendConfig { + extra_input_globs: vec!["custom/*.py".to_string()], + ..Default::default() + }; + + let generator = PythonGenerator::default(); + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), true); + + insta::assert_debug_snapshot!(result); + } + + #[macro_export] + macro_rules! project_fixture { + ($($json:tt)+) => { + serde_json::from_value::( + serde_json::json!($($json)+) + ).expect("Failed to create TestProjectModel from JSON fixture.") + }; + } + + #[tokio::test] + async fn test_intermediate_conda_outputs_snapshot() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "buildDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); + + fs::write( + temp_dir.path().join("pyproject.toml"), + r#"[project] +name = "foobar" +version = "0.1.0" +"#, + ) + .await + .expect("Failed to write pyproject.toml"); + fs::write( + temp_dir.path().join("pixi.toml"), + r#"[project] +name = "foobar" +version = "0.1.0" +"#, + ) + .await + .expect("Failed to write pixi.toml"); + + let variant_configuration = BTreeMap::from([( + "boltons".to_string(), + Vec::from([VariantValue::from("==1.0.0")]), + )]); + + let result = intermediate_conda_outputs::( + Some(project_model), + Some(temp_dir.path().to_path_buf()), + Platform::Linux64, + Some(variant_configuration), + None, + ) + .await; + + assert_eq!( + result.outputs[0].metadata.variant["boltons"], + VariantValue::from("==1.0.0") + ); + assert_eq!( + result.outputs[0].metadata.variant["target_platform"], + VariantValue::from("noarch") + ); + } + + #[tokio::test] + async fn test_variant_files_are_applied() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "buildDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); + + fs::write( + temp_dir.path().join("pyproject.toml"), + r#"[project] +name = "foobar" +version = "0.1.0" +"#, + ) + .await + .expect("Failed to write pyproject.toml"); + fs::write( + temp_dir.path().join("pixi.toml"), + r#"[project] +name = "foobar" +version = "0.1.0" +"#, + ) + .await + .expect("Failed to write pixi.toml"); + + let variant_file = temp_dir.path().join("variants.yaml"); + fs::write( + &variant_file, + r#"boltons: + - "==2.0.0" +"#, + ) + .await + .expect("Failed to write variants file"); + + let result = intermediate_conda_outputs::( + Some(project_model), + Some(temp_dir.path().to_path_buf()), + Platform::Linux64, + None, + Some(vec![variant_file]), + ) + .await; + + assert_eq!( + result.outputs[0].metadata.variant["boltons"], + VariantValue::from("==2.0.0") + ); + assert_eq!( + result.outputs[0].metadata.variant["target_platform"], + VariantValue::from("noarch") + ); + } + + #[tokio::test] + async fn test_pip_is_in_host_requirements() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &PythonBackendConfig::default_with_ignore_pyproject_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_python_is_not_added_if_already_present() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + }, + "hostDependencies": { + "python": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &PythonBackendConfig::default_with_ignore_pyproject_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_env_vars_are_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let env = IndexMap::from([("foo".to_string(), "bar".to_string())]); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &PythonBackendConfig { + env: env.clone(), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe.build.script, + { + ".content" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_multiple_compilers_configuration() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &PythonBackendConfig { + compilers: Some(vec!["c".to_string(), "cxx".to_string(), "rust".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly three compilers + assert_eq!( + compiler_templates.len(), + 3, + "Should have exactly three compilers" + ); + + // Check we have the expected compilers + assert!( + compiler_templates.contains(&"${{ compiler('c') }}".to_string()), + "C compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cxx') }}".to_string()), + "C++ compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('rust') }}".to_string()), + "Rust compiler should be in build requirements" + ); + } + + #[tokio::test] + async fn test_default_no_compilers_when_not_specified() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &PythonBackendConfig { + compilers: None, + ignore_pyproject_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that no compilers are added by default + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have no compilers by default for Python packages + assert_eq!( + compiler_templates.len(), + 0, + "Should have no compilers by default for pure Python packages" + ); + } + + // Helper function to create a minimal project fixture + fn minimal_project() -> pixi_build_types::ProjectModel { + project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": {} + } + }) + } + + // Helper function to generate recipe with given config + async fn generate_test_recipe( + config: &PythonBackendConfig, + ) -> Result> { + Ok(PythonGenerator::default() + .generate_recipe( + &minimal_project(), + config, + PathBuf::from("."), + Platform::Linux64, + None, + &std::collections::HashSet::::new(), + vec![], + None, + ) + .await?) + } + + #[tokio::test] + async fn test_noarch_defaults_to_true_when_no_compilers() { + let recipe = generate_test_recipe(&PythonBackendConfig { + ignore_pyproject_manifest: Some(true), + ..Default::default() + }) + .await + .expect("Failed to generate recipe"); + + assert!( + matches!(recipe.recipe.build.noarch, Some(NoArchKind::Python)), + "noarch should default to true when no compilers specified" + ); + } + + #[tokio::test] + async fn test_noarch_defaults_to_false_when_compilers_present() { + let config = PythonBackendConfig { + compilers: Some(vec!["c".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + + let recipe = generate_test_recipe(&config) + .await + .expect("Failed to generate recipe"); + + assert!( + recipe.recipe.build.noarch.is_none(), + "noarch should default to false when compilers are present" + ); + } + + #[tokio::test] + async fn test_noarch_explicit_true_overrides_compilers() { + let config = PythonBackendConfig { + noarch: Some(true), + compilers: Some(vec!["c".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + + let recipe = generate_test_recipe(&config) + .await + .expect("Failed to generate recipe"); + + assert!( + matches!(recipe.recipe.build.noarch, Some(NoArchKind::Python)), + "explicit noarch=true should override compiler presence" + ); + } + + #[tokio::test] + async fn test_noarch_explicit_false_overrides_no_compilers() { + let config = PythonBackendConfig { + noarch: Some(false), + compilers: None, + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + + let recipe = generate_test_recipe(&config) + .await + .expect("Failed to generate recipe"); + + assert!( + recipe.recipe.build.noarch.is_none(), + "explicit noarch=false should override absence of compilers" + ); + } + + #[test] + fn test_c_compilers_create_extra_input_globs() { + let config = PythonBackendConfig { + compilers: Some(vec!["c".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + let generator = PythonGenerator::default(); + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + insta::assert_debug_snapshot!(result); + } + + #[test] + fn test_cxx_compilers_create_extra_input_globs() { + let config = PythonBackendConfig { + compilers: Some(vec!["cxx".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + let generator = PythonGenerator::default(); + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + insta::assert_debug_snapshot!(result); + } + + #[test] + fn test_rust_compilers_create_extra_input_globs() { + let config = PythonBackendConfig { + compilers: Some(vec!["rust".to_string()]), + ignore_pyproject_manifest: Some(true), + ..Default::default() + }; + let generator = PythonGenerator::default(); + let result = generator.extract_input_globs_from_build(&config, PathBuf::new(), false); + insta::assert_debug_snapshot!(result); + } + + #[tokio::test] + async fn test_ignore_pypi_mapping_skips_dependency_mapping() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + }); + + let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); + + // Create a pyproject.toml with dependencies that would be mapped + fs::write( + temp_dir.path().join("pyproject.toml"), + r#"[project] +name = "foobar" +version = "0.1.0" +dependencies = ["requests>=2.28", "flask"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" +"#, + ) + .await + .expect("Failed to write pyproject.toml"); + + // Test with ignore_pypi_mapping = true + let config = PythonBackendConfig { + ignore_pypi_mapping: Some(true), + ..Default::default() + }; + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + &config, + temp_dir.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![ChannelUrl::from( + url::Url::parse("https://prefix.dev/conda-forge").unwrap(), + )], + None, + ) + .await + .expect("Failed to generate recipe"); + + // With ignore_pypi_mapping = true, the pypi dependencies should NOT be mapped + // Run requirements should only contain python (auto-added) + let run_deps: Vec = generated_recipe + .recipe + .requirements + .run + .iter() + .map(|item| item.to_string()) + .collect(); + + assert_eq!( + run_deps, + vec!["python"], + "run deps should only contain python when ignore_pypi_mapping=true" + ); + + // Host requirements should only contain pip (auto-added installer) and python + let host_deps: Vec = generated_recipe + .recipe + .requirements + .host + .iter() + .map(|item| item.to_string()) + .collect(); + + assert_eq!( + host_deps, + vec!["pip", "python"], + "host deps should only contain pip and python when ignore_pypi_mapping=true" + ); + } + + #[tokio::test] + async fn test_ignore_pypi_mapping_default_is_true() { + // Verify that the default value for ignore_pypi_mapping is true + let config = PythonBackendConfig::default(); + assert!( + config.ignore_pypi_mapping(), + "ignore_pypi_mapping should default to true" + ); + } +} diff --git a/crates/pixi-build-python/src/metadata.rs b/crates/pixi-build-python/src/metadata.rs new file mode 100644 index 0000000000..52d2b55d58 --- /dev/null +++ b/crates/pixi-build-python/src/metadata.rs @@ -0,0 +1,914 @@ +use std::{cell::RefCell, collections::BTreeSet, path::PathBuf, str::FromStr}; + +use miette::Diagnostic; +use once_cell::unsync::OnceCell; +use pixi_build_backend::generated_recipe::MetadataProvider; +use pyproject_toml::PyProjectToml; +use rattler_conda_types::{ParseVersionError, Version}; + +/// Controls how the `PyprojectMetadataProvider` handles the pyproject.toml manifest. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum PyprojectManifestMode { + /// Read metadata from the pyproject.toml file. + #[default] + Read, + /// Ignore the pyproject.toml file; all metadata methods will return `None`. + Ignore, +} + +#[derive(Debug, thiserror::Error, Diagnostic)] +pub enum MetadataError { + #[error("failed to parse pyproject.toml, {0}")] + PyProjectToml(#[from] toml::de::Error), + #[error("failed to parse version from pyproject.toml, {0}")] + ParseVersion(ParseVersionError), + #[error(transparent)] + Io(#[from] std::io::Error), +} + +/// An implementation of [`MetadataProvider`] that reads metadata from a +/// pyproject.toml file. +pub struct PyprojectMetadataProvider { + manifest_root: PathBuf, + pyproject_manifest: OnceCell, + mode: PyprojectManifestMode, + warnings: RefCell>, +} + +impl PyprojectMetadataProvider { + /// Constructs a new `PyprojectMetadataProvider` with the given manifest root. + /// + /// # Arguments + /// + /// * `manifest_root` - The directory that contains the `pyproject.toml` file + /// * `mode` - Controls whether to read metadata from or ignore the pyproject.toml + pub fn new(manifest_root: impl Into, mode: PyprojectManifestMode) -> Self { + Self { + manifest_root: manifest_root.into(), + pyproject_manifest: OnceCell::default(), + mode, + warnings: RefCell::new(Vec::new()), + } + } + + /// Returns all warnings collected during metadata extraction. + /// + /// This includes warnings about invalid SPDX license expressions and other + /// metadata parsing issues that don't cause errors but may indicate problems. + pub fn warnings(&self) -> Vec { + self.warnings.borrow().clone() + } + + /// Adds a warning message to the warning collection. + fn add_warning(&self, warning: impl Into) { + self.warnings.borrow_mut().push(warning.into()); + } + + /// Ensures that the manifest is loaded and returns the project metadata. + fn ensure_manifest_project(&self) -> Result, MetadataError> { + Ok(self.ensure_manifest()?.project.as_ref()) + } + + /// Ensures that the manifest is loaded + fn ensure_manifest(&self) -> Result<&PyProjectToml, MetadataError> { + self.pyproject_manifest.get_or_try_init(move || { + let pyproject_toml_content = + fs_err::read_to_string(self.manifest_root.join("pyproject.toml"))?; + toml::from_str(&pyproject_toml_content).map_err(MetadataError::PyProjectToml) + }) + } + + /// Returns the set of globs that match files that influence the metadata of + /// this package. + /// + /// This includes the package's own `pyproject.toml` file. These globs + /// can be used for incremental builds to determine when metadata might + /// have changed. + /// + /// # Returns + /// + /// A `BTreeSet` of glob patterns as strings. Common patterns include: + /// - `"pyproject.toml"` - The package's manifest file + pub fn input_globs(&self) -> BTreeSet { + let mut input_globs = BTreeSet::new(); + + let Some(_) = self.pyproject_manifest.get() else { + return input_globs; + }; + + // Add the pyproject.toml manifest file itself. + input_globs.insert(String::from("pyproject.toml")); + + input_globs + } +} + +impl MetadataProvider for PyprojectMetadataProvider { + type Error = MetadataError; + + /// Returns the package name from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the name from the project section of the pyproject.toml file. + fn name(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .map(|proj| proj.name.clone())) + } + + /// Returns the package version from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the version from the project section. The version string is parsed into a + /// `rattler_conda_types::Version`. + fn version(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + let Some(project) = self.ensure_manifest_project()? else { + return Ok(None); + }; + let Some(version) = &project.version else { + return Ok(None); + }; + Ok(Some( + Version::from_str(&version.to_string()).map_err(MetadataError::ParseVersion)?, + )) + } + + /// Returns the package description from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the description from the project section. + fn description(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.description.clone())) + } + + /// Returns the package homepage URL from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the homepage from the project.urls section. + fn homepage(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.urls.as_ref()) + .and_then(|urls| urls.get("Homepage").cloned())) + } + + /// Returns the package license from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the license from the project section. If the license text is not a valid + /// SPDX expression, a warning is added and `None` is returned. + fn license(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| match proj.license.as_ref() { + Some(pyproject_toml::License::Spdx(spdx)) => { + match spdx.parse::() { + Ok(expr) => Some(expr.to_string()), + Err(err) => { + self.add_warning(format!( + "License '{}' is not a valid SPDX expression: {}. \ + Consider using a valid SPDX identifier (e.g., 'MIT', 'Apache-2.0'). \ + See for the list of valid licenses.", + spdx, err + )); + None + } + } + } + Some(pyproject_toml::License::Text { text }) => { + match text.parse::() { + Ok(expr) => Some(expr.to_string()), + Err(err) => { + self.add_warning(format!( + "License text '{}' is not a valid SPDX expression: {}. \ + Consider using a valid SPDX identifier (e.g., 'MIT', 'Apache-2.0'). \ + See for the list of valid licenses.", + text, err + )); + None + } + } + } + _ => None, + })) + } + + /// Returns the package license file path(s) from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the license file path from the project section. This method checks: + /// 1. `license.file` - if specified as a file reference + /// 2. `license-files` - if specified as a list of file paths + /// + /// If both are present, they are combined with commas. If multiple files are + /// present in `license-files`, they are joined with commas. + fn license_files(&mut self) -> Result>, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + + let project = match self.ensure_manifest_project()? { + Some(proj) => proj, + None => return Ok(None), + }; + + let mut license_files = Vec::new(); + + // Check for license.file + if let Some(pyproject_toml::License::File { file }) = project.license.as_ref() { + license_files.push(file.to_string_lossy().to_string()); + } + + // Check for license-files + if let Some(files) = project.license_files.as_ref() { + license_files.extend(files.iter().cloned()); + } + + if license_files.is_empty() { + Ok(None) + } else { + Ok(Some(license_files)) + } + } + + /// Returns the package summary from the pyproject.toml manifest. + /// + /// This returns the same as description since pyproject.toml doesn't have + /// a separate summary field. + fn summary(&mut self) -> Result, Self::Error> { + self.description() + } + + /// Returns the package documentation URL from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the documentation URL from the project.urls section. + fn documentation(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.urls.as_ref()) + .and_then(|urls| { + urls.get("Documentation") + .or_else(|| urls.get("Docs")) + .cloned() + })) + } + + /// Returns the package repository URL from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the repository URL from the project.urls section. + fn repository(&mut self) -> Result, Self::Error> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.urls.as_ref()) + .and_then(|urls| { + urls.get("Repository") + .or_else(|| urls.get("Source")) + .or_else(|| urls.get("Source Code")) + .cloned() + })) + } +} + +impl PyprojectMetadataProvider { + /// Returns the required Python version from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the requires-python from the project section. + pub fn requires_python(&self) -> Result, MetadataError> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.requires_python.as_ref()) + .map(|req_py| req_py.to_string())) + } + + /// Returns the project dependencies from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the dependencies from the `[project.dependencies]` section. + pub fn project_dependencies( + &self, + ) -> Result>>, MetadataError> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest_project()? + .and_then(|proj| proj.dependencies.as_ref())) + } + + /// Returns the build system requirements from the pyproject.toml manifest. + /// + /// If `ignore_pyproject_manifest` is true, returns `None`. Otherwise, extracts + /// the requirements from the `[build-system].requires` section. + pub fn build_system_requires( + &self, + ) -> Result>>, MetadataError> { + if self.mode == PyprojectManifestMode::Ignore { + return Ok(None); + } + Ok(self + .ensure_manifest()? + .build_system + .as_ref() + .map(|bs| &bs.requires)) + } +} + +#[cfg(test)] +mod tests { + use std::{collections::HashSet, fs}; + + use pixi_build_backend::generated_recipe::{GenerateRecipe, MetadataProvider}; + use rattler_conda_types::Platform; + use tempfile::TempDir; + + use crate::{PythonGenerator, config::PythonBackendConfig, project_fixture}; + + use super::*; + + /// Helper function to create a temporary directory with a pyproject.toml file + fn create_temp_pyproject_project(pyproject_toml_content: &str) -> TempDir { + let temp_dir = TempDir::new().expect("Failed to create temp directory"); + let pyproject_toml_path = temp_dir.path().join("pyproject.toml"); + fs::write(pyproject_toml_path, pyproject_toml_content) + .expect("Failed to write pyproject.toml"); + temp_dir + } + + /// Helper function to create a PyprojectMetadataProvider for testing + fn create_metadata_provider(manifest_root: &std::path::Path) -> PyprojectMetadataProvider { + PyprojectMetadataProvider::new(manifest_root, PyprojectManifestMode::Read) + } + + #[test] + fn test_basic_metadata_extraction() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +description = "A test package" +license = "MIT" + +[project.urls] +Homepage = "https://example.com" +Repository = "https://github.com/example/test-package" +Documentation = "https://docs.example.com" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.name().unwrap(), Some("test-package".to_string())); + assert_eq!(provider.version().unwrap().unwrap().to_string(), "1.0.0"); + assert_eq!( + provider.description().unwrap(), + Some("A test package".to_string()) + ); + assert_eq!(provider.license().unwrap(), Some("MIT".to_string())); + assert_eq!( + provider.homepage().unwrap(), + Some("https://example.com".to_string()) + ); + assert_eq!( + provider.repository().unwrap(), + Some("https://github.com/example/test-package".to_string()) + ); + assert_eq!( + provider.documentation().unwrap(), + Some("https://docs.example.com".to_string()) + ); + } + + #[test] + fn test_license_from_file() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license = {file = "LICENSE.txt"} +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), None); + assert_eq!( + provider.license_files().unwrap(), + Some(vec!["LICENSE.txt".to_string()]) + ); + } + + #[test] + fn test_license_files_field() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license-files = ["LICENSE.txt", "COPYING.txt"] +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), None); + assert_eq!( + provider.license_files().unwrap(), + Some(vec!["LICENSE.txt".to_string(), "COPYING.txt".to_string()]) + ); + } + + #[test] + fn test_license_file_and_license_files_combined() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license = {file = "LICENSE"} +license-files = ["NOTICE.txt", "AUTHORS.txt"] +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), None); + assert_eq!( + provider.license_files().unwrap(), + Some(vec![ + "LICENSE".to_string(), + "NOTICE.txt".to_string(), + "AUTHORS.txt".to_string() + ]) + ); + } + + #[test] + fn test_single_license_file_in_license_files() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license-files = ["LICENSE"] +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), None); + assert_eq!( + provider.license_files().unwrap(), + Some(vec!["LICENSE".to_string()]) + ); + } + + #[test] + fn test_license_from_text() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license = {text = "MIT"} +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), Some("MIT".to_string())); + assert_eq!(provider.license_files().unwrap(), None); + + // Verify that no warnings were generated for valid SPDX + let warnings = provider.warnings(); + assert_eq!(warnings.len(), 0); + } + + #[test] + fn test_license_from_non_spdx_text() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +license = {text = "BLABLA"} +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.license().unwrap(), None); + assert_eq!(provider.license_files().unwrap(), None); + + // Verify that a warning was generated + let warnings = provider.warnings(); + assert_eq!(warnings.len(), 1); + assert!(warnings[0].contains("BLABLA")); + assert!(warnings[0].contains("not a valid SPDX expression")); + } + + #[test] + fn test_missing_project_section() { + let pyproject_toml_content = r#" +[build-system] +requires = ["setuptools", "wheel"] +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!(provider.name().unwrap(), None); + assert_eq!(provider.version().unwrap(), None); + assert_eq!(provider.description().unwrap(), None); + } + + #[test] + fn test_input_globs() { + let pyproject_toml_content = r#" + [project] + name = "test-package" + version = "1.0.0" + "#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Force loading of manifest + let _ = provider.name().unwrap(); + + let globs = provider.input_globs(); + assert_eq!(globs.len(), 1); + assert!(globs.contains("pyproject.toml")); + } + + #[test] + fn test_ignore_pyproject_manifest_flag() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +description = "Test description" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = + PyprojectMetadataProvider::new(temp_dir.path(), PyprojectManifestMode::Ignore); + + // All methods should return None when mode is Ignore + assert_eq!(provider.name().unwrap(), None); + assert_eq!(provider.version().unwrap(), None); + assert_eq!(provider.description().unwrap(), None); + assert_eq!(provider.license().unwrap(), None); + assert_eq!(provider.homepage().unwrap(), None); + assert_eq!(provider.repository().unwrap(), None); + assert_eq!(provider.documentation().unwrap(), None); + assert_eq!(provider.license_files().unwrap(), None); + assert_eq!(provider.summary().unwrap(), None); + assert_eq!(provider.requires_python().unwrap(), None); + } + + #[test] + fn test_alternative_url_keys() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" + +[project.urls] +"Source Code" = "https://github.com/example/test-package" +Docs = "https://docs.example.com" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + assert_eq!( + provider.repository().unwrap(), + Some("https://github.com/example/test-package".to_string()) + ); + assert_eq!( + provider.documentation().unwrap(), + Some("https://docs.example.com".to_string()) + ); + } + + #[test] + fn test_invalid_version_format() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0a1" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // This should parse successfully since it's a valid PEP440 version + let result = provider.version(); + assert!(result.is_ok()); + assert!(result.unwrap().is_some()); + } + + #[test] + fn test_pyproject_toml_parse_error() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "not.a.valid.version.at.all" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.version(); + // The pyproject-toml parser should fail to parse this + match result { + Err(MetadataError::PyProjectToml(_)) => { + // This is expected - invalid version in pyproject.toml + } + other => panic!("Expected PyProjectTomlError for invalid version, got: {other:?}"), + } + } + + #[test] + fn test_malformed_pyproject_toml() { + let pyproject_toml_content = r#" +[project +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.name(); + assert!(result.is_err()); + match result.unwrap_err() { + MetadataError::PyProjectToml(_) => {} + err => panic!("Expected PyProjectToml, got: {err:?}"), + } + } + + #[test] + fn test_summary_equals_description() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +description = "Test description" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let description = provider.description().unwrap(); + let summary = provider.summary().unwrap(); + + assert_eq!(description, summary); + assert_eq!(summary, Some("Test description".to_string())); + } + + #[test] + fn test_requires_python_extraction() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +requires-python = ">=3.13" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let provider = create_metadata_provider(temp_dir.path()); + + assert_eq!( + provider.requires_python().unwrap(), + Some(">=3.13".to_string()) + ); + } + + #[test] + fn test_requires_python_with_ignore_flag() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +requires-python = ">=3.13" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let provider = + PyprojectMetadataProvider::new(temp_dir.path(), PyprojectManifestMode::Ignore); + + assert_eq!(provider.requires_python().unwrap(), None); + } + + #[test] + fn test_build_system_requires_extraction() { + let pyproject_toml_content = r#" +[build-system] +requires = ["flit_core<4", "setuptools>=42"] + +[project] +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let provider = create_metadata_provider(temp_dir.path()); + + let requires = provider + .build_system_requires() + .expect("Should parse build-system.requires"); + assert!(requires.is_some(), "build-system.requires should exist"); + let requires = requires.unwrap(); + assert_eq!(requires.len(), 2); + assert_eq!(requires[0].name.as_ref(), "flit-core"); + assert_eq!( + requires[0].version_or_url.as_ref().unwrap().to_string(), + "<4" + ); + assert_eq!(requires[1].name.as_ref(), "setuptools"); + assert_eq!( + requires[1].version_or_url.as_ref().unwrap().to_string(), + ">=42" + ); + } + + #[test] + fn test_build_system_requires_with_ignore_flag() { + let pyproject_toml_content = r#" +[build-system] +requires = ["flit_core<4"] + +[project] +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let provider = + PyprojectMetadataProvider::new(temp_dir.path(), PyprojectManifestMode::Ignore); + + assert_eq!(provider.build_system_requires().unwrap(), None); + } + + #[test] + fn test_build_system_requires_missing() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + let provider = create_metadata_provider(temp_dir.path()); + + let requires = provider + .build_system_requires() + .expect("Should not error when build-system is missing"); + assert!( + requires.is_none(), + "build-system.requires should be None when section is missing" + ); + } + + #[tokio::test] + async fn test_generated_recipe_contains_pyproject_values() { + let pyproject_toml_content = r#" +[project] +name = "Test-package" +version = "99.0.0" +description = "A test package" +license = {text = "MIT"} + +[project.urls] +Homepage = "https://example.com" +Repository = "https://github.com/example/test-package" +Documentation = "https://docs.example.com" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + // let mut provider = create_metadata_provider(temp_dir.path()); + + // Now create project model and generate a recipe from it + let project_model = project_fixture!({ + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + // when using the default here we should read values from the pyproject.toml + &PythonBackendConfig::default(), + temp_dir.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_generated_recipe_respects_requires_python() { + let pyproject_toml_content = r#" +[project] +name = "test-package" +version = "1.0.0" +requires-python = ">=3.13" +"#; + + let temp_dir = create_temp_pyproject_project(pyproject_toml_content); + + // Now create project model and generate a recipe from it + let project_model = project_fixture!({ + "name": "foobar", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = PythonGenerator::default() + .generate_recipe( + &project_model, + // when using the default here we should read values from the pyproject.toml + &PythonBackendConfig::default(), + temp_dir.path().to_path_buf(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that Python requirements include the version constraint + let host_requirements = &generated_recipe.recipe.requirements.host; + let run_requirements = &generated_recipe.recipe.requirements.run; + + let has_python_constraint_host = host_requirements + .iter() + .any(|req| req.to_string().starts_with("python >=3.13")); + let has_python_constraint_run = run_requirements + .iter() + .any(|req| req.to_string().starts_with("python >=3.13")); + + assert!( + has_python_constraint_host, + "Host requirements should include 'python >=3.13', found: {host_requirements:?}" + ); + assert!( + has_python_constraint_run, + "Run requirements should include 'python >=3.13', found: {run_requirements:?}" + ); + } +} diff --git a/crates/pixi-build-python/src/pypi_mapping.rs b/crates/pixi-build-python/src/pypi_mapping.rs new file mode 100644 index 0000000000..da45bca7d3 --- /dev/null +++ b/crates/pixi-build-python/src/pypi_mapping.rs @@ -0,0 +1,1291 @@ +//! PyPI to conda package name mapping. +//! +//! This module provides functionality to map PyPI package names to their +//! corresponding conda-forge package names using the parselmouth mapping service. + +use std::{ + collections::HashSet, + path::{Path, PathBuf}, + str::FromStr, + time::{Duration, SystemTime}, +}; + +use indexmap::IndexMap; + +use miette::Diagnostic; +use rattler_conda_types::{ + ChannelUrl, MatchSpec, PackageName, ParseStrictness, Platform, VersionSpec, +}; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +/// Base URL for the PyPI to conda mapping API (without channel suffix). +const MAPPING_BASE_URL: &str = "https://conda-mapping.prefix.dev/pypi-to-conda-v1"; + +/// Base subdirectory within the cache for storing mapping files. +const CACHE_SUBDIR: &str = "pypi-conda-mapping"; + +/// Cache validity duration (24 hours). +const CACHE_TTL: Duration = Duration::from_secs(24 * 60 * 60); + +/// Errors that can occur during PyPI to conda mapping. +#[derive(Debug, Error, Diagnostic)] +pub enum MappingError { + /// Failed to fetch mapping from the API. + #[error("failed to fetch conda mapping for '{0}'")] + FetchError(String, #[source] reqwest::Error), + + /// Failed to parse the mapping response. + #[error("failed to parse mapping response for '{0}'")] + ParseError(String, #[source] serde_json::Error), + + /// Package not found in the mapping. + #[error("PyPI package '{0}' has no conda mapping")] + PackageNotFound(String), + + /// Invalid version specifier conversion. + #[error("failed to convert version specifier '{0}' to conda format: {1}")] + VersionConversionError(String, String), + + /// Invalid package name. + #[error("invalid conda package name '{0}'")] + InvalidPackageName( + String, + #[source] rattler_conda_types::InvalidPackageNameError, + ), +} + +/// Response format from the PyPI to conda mapping API. +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct PyPiPackageLookup { + /// Format version of the response. + pub format_version: String, + + /// Channel (e.g., "conda-forge"). + pub channel: String, + + /// The PyPI package name. + pub pypi_name: String, + + /// Mapping of PyPI versions to the best-matching conda package name. + /// Key is PyPI version string, value is the conda package name (selected server-side + /// using Levenshtein distance to the PyPI name). + /// Uses IndexMap to preserve insertion order from the API (latest version is last). + pub conda_versions: IndexMap, +} + +/// A successfully mapped conda dependency. +#[derive(Debug, Clone)] +pub struct MappedCondaDependency { + /// The conda package name. + pub name: PackageName, + + /// Optional version specification. + pub version_spec: Option, +} + +impl MappedCondaDependency { + /// Convert to a conda MatchSpec. + pub fn to_match_spec(&self) -> MatchSpec { + MatchSpec { + name: Some(rattler_conda_types::PackageNameMatcher::Exact( + self.name.clone(), + )), + version: self.version_spec.clone(), + ..Default::default() + } + } +} + +/// Mapper for converting PyPI packages to conda packages. +pub struct PyPiToCondaMapper { + cache_dir: Option, + client: reqwest::Client, + /// The channel name to use for mapping (e.g., "conda-forge"). + channel_name: String, + /// Inline mappings for testing (bypasses cache and API). + #[cfg(test)] + inline_mappings: Option>, +} + +impl PyPiToCondaMapper { + /// Create a new mapper with the given cache directory and channel name. + pub fn new(cache_dir: Option, channel_name: String) -> Self { + Self { + cache_dir, + client: reqwest::Client::new(), + channel_name, + #[cfg(test)] + inline_mappings: None, + } + } + + /// Create a mapper with inline mappings for testing. + /// This bypasses the cache and API, using only the provided mappings. + #[cfg(test)] + pub fn with_inline_mappings(mappings: IndexMap) -> Self { + Self { + cache_dir: None, + client: reqwest::Client::new(), + channel_name: "test".to_string(), + inline_mappings: Some(mappings), + } + } + + /// Get the cache file path for a normalized package name. + fn cache_path(&self, normalized_name: &str) -> Option { + self.cache_dir.as_ref().map(|dir| { + dir.join(CACHE_SUBDIR) + .join(&self.channel_name) + .join(format!("{}.json", normalized_name)) + }) + } + + /// Check if a cached file is still valid. + fn is_cache_valid(path: &Path) -> bool { + if let Ok(metadata) = std::fs::metadata(path) + && let Ok(modified) = metadata.modified() + && let Ok(elapsed) = SystemTime::now().duration_since(modified) + { + return elapsed < CACHE_TTL; + } + + false + } + + /// Read a mapping from the cache. + fn read_from_cache(&self, normalized_name: &str) -> Option { + let cache_path = self.cache_path(normalized_name)?; + + if !cache_path.exists() || !Self::is_cache_valid(&cache_path) { + return None; + } + + let content = std::fs::read_to_string(&cache_path).ok()?; + serde_json::from_str(&content).ok() + } + + /// Write a mapping to the cache. + fn write_to_cache(&self, normalized_name: &str, lookup: &PyPiPackageLookup) { + let Some(cache_path) = self.cache_path(normalized_name) else { + return; + }; + + if let Some(parent) = cache_path.parent() { + let _ = std::fs::create_dir_all(parent); + } + + if let Ok(content) = serde_json::to_string(lookup) { + let _ = std::fs::write(cache_path, content); + } + } + + /// Fetch a mapping from the API. + async fn fetch_from_api(&self, pypi_name: &str) -> Result { + let url = format!( + "{}/{}/{}.json", + MAPPING_BASE_URL, self.channel_name, pypi_name + ); + + let response = self + .client + .get(&url) + .send() + .await + .map_err(|e| MappingError::FetchError(pypi_name.to_string(), e))?; + + if response.status() == reqwest::StatusCode::NOT_FOUND { + return Err(MappingError::PackageNotFound(pypi_name.to_string())); + } + + let text = response + .text() + .await + .map_err(|e| MappingError::FetchError(pypi_name.to_string(), e))?; + + let lookup: PyPiPackageLookup = serde_json::from_str(&text) + .map_err(|e| MappingError::ParseError(pypi_name.to_string(), e))?; + + Ok(lookup) + } + + /// Get the mapping for a PyPI package, using cache if available. + pub async fn get_mapping(&self, pypi_name: &str) -> Result { + // Check inline mappings first (test-only) + #[cfg(test)] + if let Some(ref mappings) = self.inline_mappings { + return mappings + .get(pypi_name) + .cloned() + .ok_or_else(|| MappingError::PackageNotFound(pypi_name.to_string())); + } + + // Try cache + if let Some(cached) = self.read_from_cache(pypi_name) { + return Ok(cached); + } + + // Fetch from API + let lookup = self.fetch_from_api(pypi_name).await?; + + // Write to cache + self.write_to_cache(pypi_name, &lookup); + + Ok(lookup) + } + + /// Extract the conda package name from a lookup. + /// + /// Returns the best-matching conda package name for the latest version. + fn extract_conda_name(lookup: &PyPiPackageLookup) -> Option { + // The last entry is the latest version. + lookup.conda_versions.values().last().cloned() + } + + /// Convert PEP 440 version specifiers to conda VersionSpec. + /// + /// This handles common specifiers directly and transforms PEP 440-specific + /// syntax like `===` (arbitrary equality) to conda equivalents. + fn convert_version_specifiers( + specifiers: &pep508_rs::VersionOrUrl, + ) -> Result, MappingError> { + let pep508_rs::VersionOrUrl::VersionSpecifier(specs) = specifiers else { + // URL-based dependency, no version constraint + return Ok(None); + }; + + if specs.is_empty() { + return Ok(None); + } + + // Handle PEP 440-specific operators that conda doesn't understand + let spec_str = specs.to_string(); + let converted = Self::convert_pep440_operators(&spec_str); + + VersionSpec::from_str(&converted, ParseStrictness::Lenient) + .map(Some) + .map_err(|e| MappingError::VersionConversionError(spec_str, e.to_string())) + } + + /// Convert PEP 440-specific operators to conda-compatible equivalents. + fn convert_pep440_operators(spec_str: &str) -> String { + // Handle === (arbitrary equality): ===1.0.0 becomes ==1.0.0 + spec_str.replace("===", "==") + } + + /// Create a marker environment for the given platform and Python version. + /// + /// This converts a rattler Platform to a pep508_rs MarkerEnvironment that can be used + /// to evaluate PEP 508 environment markers. + fn create_marker_environment(platform: Platform) -> pep508_rs::MarkerEnvironment { + // Map Platform to Python's sys.platform and other marker values + let (sys_platform, os_name, platform_system, platform_machine) = match platform { + Platform::Linux64 => ("linux", "posix", "Linux", "x86_64"), + Platform::LinuxAarch64 => ("linux", "posix", "Linux", "aarch64"), + Platform::LinuxPpc64le => ("linux", "posix", "Linux", "ppc64le"), + Platform::LinuxS390X => ("linux", "posix", "Linux", "s390x"), + Platform::LinuxArmV6l => ("linux", "posix", "Linux", "armv6l"), + Platform::LinuxArmV7l => ("linux", "posix", "Linux", "armv7l"), + Platform::Linux32 => ("linux", "posix", "Linux", "i686"), + Platform::Osx64 => ("darwin", "posix", "Darwin", "x86_64"), + Platform::OsxArm64 => ("darwin", "posix", "Darwin", "arm64"), + Platform::Win64 => ("win32", "nt", "Windows", "AMD64"), + Platform::Win32 => ("win32", "nt", "Windows", "x86"), + Platform::WinArm64 => ("win32", "nt", "Windows", "ARM64"), + Platform::NoArch => ("linux", "posix", "Linux", "x86_64"), + _ => ("linux", "posix", "Linux", "x86_64"), // Default to linux x86_64 for unknown platforms + }; + + // Use builder pattern to create MarkerEnvironment + // Note: Python version fields are set to dummy values since we strip non-system fields + // from markers before evaluation. Only system fields (os_name, platform_*, sys_platform) matter. + pep508_rs::MarkerEnvironment::try_from(pep508_rs::MarkerEnvironmentBuilder { + implementation_name: "cpython", + implementation_version: "1.0.0", + os_name, + platform_machine, + platform_python_implementation: "CPython", + platform_release: "", + platform_system, + platform_version: "", + python_full_version: "1.0.0", + python_version: "1.0.0", + sys_platform, + }) + .expect("Failed to create MarkerEnvironment") + } + + /// Check if a marker contains any non-system fields. + /// + /// Non-system fields include python_version, python_full_version, implementation_*, + /// platform_python_implementation, platform_release, platform_version, and extra. + fn contains_non_system_fields(marker: &pep508_rs::MarkerTree) -> bool { + // Check for both snake_case and PascalCase variants to handle different + // pep508_rs versions and Debug format variations + // Fields can be found here: https://peps.python.org/pep-0508/#environment-markers + let non_system_fields = [ + "python_version", + "PythonVersion", + "python_full_version", + "PythonFullVersion", + "implementation_name", + "ImplementationName", + "implementation_version", + "ImplementationVersion", + "platform_python_implementation", + "PlatformPythonImplementation", + "platform_release", + "PlatformRelease", + "platform_version", + "PlatformVersion", + "extra", + "Extra", + ]; + + let marker_str = format!("{:?}", marker); + non_system_fields.iter().any(|f| marker_str.contains(f)) + } + + /// Check if a requirement should be skipped for the given platform. + /// + /// Returns true if the requirement should be skipped (excluded), false if it should be included. + /// + /// For NoArch platforms, ALL dependencies with markers (system or non-system) are excluded + /// because noarch packages must be platform-independent. + /// + /// If a marker contains ANY non-system fields (python_version, python_full_version, + /// implementation details, extras, etc.), the dependency is excluded entirely. + /// This conservative approach prevents incorrectly including dependencies with + /// version constraints we cannot evaluate at recipe generation time. + fn should_skip_requirement( + req: &pep508_rs::Requirement, + platform: Platform, + ) -> bool { + // If there are no markers, always include (don't skip) + if req.marker == pep508_rs::MarkerTree::default() { + return false; + } + + // For NoArch platform, exclude ALL dependencies with markers + // NoArch packages must be platform-independent + if platform == Platform::NoArch { + return true; + } + + // If the marker contains any non-system fields, exclude it entirely + // This is conservative: better to exclude and let users add manually + // than to include incorrectly and cause build failures + if Self::contains_non_system_fields(&req.marker) { + tracing::debug!( + "Excluding dependency '{}' because marker {:?} contains non-system fields (python_version, etc.)", + req.name, + req.marker + ); + return true; + } + + // At this point, marker contains only system fields + // Evaluate against the platform + let marker_env = Self::create_marker_environment(platform); + let result = req.marker.evaluate(&marker_env, &[]); + + tracing::debug!( + "Dependency '{}' with system-only marker {:?} evaluates to {} for platform {}", + req.name, + req.marker, + result, + platform + ); + + // Skip if marker evaluates to false (requirement not applicable to this platform) + !result + } + + /// Map a list of PEP 508 requirements to conda MatchSpecs. + /// + /// Returns a list of successfully mapped dependencies. Unmapped packages + /// are logged as warnings and skipped. + pub async fn map_requirements( + &self, + requirements: &[pep508_rs::Requirement], + platform: Platform, + ) -> Result, MappingError> { + let mut mapped = Vec::new(); + + for req in requirements { + // Evaluate markers against the target platform + if Self::should_skip_requirement(req, platform) { + tracing::debug!( + "Skipping dependency '{}' due to environment marker evaluation: {:?}", + req.name, + req.marker + ); + continue; + } + + // Get the mapping + let lookup = match self.get_mapping(req.name.as_ref()).await { + Ok(l) => l, + Err(MappingError::PackageNotFound(_)) => { + tracing::warn!( + "PyPI package '{}' has no conda-forge mapping, skipping", + req.name + ); + continue; + } + Err(e) => return Err(e), + }; + + // Extract the conda package name + let conda_name_str = match Self::extract_conda_name(&lookup) { + Some(n) => n, + None => { + tracing::warn!( + "No conda package names found in mapping for '{}', skipping", + req.name + ); + continue; + } + }; + + // Parse conda package name + let conda_name = PackageName::from_str(&conda_name_str) + .map_err(|e| MappingError::InvalidPackageName(conda_name_str.clone(), e))?; + + // Convert version specifiers + let version_spec = if let Some(ref version_or_url) = req.version_or_url { + match Self::convert_version_specifiers(version_or_url) { + Ok(spec) => spec, + Err(e) => { + tracing::warn!( + "Failed to convert version specifier for '{}': {}, using unconstrained version", + req.name, + e + ); + None + } + } + } else { + None + }; + + mapped.push(MappedCondaDependency { + name: conda_name, + version_spec, + }); + } + + Ok(mapped) + } +} + +/// Filter mapped PyPI dependencies, returning only those not already specified +/// in Pixi's run dependencies. +/// +/// This implements the merging behavior where Pixi dependencies take precedence +/// over inferred pyproject.toml dependencies. Dependencies not specified in +/// `skip_packages` are returned as MatchSpecs ready to be added to requirements. +pub fn filter_mapped_pypi_deps( + mapped_deps: &[MappedCondaDependency], + skip_packages: &HashSet, +) -> Vec { + mapped_deps + .iter() + .filter(|dep| { + let pkg_name = pixi_build_types::SourcePackageName::from(dep.name.as_normalized()); + !skip_packages.contains(&pkg_name) + }) + .map(|dep| dep.to_match_spec()) + .collect() +} + +/// Extract the channel name from a channel URL. +/// +/// Returns the last path segment (e.g., "conda-forge" from +/// "https://prefix.dev/conda-forge"). +pub fn extract_channel_name(channel: &ChannelUrl) -> Option<&str> { + channel.as_str().trim_end_matches('/').rsplit('/').next() +} + +/// Map PyPI requirements to conda dependencies using the first channel that provides a valid mapping. +/// +/// Tries each channel in order and returns the mapped dependencies from the first +/// channel that successfully maps at least one dependency. Returns an empty Vec +/// if no channel provides a mapping. +/// +/// The `context` parameter is used for logging (e.g., "project dependencies" or +/// "build-system requirements"). +pub async fn map_requirements_with_channels( + requirements: &[pep508_rs::Requirement], + channels: &[ChannelUrl], + cache_dir: &Option, + context: &str, + platform: Platform, +) -> Vec { + for channel in channels { + if let Some(channel_name) = extract_channel_name(channel) { + let mapper = PyPiToCondaMapper::new(cache_dir.clone(), channel_name.to_string()); + match mapper.map_requirements(requirements, platform).await { + Ok(deps) if !deps.is_empty() => { + tracing::debug!( + "Using PyPI-to-conda mapping for {} from channel '{}'", + context, + channel_name + ); + return deps; + } + Ok(_) => { + tracing::warn!( + "No PyPI-to-conda mapping found for {} in channel '{}'", + context, + channel_name + ); + } + Err(e) => { + tracing::warn!( + "Failed to get PyPI-to-conda mapping for {} in channel '{}': {}", + context, + channel_name, + e + ); + } + } + } + } + Vec::new() +} + +/// Build tools that require specific compilers. +/// +/// Maps PyPI package names to the compilers they require. This is used to +/// automatically detect compilers from `build-system.requires` in pyproject.toml. +const BUILD_TOOL_COMPILER_MAPPINGS: &[(&str, &[&str])] = + &[("maturin", &["rust"]), ("setuptools-rust", &["rust"])]; + +/// Detect compilers required by build tools in `build-system.requires`. +/// +/// Examines the list of PEP 508 requirements and returns any compilers that +/// should be automatically added based on the detected build tools. +pub fn detect_compilers_from_build_requirements( + requirements: &[pep508_rs::Requirement], +) -> Vec { + let mut detected_compilers = HashSet::new(); + + for req in requirements { + let package_name = req.name.as_ref(); + + for (tool_name, compilers) in BUILD_TOOL_COMPILER_MAPPINGS { + if package_name == *tool_name { + detected_compilers.extend(compilers.iter().map(|s| s.to_string())); + } + } + } + + detected_compilers.into_iter().collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_convert_pep440_operators() { + assert_eq!( + PyPiToCondaMapper::convert_pep440_operators(">=1.0,<2.0"), + ">=1.0,<2.0" + ); + assert_eq!( + PyPiToCondaMapper::convert_pep440_operators("===1.0.0"), + "==1.0.0" + ); + assert_eq!( + PyPiToCondaMapper::convert_pep440_operators("~=1.4.2"), + "~=1.4.2" + ); + } + + #[test] + fn test_extract_conda_name() { + let lookup = PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "requests".to_string(), + conda_versions: IndexMap::from([ + ("2.31.0".to_string(), "requests".to_string()), + ("2.32.0".to_string(), "requests".to_string()), + ]), + }; + + assert_eq!( + PyPiToCondaMapper::extract_conda_name(&lookup), + Some("requests".to_string()) + ); + } + + #[test] + fn test_extract_conda_name_empty() { + let lookup = PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "unknown".to_string(), + conda_versions: IndexMap::new(), + }; + + assert_eq!(PyPiToCondaMapper::extract_conda_name(&lookup), None); + } + + #[test] + fn test_extract_conda_name_returns_value() { + // The API returns the best-matching conda package directly + let lookup = PyPiPackageLookup { + format_version: "1.0".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "jinja2".to_string(), + conda_versions: IndexMap::from([("3.1.3".to_string(), "jinja2".to_string())]), + }; + + assert_eq!( + PyPiToCondaMapper::extract_conda_name(&lookup), + Some("jinja2".to_string()) + ); + } + + #[tokio::test] + async fn test_map_requirements_with_inline_mappings() { + let mappings = IndexMap::from([ + ( + "requests".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "requests".to_string(), + conda_versions: IndexMap::from([( + "2.31.0".to_string(), + "requests".to_string(), + )]), + }, + ), + ( + "flask".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "flask".to_string(), + conda_versions: IndexMap::from([("2.0.0".to_string(), "flask".to_string())]), + }, + ), + ]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + let requirements = vec![ + pep508_rs::Requirement::from_str("requests>=2.0").unwrap(), + pep508_rs::Requirement::from_str("flask").unwrap(), + ]; + + let mapped = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + + assert_eq!(mapped.len(), 2); + assert_eq!(mapped[0].name.as_normalized(), "requests"); + assert_eq!( + mapped[0].version_spec.as_ref().unwrap().to_string(), + ">=2.0" + ); + assert_eq!(mapped[1].name.as_normalized(), "flask"); + assert!(mapped[1].version_spec.is_none()); + } + + fn make_mapped_dep(name: &str, version_spec: Option<&str>) -> MappedCondaDependency { + MappedCondaDependency { + name: PackageName::from_str(name).unwrap(), + version_spec: version_spec + .map(|s| VersionSpec::from_str(s, ParseStrictness::Lenient).unwrap()), + } + } + + #[test] + fn test_filter_mapped_pypi_deps_without_pixi_deps() { + // When no Pixi deps are specified, all mapped deps should pass through + let mapped_deps = vec![ + make_mapped_dep("requests", Some(">=2.0")), + make_mapped_dep("flask", None), + ]; + + let skip_packages: HashSet = HashSet::new(); + + let result = filter_mapped_pypi_deps(&mapped_deps, &skip_packages); + + assert_eq!(result.len(), 2); + assert!(result.iter().any(|r| r.to_string().contains("requests"))); + assert!(result.iter().any(|r| r.to_string().contains("flask"))); + } + + #[test] + fn test_filter_mapped_pypi_deps_override_but_others_preserved() { + // When Pixi specifies some deps, those should be filtered out + // but other deps should still pass through + let mapped_deps = vec![ + make_mapped_dep("requests", Some(">=2.0")), + make_mapped_dep("flask", Some(">=1.0")), + make_mapped_dep("numpy", None), + ]; + + // Pixi specifies "requests" - it should be filtered out + let skip_packages: HashSet = + HashSet::from([pixi_build_types::SourcePackageName::from("requests")]); + + let result = filter_mapped_pypi_deps(&mapped_deps, &skip_packages); + + // requests should NOT be in result (filtered by Pixi override) + // flask and numpy should be in result + assert_eq!(result.len(), 2); + assert!(!result.iter().any(|r| r.to_string().contains("requests"))); + assert!(result.iter().any(|r| r.to_string().contains("flask"))); + assert!(result.iter().any(|r| r.to_string().contains("numpy"))); + } + + #[test] + fn test_filter_mapped_pypi_deps_all_filtered_when_all_in_pixi() { + // When all mapped deps are already in Pixi, nothing should pass through + let mapped_deps = vec![ + make_mapped_dep("requests", Some(">=2.0")), + make_mapped_dep("flask", None), + ]; + + let skip_packages: HashSet = HashSet::from([ + pixi_build_types::SourcePackageName::from("requests"), + pixi_build_types::SourcePackageName::from("flask"), + ]); + + let result = filter_mapped_pypi_deps(&mapped_deps, &skip_packages); + + assert!(result.is_empty()); + } + + #[test] + fn test_extract_channel_name() { + use url::Url; + + // Test extracting channel name from various URL formats + let url1 = ChannelUrl::from(Url::parse("https://prefix.dev/conda-forge").unwrap()); + assert_eq!(extract_channel_name(&url1), Some("conda-forge")); + + let url2 = ChannelUrl::from(Url::parse("https://conda.anaconda.org/conda-forge/").unwrap()); + assert_eq!(extract_channel_name(&url2), Some("conda-forge")); + + let url3 = ChannelUrl::from(Url::parse("https://example.com/my-channel").unwrap()); + assert_eq!(extract_channel_name(&url3), Some("my-channel")); + } + + #[tokio::test] + async fn test_marker_evaluation_linux() { + let mappings = IndexMap::from([( + "typing-extensions".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "typing-extensions".to_string(), + conda_versions: IndexMap::from([( + "4.0.0".to_string(), + "typing-extensions".to_string(), + )]), + }, + )]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Requirement with sys_platform == "linux" marker - should be included on Linux + let requirements = vec![ + pep508_rs::Requirement::from_str("typing-extensions; sys_platform == 'linux'").unwrap(), + ]; + + let mapped_linux = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + assert_eq!(mapped_linux.len(), 1, "Should include on Linux64"); + + let mapped_win = mapper + .map_requirements(&requirements, Platform::Win64) + .await + .unwrap(); + assert_eq!(mapped_win.len(), 0, "Should exclude on Win64"); + } + + #[tokio::test] + async fn test_marker_evaluation_windows() { + let mappings = IndexMap::from([( + "colorama".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "colorama".to_string(), + conda_versions: IndexMap::from([("0.4.6".to_string(), "colorama".to_string())]), + }, + )]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Requirement with sys_platform == "win32" marker - should be included on Windows + let requirements = + vec![pep508_rs::Requirement::from_str("colorama; sys_platform == 'win32'").unwrap()]; + + let mapped_win = mapper + .map_requirements(&requirements, Platform::Win64) + .await + .unwrap(); + assert_eq!(mapped_win.len(), 1, "Should include on Win64"); + + let mapped_linux = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + assert_eq!(mapped_linux.len(), 0, "Should exclude on Linux64"); + } + + #[tokio::test] + async fn test_marker_evaluation_darwin() { + let mappings = IndexMap::from([( + "pyobjc-core".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "pyobjc-core".to_string(), + conda_versions: IndexMap::from([("9.0".to_string(), "pyobjc-core".to_string())]), + }, + )]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Requirement with sys_platform == "darwin" marker - should be included on macOS + let requirements = vec![ + pep508_rs::Requirement::from_str("pyobjc-core; sys_platform == 'darwin'").unwrap(), + ]; + + let mapped_osx = mapper + .map_requirements(&requirements, Platform::Osx64) + .await + .unwrap(); + assert_eq!(mapped_osx.len(), 1, "Should include on Osx64"); + + let mapped_linux = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + assert_eq!(mapped_linux.len(), 0, "Should exclude on Linux64"); + } + + #[tokio::test] + async fn test_marker_evaluation_no_marker() { + let mapper = PyPiToCondaMapper::with_inline_mappings(IndexMap::from([( + "requests".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "requests".to_string(), + conda_versions: IndexMap::from([("2.31.0".to_string(), "requests".to_string())]), + }, + )])); + + let requirements = vec![pep508_rs::Requirement::from_str("requests").unwrap()]; + + for &platform in &[Platform::Linux64, Platform::Win64, Platform::Osx64] { + let mapped = mapper + .map_requirements(&requirements, platform) + .await + .unwrap(); + assert_eq!(mapped.len(), 1, "Should include on {:?}", platform); + } + } + + #[tokio::test] + async fn test_marker_python_full_version_excluded() { + let mappings = IndexMap::from([( + "importlib-metadata".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "importlib-metadata".to_string(), + conda_versions: IndexMap::from([( + "6.0.0".to_string(), + "importlib-metadata".to_string(), + )]), + }, + )]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Requirement with python_full_version marker + let requirements = vec![ + pep508_rs::Requirement::from_str("importlib-metadata; python_full_version < '3.10.0'") + .unwrap(), + ]; + + let mapped = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + assert_eq!( + mapped.len(), + 0, + "Should exclude dependency with python_full_version marker (non-system field)" + ); + } + + #[tokio::test] + async fn test_marker_combined_python_and_system() { + let mappings = IndexMap::from([( + "pywin32".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "pywin32".to_string(), + conda_versions: IndexMap::from([("306".to_string(), "pywin32".to_string())]), + }, + )]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Requirement with both Python version AND system marker + // The python_version part is stripped, leaving only sys_platform == 'win32' to evaluate + let requirements = vec![ + pep508_rs::Requirement::from_str( + "pywin32; sys_platform == 'win32' and python_version >= '3.8'", + ) + .unwrap(), + ]; + + let mapped_linux = mapper + .map_requirements(&requirements, Platform::Linux64) + .await + .unwrap(); + assert_eq!( + mapped_linux.len(), + 0, + "Should exclude on Linux because sys_platform == 'win32' evaluates to false (after stripping python_version)" + ); + + let mapped_win = mapper + .map_requirements(&requirements, Platform::Win64) + .await + .unwrap(); + assert_eq!( + mapped_win.len(), + 0, + "Should exclude because we can't check python_version, even though sys_platform == 'win32' is true" + ); + } + + #[tokio::test] + async fn test_all_system_marker_styles() { + // Test all supported system marker types in a compact table-driven test + let mappings = IndexMap::from([( + "test-pkg".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "test-pkg".to_string(), + conda_versions: IndexMap::from([("1.0.0".to_string(), "test-pkg".to_string())]), + }, + )]); + + let test_cases = vec![ + // (marker_expression, platform, should_include) + // sys_platform markers + ("sys_platform == 'linux'", Platform::Linux64, true), + ("sys_platform == 'linux'", Platform::LinuxAarch64, true), + ("sys_platform == 'linux'", Platform::Win64, false), + ("sys_platform == 'linux'", Platform::Osx64, false), + ("sys_platform == 'win32'", Platform::Win64, true), + ("sys_platform == 'win32'", Platform::Win32, true), + ("sys_platform == 'win32'", Platform::WinArm64, true), + ("sys_platform == 'win32'", Platform::Linux64, false), + ("sys_platform == 'darwin'", Platform::Osx64, true), + ("sys_platform == 'darwin'", Platform::OsxArm64, true), + ("sys_platform == 'darwin'", Platform::Linux64, false), + // platform_system markers + ("platform_system == 'Linux'", Platform::Linux64, true), + ("platform_system == 'Linux'", Platform::LinuxAarch64, true), + ("platform_system == 'Linux'", Platform::Win64, false), + ("platform_system == 'Windows'", Platform::Win64, true), + ("platform_system == 'Windows'", Platform::Win32, true), + ("platform_system == 'Windows'", Platform::Linux64, false), + ("platform_system == 'Darwin'", Platform::Osx64, true), + ("platform_system == 'Darwin'", Platform::OsxArm64, true), + ("platform_system == 'Darwin'", Platform::Linux64, false), + // os_name markers + ("os_name == 'posix'", Platform::Linux64, true), + ("os_name == 'posix'", Platform::Osx64, true), + ("os_name == 'posix'", Platform::Win64, false), + ("os_name == 'nt'", Platform::Win64, true), + ("os_name == 'nt'", Platform::Linux64, false), + // platform_machine markers + ("platform_machine == 'x86_64'", Platform::Linux64, true), + ("platform_machine == 'x86_64'", Platform::Osx64, true), + ( + "platform_machine == 'x86_64'", + Platform::LinuxAarch64, + false, + ), + ( + "platform_machine == 'aarch64'", + Platform::LinuxAarch64, + true, + ), + ("platform_machine == 'aarch64'", Platform::Linux64, false), + ("platform_machine == 'arm64'", Platform::OsxArm64, true), + ("platform_machine == 'arm64'", Platform::Osx64, false), + ("platform_machine == 'AMD64'", Platform::Win64, true), + ("platform_machine == 'AMD64'", Platform::Win32, false), + ]; + + for (marker, platform, should_include) in test_cases { + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings.clone()); + let requirement_str = format!("test-pkg; {}", marker); + let requirements = vec![pep508_rs::Requirement::from_str(&requirement_str).unwrap()]; + + let mapped = mapper + .map_requirements(&requirements, platform) + .await + .unwrap(); + + let expected_len = if should_include { 1 } else { 0 }; + assert_eq!( + mapped.len(), + expected_len, + "Marker '{}' on {:?} should {} the package", + marker, + platform, + if should_include { "include" } else { "exclude" } + ); + } + } + #[test] + fn test_detect_compilers_maturin() { + let requirements = vec![pep508_rs::Requirement::from_str("maturin>=1.0,<2.0").unwrap()]; + + let compilers = detect_compilers_from_build_requirements(&requirements); + + assert_eq!(compilers, vec!["rust"]); + } + + #[test] + fn test_detect_compilers_setuptools_rust() { + let requirements = vec![pep508_rs::Requirement::from_str("setuptools-rust>=1.0").unwrap()]; + + let compilers = detect_compilers_from_build_requirements(&requirements); + + assert_eq!(compilers, vec!["rust"]); + } + + #[test] + fn test_detect_compilers_no_special_tools() { + let requirements = vec![ + pep508_rs::Requirement::from_str("setuptools>=42").unwrap(), + pep508_rs::Requirement::from_str("wheel").unwrap(), + ]; + + let compilers = detect_compilers_from_build_requirements(&requirements); + + assert!(compilers.is_empty()); + } + + #[test] + fn test_detect_compilers_deduplicates() { + // Both maturin and setuptools-rust require rust - should only appear once + let requirements = vec![ + pep508_rs::Requirement::from_str("maturin>=1.0").unwrap(), + pep508_rs::Requirement::from_str("setuptools-rust>=1.0").unwrap(), + ]; + + let compilers = detect_compilers_from_build_requirements(&requirements); + + assert_eq!(compilers, vec!["rust"]); + } + + #[tokio::test] + async fn test_noarch_excludes_all_marker_dependencies() { + let mappings = IndexMap::from([ + ( + "requests".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "requests".to_string(), + conda_versions: IndexMap::from([( + "2.31.0".to_string(), + "requests".to_string(), + )]), + }, + ), + ( + "colorama".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "colorama".to_string(), + conda_versions: IndexMap::from([("0.4.6".to_string(), "colorama".to_string())]), + }, + ), + ( + "importlib-metadata".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "importlib-metadata".to_string(), + conda_versions: IndexMap::from([( + "6.0.0".to_string(), + "importlib-metadata".to_string(), + )]), + }, + ), + ]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Test with various marker types - all should be excluded for NoArch + let requirements = vec![ + // No marker - should be included + pep508_rs::Requirement::from_str("requests").unwrap(), + // System marker - should be excluded for NoArch + pep508_rs::Requirement::from_str("colorama; sys_platform == 'win32'").unwrap(), + // Non-system marker - should be excluded for NoArch + pep508_rs::Requirement::from_str("importlib-metadata; python_full_version < '3.10.0'") + .unwrap(), + ]; + + let mapped = mapper + .map_requirements(&requirements, Platform::NoArch) + .await + .unwrap(); + + // Only the dependency without markers should be included + assert_eq!( + mapped.len(), + 1, + "NoArch should only include dependencies without markers" + ); + assert_eq!( + mapped[0].name.as_normalized(), + "requests", + "NoArch should include the unmarked dependency" + ); + } + + #[tokio::test] + async fn test_noarch_excludes_system_markers() { + let mappings = IndexMap::from([ + ( + "typing-extensions".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "typing-extensions".to_string(), + conda_versions: IndexMap::from([( + "4.0.0".to_string(), + "typing-extensions".to_string(), + )]), + }, + ), + ( + "pyobjc-core".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "pyobjc-core".to_string(), + conda_versions: IndexMap::from([( + "9.0".to_string(), + "pyobjc-core".to_string(), + )]), + }, + ), + ]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Test various system markers - all should be excluded for NoArch + let test_cases = vec![ + ("typing-extensions; sys_platform == 'linux'", "sys_platform"), + ( + "typing-extensions; platform_system == 'Linux'", + "platform_system", + ), + ("typing-extensions; os_name == 'posix'", "os_name"), + ( + "typing-extensions; platform_machine == 'x86_64'", + "platform_machine", + ), + ( + "pyobjc-core; sys_platform == 'darwin'", + "sys_platform darwin", + ), + ]; + + for (req_str, marker_desc) in test_cases { + let requirements = vec![pep508_rs::Requirement::from_str(req_str).unwrap()]; + + let mapped = mapper + .map_requirements(&requirements, Platform::NoArch) + .await + .unwrap(); + + assert_eq!( + mapped.len(), + 0, + "NoArch should exclude dependency with {} marker", + marker_desc + ); + } + } + + #[tokio::test] + async fn test_noarch_includes_no_marker_dependencies() { + let mappings = IndexMap::from([ + ( + "requests".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "requests".to_string(), + conda_versions: IndexMap::from([( + "2.31.0".to_string(), + "requests".to_string(), + )]), + }, + ), + ( + "flask".to_string(), + PyPiPackageLookup { + format_version: "1".to_string(), + channel: "conda-forge".to_string(), + pypi_name: "flask".to_string(), + conda_versions: IndexMap::from([("2.0.0".to_string(), "flask".to_string())]), + }, + ), + ]); + + let mapper = PyPiToCondaMapper::with_inline_mappings(mappings); + + // Dependencies without markers should be included for NoArch + let requirements = vec![ + pep508_rs::Requirement::from_str("requests>=2.0").unwrap(), + pep508_rs::Requirement::from_str("flask").unwrap(), + ]; + + let mapped = mapper + .map_requirements(&requirements, Platform::NoArch) + .await + .unwrap(); + + assert_eq!( + mapped.len(), + 2, + "NoArch should include all dependencies without markers" + ); + assert_eq!(mapped[0].name.as_normalized(), "requests"); + assert_eq!(mapped[1].name.as_normalized(), "flask"); + } +} diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__metadata__tests__generated_recipe_contains_pyproject_values.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__metadata__tests__generated_recipe_contains_pyproject_values.snap new file mode 100644 index 0000000000..5e244d66c3 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__metadata__tests__generated_recipe_contains_pyproject_values.snap @@ -0,0 +1,32 @@ +--- +source: crates/pixi-build-python/src/metadata.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: test-package + version: 99.0.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" + noarch: python +requirements: + build: [] + host: + - pip + - python + run: + - boltons + - python + run_constraints: [] +tests: [] +about: + homepage: "https://example.com" + license: MIT + license_file: ~ + summary: A test package + description: A test package + documentation: "https://docs.example.com" + repository: "https://github.com/example/test-package" +extra: ~ diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__c_compilers_create_extra_input_globs.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__c_compilers_create_extra_input_globs.snap new file mode 100644 index 0000000000..c5b2d56102 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__c_compilers_create_extra_input_globs.snap @@ -0,0 +1,19 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: result +--- +Ok( + { + "**/*.py", + "**/*.pyx", + "**/*.{c,h}", + "Pipfile", + "Pipfile.lock", + "poetry.lock", + "pyproject.toml", + "requirements*.txt", + "setup.cfg", + "setup.py", + "tox.ini", + }, +) diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__cxx_compilers_create_extra_input_globs.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__cxx_compilers_create_extra_input_globs.snap new file mode 100644 index 0000000000..5c3255de71 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__cxx_compilers_create_extra_input_globs.snap @@ -0,0 +1,19 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: result +--- +Ok( + { + "**/*.py", + "**/*.pyx", + "**/*.{cc,cxx,cpp,hpp,hxx}", + "Pipfile", + "Pipfile.lock", + "poetry.lock", + "pyproject.toml", + "requirements*.txt", + "setup.cfg", + "setup.py", + "tox.ini", + }, +) diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__env_vars_are_set.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__env_vars_are_set.snap new file mode 100644 index 0000000000..e8091a63ec --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__env_vars_are_set.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: generated_recipe.recipe.build.script +--- +content: "[ ... script ... ]" +env: + foo: bar +secrets: [] diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs.snap new file mode 100644 index 0000000000..08d7344226 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs.snap @@ -0,0 +1,19 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: result +--- +Ok( + { + "**/*.py", + "**/*.pyx", + "Pipfile", + "Pipfile.lock", + "custom/*.py", + "poetry.lock", + "pyproject.toml", + "requirements*.txt", + "setup.cfg", + "setup.py", + "tox.ini", + }, +) diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs_editable.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs_editable.snap new file mode 100644 index 0000000000..65d8efb449 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__input_globs_includes_extra_globs_editable.snap @@ -0,0 +1,17 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: result +--- +Ok( + { + "Pipfile", + "Pipfile.lock", + "custom/*.py", + "poetry.lock", + "pyproject.toml", + "requirements*.txt", + "setup.cfg", + "setup.py", + "tox.ini", + }, +) diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__pip_is_in_host_requirements.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__pip_is_in_host_requirements.snap new file mode 100644 index 0000000000..e40a49de99 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__pip_is_in_host_requirements.snap @@ -0,0 +1,32 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" + noarch: python +requirements: + build: [] + host: + - pip + - python + run: + - boltons + - python + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__python_is_not_added_if_already_present.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__python_is_not_added_if_already_present.snap new file mode 100644 index 0000000000..8cd63bf3c1 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__python_is_not_added_if_already_present.snap @@ -0,0 +1,32 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" + noarch: python +requirements: + build: [] + host: + - python + - pip + run: + - boltons + - python + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__rust_compilers_create_extra_input_globs.snap b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__rust_compilers_create_extra_input_globs.snap new file mode 100644 index 0000000000..c29d602da3 --- /dev/null +++ b/crates/pixi-build-python/src/snapshots/pixi_build_python__tests__rust_compilers_create_extra_input_globs.snap @@ -0,0 +1,20 @@ +--- +source: crates/pixi-build-python/src/main.rs +expression: result +--- +Ok( + { + "**/*.py", + "**/*.pyx", + "**/*.rs", + "**/Cargo.toml", + "Pipfile", + "Pipfile.lock", + "poetry.lock", + "pyproject.toml", + "requirements*.txt", + "setup.cfg", + "setup.py", + "tox.ini", + }, +) diff --git a/crates/pixi-build-rattler-build/Cargo.toml b/crates/pixi-build-rattler-build/Cargo.toml new file mode 100644 index 0000000000..27bb956881 --- /dev/null +++ b/crates/pixi-build-rattler-build/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "pixi-build-rattler-build" +version = "0.3.6" +edition.workspace = true + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] + +[dependencies] +async-trait = { workspace = true } +miette = { workspace = true } +rattler_conda_types = { workspace = true } +rattler-build = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tempfile = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +pathdiff = { workspace = true } + +pixi-build-backend = { workspace = true } + +pixi_build_types = { workspace = true } +chrono = "0.4.41" +tracing.workspace = true + +[dev-dependencies] +insta = { workspace = true, features = ["json", "glob"] } +serde_json = { workspace = true } diff --git a/crates/pixi-build-rattler-build/pixi.toml b/crates/pixi-build-rattler-build/pixi.toml new file mode 100644 index 0000000000..db392f4861 --- /dev/null +++ b/crates/pixi-build-rattler-build/pixi.toml @@ -0,0 +1,10 @@ +[package.build.backend] +name = "pixi-build-rust" +version = "*" +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[package.run-dependencies] +pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-rattler-build/src/config.rs b/crates/pixi-build-rattler-build/src/config.rs new file mode 100644 index 0000000000..acd321fd60 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/config.rs @@ -0,0 +1,220 @@ +use pixi_build_backend::generated_recipe::BackendConfig; +use serde::{Deserialize, Serialize}; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +pub struct RattlerBuildBackendConfig { + /// Deprecated. Setting this has no effect; debug data is always written to + /// the `debug` subdirectory of the work directory. + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + /// Extra input globs to include in addition to the default ones + #[serde(default)] + pub extra_input_globs: Vec, + /// Enable experimental features in rattler-build (e.g., cache support for multi-output recipes) + #[serde(default)] + pub experimental: Option, +} + +impl BackendConfig for RattlerBuildBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values override base values using the following rules: + /// - debug_dir: Not allowed to have target specific value + /// - extra_input_globs: Platform-specific completely replaces base + /// - experimental: Not allowed to have target specific value + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + if target_config.experimental.is_some() { + miette::bail!("`experimental` cannot have a target specific value"); + } + + Ok(Self { + debug_dir: self.debug_dir.clone(), + extra_input_globs: if target_config.extra_input_globs.is_empty() { + self.extra_input_globs.clone() + } else { + target_config.extra_input_globs.clone() + }, + experimental: self.experimental, + }) + } +} + +#[cfg(test)] +mod tests { + use super::RattlerBuildBackendConfig; + use pixi_build_backend::generated_recipe::BackendConfig; + use serde_json::json; + use std::path::PathBuf; + + #[test] + fn test_ensure_deseralize_from_empty() { + let json_data = json!({}); + serde_json::from_value::(json_data).unwrap(); + } + + #[test] + fn test_merge_with_target_config() { + let base_config = RattlerBuildBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + experimental: Some(false), + }; + + let target_config = RattlerBuildBackendConfig { + debug_dir: None, + extra_input_globs: vec!["*.target".to_string()], + experimental: None, // Not specified in target + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // debug_dir should use base value + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + + // extra_input_globs should be completely overridden + assert_eq!(merged.extra_input_globs, vec!["*.target".to_string()]); + + // experimental should be preserved from base + assert_eq!(merged.experimental, Some(false)); + } + + #[test] + fn test_merge_with_empty_target_config() { + let base_config = RattlerBuildBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + experimental: Some(true), + }; + + let empty_target_config = RattlerBuildBackendConfig::default(); + + let merged = base_config + .merge_with_target_config(&empty_target_config) + .unwrap(); + + // Should keep base values when target is empty + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + assert_eq!(merged.extra_input_globs, vec!["*.base".to_string()]); + // experimental should be true when base has it enabled + assert_eq!(merged.experimental, Some(true)); + } + + #[test] + fn test_merge_target_debug_dir_error() { + let base_config = RattlerBuildBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + ..Default::default() + }; + + let target_config = RattlerBuildBackendConfig { + debug_dir: Some(PathBuf::from("/target/debug")), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`debug_dir` cannot have a target specific value")); + } + + #[test] + fn test_merge_target_experimental_error() { + // Test that setting experimental in target config returns an error (even if false) + let base_config = RattlerBuildBackendConfig { + experimental: None, + ..Default::default() + }; + + // Test with experimental = true in target + let target_config = RattlerBuildBackendConfig { + experimental: Some(true), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`experimental` cannot have a target specific value")); + + // Test with experimental = false in target (should also error) + let target_config = RattlerBuildBackendConfig { + experimental: Some(false), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`experimental` cannot have a target specific value")); + } + + #[test] + fn test_merge_experimental_from_base() { + // Test that experimental value from base config is preserved + let base = RattlerBuildBackendConfig { + experimental: Some(true), + ..Default::default() + }; + let target = RattlerBuildBackendConfig { + experimental: None, // Not specified in target + ..Default::default() + }; + let merged = base.merge_with_target_config(&target).unwrap(); + assert_eq!(merged.experimental, Some(true)); + + // Test with experimental false in base + let base = RattlerBuildBackendConfig { + experimental: Some(false), + ..Default::default() + }; + let target = RattlerBuildBackendConfig { + experimental: None, // Not specified in target + ..Default::default() + }; + let merged = base.merge_with_target_config(&target).unwrap(); + assert_eq!(merged.experimental, Some(false)); + + // Test with experimental None in base (default) + let base = RattlerBuildBackendConfig { + experimental: None, + ..Default::default() + }; + let target = RattlerBuildBackendConfig { + experimental: None, + ..Default::default() + }; + let merged = base.merge_with_target_config(&target).unwrap(); + assert_eq!(merged.experimental, None); + } + + #[test] + fn test_deserialize_experimental() { + let json_data = json!({ + "experimental": true + }); + let config: RattlerBuildBackendConfig = serde_json::from_value(json_data).unwrap(); + assert_eq!(config.experimental, Some(true)); + + let json_data = json!({ + "experimental": false + }); + let config: RattlerBuildBackendConfig = serde_json::from_value(json_data).unwrap(); + assert_eq!(config.experimental, Some(false)); + + // Test that not specifying experimental results in None + let json_data = json!({}); + let config: RattlerBuildBackendConfig = serde_json::from_value(json_data).unwrap(); + assert_eq!(config.experimental, None); + } +} diff --git a/crates/pixi-build-rattler-build/src/main.rs b/crates/pixi-build-rattler-build/src/main.rs new file mode 100644 index 0000000000..8ffc54b3fa --- /dev/null +++ b/crates/pixi-build-rattler-build/src/main.rs @@ -0,0 +1,13 @@ +mod config; +mod protocol; +mod rattler_build; + +use protocol::RattlerBuildBackendInstantiator; + +#[tokio::main] +pub async fn main() { + if let Err(err) = pixi_build_backend::cli::main(RattlerBuildBackendInstantiator::new).await { + eprintln!("{err:?}"); + std::process::exit(1); + } +} diff --git a/crates/pixi-build-rattler-build/src/protocol.rs b/crates/pixi-build-rattler-build/src/protocol.rs new file mode 100644 index 0000000000..ab956320c6 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/protocol.rs @@ -0,0 +1,1199 @@ +use std::{ + collections::{BTreeMap, BTreeSet, HashMap}, + path::{Path, PathBuf}, + sync::Arc, +}; + +use crate::{config::RattlerBuildBackendConfig, rattler_build::RattlerBuildBackend}; +use miette::{Context, IntoDiagnostic}; +use pixi_build_backend::specs_conversion::{ + convert_variant_from_pixi_build_types, convert_variant_to_pixi_build_types, + from_build_v1_args_to_finalized_dependencies, +}; +use pixi_build_backend::{ + dependencies::{convert_constraint_dependencies, convert_dependencies}, + intermediate_backend::{conda_build_v1_directories, find_matching_output}, + protocol::{Protocol, ProtocolInstantiator}, + tools::LoadedVariantConfig, +}; +use pixi_build_types::{ + BackendCapabilities, PathSpec, SourcePackageSpec, Target, + procedures::{ + conda_build_v1::{CondaBuildV1Params, CondaBuildV1Result}, + conda_outputs::{ + CondaOutput, CondaOutputDependencies, CondaOutputIgnoreRunExports, CondaOutputMetadata, + CondaOutputRunExports, CondaOutputsParams, CondaOutputsResult, + }, + initialize::{InitializeParams, InitializeResult}, + negotiate_capabilities::{NegotiateCapabilitiesParams, NegotiateCapabilitiesResult}, + }, +}; +use rattler_build::{ + build::{WorkingDirectoryBehavior, run_build}, + console_utils::LoggingOutputHandler, + hash::HashInfo, + metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages}, + recipe::{ParsingError, Recipe, parser::find_outputs_from_src}, + selectors::SelectorConfig, + tool_configuration::Configuration, + types::{PackageIdentifier, PackagingSettings}, + variant_config::{ParseErrors, VariantConfig}, +}; +use rattler_conda_types::{Platform, compression_level::CompressionLevel, package::ArchiveType}; +use tracing::warn; +pub struct RattlerBuildBackendInstantiator { + logging_output_handler: LoggingOutputHandler, +} + +impl RattlerBuildBackendInstantiator { + /// This type implements [`ProtocolInstantiator`] and can be used to + /// initialize a new [`RattlerBuildBackend`]. + pub fn new(logging_output_handler: LoggingOutputHandler) -> RattlerBuildBackendInstantiator { + RattlerBuildBackendInstantiator { + logging_output_handler, + } + } +} + +#[async_trait::async_trait] +impl Protocol for RattlerBuildBackend { + async fn conda_outputs( + &self, + params: CondaOutputsParams, + ) -> miette::Result { + let build_platform = params.host_platform; + + // Determine the variant configuration to use. This loads the variant + // configuration from disk as well as including the variants from the input + // parameters. + let selector_config_for_variants = SelectorConfig { + target_platform: params.host_platform, + host_platform: params.host_platform, + build_platform, + hash: None, + variant: Default::default(), + experimental: self.config.experimental.unwrap_or(false), + allow_undefined: false, + recipe_path: Some(self.recipe_source.path.clone()), + }; + let variant_config = LoadedVariantConfig::from_recipe_path( + &self.source_dir, + &self.recipe_source.path, + &selector_config_for_variants, + params.variant_files.iter().flatten().map(PathBuf::as_path), + )? + .extend_with_input_variants(params.variant_configuration.unwrap_or_default()); + + // Find all outputs from the recipe + let output_nodes = find_outputs_from_src(self.recipe_source.clone())?; + let discovered_outputs = variant_config.variant_config.find_variants( + &output_nodes, + self.recipe_source.clone(), + &selector_config_for_variants, + )?; + + // Construct a mapping that for packages that we want from source. + // + // By default, this includes all the outputs in the recipe. These should all be + // build from source, in particular from the current source. + let mut local_source_packages: HashMap = discovered_outputs + .iter() + .map(|output| (output.name.clone(), PathSpec { path: ".".into() }.into())) + .collect(); + + // Add workspace dependencies to the source packages mapping. + // This allows the recipe to reference workspace packages by name (e.g., "my-lib") + // and have them automatically resolved to source dependencies with the correct path. + local_source_packages.extend(self.workspace_dependencies.clone()); + + let mut subpackages = HashMap::new(); + let mut outputs = Vec::new(); + for discovered_output in discovered_outputs { + let variant = discovered_output.used_vars; + let hash = HashInfo::from_variant(&variant, &discovered_output.noarch_type); + + // Construct the selector config for this particular output. We base this on the + // selector config that was used to determine the variants. + let selector_config = SelectorConfig { + variant: variant.clone(), + hash: Some(hash.clone()), + target_platform: discovered_output.target_platform, + ..selector_config_for_variants.clone() + }; + + // Convert this discovered output into a recipe. + let recipe = Recipe::from_node(&discovered_output.node, selector_config.clone()) + .map_err(|err| { + let errs: ParseErrors<_> = err + .into_iter() + .map(|err| ParsingError::from_partial(self.recipe_source.clone(), err)) + .collect::>() + .into(); + errs + })?; + + // Skip this output if the recipe is marked as skipped + if recipe.build().skip() { + continue; + } + + subpackages.insert( + recipe.package().name().clone(), + PackageIdentifier { + name: recipe.package().name().clone(), + version: recipe.package().version().version().clone().into(), + build_string: discovered_output.build_string.clone(), + }, + ); + + outputs.push(CondaOutput { + metadata: CondaOutputMetadata { + name: recipe.package().name().clone(), + version: recipe.package.version().clone(), + build: discovered_output.build_string.clone(), + build_number: recipe.build().number, + subdir: discovered_output.target_platform, + license: recipe.about.license.map(|l| l.to_string()), + license_family: recipe.about.license_family, + noarch: recipe.build.noarch, + purls: None, + python_site_packages_path: recipe.build.python.site_packages_path.clone(), + variant: variant + .iter() + .map(|(key, value)| { + Ok(( + key.0.clone(), + convert_variant_to_pixi_build_types(value.clone()).into_diagnostic() + .with_context(|| { + format!("the output {}/{}={}={} contains a variant for '{}' which cannot be converted to pixi types: {}", + discovered_output.target_platform, + discovered_output.name, + discovered_output.version, + discovered_output.build_string, + key.0, + value) + })? + )) + }) + .collect::>()?, + }, + build_dependencies: Some(CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.build, + &variant, + &subpackages, + &local_source_packages, + )?, + constraints: Vec::new(), + }), + host_dependencies: Some(CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.host, + &variant, + &subpackages, + &local_source_packages, + )?, + constraints: Vec::new(), + }), + run_dependencies: CondaOutputDependencies { + depends: convert_dependencies( + recipe.requirements.run, + &BTreeMap::default(), // Variants are not applied to run dependencies + &subpackages, + &local_source_packages, + )?, + constraints: convert_constraint_dependencies( + recipe.requirements.run_constraints, + &BTreeMap::default(), // Variants are not applied to run constraints + &subpackages, + )?, + }, + ignore_run_exports: CondaOutputIgnoreRunExports { + by_name: recipe + .requirements + .ignore_run_exports + .by_name + .into_iter() + .collect(), + from_package: recipe + .requirements + .ignore_run_exports + .from_package + .into_iter() + .collect(), + }, + run_exports: CondaOutputRunExports { + weak: convert_dependencies( + recipe.requirements.run_exports.weak, + &variant, + &subpackages, + &local_source_packages, + )?, + strong: convert_dependencies( + recipe.requirements.run_exports.strong, + &variant, + &subpackages, + &local_source_packages, + )?, + noarch: convert_dependencies( + recipe.requirements.run_exports.noarch, + &variant, + &subpackages, + &local_source_packages, + )?, + weak_constrains: convert_constraint_dependencies( + recipe.requirements.run_exports.weak_constraints, + &variant, + &subpackages, + )?, + strong_constrains: convert_constraint_dependencies( + recipe.requirements.run_exports.strong_constraints, + &variant, + &subpackages, + )?, + }, + + // The input globs are the same for all outputs + input_globs: None, + // TODO: Implement caching + }); + } + + let mut input_globs = variant_config.input_globs; + input_globs.extend(get_metadata_input_globs( + &self.manifest_root, + &self.recipe_source.path, + )?); + + Ok(CondaOutputsResult { + outputs, + input_globs, + }) + } + + async fn conda_build_v1( + &self, + params: CondaBuildV1Params, + ) -> miette::Result { + let host_platform = params + .host_prefix + .as_ref() + .map_or_else(Platform::current, |prefix| prefix.platform); + let build_platform = params + .build_prefix + .as_ref() + .map_or_else(Platform::current, |prefix| prefix.platform); + + // Construct a `VariantConfig` based on the input parameters. We only + // have a single variant here so we can just use the variant from the + // parameters. + let variant_config = VariantConfig { + variants: params + .output + .variant + .iter() + .map(|(k, v)| { + ( + k.as_str().into(), + vec![convert_variant_from_pixi_build_types(v.clone())], + ) + }) + .collect(), + pin_run_as_build: None, + zip_keys: None, + }; + + // Determine the variant configuration to use. This loads the variant + // configuration from disk as well as including the variants from the input + // parameters. + let selector_config_for_variants = SelectorConfig { + target_platform: host_platform, + host_platform, + build_platform, + hash: None, + variant: Default::default(), + experimental: self.config.experimental.unwrap_or(false), + allow_undefined: false, + recipe_path: Some(self.recipe_source.path.clone()), + }; + let outputs = find_outputs_from_src(self.recipe_source.clone())?; + let discovered_outputs = variant_config.find_variants( + &outputs, + self.recipe_source.clone(), + &selector_config_for_variants, + )?; + let discovered_output = find_matching_output(¶ms.output, discovered_outputs)?; + + // Set up the proper directories for the build. + let directories = conda_build_v1_directories( + params.host_prefix.as_ref().map(|p| p.prefix.as_path()), + params.build_prefix.as_ref().map(|p| p.prefix.as_path()), + params.work_directory, + self.cache_dir.as_deref(), + params.output_directory.as_deref(), + self.recipe_source.path.clone(), + ); + + let tool_config = Configuration::builder() + .with_opt_cache_dir(self.cache_dir.clone()) + .with_logging_output_handler(self.logging_output_handler.clone()) + .with_testing(false) + // Pixi is incremental so keep the build + .with_keep_build(true) + // This indicates that the environments are externally managed, e.g. they are already + // prepared. + .with_environments_externally_managed(true) + .finish(); + + let output = Output { + recipe: discovered_output.recipe, + build_configuration: BuildConfiguration { + target_platform: discovered_output.target_platform, + host_platform: PlatformWithVirtualPackages { + platform: host_platform, + virtual_packages: vec![], + }, + build_platform: PlatformWithVirtualPackages { + platform: build_platform, + virtual_packages: vec![], + }, + hash: discovered_output.hash, + variant: discovered_output.used_vars.clone(), + directories, + channels: vec![], + channel_priority: Default::default(), + solve_strategy: Default::default(), + timestamp: chrono::Utc::now(), + subpackages: BTreeMap::new(), + packaging_settings: PackagingSettings::from_args( + ArchiveType::Conda, + CompressionLevel::default(), + ), + store_recipe: false, + force_colors: true, + sandbox_config: None, + debug: Debug::new(false), + exclude_newer: None, + }, + finalized_dependencies: Some(from_build_v1_args_to_finalized_dependencies( + params.build_prefix, + params.host_prefix, + params.run_dependencies, + params.run_constraints, + params.run_exports, + )), + finalized_sources: None, + finalized_cache_dependencies: None, + finalized_cache_sources: None, + build_summary: Arc::default(), + system_tools: Default::default(), + extra_meta: None, + }; + + let (output, output_path) = + // rattler-build requires a clean work dir + run_build(output, &tool_config, WorkingDirectoryBehavior::Cleanup).await?; + + Ok(CondaBuildV1Result { + output_file: output_path, + input_globs: build_input_globs( + &self.manifest_root, + &self.recipe_source.path, + extract_mutable_package_sources(&output), + self.config.extra_input_globs.clone(), + )?, + name: output.name().as_normalized().to_string(), + version: output.version().clone(), + build: output.build_string().into_owned(), + subdir: *output.target_platform(), + }) + } +} + +/// Extracts the package sources from an `Output` object that are mutable and +/// should be watched for changes. +fn extract_mutable_package_sources(output: &Output) -> Option> { + output.finalized_sources.as_ref().map(|package_sources| { + package_sources + .iter() + .filter_map(|source| { + if let rattler_build::recipe::parser::Source::Path(path_source) = source { + Some(path_source.path.clone()) + } else { + None + } + }) + .collect() + }) +} + +/// Returns the relative path from `base` to `input`, joined by "/". +fn build_relative_glob(base: &std::path::Path, input: &std::path::Path) -> miette::Result { + // Get the difference between paths + let rel = pathdiff::diff_paths(input, base).ok_or_else(|| { + miette::miette!( + "could not compute relative path from '{:?}' to '{:?}'", + input, + base + ) + })?; + + // Normalize the path + let joined = rel + .components() + .map(|c| c.as_os_str().to_string_lossy()) + .collect::>() + .join("/"); + + if input.is_dir() { + // This means the base is the same as the input + // just use `**` in that case that matches everything + if joined.is_empty() { + Ok("**".to_string()) + } else { + Ok(format!("{joined}/**")) + } + } else { + // This is a file so lets just use that + Ok(joined) + } +} + +fn build_input_globs( + manifest_root: &Path, + source: &Path, + package_sources: Option>, + extra_globs: Vec, +) -> miette::Result> { + // Get parent directory path + let src_parent = if source.is_file() { + // use the parent path as glob + source.parent().unwrap_or(source).to_path_buf() + } else { + // use the source path as glob + source.to_path_buf() + }; + + // Always add the current directory of the package to the globs + let mut input_globs = BTreeSet::from([build_relative_glob(manifest_root, &src_parent)?]); + + // If there are sources add them to the globs as well + if let Some(package_sources) = package_sources { + for source in package_sources { + let source = if source.is_absolute() { + source + } else { + src_parent.join(source) + }; + input_globs.insert(build_relative_glob(manifest_root, &source)?); + } + } + + // Extend with extra input globs + input_globs.extend(extra_globs); + + Ok(input_globs) +} + +/// Returns the input globs for conda_get_metadata, as used in the +/// CondaMetadataResult. +fn get_metadata_input_globs( + manifest_root: &Path, + recipe_source_path: &Path, +) -> miette::Result> { + match build_relative_glob(manifest_root, recipe_source_path) { + Ok(rel) if !rel.is_empty() => Ok(BTreeSet::from_iter([rel])), + Ok(_) => Ok(Default::default()), + Err(e) => Err(e), + } +} + +#[async_trait::async_trait] +impl ProtocolInstantiator for RattlerBuildBackendInstantiator { + async fn initialize( + &self, + params: InitializeParams, + ) -> miette::Result<(Box, InitializeResult)> { + let config = if let Some(config) = params.configuration { + serde_json::from_value(config) + .into_diagnostic() + .context("failed to parse configuration")? + } else { + RattlerBuildBackendConfig::default() + }; + + if let Some(path) = config.debug_dir.as_ref() { + warn!( + path = %path.display(), + "`debug-dir` backend configuration is deprecated and ignored; debug data is now written to the build work directory." + ); + } + + let mut workspace_dependencies = HashMap::new(); + + if let Some(target) = params.project_model.and_then(|m| m.targets) { + fn extract_workspace_deps( + target: Target, + workspace_deps: &mut HashMap, + ) -> miette::Result<()> { + for dep_list in [ + target.build_dependencies, + target.host_dependencies, + target.run_dependencies, + ] { + let Some(deps) = dep_list else { + continue; + }; + + for (name, spec) in deps { + match spec { + pixi_build_types::PackageSpec::Source(source_spec) => { + // Source dependencies are allowed - they represent workspace packages + workspace_deps.insert(name, source_spec); + } + pixi_build_types::PackageSpec::Binary(_) => { + // Binary dependencies must be specified in the recipe, not here + return Err(miette::miette!( + "Binary dependency '{}' is not allowed in pixi-build-rattler-build. Please specify all binary dependencies in the recipe.", + name + )); + } + pixi_build_types::PackageSpec::PinCompatible(_) => { + // PinCompatible dependencies are not yet supported + return Err(miette::miette!( + "PinCompatible dependency '{}' is not yet supported in pixi-build-rattler-build.", + name + )); + } + } + } + } + Ok(()) + } + + if let Some(default_target) = target.default_target { + extract_workspace_deps(default_target, &mut workspace_dependencies)?; + } + + if let Some(targets) = target.targets { + for (_, target) in targets { + extract_workspace_deps(target, &mut workspace_dependencies)?; + } + } + } + + let mut instance = RattlerBuildBackend::new( + params.source_directory, + params.manifest_path.as_path(), + self.logging_output_handler.clone(), + params.cache_directory, + config, + )?; + + // Set the workspace dependencies + instance.workspace_dependencies = workspace_dependencies; + + Ok((Box::new(instance), InitializeResult {})) + } + + async fn negotiate_capabilities( + _params: NegotiateCapabilitiesParams, + ) -> miette::Result { + Ok(NegotiateCapabilitiesResult { + capabilities: default_capabilities(), + }) + } +} + +pub(crate) fn default_capabilities() -> BackendCapabilities { + BackendCapabilities { + provides_conda_outputs: Some(true), + provides_conda_build_v1: Some(true), + } +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use pixi_build_backend::utils::test::conda_outputs_snapshot; + use pixi_build_types::{VariantValue, procedures::initialize::InitializeParams}; + use rattler_build::console_utils::LoggingOutputHandler; + use tempfile::tempdir; + + use super::*; + + #[test] + fn test_conda_outputs() { + insta::glob!("../../../tests/recipe", "*/recipe.yaml", |recipe_path| { + let runtime = tokio::runtime::Builder::new_current_thread() + .build() + .unwrap(); + runtime.block_on(async move { + let factory = RattlerBuildBackendInstantiator::new(LoggingOutputHandler::default()) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: recipe_path.to_path_buf(), + project_model: None, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let current_dir = std::env::current_dir().unwrap(); + + let result = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Linux64, + build_platform: Platform::Linux64, + variant_configuration: None, + variant_files: None, + work_directory: current_dir, + }) + .await + .unwrap(); + + insta::assert_snapshot!(conda_outputs_snapshot(result)); + }); + }); + } + + const VARIANT_RECIPE: &str = r#" + package: + name: variant-test + version: 0.1.0 + + build: + number: 0 + + requirements: + host: + - python + - numpy + "#; + + #[tokio::test] + async fn test_variant_files_are_applied() { + let temp_dir = tempdir().unwrap(); + let recipe_path = temp_dir.path().join("recipe.yaml"); + tokio::fs::write(&recipe_path, VARIANT_RECIPE) + .await + .expect("Failed to write variant recipe"); + + let variant_file = temp_dir.path().join("global-variants.yaml"); + tokio::fs::write( + &variant_file, + r#"python: + - "3.9" +"#, + ) + .await + .expect("Failed to write variant file"); + + let factory = RattlerBuildBackendInstantiator::new(LoggingOutputHandler::default()) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: recipe_path, + project_model: None, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let result = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Linux64, + build_platform: Platform::Linux64, + variant_configuration: None, + variant_files: Some(vec![variant_file.clone()]), + work_directory: temp_dir.path().to_path_buf(), + }) + .await + .unwrap(); + + assert_eq!(result.outputs.len(), 1); + let python_value = result.outputs[0] + .metadata + .variant + .get("python") + .expect("python variant present"); + assert_eq!(python_value, &VariantValue::from("3.9")); + } + + #[tokio::test] + async fn test_variant_configuration_is_applied() { + let temp_dir = tempdir().unwrap(); + let recipe_path = temp_dir.path().join("recipe.yaml"); + tokio::fs::write(&recipe_path, VARIANT_RECIPE) + .await + .expect("Failed to write recipe"); + + let mut variant_configuration = BTreeMap::new(); + variant_configuration.insert("python".to_string(), vec![VariantValue::from("3.11")]); + + let factory = RattlerBuildBackendInstantiator::new(LoggingOutputHandler::default()) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: recipe_path.clone(), + project_model: None, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let result = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Linux64, + build_platform: Platform::Linux64, + variant_configuration: Some(variant_configuration), + variant_files: None, + work_directory: temp_dir.path().to_path_buf(), + }) + .await + .unwrap(); + + assert_eq!( + result.outputs[0].metadata.variant["python"], + VariantValue::from("3.11"), + "Python variant should come from the provided configuration" + ); + assert_eq!( + result.outputs[0].metadata.variant["target_platform"], + VariantValue::from("linux-64"), + "Target platform should match the requested platform" + ); + } + + #[tokio::test] + async fn test_variant_configuration_overrides_variant_files() { + let temp_dir = tempdir().unwrap(); + let recipe_path = temp_dir.path().join("recipe.yaml"); + tokio::fs::write(&recipe_path, VARIANT_RECIPE) + .await + .expect("Failed to write variant recipe"); + + let variant_file = temp_dir.path().join("shared-variants.yaml"); + tokio::fs::write( + &variant_file, + r#"python: + - "3.8" +numpy: + - "1.22" +"#, + ) + .await + .expect("Failed to write shared variants"); + + let mut variant_configuration = BTreeMap::new(); + variant_configuration.insert("python".to_string(), vec![VariantValue::from("3.10")]); + + let factory = RattlerBuildBackendInstantiator::new(LoggingOutputHandler::default()) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: recipe_path, + project_model: None, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let result = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Linux64, + build_platform: Platform::Linux64, + variant_configuration: Some(variant_configuration), + variant_files: Some(vec![variant_file.clone()]), + work_directory: temp_dir.path().to_path_buf(), + }) + .await + .unwrap(); + + assert_eq!(result.outputs.len(), 1); + let python_value = result.outputs[0] + .metadata + .variant + .get("python") + .expect("python variant present"); + assert_eq!(python_value, &VariantValue::from("3.10")); + assert_eq!( + result.outputs[0] + .metadata + .variant + .get("numpy") + .expect("numpy variant present from variant file"), + &VariantValue::from("1.22") + ); + } + + #[tokio::test] + async fn test_variant_files_override_auto_discovered_variant() { + let temp_dir = tempdir().unwrap(); + let recipe_path = temp_dir.path().join("recipe.yaml"); + tokio::fs::write(&recipe_path, VARIANT_RECIPE) + .await + .expect("Failed to write variant recipe"); + + let auto_discovered_variant = temp_dir.path().join("variants.yaml"); + tokio::fs::write( + &auto_discovered_variant, + r#"python: + - "3.8" +numpy: + - "1.22" +"#, + ) + .await + .expect("Failed to write auto-discovered variants"); + + let variant_file = temp_dir.path().join("override-variants.yaml"); + tokio::fs::write( + &variant_file, + r#"python: + - "3.10" +"#, + ) + .await + .expect("Failed to write overriding variants"); + + let factory = RattlerBuildBackendInstantiator::new(LoggingOutputHandler::default()) + .initialize(InitializeParams { + workspace_directory: None, + source_directory: None, + manifest_path: recipe_path, + project_model: None, + configuration: None, + target_configuration: None, + cache_directory: None, + }) + .await + .unwrap(); + + let result = factory + .0 + .conda_outputs(CondaOutputsParams { + channels: vec![], + host_platform: Platform::Linux64, + build_platform: Platform::Linux64, + variant_configuration: None, + variant_files: Some(vec![variant_file.clone()]), + work_directory: temp_dir.path().to_path_buf(), + }) + .await + .unwrap(); + + assert_eq!(result.outputs.len(), 1); + let variant = &result.outputs[0].metadata.variant; + assert_eq!( + variant + .get("python") + .expect("python variant present after override"), + &VariantValue::from("3.10") + ); + assert_eq!( + variant + .get("numpy") + .expect("numpy variant present from auto-discovered file"), + &VariantValue::from("1.22") + ); + } + + const FAKE_RECIPE: &str = r#" + package: + name: foobar + version: 0.1.0 + "#; + + async fn try_initialize( + manifest_path: impl AsRef, + ) -> miette::Result { + RattlerBuildBackend::new( + None, + manifest_path.as_ref(), + LoggingOutputHandler::default(), + None, + RattlerBuildBackendConfig::default(), + ) + } + + #[tokio::test] + async fn test_recipe_discovery() { + let tmp = tempdir().unwrap(); + let recipe = tmp.path().join("recipe.yaml"); + std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + assert_eq!( + try_initialize(&tmp.path().join("pixi.toml")) + .await + .unwrap() + .recipe_source + .path, + recipe + ); + assert_eq!( + try_initialize(&recipe).await.unwrap().recipe_source.path, + recipe + ); + + let tmp = tempdir().unwrap(); + let recipe = tmp.path().join("recipe.yml"); + std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + assert_eq!( + try_initialize(&tmp.path().join("pixi.toml")) + .await + .unwrap() + .recipe_source + .path, + recipe + ); + assert_eq!( + try_initialize(&recipe).await.unwrap().recipe_source.path, + recipe + ); + + let tmp = tempdir().unwrap(); + let recipe_dir = tmp.path().join("recipe"); + let recipe = recipe_dir.join("recipe.yaml"); + std::fs::create_dir(recipe_dir).unwrap(); + std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + assert_eq!( + try_initialize(&tmp.path().join("pixi.toml")) + .await + .unwrap() + .recipe_source + .path, + recipe + ); + + let tmp = tempdir().unwrap(); + let recipe_dir = tmp.path().join("recipe"); + let recipe = recipe_dir.join("recipe.yml"); + std::fs::create_dir(recipe_dir).unwrap(); + std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + assert_eq!( + try_initialize(&tmp.path().join("pixi.toml")) + .await + .unwrap() + .recipe_source + .path, + recipe + ); + } + + #[test] + fn test_relative_path_joined() { + use std::path::Path; + // Simple case + let base = Path::new("/foo/bar"); + let input = Path::new("/foo/bar/baz/qux.txt"); + assert_eq!( + super::build_relative_glob(base, input).unwrap(), + "baz/qux.txt" + ); + // Same path + let base = Path::new("/foo/bar"); + let input = Path::new("/foo/bar"); + assert_eq!(super::build_relative_glob(base, input).unwrap(), ""); + // Input not under base + let base = Path::new("/foo/bar"); + let input = Path::new("/foo/other"); + assert_eq!(super::build_relative_glob(base, input).unwrap(), "../other"); + // Relative paths + let base = Path::new("foo/bar"); + let input = Path::new("foo/bar/baz"); + assert_eq!(super::build_relative_glob(base, input).unwrap(), "baz"); + } + + #[test] + #[cfg(windows)] + fn test_relative_path_joined_windows() { + use std::path::Path; + let base = Path::new(r"C:\foo\bar"); + let input = Path::new(r"C:\foo\bar\baz\qux.txt"); + assert_eq!( + super::build_relative_glob(base, input).unwrap(), + "baz/qux.txt" + ); + let base = Path::new(r"C:\foo\bar"); + let input = Path::new(r"C:\foo\bar"); + assert_eq!(super::build_relative_glob(base, input).unwrap(), ""); + let base = Path::new(r"C:\foo\bar"); + let input = Path::new(r"C:\foo\other"); + assert_eq!(super::build_relative_glob(base, input).unwrap(), "../other"); + } + + #[test] + fn test_build_input_globs_with_tempdirs() { + use std::fs; + + use tempfile::tempdir; + + // Create a temp directory to act as the base + let base_dir = tempdir().unwrap(); + let base_path = base_dir.path(); + + // Case 1: source is a file in the base dir + let recipe_path = base_path.join("recipe.yaml"); + fs::write(&recipe_path, "fake").unwrap(); + let globs = super::build_input_globs(base_path, &recipe_path, None, Vec::new()).unwrap(); + assert_eq!(globs, BTreeSet::from([String::from("**")])); + + // Case 2: source is a directory, with a file and a dir as package sources + let pkg_dir = base_path.join("pkg"); + let pkg_file = pkg_dir.join("file.txt"); + let pkg_subdir = pkg_dir.join("dir"); + fs::create_dir_all(&pkg_subdir).unwrap(); + fs::write(&pkg_file, "fake").unwrap(); + let globs = super::build_input_globs( + base_path, + base_path, + Some(vec![pkg_file.clone(), pkg_subdir.clone()]), + Vec::new(), + ) + .unwrap(); + assert_eq!( + globs, + BTreeSet::from([ + String::from("**"), + String::from("pkg/file.txt"), + String::from("pkg/dir/**") + ]) + ); + } + + #[test] + fn test_build_input_globs_two_folders_in_tempdir() { + use std::fs; + + use tempfile::tempdir; + + // Create a temp directory + let temp = tempdir().unwrap(); + let temp_path = temp.path(); + + // Create two folders: source_dir and package_source_dir + let source_dir = temp_path.join("source"); + let package_source_dir = temp_path.join("pkgsrc"); + fs::create_dir_all(&source_dir).unwrap(); + fs::create_dir_all(&package_source_dir).unwrap(); + + // Call build_input_globs with source_dir as source, and package_source_dir as + // package source + let globs = super::build_input_globs( + temp_path, + &source_dir, + Some(vec![package_source_dir.clone()]), + Vec::new(), + ) + .unwrap(); + assert_eq!( + globs, + BTreeSet::from([String::from("source/**"), String::from("pkgsrc/**")]) + ); + } + + #[test] + fn test_build_input_globs_relative_source() { + use std::{fs, path::PathBuf}; + + use tempfile::tempdir; + + // Create a temp directory to act as the base + let base_dir = tempdir().unwrap(); + let base_path = base_dir.path(); + + // Case: source is a directory, package_sources contains a relative path + let rel_dir = PathBuf::from("rel_folder"); + let abs_rel_dir = base_path.join(&rel_dir); + fs::create_dir_all(&abs_rel_dir).unwrap(); + + // Call build_input_globs with base_path as source, and rel_dir as package + // source (relative) + let globs = super::build_input_globs( + base_path, + base_path, + Some(vec![rel_dir.clone()]), + Vec::new(), + ) + .unwrap(); + // The relative path from base_path to rel_dir should be "rel_folder/**" + assert_eq!( + globs, + BTreeSet::from_iter(["**", "rel_folder/**"].into_iter().map(ToString::to_string)) + ); + } + + #[test] + fn test_get_metadata_input_globs() { + use std::path::PathBuf; + // Case: file with name + let manifest_root = PathBuf::from("/foo/bar"); + let path = PathBuf::from("/foo/bar/recipe.yaml"); + let globs = super::get_metadata_input_globs(&manifest_root, &path).unwrap(); + assert_eq!(globs, BTreeSet::from([String::from("recipe.yaml")])); + // Case: file with no name (root) + let manifest_root = PathBuf::from("/"); + let path = PathBuf::from("/"); + let globs = super::get_metadata_input_globs(&manifest_root, &path).unwrap(); + assert_eq!(globs, BTreeSet::from([String::from("**")])); + // Case: file with .yml extension + let manifest_root = PathBuf::from("/foo/bar"); + let path = PathBuf::from("/foo/bar/recipe.yml"); + let globs = super::get_metadata_input_globs(&manifest_root, &path).unwrap(); + assert_eq!(globs, BTreeSet::from([String::from("recipe.yml")])); + // Case: file in subdir + let manifest_root = PathBuf::from("/foo"); + let path = PathBuf::from("/foo/bar/recipe.yaml"); + let globs = super::get_metadata_input_globs(&manifest_root, &path).unwrap(); + assert_eq!(globs, BTreeSet::from([String::from("bar/recipe.yaml")])); + } + + #[test] + fn test_build_input_globs_includes_extra_globs() { + use std::fs; + + use tempfile::tempdir; + + // Create a temp directory to act as the base + let base_dir = tempdir().unwrap(); + let base_path = base_dir.path(); + + // Create a recipe file + let recipe_path = base_path.join("recipe.yaml"); + fs::write(&recipe_path, "fake").unwrap(); + + // Test with extra globs + let extra_globs = vec!["custom/*.txt".to_string(), "extra/**/*.py".to_string()]; + let globs = + super::build_input_globs(base_path, &recipe_path, None, extra_globs.clone()).unwrap(); + + // Verify that all extra globs are included in the result + for extra_glob in &extra_globs { + assert!( + globs.contains(extra_glob), + "Result should contain extra glob: {extra_glob}" + ); + } + + // Verify that the basic manifest glob is still present + assert!(globs.contains("**")); + } +} diff --git a/crates/pixi-build-rattler-build/src/rattler_build.rs b/crates/pixi-build-rattler-build/src/rattler_build.rs new file mode 100644 index 0000000000..ecefaf9b33 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/rattler_build.rs @@ -0,0 +1,93 @@ +use std::{ + collections::HashMap, + ffi::OsStr, + path::{Path, PathBuf}, +}; + +use miette::IntoDiagnostic; +use pixi_build_backend::source::Source; +use pixi_build_types::SourcePackageSpec; +use rattler_build::console_utils::LoggingOutputHandler; + +use crate::config::RattlerBuildBackendConfig; + +pub struct RattlerBuildBackend { + pub(crate) logging_output_handler: LoggingOutputHandler, + pub(crate) source_dir: PathBuf, + /// In case of rattler-build, manifest is the raw recipe + /// We need to apply later the selectors to get the final recipe + pub(crate) recipe_source: Source, + pub(crate) manifest_root: PathBuf, + pub(crate) cache_dir: Option, + pub(crate) config: RattlerBuildBackendConfig, + /// Workspace dependencies from the project model + pub(crate) workspace_dependencies: HashMap, +} + +impl RattlerBuildBackend { + /// Returns a new instance of [`RattlerBuildBackend`] by reading the + /// manifest at the given path. + pub fn new( + source_dir: Option, + manifest_path: &Path, + logging_output_handler: LoggingOutputHandler, + cache_dir: Option, + config: RattlerBuildBackendConfig, + ) -> miette::Result { + // Locate the recipe + let manifest_file_name = manifest_path.file_name().and_then(OsStr::to_str); + let (recipe_path, source_dir) = match manifest_file_name { + Some("recipe.yaml") | Some("recipe.yml") => { + let source_dir = source_dir.unwrap_or_else(|| { + manifest_path + .parent() + .expect("file always has parent") + .to_path_buf() + }); + (manifest_path.to_path_buf(), source_dir) + } + _ => { + // The manifest is not a recipe, so we need to find the recipe.yaml file. + let source_dir = source_dir.unwrap_or_else(|| { + manifest_path + .parent() + .unwrap_or(manifest_path) + .to_path_buf() + }); + let recipe_path = manifest_path.parent().and_then(|manifest_dir| { + [ + "recipe.yaml", + "recipe.yml", + "recipe/recipe.yaml", + "recipe/recipe.yml", + ] + .into_iter() + .find_map(|relative_path| { + let recipe_path = manifest_dir.join(relative_path); + recipe_path.is_file().then_some(recipe_path) + }) + }); + + (recipe_path.ok_or_else(|| miette::miette!("Could not find a recipe.yaml in the source directory to use as the recipe manifest."))?, source_dir) + } + }; + + // Load the manifest from the source directory + let manifest_root = manifest_path + .parent() + .expect("manifest must have a root") + .to_path_buf(); + let recipe_source = + Source::from_rooted_path(&manifest_root, recipe_path).into_diagnostic()?; + + Ok(Self { + logging_output_handler, + source_dir, + recipe_source, + manifest_root, + cache_dir, + config, + workspace_dependencies: HashMap::new(), + }) + } +} diff --git a/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@boltons__recipe.yaml.snap b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@boltons__recipe.yaml.snap new file mode 100644 index 0000000000..d6760be087 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@boltons__recipe.yaml.snap @@ -0,0 +1,47 @@ +--- +source: crates/pixi-build-rattler-build/src/protocol.rs +expression: conda_outputs_snapshot(result) +input_file: tests/recipe/boltons/recipe.yaml +--- +{ + "outputs": [ + { + "metadata": { + "name": "boltons-with-extra", + "version": "23.0.0", + "build": "pyh4616a5c_0", + "buildNumber": 0, + "subdir": "noarch", + "license": "BSD-3-Clause", + "noarch": "python", + "variant": { + "target_platform": "noarch" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python" + }, + { + "name": "pip" + }, + { + "name": "setuptools" + } + ] + }, + "runDependencies": { + "depends": [ + { + "name": "pip" + } + ] + } + } + ], + "inputGlobs": [ + "recipe.yaml", + "variants.yaml" + ] +} diff --git a/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@custom-build-string__recipe.yaml.snap b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@custom-build-string__recipe.yaml.snap new file mode 100644 index 0000000000..0391261d87 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@custom-build-string__recipe.yaml.snap @@ -0,0 +1,27 @@ +--- +source: crates/pixi-build-rattler-build/src/protocol.rs +expression: conda_outputs_snapshot(result) +input_file: tests/recipe/custom-build-string/recipe.yaml +--- +{ + "outputs": [ + { + "metadata": { + "name": "python", + "version": "3.15", + "build": "0_cp315", + "buildNumber": 0, + "subdir": "linux-64", + "license": "Python-2.0", + "noarch": false, + "variant": { + "target_platform": "linux-64" + } + } + } + ], + "inputGlobs": [ + "recipe.yaml", + "variants.yaml" + ] +} diff --git a/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage-variants__recipe.yaml.snap b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage-variants__recipe.yaml.snap new file mode 100644 index 0000000000..cc29be5e67 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage-variants__recipe.yaml.snap @@ -0,0 +1,169 @@ +--- +source: crates/pixi-build-rattler-build/src/protocol.rs +expression: conda_outputs_snapshot(result) +input_file: tests/recipe/pin-subpackage-variants/recipe.yaml +--- +{ + "outputs": [ + { + "metadata": { + "name": "my-package", + "version": "0.1.0", + "build": "py38hb368f13_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "python": "3.8", + "target_platform": "noarch" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.8.*" + } + } + ] + } + }, + { + "metadata": { + "name": "my-package-pinned", + "version": "0.1.0", + "build": "h1670b25_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "my-package": "0.1.0 py38hb368f13_0", + "target_platform": "noarch" + } + }, + "runDependencies": { + "depends": [ + { + "name": "my-package", + "source": { + "path": { + "path": "." + }, + "version": "==0.1.0", + "build": "py38hb368f13_0" + } + } + ] + } + }, + { + "metadata": { + "name": "my-package", + "version": "0.1.0", + "build": "py39h6a44458_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "python": "3.9", + "target_platform": "noarch" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.9.*" + } + } + ] + } + }, + { + "metadata": { + "name": "my-package-pinned", + "version": "0.1.0", + "build": "h11d4084_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "my-package": "0.1.0 py39h6a44458_0", + "target_platform": "noarch" + } + }, + "runDependencies": { + "depends": [ + { + "name": "my-package", + "source": { + "path": { + "path": "." + }, + "version": "==0.1.0", + "build": "py39h6a44458_0" + } + } + ] + } + }, + { + "metadata": { + "name": "my-package", + "version": "0.1.0", + "build": "py310hbede2c2_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "python": "3.10", + "target_platform": "noarch" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.10.*" + } + } + ] + } + }, + { + "metadata": { + "name": "my-package-pinned", + "version": "0.1.0", + "build": "hba4f637_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "my-package": "0.1.0 py310hbede2c2_0", + "target_platform": "noarch" + } + }, + "runDependencies": { + "depends": [ + { + "name": "my-package", + "source": { + "path": { + "path": "." + }, + "version": "==0.1.0", + "build": "py310hbede2c2_0" + } + } + ] + } + } + ], + "inputGlobs": [ + "recipe.yaml", + "variants.yaml" + ] +} diff --git a/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage__recipe.yaml.snap b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage__recipe.yaml.snap new file mode 100644 index 0000000000..6ad4a3e6c9 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@pin-subpackage__recipe.yaml.snap @@ -0,0 +1,54 @@ +--- +source: crates/pixi-build-rattler-build/src/protocol.rs +expression: conda_outputs_snapshot(result) +input_file: tests/recipe/pin-subpackage/recipe.yaml +--- +{ + "outputs": [ + { + "metadata": { + "name": "my-package", + "version": "0.1.0", + "build": "h4616a5c_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "target_platform": "noarch" + } + } + }, + { + "metadata": { + "name": "my-package-a", + "version": "0.1.0", + "build": "hc811278_0", + "buildNumber": 0, + "subdir": "noarch", + "noarch": "generic", + "variant": { + "my-package": "0.1.0 h4616a5c_0", + "target_platform": "noarch" + } + }, + "runDependencies": { + "depends": [ + { + "name": "my-package", + "source": { + "path": { + "path": "." + }, + "version": "==0.1.0", + "build": "h4616a5c_0" + } + } + ] + } + } + ], + "inputGlobs": [ + "recipe.yaml", + "variants.yaml" + ] +} diff --git a/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@variants__recipe.yaml.snap b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@variants__recipe.yaml.snap new file mode 100644 index 0000000000..4af02a2f41 --- /dev/null +++ b/crates/pixi-build-rattler-build/src/snapshots/pixi_build_rattler_build__protocol__tests__conda_outputs@variants__recipe.yaml.snap @@ -0,0 +1,106 @@ +--- +source: crates/pixi-build-rattler-build/src/protocol.rs +expression: conda_outputs_snapshot(result) +input_file: tests/recipe/variants/recipe.yaml +--- +{ + "outputs": [ + { + "metadata": { + "name": "foobar", + "version": "1.0.0", + "build": "py38h0891c58_0", + "buildNumber": 0, + "subdir": "linux-64", + "noarch": false, + "variant": { + "python": "3.8", + "target_platform": "linux-64" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.8.*" + } + } + ] + }, + "runDependencies": { + "depends": [ + { + "name": "python" + } + ] + } + }, + { + "metadata": { + "name": "foobar", + "version": "1.0.0", + "build": "py39h2e92cda_0", + "buildNumber": 0, + "subdir": "linux-64", + "noarch": false, + "variant": { + "python": "3.9", + "target_platform": "linux-64" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.9.*" + } + } + ] + }, + "runDependencies": { + "depends": [ + { + "name": "python" + } + ] + } + }, + { + "metadata": { + "name": "foobar", + "version": "1.0.0", + "build": "py310h8e7c8fa_0", + "buildNumber": 0, + "subdir": "linux-64", + "noarch": false, + "variant": { + "python": "3.10", + "target_platform": "linux-64" + } + }, + "hostDependencies": { + "depends": [ + { + "name": "python", + "binary": { + "version": "3.10.*" + } + } + ] + }, + "runDependencies": { + "depends": [ + { + "name": "python" + } + ] + } + } + ], + "inputGlobs": [ + "recipe.yaml", + "variants.yaml" + ] +} diff --git a/crates/pixi-build-rust/Cargo.toml b/crates/pixi-build-rust/Cargo.toml new file mode 100644 index 0000000000..bb02152758 --- /dev/null +++ b/crates/pixi-build-rust/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "pixi-build-rust" +version = "0.4.4" +description = "A Rust build backend for Pixi" +documentation = "https://prefix-dev.github.io/pixi-build-backends/backends/pixi-build-rust/" +repository.workspace = true +license.workspace = true +edition.workspace = true + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls"] + +[dependencies] +async-trait = { workspace = true } +fs-err = { workspace = true } +indexmap = { workspace = true } +miette = { workspace = true } +minijinja = { workspace = true, features = ["json"] } +once_cell = { workspace = true } +rattler_conda_types = { workspace = true } +serde = { workspace = true, features = ["derive"] } +thiserror = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +cargo_toml = { workspace = true } +pathdiff = { workspace = true } +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } + +recipe-stage0 = { workspace = true } + +[dev-dependencies] +insta = { workspace = true, features = ["yaml", "redactions", "filters"] } +rstest = { workspace = true } +temp-env = { workspace = true } +serde_json = { workspace = true } +tempfile = { workspace = true } diff --git a/crates/pixi-build-rust/pixi.toml b/crates/pixi-build-rust/pixi.toml new file mode 100644 index 0000000000..db392f4861 --- /dev/null +++ b/crates/pixi-build-rust/pixi.toml @@ -0,0 +1,10 @@ +[package.build.backend] +name = "pixi-build-rust" +version = "*" +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[package.run-dependencies] +pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-rust/src/build_script.j2 b/crates/pixi-build-rust/src/build_script.j2 new file mode 100644 index 0000000000..470be3a2e7 --- /dev/null +++ b/crates/pixi-build-rust/src/build_script.j2 @@ -0,0 +1,24 @@ +{% macro env(key) -%} +{%- if is_bash %}{{ "$" ~key }}{% else %}{{ "%" ~ key ~ "%" }}{% endif -%} +{% endmacro -%} +{%- macro export(key, value) -%} +{%- if is_bash -%} +export {{ key }}={{ value }} +{%- else -%} +SET {{ key }}={{ value }} +{%- endif -%} +{%- endmacro -%} + +{%- if has_openssl %} +{{ export("OPENSSL_DIR", env("PREFIX")|tojson) }} +{%- endif %} +{%- if has_sccache %} +{{ export("RUSTC_WRAPPER", "sccache") }} +{%- endif %} + +cargo install --locked --root "{{ env("PREFIX") }}" --path {{ source_dir }} --target-dir target --no-track {{ extra_args | join(" ") }} --force +{%- if not is_bash %} +if errorlevel 1 exit 1 +{%- endif %} + +{% if has_sccache %}sccache --show-stats{% endif %} diff --git a/crates/pixi-build-rust/src/build_script.rs b/crates/pixi-build-rust/src/build_script.rs new file mode 100644 index 0000000000..a62ce1a3c4 --- /dev/null +++ b/crates/pixi-build-rust/src/build_script.rs @@ -0,0 +1,89 @@ +use minijinja::Environment; +use serde::Serialize; + +#[derive(Serialize)] +pub struct BuildScriptContext { + /// The location of the source + pub source_dir: String, + + /// Any additional args to pass to `cargo` + pub extra_args: Vec, + + /// True if `openssl` is part of the build environment + pub has_openssl: bool, + + /// True if `sccache` is available. + pub has_sccache: bool, + + /// The platform that is running the build. + pub is_bash: bool, +} + +impl BuildScriptContext { + pub fn render(&self) -> String { + let env = Environment::new(); + let template = env + .template_from_str(include_str!("build_script.j2")) + .unwrap(); + template.render(self).unwrap().trim().to_string() + } +} + +#[cfg(test)] +mod test { + use rstest::*; + + #[rstest] + fn test_build_script(#[values(true, false)] is_bash: bool) { + let context = super::BuildScriptContext { + source_dir: String::from("my-prefix-dir"), + extra_args: vec![], + has_openssl: false, + has_sccache: false, + is_bash, + }; + let script = context.render(); + + let mut settings = insta::Settings::clone_current(); + settings.set_snapshot_suffix(if is_bash { "bash" } else { "cmdexe" }); + settings.bind(|| { + insta::assert_snapshot!(script); + }); + } + + #[rstest] + fn test_sccache(#[values(true, false)] is_bash: bool) { + let context = super::BuildScriptContext { + source_dir: String::from("my-prefix-dir"), + extra_args: vec![], + has_openssl: false, + has_sccache: true, + is_bash, + }; + let script = context.render(); + + let mut settings = insta::Settings::clone_current(); + settings.set_snapshot_suffix(if is_bash { "bash" } else { "cmdexe" }); + settings.bind(|| { + insta::assert_snapshot!(script); + }); + } + + #[rstest] + fn test_openssl(#[values(true, false)] is_bash: bool) { + let context = super::BuildScriptContext { + source_dir: String::from("my-prefix-dir"), + extra_args: vec![], + has_openssl: true, + has_sccache: false, + is_bash, + }; + let script = context.render(); + + let mut settings = insta::Settings::clone_current(); + settings.set_snapshot_suffix(if is_bash { "bash" } else { "cmdexe" }); + settings.bind(|| { + insta::assert_snapshot!(script); + }); + } +} diff --git a/crates/pixi-build-rust/src/config.rs b/crates/pixi-build-rust/src/config.rs new file mode 100644 index 0000000000..0ff26867b4 --- /dev/null +++ b/crates/pixi-build-rust/src/config.rs @@ -0,0 +1,221 @@ +use indexmap::IndexMap; +use pixi_build_backend::generated_recipe::BackendConfig; +use std::path::{Path, PathBuf}; + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +pub struct RustBackendConfig { + /// Extra args to pass for cargo + #[serde(default)] + pub extra_args: Vec, + /// Environment Variables + #[serde(default)] + pub env: IndexMap, + /// Deprecated. Setting this has no effect; debug data is always written to + /// the `debug` subdirectory of the work directory. + #[serde(alias = "debug_dir")] + pub debug_dir: Option, + /// Extra input globs to include in addition to the default ones + #[serde(default)] + pub extra_input_globs: Vec, + /// Ignore the cargo manifest and depend only on the project model. + #[serde(default)] + pub ignore_cargo_manifest: Option, + /// List of compilers to use (e.g., ["rust", "c", "cxx"]) + /// If not specified, a default will be used + pub compilers: Option>, +} + +impl RustBackendConfig { + /// Creates a new [`RustBackendConfig`] with default values and + /// `ignore_cargo_manifest` set to `true`. + #[cfg(test)] + pub fn default_with_ignore_cargo_manifest() -> Self { + Self { + ignore_cargo_manifest: Some(true), + ..Default::default() + } + } +} + +impl BackendConfig for RustBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + /// Merge this configuration with a target-specific configuration. + /// Target-specific values override base values using the following rules: + /// - extra_args: Platform-specific completely replaces base + /// - env: Platform env vars override base, others merge + /// - debug_dir: Not allowed to have target specific value + /// - extra_input_globs: Platform-specific completely replaces base + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + Ok(Self { + extra_args: if target_config.extra_args.is_empty() { + self.extra_args.clone() + } else { + target_config.extra_args.clone() + }, + env: { + let mut merged_env = self.env.clone(); + merged_env.extend(target_config.env.clone()); + merged_env + }, + debug_dir: self.debug_dir.clone(), + extra_input_globs: if target_config.extra_input_globs.is_empty() { + self.extra_input_globs.clone() + } else { + target_config.extra_input_globs.clone() + }, + ignore_cargo_manifest: target_config + .ignore_cargo_manifest + .or(self.ignore_cargo_manifest), + compilers: target_config + .compilers + .clone() + .or_else(|| self.compilers.clone()), + }) + } +} + +#[cfg(test)] +mod tests { + use super::RustBackendConfig; + use pixi_build_backend::generated_recipe::BackendConfig; + use serde_json::json; + use std::path::PathBuf; + + #[test] + fn test_ensure_deseralize_from_empty() { + let json_data = json!({}); + serde_json::from_value::(json_data).unwrap(); + } + + #[test] + fn test_debug_dir_accepts_both_formats() { + // Test with debug-dir (kebab-case) - the canonical format + let json_with_hyphen = json!({ + "debug-dir": "/path/to/debug" + }); + let config = serde_json::from_value::(json_with_hyphen).unwrap(); + assert_eq!(config.debug_dir, Some(PathBuf::from("/path/to/debug"))); + + // Test with debug_dir (underscore) - should also work due to alias + let json_with_underscore = json!({ + "debug_dir": "/path/to/debug" + }); + let config = serde_json::from_value::(json_with_underscore).unwrap(); + assert_eq!(config.debug_dir, Some(PathBuf::from("/path/to/debug"))); + } + + #[test] + fn test_merge_with_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + base_env.insert("SHARED_VAR".to_string(), "base_shared".to_string()); + + let base_config = RustBackendConfig { + extra_args: vec!["--base-arg".to_string()], + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + ignore_cargo_manifest: None, + compilers: Some(vec!["rust".to_string()]), + }; + + let mut target_env = indexmap::IndexMap::new(); + target_env.insert("TARGET_VAR".to_string(), "target_value".to_string()); + target_env.insert("SHARED_VAR".to_string(), "target_shared".to_string()); + + let target_config = RustBackendConfig { + extra_args: vec!["--target-arg".to_string()], + env: target_env, + debug_dir: None, + extra_input_globs: vec!["*.target".to_string()], + ignore_cargo_manifest: Some(true), + compilers: Some(vec!["c".to_string(), "rust".to_string()]), + }; + + let merged = base_config + .merge_with_target_config(&target_config) + .unwrap(); + + // extra_args should be completely overridden + assert_eq!(merged.extra_args, vec!["--target-arg".to_string()]); + + // env should merge with target taking precedence + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!( + merged.env.get("TARGET_VAR"), + Some(&"target_value".to_string()) + ); + assert_eq!( + merged.env.get("SHARED_VAR"), + Some(&"target_shared".to_string()) + ); + + // debug_dir should use base value + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + + // extra_input_globs should be completely overridden + assert_eq!(merged.extra_input_globs, vec!["*.target".to_string()]); + + // compilers should be completely overridden by target + assert_eq!( + merged.compilers, + Some(vec!["c".to_string(), "rust".to_string()]) + ); + } + + #[test] + fn test_merge_with_empty_target_config() { + let mut base_env = indexmap::IndexMap::new(); + base_env.insert("BASE_VAR".to_string(), "base_value".to_string()); + + let base_config = RustBackendConfig { + extra_args: vec!["--base-arg".to_string()], + env: base_env, + debug_dir: Some(PathBuf::from("/base/debug")), + extra_input_globs: vec!["*.base".to_string()], + ignore_cargo_manifest: None, + compilers: Some(vec!["rust".to_string()]), + }; + + let empty_target_config = RustBackendConfig::default(); + + let merged = base_config + .merge_with_target_config(&empty_target_config) + .unwrap(); + + // Should keep base values when target is empty + assert_eq!(merged.extra_args, vec!["--base-arg".to_string()]); + assert_eq!(merged.env.get("BASE_VAR"), Some(&"base_value".to_string())); + assert_eq!(merged.debug_dir, Some(PathBuf::from("/base/debug"))); + assert_eq!(merged.extra_input_globs, vec!["*.base".to_string()]); + assert_eq!(merged.compilers, Some(vec!["rust".to_string()])); + } + + #[test] + fn test_merge_target_debug_dir_error() { + let base_config = RustBackendConfig { + debug_dir: Some(PathBuf::from("/base/debug")), + ..Default::default() + }; + + let target_config = RustBackendConfig { + debug_dir: Some(PathBuf::from("/target/debug")), + ..Default::default() + }; + + let result = base_config.merge_with_target_config(&target_config); + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("`debug_dir` cannot have a target specific value")); + } +} diff --git a/crates/pixi-build-rust/src/main.rs b/crates/pixi-build-rust/src/main.rs new file mode 100644 index 0000000000..043e113040 --- /dev/null +++ b/crates/pixi-build-rust/src/main.rs @@ -0,0 +1,924 @@ +mod build_script; +mod config; +mod metadata; + +use build_script::BuildScriptContext; +use config::RustBackendConfig; +use metadata::CargoMetadataProvider; +use miette::IntoDiagnostic; +use pixi_build_backend::variants::NormalizedKey; +use pixi_build_backend::{ + Variable, + cache::{sccache_envs, sccache_tools}, + generated_recipe::{GenerateRecipe, GeneratedRecipe, PythonParams}, + intermediate_backend::IntermediateBackendInstantiator, + traits::ProjectModel, +}; +use rattler_conda_types::{ChannelUrl, Platform}; +use recipe_stage0::{ + matchspec::PackageDependency, + recipe::{Item, Script}, +}; +use std::collections::HashSet; +use std::{ + collections::{BTreeMap, BTreeSet, HashMap}, + path::{Path, PathBuf}, + sync::Arc, +}; + +#[derive(Default, Clone)] +pub struct RustGenerator {} + +#[async_trait::async_trait] +impl GenerateRecipe for RustGenerator { + type Config = RustBackendConfig; + + async fn generate_recipe( + &self, + model: &pixi_build_types::ProjectModel, + config: &Self::Config, + manifest_path: PathBuf, + host_platform: Platform, + _python_params: Option, + variants: &HashSet, + _channels: Vec, + _cache_dir: Option, + ) -> miette::Result { + // Construct a CargoMetadataProvider to read the Cargo.toml file + // and extract metadata from it. + // Determine the manifest root, because `manifest_path` can be + // either a direct file path or a directory path. + let manifest_root = if manifest_path.is_file() { + manifest_path + .parent() + .ok_or_else(|| { + miette::Error::msg(format!( + "Manifest path {} is a file but has no parent directory.", + manifest_path.display() + )) + })? + .to_path_buf() + } else { + manifest_path.clone() + }; + + let mut cargo_metadata = CargoMetadataProvider::new( + &manifest_root, + config.ignore_cargo_manifest.is_some_and(|ignore| ignore), + ); + + // Create the recipe + let mut generated_recipe = + GeneratedRecipe::from_model(model.clone(), &mut cargo_metadata).into_diagnostic()?; + + // we need to add compilers + let requirements = &mut generated_recipe.recipe.requirements; + + // Get the platform-specific dependencies from the project model. + // This properly handles target selectors like [target.linux-64] by using + // the ProjectModel trait's platform-aware API instead of trying to evaluate + // rattler-build selectors with simple string comparison. + let model_dependencies = model.dependencies(Some(host_platform)); + + // Get the list of compilers from config, defaulting to ["rust"] if not + // specified + let compilers = config + .compilers + .clone() + .unwrap_or_else(|| vec!["rust".to_string()]); + + // Add configured compilers to build requirements + pixi_build_backend::compilers::add_compilers_to_requirements( + &compilers, + &mut requirements.build, + &model_dependencies, + &host_platform, + ); + pixi_build_backend::compilers::add_stdlib_to_requirements( + &compilers, + &mut requirements.build, + variants, + ); + + // Check if openssl is in the host dependencies + let has_openssl = model_dependencies + .host + .contains_key(&pixi_build_types::SourcePackageName::from("openssl")); + + let mut has_sccache = false; + + let config_env = config.env.clone(); + + let system_env_vars = std::env::vars().collect::>(); + + let all_env_vars = config_env + .clone() + .into_iter() + .chain(system_env_vars.clone()) + .collect(); + + let mut sccache_secrets = Vec::default(); + + // Verify if user has set any sccache environment variables + if sccache_envs(&all_env_vars).is_some() { + // check if we set some sccache in system env vars + if let Some(system_sccache_keys) = sccache_envs(&system_env_vars) { + // If sccache_envs are used in the system environment variables, + // we need to set them as secrets + let system_sccache_keys = system_env_vars + .keys() + // we set only those keys that are present in the system environment variables + // and not in the config env + .filter(|key| { + system_sccache_keys.contains(&key.as_str()) + && !config_env.contains_key(*key) + }) + .cloned() + .collect(); + + sccache_secrets = system_sccache_keys; + }; + + let sccache_dep: Vec> = sccache_tools() + .iter() + .map(|tool| tool.parse().into_diagnostic()) + .collect::>>()?; + + // Add sccache tools to the build requirements + // only if they are not already present + let existing_reqs: Vec<_> = requirements.build.clone().into_iter().collect(); + + requirements.build.extend( + sccache_dep + .into_iter() + .filter(|dep| !existing_reqs.contains(dep)), + ); + + has_sccache = true; + } + + let build_script = BuildScriptContext { + source_dir: manifest_root.display().to_string(), + extra_args: config.extra_args.clone(), + has_openssl, + has_sccache, + is_bash: !Platform::current().is_windows(), + } + .render(); + + generated_recipe.recipe.build.script = Script { + content: build_script, + env: config_env, + secrets: sccache_secrets, + }; + + // Add the input globs from the Cargo metadata provider + generated_recipe + .metadata_input_globs + .extend(cargo_metadata.input_globs()); + + Ok(generated_recipe) + } + + /// Returns the build input globs used by the backend. + fn extract_input_globs_from_build( + &self, + config: &Self::Config, + _workdir: impl AsRef, + _editable: bool, + ) -> miette::Result> { + Ok([ + "**/*.rs", + // Cargo configuration files + "Cargo.toml", + "Cargo.lock", + // Build scripts + "build.rs", + ] + .iter() + .map(|s| s.to_string()) + .chain(config.extra_input_globs.clone()) + .collect()) + } + + fn default_variants( + &self, + host_platform: Platform, + ) -> miette::Result>> { + let mut variants = BTreeMap::new(); + + if host_platform.is_windows() { + // Default to the Visual Studio 2022 compiler on Windows + // Not 2019 due to Conda-forge switching and the mainstream support dropping in 2024. + // rattler-build will default to vs2017 which for most github runners is too + // old. + variants.insert(NormalizedKey::from("c_compiler"), vec!["vs2022".into()]); + variants.insert(NormalizedKey::from("cxx_compiler"), vec!["vs2022".into()]); + } + + Ok(variants) + } +} + +#[tokio::main] +pub async fn main() { + if let Err(err) = pixi_build_backend::cli::main(|log| { + IntermediateBackendInstantiator::::new(log, Arc::default()) + }) + .await + { + eprintln!("{err:?}"); + std::process::exit(1); + } +} + +#[cfg(test)] +mod tests { + use cargo_toml::Manifest; + use indexmap::IndexMap; + use recipe_stage0::recipe::{Item, Value}; + + use super::*; + + #[test] + fn test_input_globs_includes_extra_globs() { + let config = RustBackendConfig { + extra_input_globs: vec!["custom/*.txt".to_string(), "extra/**/*.py".to_string()], + ..Default::default() + }; + + let generator = RustGenerator::default(); + + let result = generator + .extract_input_globs_from_build(&config, PathBuf::new(), false) + .unwrap(); + + // Verify that all extra globs are included in the result + for extra_glob in &config.extra_input_globs { + assert!( + result.contains(extra_glob), + "Result should contain extra glob: {extra_glob}" + ); + } + + // Verify that default globs are still present + assert!(result.contains("**/*.rs")); + assert!(result.contains("Cargo.toml")); + assert!(result.contains("Cargo.lock")); + assert!(result.contains("build.rs")); + } + + #[macro_export] + macro_rules! project_fixture { + ($($json:tt)+) => { + serde_json::from_value::( + serde_json::json!($($json)+) + ).expect("Failed to create TestProjectModel from JSON fixture.") + }; + } + + #[tokio::test] + async fn test_rust_is_in_build_requirements() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default_with_ignore_cargo_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_rust_is_not_added_if_already_present() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + }, + "buildDependencies": { + "rust": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default_with_ignore_cargo_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_env_vars_are_set() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let env = IndexMap::from([("foo".to_string(), "bar".to_string())]); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig { + env: env.clone(), + ignore_cargo_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + insta::assert_yaml_snapshot!(generated_recipe.recipe.build.script, + { + ".content" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_sccache_is_enabled() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "default_target": { + "run_dependencies": { + "boltons": "*" + } + }, + } + }); + + let env = IndexMap::from([("SCCACHE_BUCKET".to_string(), "my-bucket".to_string())]); + + // Set environment variables manually + // SAFETY: We're in a test and controlling the environment for this test only + unsafe { + std::env::set_var("SCCACHE_SYSTEM", "SOME_VALUE"); + std::env::set_var("SCCACHE_BUCKET", "system-bucket"); + } + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig { + env, + ignore_cargo_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Clean up environment variables + // SAFETY: We're in a test and cleaning up the environment after the test + unsafe { + std::env::remove_var("SCCACHE_SYSTEM"); + std::env::remove_var("SCCACHE_BUCKET"); + } + + // Verify that sccache is added to the build requirements + // when some env variables are set + insta::assert_yaml_snapshot!(generated_recipe.recipe, { + ".source[0].path" => "[ ... path ... ]", + ".build.script.content" => "[ ... script ... ]", + }); + } + + #[tokio::test] + async fn test_with_cargo_manifest() { + let project_model = project_fixture!({}); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default(), + // Using this crate itself, as it has interesting metadata, using .workspace + std::env::current_dir().unwrap(), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Manually load the Cargo manifest to ensure it works + let current_dir = std::env::current_dir().unwrap(); + let package_manifest_path = current_dir.join("Cargo.toml"); + let mut manifest = Manifest::from_path(&package_manifest_path).unwrap(); + manifest.complete_from_path(&package_manifest_path).unwrap(); + + assert_eq!( + manifest.clone().package.unwrap().name.clone(), + generated_recipe.recipe.package.name.to_string() + ); + assert_eq!( + *manifest.clone().package.unwrap().version.get().unwrap(), + generated_recipe.recipe.package.version.to_string() + ); + assert_eq!( + *manifest + .clone() + .package + .unwrap() + .description + .unwrap() + .get() + .unwrap(), + generated_recipe + .recipe + .about + .as_ref() + .and_then(|a| a.description.clone()) + .unwrap() + .to_string() + ); + assert_eq!( + *manifest + .clone() + .package + .unwrap() + .license + .unwrap() + .get() + .unwrap(), + generated_recipe + .recipe + .about + .as_ref() + .and_then(|a| a.license.clone()) + .unwrap() + .to_string() + ); + assert_eq!( + *manifest + .clone() + .package + .unwrap() + .repository + .unwrap() + .get() + .unwrap(), + generated_recipe + .recipe + .about + .as_ref() + .and_then(|a| a.repository.clone()) + .unwrap() + .to_string() + ); + + insta::assert_yaml_snapshot!(&generated_recipe.metadata_input_globs, @r###" + - "../../Cargo.toml" + - "../Cargo.toml" + - Cargo.toml + "###); + } + + #[tokio::test] + async fn test_error_handling_missing_cargo_manifest() { + let project_model = project_fixture!({ + "targets": { + "default_target": { + "run_dependencies": { + "dependency": "*" + } + }, + } + }); + + // Try to generate recipe from a non-existent directory + let result = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default(), + PathBuf::from("/non/existent/path"), + Platform::Linux64, + None, + &std::collections::HashSet::new(), + vec![], + None, + ) + .await; + + // Should fail when trying to read Cargo.toml from non-existent path + assert!(result.is_err()); + } + + #[tokio::test] + async fn test_empty_name() { + let project_model = project_fixture!({ + "version": "0.1.0", + "targets": { + "default_target": { + "run_dependencies": { + "dependency": "*" + } + }, + } + }); + + // Should fail because name is empty and we're ignoring cargo manifest + let result = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default_with_ignore_cargo_manifest(), + std::env::current_dir().unwrap(), + Platform::Linux64, + None, + &std::collections::HashSet::new(), + vec![], + None, + ) + .await; + + assert!(result.is_err()); + let error_message = result.err().unwrap().to_string(); + assert!(error_message.contains("no name defined")); + } + + #[tokio::test] + async fn test_multiple_compilers_configuration() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig { + compilers: Some(vec!["rust".to_string(), "c".to_string(), "cxx".to_string()]), + ignore_cargo_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly three compilers + assert_eq!( + compiler_templates.len(), + 3, + "Should have exactly three compilers" + ); + + // Check we have the expected compilers + assert!( + compiler_templates.contains(&"${{ compiler('rust') }}".to_string()), + "Rust compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('c') }}".to_string()), + "C compiler should be in build requirements" + ); + assert!( + compiler_templates.contains(&"${{ compiler('cxx') }}".to_string()), + "C++ compiler should be in build requirements" + ); + } + + #[tokio::test] + async fn test_default_compiler_when_not_specified() { + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "runDependencies": { + "boltons": { + "binary": { + "version": "*" + } + } + } + }, + } + }); + + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig { + compilers: None, + ignore_cargo_manifest: Some(true), + ..Default::default() + }, + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Check that we have exactly the expected compilers and build tools + let build_reqs = &generated_recipe.recipe.requirements.build; + let compiler_templates: Vec = build_reqs + .iter() + .filter_map(|item| match item { + Item::Value(Value::Template(s)) if s.contains("compiler") => Some(s.clone()), + _ => None, + }) + .collect(); + + // Should have exactly one compiler: rust + assert_eq!( + compiler_templates.len(), + 1, + "Should have exactly one compiler when not specified" + ); + assert_eq!( + compiler_templates[0], "${{ compiler('rust') }}", + "Default compiler should be rust" + ); + } + + #[tokio::test] + async fn test_target_specific_build_dependencies_linux() { + use pixi_build_backend::traits::ProjectModel; + + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "targets": { + "linux-64": { + "buildDependencies": { + "openssl": { + "binary": { + "version": ">=3.0" + } + } + } + } + } + } + }); + + // Test that the ProjectModel correctly filters dependencies for Linux64 + let linux_deps = project_model.dependencies(Some(Platform::Linux64)); + assert!( + linux_deps + .build + .contains_key(&pixi_build_types::SourcePackageName::from("openssl")), + "openssl should be in build dependencies for Linux64" + ); + + // Test that the ProjectModel correctly excludes dependencies for Osx64 + let osx_deps = project_model.dependencies(Some(Platform::Osx64)); + assert!( + !osx_deps + .build + .contains_key(&pixi_build_types::SourcePackageName::from("openssl")), + "openssl should NOT be in build dependencies for Osx64" + ); + + // Test that the intermediate recipe contains the conditional items with correct condition + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default_with_ignore_cargo_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Verify that conditional build dependencies contain openssl with linux-64 condition + let mut found_openssl_conditional = false; + for item in &generated_recipe.recipe.requirements.build { + if let Item::Conditional(cond) = item { + // Check if the then branch contains openssl + if cond + .then + .0 + .iter() + .any(|dep| dep.package_name().as_source() == "openssl") + { + // Print the actual condition for debugging + eprintln!( + "Found openssl conditional with condition: '{}'", + cond.condition + ); + // The condition should be exactly "host_platform == 'linux-64'" + assert_eq!( + cond.condition, "host_platform == 'linux-64'", + "Condition should be exactly \"host_platform == 'linux-64'\"" + ); + found_openssl_conditional = true; + break; + } + } + } + + assert!( + found_openssl_conditional, + "Recipe should contain conditional build dependency for openssl with linux-64 condition" + ); + } + + #[tokio::test] + async fn test_target_specific_build_dependencies_with_unix_selector() { + use pixi_build_backend::traits::ProjectModel; + + let project_model = project_fixture!({ + "name": "foobar", + "version": "0.1.0", + "targets": { + "targets": { + "unix": { + "buildDependencies": { + "gcc": { + "binary": { + "version": "*" + } + } + } + } + } + } + }); + + // Test that the ProjectModel correctly filters dependencies for Linux64 (unix) + let linux_deps = project_model.dependencies(Some(Platform::Linux64)); + assert!( + linux_deps + .build + .contains_key(&pixi_build_types::SourcePackageName::from("gcc")), + "gcc should be in build dependencies for Linux64 (unix)" + ); + + // Test that the ProjectModel correctly filters dependencies for Osx64 (unix) + let osx_deps = project_model.dependencies(Some(Platform::Osx64)); + assert!( + osx_deps + .build + .contains_key(&pixi_build_types::SourcePackageName::from("gcc")), + "gcc should be in build dependencies for Osx64 (unix)" + ); + + // Test that the ProjectModel correctly excludes dependencies for Win64 (not unix) + let win_deps = project_model.dependencies(Some(Platform::Win64)); + assert!( + !win_deps + .build + .contains_key(&pixi_build_types::SourcePackageName::from("gcc")), + "gcc should NOT be in build dependencies for Win64 (not unix)" + ); + + // Test that the intermediate recipe contains the conditional items with correct condition + let generated_recipe = RustGenerator::default() + .generate_recipe( + &project_model, + &RustBackendConfig::default_with_ignore_cargo_manifest(), + PathBuf::from("."), + Platform::Linux64, + None, + &HashSet::new(), + vec![], + None, + ) + .await + .expect("Failed to generate recipe"); + + // Verify that conditional build dependencies contain gcc with unix condition + let mut found_gcc_conditional = false; + for item in &generated_recipe.recipe.requirements.build { + if let Item::Conditional(cond) = item { + // Check if the then branch contains gcc + if cond + .then + .0 + .iter() + .any(|dep| dep.package_name().as_source() == "gcc") + { + // Print the actual condition for debugging + eprintln!("Found gcc conditional with condition: '{}'", cond.condition); + // The condition should be exactly "unix" + assert_eq!( + cond.condition, "unix", + "Condition should be exactly \"unix\"" + ); + found_gcc_conditional = true; + break; + } + } + } + + assert!( + found_gcc_conditional, + "Recipe should contain conditional build dependency for gcc with unix condition" + ); + } +} diff --git a/crates/pixi-build-rust/src/metadata.rs b/crates/pixi-build-rust/src/metadata.rs new file mode 100644 index 0000000000..fddd51cbe9 --- /dev/null +++ b/crates/pixi-build-rust/src/metadata.rs @@ -0,0 +1,869 @@ +use std::{collections::BTreeSet, path::PathBuf, str::FromStr}; + +use cargo_toml::{ + AbstractFilesystem, Error as CargoTomlError, Filesystem, Inheritable, Manifest, Package, + PackageTemplate, +}; +use miette::Diagnostic; +use once_cell::unsync::OnceCell; +use pixi_build_backend::generated_recipe::MetadataProvider; +use rattler_conda_types::{ParseVersionError, Version}; + +#[derive(Debug, thiserror::Error, Diagnostic)] +pub enum MetadataError { + #[error(transparent)] + CargoTomlError(CargoTomlError), + #[error("failed to parse version from Cargo.toml, {0}")] + ParseVersionError(ParseVersionError), + #[error(transparent)] + IoError(#[from] std::io::Error), + #[error("missing inherited value from workspace {0}")] + MissingInheritedValue(String), +} + +/// An implementation of [`MetadataProvider`] that reads metadata from a +/// Cargo.toml file and possibly an associated workspace manifest. +pub struct CargoMetadataProvider { + manifest_root: PathBuf, + cargo_manifest: OnceCell, + workspace_manifest: OnceCell<(Manifest, PathBuf)>, + ignore_cargo_manifest: bool, +} + +impl CargoMetadataProvider { + /// Constructs a new `CargoMetadataProvider` with the given manifest root. + /// + /// # Arguments + /// + /// * `manifest_root` - The directory that contains the `Cargo.toml` file + /// * `ignore_cargo_manifest` - If `true`, all metadata methods will return + /// `None`, effectively disabling Cargo.toml metadata extraction + pub fn new(manifest_root: impl Into, ignore_cargo_manifest: bool) -> Self { + Self { + manifest_root: manifest_root.into(), + cargo_manifest: OnceCell::default(), + workspace_manifest: OnceCell::default(), + ignore_cargo_manifest, + } + } + + /// Ensures that the manifest is loaded and returns the package metadata. + fn ensure_manifest_package(&self) -> Result, MetadataError> { + Ok(self.ensure_manifest()?.package.as_ref()) + } + + /// Ensures that the manifest is loaded + fn ensure_manifest(&self) -> Result<&Manifest, MetadataError> { + self.cargo_manifest.get_or_try_init(move || { + let cargo_toml_content = fs_err::read_to_string(self.manifest_root.join("Cargo.toml"))?; + Manifest::from_slice_with_metadata(cargo_toml_content.as_bytes()) + .map_err(MetadataError::CargoTomlError) + }) + } + + /// Ensures that the workspace manifest is loaded, and returns the package + /// template + fn ensure_workspace_manifest(&self) -> Result, MetadataError> { + let manifest = self.ensure_manifest()?; + + // If the package manifest already has a workspace defined, return that. + if let Some(workspace) = &manifest.workspace { + return Ok(workspace.package.as_ref()); + } + + let workspace_hint = manifest.package.as_ref().and_then(|p| p.workspace.clone()); + let (manifest, _) = self.workspace_manifest.get_or_try_init(move || { + Filesystem::new(&self.manifest_root) + .parse_root_workspace(workspace_hint.as_deref()) + .map_err(MetadataError::CargoTomlError) + })?; + Ok(manifest.workspace.as_ref().and_then(|w| w.package.as_ref())) + } + + /// Returns the set of globs that match files that influence the metadata of + /// this package. + /// + /// This includes the package's own `Cargo.toml` file and any workspace + /// `Cargo.toml` files if workspace inheritance is detected. These globs + /// can be used for incremental builds to determine when metadata might + /// have changed. + /// + /// # Returns + /// + /// A `BTreeSet` of glob patterns as strings. Common patterns include: + /// - `"Cargo.toml"` - The package's manifest file + /// - `"../../**/Cargo.toml"` - Workspace manifest files (when workspace + /// inheritance is used) + pub fn input_globs(&self) -> BTreeSet { + let mut input_globs = BTreeSet::new(); + + let Some(_) = self.cargo_manifest.get() else { + return input_globs; + }; + + // Add the Cargo.toml manifest file itself. + input_globs.insert(String::from("Cargo.toml")); + + // If the manifest has workspace inheritance, include that as well. + if let Some((_, workspace_path)) = self.workspace_manifest.get() { + // If the workspace is defined in the package we just include the path to the + // workspace itself. + let workspace_selected = self + .cargo_manifest + .get() + .and_then(|p| p.package.as_ref()) + .is_some_and(|p| p.workspace.is_some()); + + if let Some(path) = pathdiff::diff_paths( + workspace_path + .parent() + .expect("the workspace path is a file so it must have a parent"), + &self.manifest_root, + ) { + if workspace_selected { + input_globs.insert(format!( + "{}/Cargo.toml", + path.display().to_string().replace("\\", "/") + )); + } else { + // Otherwise we assume the file is located in a parent directory of the package. + input_globs.extend( + path.components() + .take_while(|p| matches!(p, std::path::Component::ParentDir)) + .enumerate() + .map(|(idx, _)| format!("{}Cargo.toml", "../".repeat(idx + 1))), + ) + } + } + } + + input_globs + } +} + +impl MetadataProvider for CargoMetadataProvider { + type Error = MetadataError; + + /// Returns the package name from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the name from the package section of the Cargo.toml file. + fn name(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + Ok(self.ensure_manifest_package()?.map(|pkg| pkg.name.clone())) + } + + /// Returns the package version from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the version from the package section, handling workspace inheritance if + /// needed. The version string is parsed into a + /// `rattler_conda_types::Version`. + fn version(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.version) else { + return Ok(None); + }; + let version = match value { + Inheritable::Set(value) => value, + Inheritable::Inherited => self + .ensure_workspace_manifest()? + .and_then(|template| template.version.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from("workspace.package.version")) + })?, + }; + Ok(Some( + Version::from_str(version).map_err(MetadataError::ParseVersionError)?, + )) + } + + /// Returns the package description from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the description from the package section, handling workspace inheritance + /// if needed. + fn description(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.description) else { + return Ok(None); + }; + let description = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.description.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from( + "workspace.package.description", + )) + })?, + }; + Ok(Some(description.clone())) + } + + /// Returns the package homepage URL from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the homepage from the package section, handling workspace inheritance if + /// needed. + fn homepage(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.homepage) else { + return Ok(None); + }; + let homepage = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.homepage.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from("workspace.package.homepage")) + })?, + }; + Ok(Some(homepage.clone())) + } + + /// Returns the package license from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the license from the package section, handling workspace inheritance if + /// needed. + fn license(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.license) else { + return Ok(None); + }; + let license = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.license.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from("workspace.package.license")) + })?, + }; + Ok(Some(license.clone())) + } + + /// Returns the package license file path from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the license-file from the package section, handling workspace + /// inheritance if needed. The path is converted to a string + /// representation. Since Cargo.toml only supports a single license-file, + /// returns a Vec with one element if present. + fn license_files(&mut self) -> Result>, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.license_file) else { + return Ok(None); + }; + let license_file = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.license_file.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from( + "workspace.package.license-file", + )) + })?, + }; + Ok(Some(vec![license_file.display().to_string()])) + } + + /// Returns the package summary from the Cargo.toml manifest. + /// + /// Currently always returns `None` as Cargo.toml does not have a summary + /// field. This could be implemented to return the description field as + /// a fallback. + fn summary(&mut self) -> Result, Self::Error> { + Ok(None) + } + + /// Returns the package documentation URL from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the documentation from the package section, handling workspace + /// inheritance if needed. + fn documentation(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self + .ensure_manifest_package()? + .map(|pkg| &pkg.documentation) + else { + return Ok(None); + }; + let documentation = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.documentation.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from( + "workspace.package.documentation", + )) + })?, + }; + Ok(Some(documentation.clone())) + } + + /// Returns the package repository URL from the Cargo.toml manifest. + /// + /// If `ignore_cargo_manifest` is true, returns `None`. Otherwise, extracts + /// the repository from the package section, handling workspace inheritance + /// if needed. + fn repository(&mut self) -> Result, Self::Error> { + if self.ignore_cargo_manifest { + return Ok(None); + } + let Some(value) = self.ensure_manifest_package()?.map(|pkg| &pkg.repository) else { + return Ok(None); + }; + let repository = match value { + None => return Ok(None), + Some(Inheritable::Set(value)) => value, + Some(Inheritable::Inherited) => self + .ensure_workspace_manifest()? + .and_then(|template| template.repository.as_ref()) + .ok_or_else(|| { + MetadataError::MissingInheritedValue(String::from( + "workspace.package.repository", + )) + })?, + }; + Ok(Some(repository.clone())) + } +} + +#[cfg(test)] +mod tests { + use std::fs; + + use pixi_build_backend::generated_recipe::MetadataProvider; + use tempfile::TempDir; + + use super::*; + + /// Helper function to create a temporary directory with a Cargo.toml file + fn create_temp_cargo_project(cargo_toml_content: &str) -> TempDir { + let temp_dir = TempDir::new().expect("Failed to create temp directory"); + let cargo_toml_path = temp_dir.path().join("Cargo.toml"); + fs::write(cargo_toml_path, cargo_toml_content).expect("Failed to write Cargo.toml"); + temp_dir + } + + /// Helper function to create a CargoMetadataProvider for testing + fn create_metadata_provider(manifest_root: &std::path::Path) -> CargoMetadataProvider { + CargoMetadataProvider::new(manifest_root, false) + } + + /// Helper function to assert workspace inheritance error + fn assert_missing_inherited_value_error( + result: Result, MetadataError>, + expected_field: &str, + ) { + assert!(result.is_err()); + let error = result.unwrap_err(); + match error { + MetadataError::MissingInheritedValue(field) => { + assert_eq!(field, expected_field); + } + MetadataError::CargoTomlError(_) => { + // This is expected when workspace inheritance fails due to + // missing workspace + } + _ => panic!("Expected MissingInheritedValue or CargoTomlError, got: {error:?}"), + } + } + + /// Helper function to assert workspace inheritance error for version + fn assert_version_inheritance_error( + result: Result, MetadataError>, + expected_field: &str, + ) { + assert!(result.is_err()); + let error = result.unwrap_err(); + match error { + MetadataError::MissingInheritedValue(field) => { + assert_eq!(field, expected_field); + } + MetadataError::CargoTomlError(_) => { + // This is expected when workspace inheritance fails due to + // missing workspace + } + _ => panic!("Expected MissingInheritedValue or CargoTomlError, got: {error:?}"), + } + } + + #[test] + fn test_workspace_inheritance_in_same_file() { + let cargo_toml_content = r#" +[workspace] +members = [] + +[workspace.package] +version = "1.0.0" +description = "Workspace description" +license = "MIT" +homepage = "https://workspace.example.com" +repository = "https://github.com/workspace/repo" +documentation = "https://docs.workspace.example.com" + +[package] +name = "test-package" +version.workspace = true +description.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true +documentation.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Test that workspace inheritance works when workspace is in the same file + assert_eq!(provider.name().unwrap(), Some("test-package".to_string())); + assert_eq!(provider.version().unwrap().unwrap().to_string(), "1.0.0"); + assert_eq!( + provider.description().unwrap(), + Some("Workspace description".to_string()) + ); + assert_eq!(provider.license().unwrap(), Some("MIT".to_string())); + assert_eq!( + provider.homepage().unwrap(), + Some("https://workspace.example.com".to_string()) + ); + assert_eq!( + provider.repository().unwrap(), + Some("https://github.com/workspace/repo".to_string()) + ); + assert_eq!( + provider.documentation().unwrap(), + Some("https://docs.workspace.example.com".to_string()) + ); + } + + #[test] + fn test_inheritance_without_workspace_version() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version.workspace = true +description = "Regular description" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Test that inheritance fails when no workspace is defined + let result = provider.version(); + assert_version_inheritance_error(result, "workspace.package.version"); + } + + #[test] + fn test_inheritance_without_workspace_description() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +description.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.description(); + assert_missing_inherited_value_error(result, "workspace.package.description"); + } + + #[test] + fn test_inheritance_without_workspace_license() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +license.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.license(); + assert_missing_inherited_value_error(result, "workspace.package.license"); + } + + #[test] + fn test_inheritance_without_workspace_homepage() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +homepage.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.homepage(); + assert_missing_inherited_value_error(result, "workspace.package.homepage"); + } + + #[test] + fn test_inheritance_without_workspace_repository() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +repository.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.repository(); + assert_missing_inherited_value_error(result, "workspace.package.repository"); + } + + #[test] + fn test_inheritance_without_workspace_documentation() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +documentation.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.documentation(); + assert_missing_inherited_value_error(result, "workspace.package.documentation"); + } + + #[test] + fn test_inheritance_without_workspace_license_file() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +license-file.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider + .license_files() + .map(|opt| opt.map(|v| v.join(", "))); + assert_missing_inherited_value_error(result, "workspace.package.license-file"); + } + + #[test] + fn test_workspace_with_partial_inheritance() { + let cargo_toml_content = r#" +[workspace] +members = [] + +[workspace.package] +version = "2.0.0" +description = "Workspace description" + +[package] +name = "test-package" +version.workspace = true +description = "Package-specific description" +license = "Apache-2.0" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Test mixed inheritance and direct values + assert_eq!(provider.version().unwrap().unwrap().to_string(), "2.0.0"); + assert_eq!( + provider.description().unwrap(), + Some("Package-specific description".to_string()) + ); + assert_eq!(provider.license().unwrap(), Some("Apache-2.0".to_string())); + } + + #[test] + fn test_workspace_inheritance_with_missing_workspace_fields() { + let cargo_toml_content = r#" +[workspace] +members = [] + +[workspace.package] +version = "1.5.0" + +[package] +name = "test-package" +version.workspace = true +description.workspace = true +license.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Version should work + assert_eq!(provider.version().unwrap().unwrap().to_string(), "1.5.0"); + + // Description should fail + let result = provider.description(); + assert_missing_inherited_value_error(result, "workspace.package.description"); + + // License should fail + let result = provider.license(); + assert_missing_inherited_value_error(result, "workspace.package.license"); + } + + #[test] + fn test_input_globs_with_workspace_in_same_file() { + let cargo_toml_content = r#" +[workspace] +members = [] + +[workspace.package] +version = "1.0.0" + +[package] +name = "test-package" +version.workspace = true +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Force loading of manifest and workspace + let _ = provider.version().unwrap(); + + let globs = provider.input_globs(); + assert!(globs.contains("Cargo.toml")); + // When workspace is in the same file, no additional glob is needed + assert_eq!( + globs.len(), + 1, + "Expected only Cargo.toml glob when workspace is in same file, got: {globs:?}" + ); + } + + #[test] + fn test_input_globs_with_separate_workspace_file() { + // Create workspace root directory + let workspace_dir = TempDir::new().expect("Failed to create workspace temp directory"); + let workspace_cargo_toml = r#" +[workspace] +members = ["package"] + +[workspace.package] +version = "2.0.0" +description = "Workspace description" +"#; + fs::write( + workspace_dir.path().join("Cargo.toml"), + workspace_cargo_toml, + ) + .expect("Failed to write workspace Cargo.toml"); + + // Create package subdirectory + let package_dir = workspace_dir.path().join("package"); + fs::create_dir(&package_dir).expect("Failed to create package directory"); + let package_cargo_toml = r#" +[package] +name = "test-package" +version.workspace = true +description.workspace = true +"#; + fs::write(package_dir.join("Cargo.toml"), package_cargo_toml) + .expect("Failed to write package Cargo.toml"); + + let mut provider = create_metadata_provider(&package_dir); + + // Force loading of manifest and workspace + let version_result = provider.version(); + assert!( + version_result.is_ok(), + "Version should be inherited from workspace" + ); + assert_eq!(version_result.unwrap().unwrap().to_string(), "2.0.0"); + + let globs = provider.input_globs(); + assert!(globs.contains("Cargo.toml")); + // Should include workspace glob since workspace inheritance from separate file + // is detected + assert!( + globs.len() >= 2, + "Expected at least 2 globs when workspace is in separate file, got: {globs:?}" + ); + + // Check that a workspace-related glob pattern is included + let has_workspace_glob = globs + .iter() + .any(|glob| glob.contains("../Cargo.toml") && glob != "Cargo.toml"); + assert!( + has_workspace_glob, + "Expected workspace glob pattern, got: {globs:?}" + ); + } + + #[test] + fn test_input_globs_without_workspace() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Force loading of manifest + let _ = provider.version().unwrap(); + + let globs = provider.input_globs(); + assert_eq!( + globs.len(), + 1, + "Expected exactly 1 glob when no workspace is present, got: {globs:?}" + ); + assert!(globs.contains("Cargo.toml")); + + // Verify no workspace-related globs are present + let has_workspace_glob = globs + .iter() + .any(|glob| glob.contains("**/Cargo.toml") && glob != "Cargo.toml"); + assert!( + !has_workspace_glob, + "No workspace globs should be present when no workspace inheritance occurs, got: {globs:?}" + ); + } + + #[test] + fn test_input_globs_no_inheritance_with_workspace_present() { + let cargo_toml_content = r#" +[workspace] +members = [] + +[workspace.package] +version = "2.0.0" + +[package] +name = "test-package" +version = "1.0.0" +description = "Direct package values" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + // Force loading of manifest - no inheritance should occur + let version = provider.version().unwrap().unwrap(); + assert_eq!( + version.to_string(), + "1.0.0", + "Should use direct package version, not workspace version" + ); + + let globs = provider.input_globs(); + // When workspace exists but no inheritance is used, only Cargo.toml should be + // included + assert_eq!( + globs.len(), + 1, + "Expected exactly 1 glob when workspace exists but no inheritance is used, got: {globs:?}" + ); + assert!(globs.contains("Cargo.toml")); + } + + #[test] + fn test_ignore_cargo_manifest_flag() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "1.0.0" +description = "Test description" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = CargoMetadataProvider::new(temp_dir.path(), true); + + // All methods should return None when ignore_cargo_manifest is true + assert_eq!(provider.name().unwrap(), None); + assert_eq!(provider.version().unwrap(), None); + assert_eq!(provider.description().unwrap(), None); + assert_eq!(provider.license().unwrap(), None); + assert_eq!(provider.homepage().unwrap(), None); + assert_eq!(provider.repository().unwrap(), None); + assert_eq!(provider.documentation().unwrap(), None); + assert_eq!(provider.license_files().unwrap(), None); + assert_eq!(provider.summary().unwrap(), None); + } + + #[test] + fn test_invalid_version_format() { + let cargo_toml_content = r#" +[package] +name = "test-package" +version = "not.a.valid.version.at.all" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.version(); + // Note: rattler_conda_types::Version is quite permissive, so let's test what + // actually happens + match result { + Ok(Some(version)) => { + // If it parses successfully, that's also valid behavior - conda versions are + // flexible + assert!(!version.to_string().is_empty()); + } + Err(MetadataError::ParseVersionError(_)) => { + // This is the expected error case + } + other => panic!("Unexpected result: {other:?}"), + } + } + + #[test] + fn test_malformed_cargo_toml() { + let cargo_toml_content = r#" +[package +name = "test-package" +version = "1.0.0" +"#; + + let temp_dir = create_temp_cargo_project(cargo_toml_content); + let mut provider = create_metadata_provider(temp_dir.path()); + + let result = provider.name(); + assert!(result.is_err()); + match result.unwrap_err() { + MetadataError::CargoTomlError(_) => {} + err => panic!("Expected CargoTomlError, got: {err:?}"), + } + } +} diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@bash.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@bash.snap new file mode 100644 index 0000000000..cf04079a49 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@bash.snap @@ -0,0 +1,5 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +cargo install --locked --root "$PREFIX" --path my-prefix-dir --target-dir target --no-track --force diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@cmdexe.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@cmdexe.snap new file mode 100644 index 0000000000..0c6f3b657e --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__build_script@cmdexe.snap @@ -0,0 +1,6 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +cargo install --locked --root "%PREFIX%" --path my-prefix-dir --target-dir target --no-track --force +if errorlevel 1 exit 1 diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@bash.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@bash.snap new file mode 100644 index 0000000000..8c859848d0 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@bash.snap @@ -0,0 +1,7 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +export OPENSSL_DIR="$PREFIX" + +cargo install --locked --root "$PREFIX" --path my-prefix-dir --target-dir target --no-track --force diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@cmdexe.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@cmdexe.snap new file mode 100644 index 0000000000..14a67499dd --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__openssl@cmdexe.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +SET OPENSSL_DIR="%PREFIX%" + +cargo install --locked --root "%PREFIX%" --path my-prefix-dir --target-dir target --no-track --force +if errorlevel 1 exit 1 diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@bash.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@bash.snap new file mode 100644 index 0000000000..519ba3ff48 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@bash.snap @@ -0,0 +1,9 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +export RUSTC_WRAPPER=sccache + +cargo install --locked --root "$PREFIX" --path my-prefix-dir --target-dir target --no-track --force + +sccache --show-stats diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@cmdexe.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@cmdexe.snap new file mode 100644 index 0000000000..cd408895e2 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__build_script__test__sccache@cmdexe.snap @@ -0,0 +1,10 @@ +--- +source: crates/pixi-build-rust/src/build_script.rs +expression: script +--- +SET RUSTC_WRAPPER=sccache + +cargo install --locked --root "%PREFIX%" --path my-prefix-dir --target-dir target --no-track --force +if errorlevel 1 exit 1 + +sccache --show-stats diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__env_vars_are_set.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__env_vars_are_set.snap new file mode 100644 index 0000000000..ab082766b5 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__env_vars_are_set.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi-build-rust/src/main.rs +expression: generated_recipe.recipe.build.script +--- +content: "[ ... script ... ]" +env: + foo: bar +secrets: [] diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_in_build_requirements.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_in_build_requirements.snap new file mode 100644 index 0000000000..90e21a0b6e --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_in_build_requirements.snap @@ -0,0 +1,29 @@ +--- +source: crates/pixi-build-rust/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: + - "${{ compiler('rust') }}" + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_not_added_if_already_present.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_not_added_if_already_present.snap new file mode 100644 index 0000000000..701799b7d3 --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__rust_is_not_added_if_already_present.snap @@ -0,0 +1,29 @@ +--- +source: crates/pixi-build-rust/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: "[ ... script ... ]" +requirements: + build: + - rust + host: [] + run: + - boltons + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__sccache_is_enabled.snap b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__sccache_is_enabled.snap new file mode 100644 index 0000000000..e206ab027b --- /dev/null +++ b/crates/pixi-build-rust/src/snapshots/pixi_build_rust__tests__sccache_is_enabled.snap @@ -0,0 +1,34 @@ +--- +source: crates/pixi-build-rust/src/main.rs +expression: generated_recipe.recipe +--- +context: {} +package: + name: foobar + version: 0.1.0 +source: [] +build: + number: ~ + script: + content: "[ ... script ... ]" + env: + SCCACHE_BUCKET: my-bucket + secrets: + - SCCACHE_SYSTEM +requirements: + build: + - "${{ compiler('rust') }}" + - sccache + host: [] + run: [] + run_constraints: [] +tests: [] +about: + homepage: ~ + license: ~ + license_file: ~ + summary: ~ + description: ~ + documentation: ~ + repository: ~ +extra: ~ diff --git a/crates/recipe-stage0/Cargo.toml b/crates/recipe-stage0/Cargo.toml new file mode 100644 index 0000000000..b927e60959 --- /dev/null +++ b/crates/recipe-stage0/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "recipe-stage0" +version = "0.1.1" +edition.workspace = true + +[dependencies] +itertools = { workspace = true } +hashlink = { workspace = true } +marked-yaml = { workspace = true } +rattler_conda_types = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_yaml = { workspace = true } +rattler-build = { workspace = true } +indexmap = { workspace = true } +url = { workspace = true } + +[dev-dependencies] +insta = { workspace = true, features = ["yaml", "redactions", "filters"] } diff --git a/crates/recipe-stage0/src/lib.rs b/crates/recipe-stage0/src/lib.rs new file mode 100644 index 0000000000..bfd6cfe0d0 --- /dev/null +++ b/crates/recipe-stage0/src/lib.rs @@ -0,0 +1,5 @@ +pub mod recipe; + +pub mod marked_yaml; +pub mod matchspec; +pub mod requirements; diff --git a/crates/recipe-stage0/src/marked_yaml.rs b/crates/recipe-stage0/src/marked_yaml.rs new file mode 100644 index 0000000000..819b747f9a --- /dev/null +++ b/crates/recipe-stage0/src/marked_yaml.rs @@ -0,0 +1,385 @@ +use hashlink::LinkedHashMap; +use marked_yaml::types::{MarkedMappingNode, MarkedScalarNode, MarkedSequenceNode}; +use marked_yaml::{Node as MarkedNode, Span}; + +pub type MappingHash = LinkedHashMap; + +use crate::recipe::{ + About, Build, Conditional, ConditionalList, ConditionalRequirements, Extra, IntermediateRecipe, + Item, ListOrItem, Package, PackageContents, Source, Test, Value, +}; + +// Trait for converting to marked YAML nodes +pub trait ToMarkedYaml { + fn to_marked_yaml(&self) -> MarkedNode; +} + +impl ToMarkedYaml for Value +where + T: ToString, +{ + fn to_marked_yaml(&self) -> MarkedNode { + let value_str = match self { + Value::Concrete(val) => val.to_string(), + Value::Template(template) => template.clone(), + }; + MarkedNode::Scalar(MarkedScalarNode::new(Span::new_blank(), value_str)) + } +} + +impl ToMarkedYaml for Item +where + T: ToString, +{ + fn to_marked_yaml(&self) -> MarkedNode { + match self { + Item::Value(value) => value.to_marked_yaml(), + Item::Conditional(conditional) => conditional.to_marked_yaml(), + } + } +} + +impl ToMarkedYaml for Conditional { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + // Add the "if" condition + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "if"), + MarkedNode::Scalar(MarkedScalarNode::new(Span::new_blank(), &self.condition)), + ); + + // Add the "then" value + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "then"), + self.then.to_marked_yaml(), + ); + + // Add the "else" value if present + if !self.else_value.0.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "else"), + self.else_value.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for ConditionalList +where + T: ToString, +{ + fn to_marked_yaml(&self) -> MarkedNode { + let nodes: Vec = self.iter().map(|item| item.to_marked_yaml()).collect(); + MarkedNode::Sequence(MarkedSequenceNode::new(Span::new_blank(), nodes)) + } +} + +impl ToMarkedYaml for Package { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "name"), + self.name.to_marked_yaml(), + ); + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "version"), + self.version.to_marked_yaml(), + ); + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for Source { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + match self { + Source::Path(path) => { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "path"), + path.path.to_marked_yaml(), + ); + if let Some(ref sha256) = path.sha256 { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "sha256"), + sha256.to_marked_yaml(), + ); + } + } + Source::Url(url) => { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "url"), + url.url.to_marked_yaml(), + ); + if let Some(ref sha256) = url.sha256 { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "sha256"), + sha256.to_marked_yaml(), + ); + } + } + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for Build { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if let Some(ref number) = self.number { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "number"), + number.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for ConditionalRequirements { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if !self.build.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "build"), + self.build.to_marked_yaml(), + ); + } + + if !self.host.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "host"), + self.host.to_marked_yaml(), + ); + } + + if !self.run.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "run"), + self.run.to_marked_yaml(), + ); + } + + if !self.run_constraints.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "run_constraints"), + self.run_constraints.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for PackageContents { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if let Some(ref include) = self.include { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "include"), + include.to_marked_yaml(), + ); + } + + if let Some(ref files) = self.files { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "files"), + files.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for Test { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if let Some(ref package_contents) = self.package_contents { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "package_contents"), + package_contents.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for About { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if let Some(ref homepage) = self.homepage { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "homepage"), + homepage.to_marked_yaml(), + ); + } + + if let Some(ref license) = self.license { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "license"), + license.to_marked_yaml(), + ); + } + + if let Some(ref license_file) = self.license_file { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "license_file"), + license_file.to_marked_yaml(), + ); + } + + if let Some(ref summary) = self.summary { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "summary"), + summary.to_marked_yaml(), + ); + } + + if let Some(ref description) = self.description { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "description"), + description.to_marked_yaml(), + ); + } + + if let Some(ref documentation) = self.documentation { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "documentation"), + documentation.to_marked_yaml(), + ); + } + + if let Some(ref repository) = self.repository { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "repository"), + repository.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for Extra { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + if !self.recipe_maintainers.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "recipe-maintainers"), + self.recipe_maintainers.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for IntermediateRecipe { + fn to_marked_yaml(&self) -> MarkedNode { + let mut mapping = MappingHash::new(); + + // Add context if present + if !self.context.is_empty() { + let mut context_mapping = MappingHash::new(); + for (key, value) in self.context.iter() { + context_mapping.insert( + MarkedScalarNode::new(Span::new_blank(), key), + value.to_marked_yaml(), + ); + } + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "context"), + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), context_mapping)), + ); + } + + // Add package + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "package"), + self.package.to_marked_yaml(), + ); + + if !self.source.is_empty() { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "build"), + self.source.to_marked_yaml(), + ); + } + + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "build"), + self.build.to_marked_yaml(), + ); + + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "requirements"), + self.requirements.to_marked_yaml(), + ); + + if !self.tests.is_empty() { + let test_nodes: Vec = self + .tests + .iter() + .map(|test| test.to_marked_yaml()) + .collect(); + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "tests"), + MarkedNode::Sequence(MarkedSequenceNode::new(Span::new_blank(), test_nodes)), + ); + } + + if let Some(ref about) = self.about { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "about"), + about.to_marked_yaml(), + ); + } + + if let Some(ref extra) = self.extra { + mapping.insert( + MarkedScalarNode::new(Span::new_blank(), "extra"), + extra.to_marked_yaml(), + ); + } + + MarkedNode::Mapping(MarkedMappingNode::new(Span::new_blank(), mapping)) + } +} + +impl ToMarkedYaml for ListOrItem +where + T: ToString, +{ + fn to_marked_yaml(&self) -> MarkedNode { + if self.0.len() == 1 { + MarkedNode::Scalar(MarkedScalarNode::new( + Span::new_blank(), + self.0[0].to_string(), + )) + } else { + let nodes: Vec = self + .0 + .iter() + .map(|item| item.to_string()) + .map(|value| MarkedScalarNode::new(Span::new_blank(), value)) + .map(MarkedNode::Scalar) + .collect(); + MarkedNode::Sequence(MarkedSequenceNode::new(Span::new_blank(), nodes)) + } + } +} diff --git a/crates/recipe-stage0/src/matchspec.rs b/crates/recipe-stage0/src/matchspec.rs new file mode 100644 index 0000000000..6db8a54117 --- /dev/null +++ b/crates/recipe-stage0/src/matchspec.rs @@ -0,0 +1,222 @@ +use rattler_conda_types::{MatchSpec, PackageName, ParseMatchSpecError}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::{fmt::Display, str::FromStr}; +use url::Url; + +// Wrapper for MatchSpec to enable serde support +#[derive(Debug, Clone, Default)] +pub struct SerializableMatchSpec(pub MatchSpec); + +impl Serialize for SerializableMatchSpec { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.0.to_string()) + } +} + +impl<'de> Deserialize<'de> for SerializableMatchSpec { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + MatchSpec::from_str(&s, rattler_conda_types::ParseStrictness::Strict) + .map(SerializableMatchSpec) + .map_err(serde::de::Error::custom) + } +} + +impl From for SerializableMatchSpec { + fn from(spec: MatchSpec) -> Self { + SerializableMatchSpec(spec) + } +} + +impl From<&str> for SerializableMatchSpec { + fn from(s: &str) -> Self { + SerializableMatchSpec( + MatchSpec::from_str(s, rattler_conda_types::ParseStrictness::Strict) + .expect("Invalid MatchSpec"), + ) + } +} + +impl From for SerializableMatchSpec { + fn from(s: String) -> Self { + SerializableMatchSpec( + MatchSpec::from_str(&s, rattler_conda_types::ParseStrictness::Strict) + .expect("Invalid MatchSpec"), + ) + } +} + +impl Display for SerializableMatchSpec { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl FromStr for SerializableMatchSpec { + type Err = ParseMatchSpecError; + + fn from_str(s: &str) -> Result { + MatchSpec::from_str(s, rattler_conda_types::ParseStrictness::Strict) + .map(SerializableMatchSpec) + } +} + +#[derive(Clone, PartialEq, Debug)] +pub struct SourceMatchSpec { + pub spec: MatchSpec, + pub location: Url, +} + +#[derive(Clone, PartialEq, Debug)] +pub enum PackageDependency { + Binary(MatchSpec), + Source(SourceMatchSpec), +} + +impl PackageDependency { + pub fn package_name(&self) -> PackageName { + match self { + PackageDependency::Binary(spec) => spec + .name + .as_ref() + .and_then(|matcher| matcher.as_exact()) + .cloned() + .expect("Binary spec should have a name"), + PackageDependency::Source(source_spec) => source_spec + .spec + .name + .as_ref() + .and_then(|matcher| matcher.as_exact()) + .cloned() + .expect("Source spec should have a name"), + } + } + + pub fn as_source(&self) -> Option<&SourceMatchSpec> { + if let PackageDependency::Source(source_spec) = self { + Some(source_spec) + } else { + None + } + } + + /// Check if the dependency can be used as a variant in a recipe. + pub fn can_be_used_as_variant(&self) -> bool { + match self { + PackageDependency::Binary(boxed_spec) => { + let rattler_conda_types::MatchSpec { + version, + build, + build_number, + file_name, + channel, + subdir, + md5, + sha256, + .. + } = boxed_spec; + + version == &Some(rattler_conda_types::VersionSpec::Any) + && build.is_none() + && build_number.is_none() + && file_name.is_none() + && channel.is_none() + && subdir.is_none() + && md5.is_none() + && sha256.is_none() + } + _ => false, + } + } +} + +impl Display for PackageDependency { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + PackageDependency::Binary(spec) => write!(f, "{spec}"), + PackageDependency::Source(source_spec) => { + let matchspec = SerializableMatchSpec::from(source_spec.spec.clone()); + write!(f, "Source(spec: {}, {})", matchspec, source_spec.location) + } + } + } +} + +impl From for PackageDependency { + fn from(spec: SerializableMatchSpec) -> Self { + // we need to split on url to determine if this is a binary or source dependency + if let Some(url) = spec.0.url.as_ref() { + // remove the URL from the MatchSpec + let mut spec = spec.0.clone(); + spec.url = None; + + PackageDependency::Source(SourceMatchSpec { + spec, + location: url.clone(), + }) + } else { + PackageDependency::Binary(spec.0) + } + } +} + +impl FromStr for PackageDependency { + type Err = ParseMatchSpecError; + + fn from_str(s: &str) -> Result { + SerializableMatchSpec::from_str(s).map(PackageDependency::from) + } +} + +impl From<&str> for PackageDependency { + fn from(s: &str) -> Self { + SerializableMatchSpec::from(s).into() + } +} + +impl From for SerializableMatchSpec { + fn from(val: PackageDependency) -> Self { + match val { + PackageDependency::Binary(spec) => SerializableMatchSpec(spec), + PackageDependency::Source(source_spec) => { + // we need to put the URL from source spec back into the MatchSpec + + let mut matchspec = source_spec.spec.clone(); + matchspec.url = Some(source_spec.location); + + SerializableMatchSpec(matchspec) + } + } + } +} + +impl Serialize for PackageDependency { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let dep = self.clone(); + + let ser_matchspec: SerializableMatchSpec = dep.into(); + serializer.serialize_str(&ser_matchspec.to_string()) + } +} + +impl<'de> Deserialize<'de> for PackageDependency { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + MatchSpec::from_str(&s, rattler_conda_types::ParseStrictness::Strict) + .map(SerializableMatchSpec) + .map(PackageDependency::from) + .map_err(serde::de::Error::custom) + } +} diff --git a/crates/recipe-stage0/src/recipe.rs b/crates/recipe-stage0/src/recipe.rs new file mode 100644 index 0000000000..b817bc2966 --- /dev/null +++ b/crates/recipe-stage0/src/recipe.rs @@ -0,0 +1,864 @@ +use std::{ + fmt::{Debug, Display}, + str::FromStr, +}; + +use indexmap::IndexMap; +use itertools::Itertools; +use rattler_conda_types::{PackageName, Platform, package::EntryPoint}; +use serde::{Deserialize, Serialize}; + +use crate::{ + matchspec::{PackageDependency, SerializableMatchSpec}, + requirements::PackageSpecDependencies, +}; + +// Core enum for values that can be either concrete or templated +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(untagged)] +pub enum Value { + Concrete(T), + Template(String), // Jinja template like "${{ name|lower }}" +} + +impl Display for Value { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Value::Concrete(val) => write!(f, "{val}"), + Value::Template(template) => write!(f, "{template}"), + } + } +} + +impl Value { + pub fn concrete(&self) -> Option<&T> { + if let Value::Concrete(val) = self { + Some(val) + } else { + None + } + } +} + +impl FromStr for Value +where + T::Err: std::fmt::Display, +{ + type Err = T::Err; + + fn from_str(s: &str) -> Result { + if s.contains("${{") { + // If it contains some template syntax, treat it as a template + return Ok(Value::Template(s.to_string())); + } + + Ok(Value::Concrete(T::from_str(s)?)) + } +} + +impl From for Value { + fn from(spec: SerializableMatchSpec) -> Self { + Value::Concrete(spec) + } +} + +// Any item in a list can be either a value or a conditional +#[derive(Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum Item { + Value(Value), + Conditional(Conditional), +} + +impl Item { + pub fn new_from_conditional(condition: String, then: Vec, else_value: Vec) -> Self { + Item::Conditional(Conditional { + condition, + then: ListOrItem::new(then), + else_value: ListOrItem::new(else_value), + }) + } +} + +impl Display for Item { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Item::Value(value) => write!(f, "{value}"), + Item::Conditional(cond) => write!(f, "{cond}"), + } + } +} + +impl PartialEq for Item { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Item::Value(Value::Concrete(a)), Item::Value(Value::Concrete(b))) => a == b, + (Item::Conditional(a), Item::Conditional(b)) => { + a.condition == b.condition && a.then == b.then && a.else_value == b.else_value + } + _ => false, + } + } +} + +impl Debug for Item { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Item::Value(value) => write!(f, "Value({value:?})"), + Item::Conditional(cond) => write!(f, "Conditional({cond:?})"), + } + } +} + +impl From> for Item { + fn from(value: Conditional) -> Self { + Self::Conditional(value) + } +} + +impl From for Item { + fn from(source: Source) -> Self { + Item::Value(Value::Concrete(source)) + } +} + +impl From for Item { + fn from(matchspec: SerializableMatchSpec) -> Self { + Item::Value(Value::Concrete(matchspec)) + } +} + +impl From for Item { + fn from(dep: PackageDependency) -> Self { + Item::Value(Value::Concrete(dep)) + } +} + +impl FromStr for Item +where + T::Err: std::fmt::Display, +{ + type Err = T::Err; + + fn from_str(s: &str) -> Result { + if s.contains("${{") { + // If it contains some template syntax, treat it as a template + return Ok(Item::Value(Value::Template(s.to_string()))); + } + + let value = Value::Concrete(T::from_str(s)?); + Ok(Item::Value(value)) + } +} +#[derive(Clone)] +pub struct ListOrItem(pub Vec); + +impl Default for ListOrItem { + fn default() -> Self { + ListOrItem(Vec::new()) + } +} + +impl PartialEq for ListOrItem { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl Debug for ListOrItem { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.0.is_empty() { + write!(f, "ListOrItem([])") + } else if self.0.len() == 1 { + write!(f, "ListOrItem({:?})", self.0[0]) + } else { + write!(f, "ListOrItem({:?})", self.0) + } + } +} + +impl FromStr for ListOrItem { + type Err = T::Err; + + fn from_str(s: &str) -> Result { + Ok(ListOrItem::single(s.parse()?)) + } +} + +impl serde::Serialize for ListOrItem +where + T: serde::Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self.0.len() { + 1 => self.0[0].serialize(serializer), + _ => self.0.serialize(serializer), + } + } +} + +impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for ListOrItem { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use std::fmt; + + use serde::de::{Error, Visitor}; + + struct ListOrItemVisitor(std::marker::PhantomData); + + impl<'de, T: serde::Deserialize<'de>> Visitor<'de> for ListOrItemVisitor { + type Value = ListOrItem; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a single item or a list of items") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + let mut vec = Vec::new(); + while let Some(item) = seq.next_element()? { + vec.push(item); + } + Ok(ListOrItem(vec)) + } + + fn visit_str(self, value: &str) -> Result + where + E: Error, + { + let item = T::deserialize(serde::de::value::StrDeserializer::new(value))?; + Ok(ListOrItem(vec![item])) + } + + fn visit_string(self, value: String) -> Result + where + E: Error, + { + let item = T::deserialize(serde::de::value::StringDeserializer::new(value))?; + Ok(ListOrItem(vec![item])) + } + + fn visit_map(self, map: A) -> Result + where + A: serde::de::MapAccess<'de>, + { + let item = T::deserialize(serde::de::value::MapAccessDeserializer::new(map))?; + Ok(ListOrItem(vec![item])) + } + } + + deserializer.deserialize_any(ListOrItemVisitor(std::marker::PhantomData)) + } +} + +impl Display for ListOrItem { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self.0.len() { + 0 => write!(f, "[]"), + 1 => write!(f, "{}", self.0[0].to_string()), + _ => write!( + f, + "[{}]", + self.0 + .iter() + .map(|x| x.to_string()) + .collect::>() + .join(", ") + ), + } + } +} + +impl ListOrItem { + pub fn new(items: Vec) -> Self { + Self(items) + } + + pub fn single(item: T) -> Self { + Self(vec![item]) + } + + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn iter(&self) -> std::slice::Iter<'_, T> { + self.0.iter() + } +} + +// Conditional structure for if-else logic +#[derive(Clone, Serialize, Deserialize, PartialEq)] +pub struct Conditional { + #[serde(rename = "if")] + pub condition: String, + pub then: ListOrItem, + #[serde(rename = "else")] + pub else_value: ListOrItem, +} + +impl Debug for Conditional { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Conditional {{ condition: {}, then: {:?}, else: {:?} }}", + self.condition, self.then, self.else_value + ) + } +} + +impl Display for Conditional { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "if {} then {} else {}", + self.condition, self.then, self.else_value + ) + } +} + +/// Type alias for lists that can contain conditionals +pub type ConditionalList = Vec>; + +// Main recipe structure +#[derive(Serialize, Deserialize, Default, Clone, Debug)] +pub struct IntermediateRecipe { + #[serde(default)] + pub context: IndexMap>, + #[serde(default)] + pub package: Package, + #[serde(default)] + pub source: ConditionalList, + #[serde(default)] + pub build: Build, + #[serde(default)] + pub requirements: ConditionalRequirements, + #[serde(default)] + pub tests: Vec, + #[serde(default)] + pub about: Option, + #[serde(default)] + pub extra: Option, +} + +pub struct EvaluatedDependencies { + pub build: Option>, + pub host: Option>, + pub run: Option>, + pub run_constraints: Option>, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Package { + pub name: Value, + pub version: Value, +} + +impl Default for Package { + fn default() -> Self { + Package { + name: Value::Concrete("default-package".to_string()), + version: Value::Concrete("0.0.1".to_string()), + } + } +} + +impl Display for Package { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}-{}", self.name, self.version) + } +} + +/// Source information. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(untagged)] +pub enum Source { + /// Url source pointing to a tarball or similar to retrieve the source from + Url(UrlSource), + /// Path source pointing to a local path where the source can be found + Path(PathSource), +} + +impl Source { + pub fn url(url: String) -> Self { + Source::Url(UrlSource { + url: Value::Concrete(url), + sha256: None, + }) + } + + pub fn path(path: String) -> Self { + Source::Path(PathSource { + path: Value::Concrete(path), + sha256: None, + }) + } + + pub fn with_sha256(self, sha256: String) -> Self { + match self { + Source::Url(mut url_source) => { + url_source.sha256 = Some(Value::Concrete(sha256)); + Source::Url(url_source) + } + Source::Path(mut path_source) => { + path_source.sha256 = Some(Value::Concrete(sha256)); + Source::Path(path_source) + } + } + } +} + +impl From for Source { + fn from(url_source: UrlSource) -> Self { + Source::Url(url_source) + } +} +impl From for Source { + fn from(path_source: PathSource) -> Self { + Source::Path(path_source) + } +} + +impl FromStr for Source { + type Err = String; + + fn from_str(s: &str) -> Result { + if s.starts_with("http://") || s.starts_with("https://") { + Ok(Source::Url(UrlSource { + url: Value::Concrete(s.to_string()), + sha256: None, + })) + } else { + Ok(Source::Path(PathSource { + path: Value::Concrete(s.to_string()), + sha256: None, + })) + } + } +} + +impl Display for Source { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Source::Url(url_source) => { + let sha256 = url_source + .sha256 + .as_ref() + .map_or("".to_string(), |s| s.to_string()); + write!(f, "url: {}, sha256: {}", url_source.url, sha256) + } + Source::Path(path_source) => { + let sha256 = path_source + .sha256 + .as_ref() + .map_or("".to_string(), |s| s.to_string()); + write!(f, "path: {}, sha256: {}", path_source.path, sha256) + } + } + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +pub struct UrlSource { + pub url: Value, + pub sha256: Option>, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +pub struct PathSource { + pub path: Value, + pub sha256: Option>, +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +pub struct Script { + pub content: String, + #[serde(default)] + pub env: IndexMap, + #[serde(default)] + pub secrets: Vec, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "lowercase")] +pub enum NoArchKind { + Python, + Generic, +} + +impl Display for NoArchKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + NoArchKind::Python => write!(f, "python"), + NoArchKind::Generic => write!(f, "generic"), + } + } +} +/// Python specific build configuration +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct Python { + /// For a Python noarch package to have executables it is necessary to + /// specify the python entry points. These contain the name of the + /// executable and the module + function that should be executed. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub entry_points: Vec, +} + +impl Python { + /// Returns true if this is the default python configuration. + pub fn is_default(&self) -> bool { + self.entry_points.is_empty() + } +} + +impl Display for Python { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for entry_point in &self.entry_points { + write!(f, "{entry_point}, ")?; + } + Ok(()) + } +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +pub struct Build { + pub number: Option>, + pub script: Script, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub noarch: Option, + #[serde(default, skip_serializing_if = "Python::is_default")] + pub python: Python, +} + +impl Build { + pub fn new(content: String) -> Self { + Build { + number: None, + script: Script { + content, + ..Default::default() + }, + ..Default::default() + } + } +} + +/// A struct to hold the fully resolved, non-conditional requirements. +#[derive(Default)] +pub struct ResolvedRequirements { + pub build: Vec, + pub host: Vec, + pub run: Vec, + pub run_constraints: Vec, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)] +pub enum Target { + Default, + Specific(String), +} + +/// A type that is very specific to rattler-build /recipe.yaml side +#[derive(Serialize, Deserialize, Default, Debug, Clone)] +pub struct ConditionalRequirements { + #[serde(default)] + pub build: ConditionalList, + #[serde(default)] + pub host: ConditionalList, + #[serde(default)] + pub run: ConditionalList, + #[serde(default)] + pub run_constraints: ConditionalList, +} + +impl ConditionalRequirements { + /// Resolves the conditional requirements for a given platform. + pub fn resolve( + build: &ConditionalList, + host: &ConditionalList, + run: &ConditionalList, + run_constraints: &ConditionalList, + platform: Option, + ) -> PackageSpecDependencies { + PackageSpecDependencies { + build: Self::resolve_list(build, platform), + host: Self::resolve_list(host, platform), + run: Self::resolve_list(run, platform), + run_constraints: Self::resolve_list(run_constraints, platform), + } + } + + pub(crate) fn resolve_list( + list: &ConditionalList, + platform: Option, + ) -> IndexMap { + list.iter() + .flat_map(|item| Self::resolve_item(item, platform)) + .collect() + } + + pub(crate) fn resolve_item( + item: &Item, + platform: Option, + ) -> IndexMap { + match item { + Item::Value(v) => { + // Should we handle jinja here? + if let Some(dep) = v.concrete() { + IndexMap::from([(dep.package_name(), dep.clone())]) + } else { + IndexMap::new() + } + } + + Item::Conditional(cond) => { + if let Some(p) = platform { + // This is a simple string comparison + let dependencies = if cond.condition == *p.as_str() { + cond.then.clone().0.to_vec() + } else { + cond.else_value.clone().0.to_vec() + }; + + let mut map: IndexMap = IndexMap::new(); + for dep in dependencies { + map.insert(dep.package_name(), dep.clone()); + } + + map + } else { + // If no platform is specified, conditional blocks are ignored. + IndexMap::new() + } + } + } + } +} + +impl Display for ConditionalRequirements { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{{ build: {}, host: {}, run: {}, run_constraints: {} }}", + self.build.iter().format(", "), + self.host.iter().format(", "), + self.run.iter().format(", "), + self.run_constraints.iter().format(", "), + ) + } +} + +// #[derive(Debug, Serialize, Deserialize)] +// pub(crate) struct Requirements { +// pub build: Vec, +// pub host: Vec, +// pub run: Vec, +// pub run_constraints: Vec, +// } + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +pub struct Test { + pub package_contents: Option, +} + +impl Display for Test { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Test {{ package_contents: {} }}", + self.package_contents.as_ref().into_iter().format("") + ) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +pub struct PackageContents { + pub include: Option>, + pub files: Option>, +} + +impl Display for PackageContents { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "PackageContents {{ include: {}, files: {} }}", + self.include.as_ref().into_iter().flatten().format(", "), + self.files.as_ref().into_iter().flatten().format(", "), + ) + } +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +pub struct About { + pub homepage: Option>, + pub license: Option>, + pub license_file: Option>, + pub summary: Option>, + pub description: Option>, + pub documentation: Option>, + pub repository: Option>, +} + +impl Display for About { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "About {{ homepage: {}, license: {}, license_file: {}, summary: {}, description: {}, documentation: {}, repository: {} }}", + self.homepage.as_ref().into_iter().format(", "), + self.license.as_ref().into_iter().format(", "), + self.license_file.as_ref().into_iter().format(", "), + self.summary.as_ref().into_iter().format(", "), + self.description.as_ref().into_iter().format(", "), + self.documentation.as_ref().into_iter().format(", "), + self.repository.as_ref().into_iter().format(", ") + ) + } +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +pub struct Extra { + #[serde(rename = "recipe-maintainers")] + pub recipe_maintainers: ConditionalList, +} + +impl Display for Extra { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{{ recipe_maintainers: {} }}", + self.recipe_maintainers.iter().format(", ") + ) + } +} + +// Implementation for Recipe +impl IntermediateRecipe { + /// Converts the recipe to YAML string + pub fn to_yaml(&self) -> Result { + serde_yaml::to_string(self) + } + + /// Converts the recipe to pretty-formatted YAML string + pub fn to_yaml_pretty(&self) -> Result { + // serde_yaml doesn't have a "pretty" option like serde_json, + // but it produces readable YAML by default + self.to_yaml() + } + + /// Creates a recipe from YAML string + pub fn from_yaml(yaml: &str) -> Result { + serde_yaml::from_str(yaml) + } +} + +impl Conditional { + pub fn new(condition: String, then_value: ListOrItem) -> Self { + Self { + condition, + then: then_value, + else_value: ListOrItem::default(), + } + } + + pub fn with_else(mut self, else_value: ListOrItem) -> Self { + self.else_value = else_value; + self + } +} + +impl Value { + pub fn is_template(&self) -> bool { + matches!(self, Value::Template(_)) + } + + pub fn is_concrete(&self) -> bool { + matches!(self, Value::Concrete(_)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_recipe_to_yaml() { + // Create a simple recipe + let mut context = IndexMap::new(); + context.insert("name".to_string(), Value::Concrete("xtensor".to_string())); + context.insert("version".to_string(), Value::Concrete("0.24.6".to_string())); + + let source = ConditionalList::from(vec![>>::into( + UrlSource { + url: "https://github.com/xtensor-stack/xtensor/archive/${{ version }}.tar.gz" + .parse() + .unwrap(), + sha256: Some( + "f87259b51aabafdd1183947747edfff4cff75d55375334f2e81cee6dc68ef655" + .parse() + .unwrap(), + ), + } + .into(), + )]); + + let recipe = IntermediateRecipe { + context, + package: Package { + name: Value::Template("${{ name|lower }}".to_string()), + version: Value::Template("${{ version }}".to_string()), + }, + source, + build: Build::default(), + requirements: ConditionalRequirements { + build: vec![ + "${{ compiler('cxx') }}".parse().unwrap(), + "cmake".parse().unwrap(), + Conditional { + condition: "unix".to_owned(), + then: "make".parse().unwrap(), + else_value: "ninja".parse().unwrap(), + } + .into(), + ], + host: vec![ + "xtl >=0.7,<0.8".parse().unwrap(), + "${{ context.name }}".parse().unwrap(), + ], + run: vec!["xtl >=0.7,<0.8".parse().unwrap()], + run_constraints: vec!["xsimd >=8.0.3,<10".parse().unwrap()], + }, + about: Some(About { + homepage: Some(Value::Concrete( + "https://github.com/xtensor-stack/xtensor".to_string(), + )), + license: Some("BSD-3-Clause".parse().unwrap()), + license_file: Some("LICENSE".parse().unwrap()), + summary: Some("The C++ tensor algebra library".parse().unwrap()), + description: Some( + "Multi dimensional arrays with broadcasting and lazy computing" + .parse() + .unwrap(), + ), + documentation: Some("https://xtensor.readthedocs.io".parse().unwrap()), + repository: Some("https://github.com/xtensor-stack/xtensor".parse().unwrap()), + }), + extra: Some(Extra { + recipe_maintainers: vec!["some-maintainer".parse().unwrap()], + }), + ..Default::default() + }; + + insta::assert_yaml_snapshot!(recipe) + } +} diff --git a/crates/recipe-stage0/src/requirements.rs b/crates/recipe-stage0/src/requirements.rs new file mode 100644 index 0000000000..62a63b5074 --- /dev/null +++ b/crates/recipe-stage0/src/requirements.rs @@ -0,0 +1,57 @@ +use std::collections::HashSet; + +use indexmap::IndexMap; +use rattler_build::NormalizedKey; +use rattler_conda_types::PackageName; + +use crate::matchspec::PackageDependency; + +/// A package spec dependency represent dependencies for a specific target. +#[derive(Debug, Clone)] +pub struct PackageSpecDependencies { + pub build: IndexMap, + pub host: IndexMap, + pub run: IndexMap, + pub run_constraints: IndexMap, +} + +impl Default for PackageSpecDependencies { + fn default() -> Self { + PackageSpecDependencies { + build: IndexMap::new(), + host: IndexMap::new(), + run: IndexMap::new(), + run_constraints: IndexMap::new(), + } + } +} + +impl PackageSpecDependencies { + /// Return the used variants of the package spec dependencies. + pub fn used_variants(&self) -> HashSet { + self.build + .iter() + .chain(self.host.iter()) + .chain(self.run.iter()) + .filter(|(_, spec)| spec.can_be_used_as_variant()) + .map(|(name, _)| name.clone().as_normalized().into()) + .collect() + } + + pub fn contains(&self, name: &PackageName) -> bool { + self.build.contains_key(name) + || self.host.contains_key(name) + || self.run.contains_key(name) + || self.run_constraints.contains_key(name) + } +} + +/// Represents a platform, selector. +#[derive(Debug, Clone, Hash, Eq, PartialEq)] +pub enum Selector { + Unix, + Linux, + Win, + MacOs, + Platform(String), +} diff --git a/crates/recipe-stage0/src/snapshots/recipe_stage0__recipe__tests__recipe_to_yaml.snap b/crates/recipe-stage0/src/snapshots/recipe_stage0__recipe__tests__recipe_to_yaml.snap new file mode 100644 index 0000000000..a3a5c30573 --- /dev/null +++ b/crates/recipe-stage0/src/snapshots/recipe_stage0__recipe__tests__recipe_to_yaml.snap @@ -0,0 +1,45 @@ +--- +source: crates/recipe-stage0/src/recipe.rs +expression: recipe +--- +context: + name: xtensor + version: 0.24.6 +package: + name: "${{ name|lower }}" + version: "${{ version }}" +source: + - url: "https://github.com/xtensor-stack/xtensor/archive/${{ version }}.tar.gz" + sha256: f87259b51aabafdd1183947747edfff4cff75d55375334f2e81cee6dc68ef655 +build: + number: ~ + script: + content: "" + env: {} + secrets: [] +requirements: + build: + - "${{ compiler('cxx') }}" + - cmake + - if: unix + then: make + else: ninja + host: + - "xtl >=0.7,<0.8" + - "${{ context.name }}" + run: + - "xtl >=0.7,<0.8" + run_constraints: + - "xsimd >=8.0.3,<10" +tests: [] +about: + homepage: "https://github.com/xtensor-stack/xtensor" + license: BSD-3-Clause + license_file: LICENSE + summary: The C++ tensor algebra library + description: Multi dimensional arrays with broadcasting and lazy computing + documentation: "https://xtensor.readthedocs.io" + repository: "https://github.com/xtensor-stack/xtensor" +extra: + recipe-maintainers: + - some-maintainer diff --git a/docs/build/backends.md b/docs/build/backends.md index 561a20d579..350c959a92 100644 --- a/docs/build/backends.md +++ b/docs/build/backends.md @@ -2,8 +2,23 @@ To decouple the building of a conda package from Pixi we provide something what These are essentially executables following a specific protocol that is implemented for both Pixi and the build backend. This also allows for decoupling of the build backend from Pixi and it's manifest specification. -The Prefix.dev managed backends are being developed in the [pixi-build-backends](https://github.com/prefix-dev/pixi-build-backends) repository, and have their own -[documentation](https://prefix-dev.github.io/pixi-build-backends/). +## Available Backends + +| Backend | Use Case | +|---------|----------| +| [**`pixi-build-cmake`**](./backends/pixi-build-cmake.md) | Projects using CMake | +| [**`pixi-build-python`**](./backends/pixi-build-python.md) | Building Python packages | +| [**`pixi-build-rattler-build`**](./backends/pixi-build-rattler-build.md) | Direct `recipe.yaml` builds with full control | +| [**`pixi-build-ros`**](./backends/pixi-build-ros.md) | ROS (Robot Operating System) packages | +| [**`pixi-build-rust`**](./backends/pixi-build-rust.md) | Cargo-based Rust applications and libraries | +| [**`pixi-build-mojo`**](./backends/pixi-build-mojo.md) | Mojo applications and packages | + +All backends are available through the [conda-forge](https://prefix.dev/channels/conda-forge) conda channel and work across multiple platforms (Linux, macOS, Windows). +For the latest backend versions, you can preprend the channel list with the [prefix.dev/pixi-build-backends](https://prefix.dev/channels/pixi-build-backends) conda channel. + +## Key Concepts + +- [Compilers](./key_concepts/compilers.md) - How pixi-build integrates with conda-forge's compiler infrastructure ### Installation @@ -28,3 +43,77 @@ For example: `pixi-build-cmake=/path/to/bin,pixi-build-python` will: 1. override the `pixi-build-cmake` backend with the executable located at `/path/to/bin` 2. and will use the `pixi-build-python` backend from the `PATH`. 2. `PIXI_BUILD_BACKEND_OVERRIDE_ALL`: If this environment variable is set to *some* value e.g `1` or `true`, it will not install any backends in isolation and will assume that all backends are overridden and available in the `PATH`. This is useful for development purposes. e.g `PIXI_BUILD_BACKEND_OVERRIDE_ALL=1 pixi install` + +## Troubleshooting + +### Rebuilding Generated Recipes + +When you build a package using `pixi build`, the build backends generate a complete rattler-build recipe that is stored in your project's build directory. This can be useful for debugging build issues or understanding exactly how your package is being built. + +### Recipe Locations + +The build backends generate recipes in two locations: + +#### 1. General Recipe (all outputs) + +``` +/.pixi/build/work/--/debug/ +``` + +This directory contains: + +- `recipe.yaml` - A general recipe that can build all package outputs +- `variants.yaml` - All variant configurations for the package + +#### 2. Variant-Specific Recipe (single output) + +``` +/.pixi/build/work/--/debug/recipe// +``` + +This directory contains: + +- `recipe.yaml` - The complete rattler-build recipe generated by the build backend +- `variants.yaml` - The variant configuration used for this specific build + +### Rebuilding a Package + +To debug or rebuild a package using the same configuration, you have two options: + +#### Option 1: Navigate to the recipe directory + +1. Navigate to the recipe directory: + ```bash + cd .pixi/build/work/--/recipe//debug/ + ``` + +2. Use `rattler-build` to rebuild the package: + ```bash + rattler-build build + ``` + +#### Option 2: Point to the recipe directory + +Use the `--recipe` flag to build without changing directories: + +```bash +rattler-build build --recipe .pixi/build/work/--/debug/recipe// +``` + +This allows you to: + +* Inspect the exact recipe that was generated +* Debug build failures with direct access to `rattler-build` +* Understand how the build backend translated your project model (`pixi.toml`) + +!!! tip + The `` ensures that each unique combination of build variants gets its own recipe directory, making it easy to compare different build configurations. + +### Debugging JSON-RPC + +You can find JSON version of your project model and requests/responses in the same directory alongside `recipe.yaml`. +We store: + +- Project model: `project_model.json` +- Requests: `*_params.json` +- Responses: `*_response.json` diff --git a/docs/build/backends/pixi-build-cmake.md b/docs/build/backends/pixi-build-cmake.md new file mode 100644 index 0000000000..6de266f2e1 --- /dev/null +++ b/docs/build/backends/pixi-build-cmake.md @@ -0,0 +1,226 @@ +# pixi-build-cmake + +The `pixi-build-cmake` backend is designed for building C and C++ projects using the [CMake](https://cmake.org/) build system. It provides seamless integration with Pixi's package management workflow while maintaining cross-platform compatibility. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + + +## Overview + +This backend automatically generates conda packages from CMake-based projects by: + +- **Detecting and configuring compilers**: Automatically includes the appropriate C/C++ compilers for your target platform +- **Building with Ninja**: Uses the fast Ninja build system for optimal build performance +- **Cross-platform support**: Works consistently across Linux, macOS, and Windows +- **Standard CMake workflow**: Follows CMake best practices with sensible defaults + +## Basic Usage + +To use the CMake backend in your `pixi.toml`, add it to your package's build configuration: + +```toml +[package] +name = "cmake_package" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-cmake", version = "*" } +channels = [ + "https://prefix.dev/conda-forge", +] +``` + +### Required Dependencies + +The backend automatically includes the following build tools: + +- `cmake` - The CMake build system +- `ninja` - Fast build system used by CMake +- Platform-specific C++ compilers (e.g., `gcc_linux-64`, `clang_osx-64`) + +You can add these to your [`build-dependencies`](https://pixi.sh/latest/build/dependency_types/) if you need specific versions: + +```toml +[package.build-dependencies] +ninja = "1.13" +``` + +## Configuration Options + +You can customize the CMake backend behavior using the `[package.build.config]` section in your `pixi.toml`. The backend supports the following configuration options: + +### `extra-args` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific arguments completely replace base arguments + +Additional command-line arguments to pass to the CMake configuration step. These arguments are inserted into the `cmake` command that configures your project. + +```toml +[package.build.config] +extra-args = [ + "-DENABLE_TESTING=ON", + "-DCMAKE_CXX_STANDARD=17" +] +``` + +For target-specific configuration, platform arguments completely replace the base configuration: + +```toml +[package.build.config] +extra-args = ["-DCMAKE_BUILD_TYPE=Release"] + +[package.build.target.linux-64.config] +extra-args = ["-DCMAKE_BUILD_TYPE=Debug", "-DLINUX_FLAG=ON"] +# Result for linux-64: ["-DCMAKE_BUILD_TYPE=Debug", "-DLINUX_FLAG=ON"] +``` + +### `env` + +- **Type**: `Map` +- **Default**: `{}` +- **Target Merge Behavior**: `Merge` - Platform environment variables override base variables with same name, others are merged + +Environment variables to set during the build process. These variables are available to both the CMake configuration and build steps. + +```toml +[package.build.config] +env = { CMAKE_VERBOSE_MAKEFILE = "ON", CXXFLAGS = "-O3 -march=native" } +``` + +For target-specific configuration, platform environment variables are merged with base variables: + +```toml +[package.build.config] +env = { CMAKE_VERBOSE_MAKEFILE = "OFF", COMMON_VAR = "base" } + +[package.build.target.linux-64.config] +env = { COMMON_VAR = "linux", LINUX_VAR = "value" } +# Result for linux-64: { CMAKE_VERBOSE_MAKEFILE = "OFF", COMMON_VAR = "linux", LINUX_VAR = "value" } +``` + +### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside each work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; if it is present in a manifest a warning is emitted. + +### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Additional glob patterns to include as input files for the build process. These patterns are added to the default input globs that include source files (`**/*.{c,cc,cxx,cpp,h,hpp,hxx}`), CMake files (`**/*.{cmake,cmake.in}`, `**/CMakeFiles.txt`), and other build-related files. + +```toml +[package.build.config] +extra-input-globs = [ + "assets/**/*", + "config/*.ini", + "*.md" +] +``` + +For target-specific configuration, platform-specific globs completely replace the base: + +```toml +[package.build.config] +extra-input-globs = ["*.txt"] + +[package.build.target.linux-64.config] +extra-input-globs = ["*.txt", "*.linux", "linux-configs/**/*"] +# Result for linux-64: ["*.txt", "*.linux", "linux-configs/**/*"] +``` + +### `compilers` + +- **Type**: `Array` +- **Default**: `["cxx"]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific compilers completely replace base compilers + +List of compilers to use for the build. The backend automatically generates appropriate compiler dependencies using conda-forge's compiler infrastructure. + +```toml +[package.build.config] +compilers = ["c", "cxx", "fortran"] +``` + +For target-specific configuration, platform compilers completely replace the base configuration: + +```toml +[package.build.config] +compilers = ["cxx"] + +[package.build.target.linux-64.config] +compilers = ["c", "cxx", "cuda"] +# Result for linux-64: ["c", "cxx", "cuda"] +``` + +!!! info "Comprehensive Compiler Documentation" + For detailed information about available compilers, platform-specific behavior, and how conda-forge compilers work, see the [Compilers Documentation](../key_concepts/compilers.md). + + +## Build Process + +The CMake backend follows this build process: + +1. **Version Detection**: Displays CMake and Ninja versions for diagnostics +2. **Configuration**: Runs `cmake` with the following default options: + - `-GNinja`: Use Ninja generator + - `-DCMAKE_BUILD_TYPE=Release`: Release build by default + - `-DCMAKE_INSTALL_PREFIX=$PREFIX`: Install to conda prefix + - `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`: Export compile commands for tooling + - `-DBUILD_SHARED_LIBS=ON`: Build shared libraries by default + - `-DPython_EXECUTABLE=$PYTHON`: Use the conda Python executable if it's part of the host dependencies. +3. **Build**: Executes `cmake --build` to compile the project +4. **Install**: Installs the built artifacts to the conda package + +## CMake Flag Precedence + +With CMake, when duplicate flags are provided, the last flag takes precedence. +The `pixi-build-cmake` backend places `extra-args` after the default CMake flags, allowing you to override default settings. + +For example, to switch from the default Release build to Debug mode: + +```toml +[package.build.config] +extra-args = ["-DCMAKE_BUILD_TYPE=Debug"] +``` + +## Default variants + +On Windows platforms, the backend automatically sets the following default variants: + +- `c_compiler`: `vs2022` - Visual Studio 2022 C compiler +- `cxx_compiler`: `vs2022` - Visual Studio 2022 C++ compiler + +These variants are used when you specify compilers in your [`[package.build.config.compilers]`](#compilers) configuration. +Only `cxx_compiler` will be installed by default, the `c_compiler` is set to help when you would add that compiler. + +This default is set to align with conda-forge's switch to Visual Studio 2022 and because [mainstream support for Visual Studio 2019 ended in 2024](https://learn.microsoft.com/en-us/lifecycle/products/visual-studio-2019). +The `vs2022` compiler is more widely supported on modern GitHub runners and build environments. + +You can override these defaults by explicitly setting variants using [`[workspace.build-variants]`](https://pixi.sh/latest/reference/pixi_manifest/#build-variants-optional) in your `pixi.toml`: + +```toml +[workspace.build-variants] +c_compiler = ["vs2019"] +cxx_compiler = ["vs2019"] +``` + +## Limitations + +- Currently, assumes C++ projects (hardcoded to `cxx` language) +- Language detection from CMakeLists.txt is not yet implemented + +## See Also + +- [Building C++ Packages](https://pixi.sh/latest/build/cpp/) - Tutorial for building C++ packages with Pixi +- [CMake Documentation](https://cmake.org/documentation/) - Official CMake documentation diff --git a/docs/build/backends/pixi-build-mojo.md b/docs/build/backends/pixi-build-mojo.md new file mode 100644 index 0000000000..6d8b06b4c4 --- /dev/null +++ b/docs/build/backends/pixi-build-mojo.md @@ -0,0 +1,332 @@ +# pixi-build-mojo + +The `pixi-build-mojo` backend is designed for building Mojo projects. It provides seamless integration with Pixi's package management workflow. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + +## Overview + +This backend automatically generates conda packages from Mojo projects. + +The generated packages can be installed into local envs for development, or packaged for distribution. + +### Auto-derive of pkg and bin + +The Mojo backend includes auto-discovery of your project structure and will derive the following: + +- **Binaries**: Automatically searches for `main.mojo` or `main.🔥` in: + - `/main.mojo` +- **Packages**: Automatically searches for directories with `__init__.mojo` or `__init__.🔥` in: + - `//` + - `/src/` + +This means in most cases, you don't need to explicitly configure the `bins` or `pkg` fields. + +**Caveats**: +- If both a `bin` and a `pkg` are auto-derived, only the `bin` will be created, you must manually specify the pkg. +- If the user specifies a `pkg` a `bin` will not be auto-derived. +- If the user specifies a `bin` a `pkg` will not be auto-derived. + + +## Basic Usage + +To use the Mojo backend in your `pixi.toml`, add it to your package's build configuration. The backend will automatically discover your project structure: + + +```txt +# Example project layout for combined binary/library. +. +├── greetings +│   ├── __init__.mojo +│   └── lib.mojo +├── main.mojo +├── pixi.lock +├── pixi.toml +└── README.md +``` + +With the project structure above, pixi-build-mojo will automatically discover: +- The binary from `main.mojo` +- The package from `greetings/__init__.mojo` + +Here's a minimal configuration that leverages auto-derive: + +```toml +[workspace] +authors = ["J. Doe "] +platforms = ["linux-64"] +preview = ["pixi-build"] +channels = [ + "https://prefix.dev/conda-forge", + "https://conda.modular.com/max-nightly", + "https://prefix.dev/modular-community" +] + +[package] +name = "greetings" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-mojo", version = "0.1.*" } + +[tasks] + +[package.host-dependencies] +mojo-compiler = "=25.5.0" + +[package.build-dependencies] +mojo-compiler = "=25.5.0" +small_time = ">=25.4.1,<26" +extramojo = ">=0.16.0,<0.17" + +[package.run-dependencies] +mojo-compiler = "=25.5.0" + +[dependencies] +# For running `mojo test` while developing add all dependencies under +# `[package.build-dependencies]` here as well. +greetings = { path = "." } +``` + +### Project Structure Examples + +The auto-derive feature supports various common project layouts: + +#### Binary-only project +```txt +. +├── main.mojo # Auto-derive as binary +├── pixi.toml +└── README.md +``` + +#### Package-only project +```txt +. +├── mypackage/ # Auto-derive if matches project name +│ ├── __init__.mojo +│ └── utils.mojo +├── pixi.toml +└── README.md +``` + +#### Source directory layout +```txt +. +├── src/ +│ ├── __init__.mojo # Auto-derive as package +│ └── lib.mojo +├── pixi.toml +└── README.md +``` + +#### Combined project (shown earlier) +```txt +. +├── greetings/ +│ ├── __init__.mojo # NOT auto-derived as package +│ └── lib.mojo +├── main.mojo # Auto-derived as binary +├── pixi.toml +└── README.md +``` + +### Required Dependencies + +- `mojo` / `mojo-compiler` package for both the compiler and linked runtime + +## Configuration Options + +You can customize the Mojo backend behavior using the `[package.build.config]` section in your `pixi.toml`. The backend supports the following configuration options: + +#### `env` + +- **Type**: `Map` +- **Default**: `{}` + +Environment variables to set during the build process. + +```toml +[package.build.config] +env = { ASSERT = "all" } +``` + +#### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside the work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; if present, the backend emits a warning to highlight that it no longer has any effect. + +#### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` + +Additional globs to pass to pixi to discover if the package should be rebuilt. + +```toml +[package.build.config] +extra-input-globs = ["**/*.c", "assets/**/*", "*.md"] +``` + +### `compilers` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific compilers completely replace base compilers + +List of compilers to use for the build. Compilers use conda-forge's standard compiler infrastructure. + +```toml +[package.build.config] +compilers = ["c", "cxx"] +``` + +For target-specific configuration, platform compilers completely replace the base configuration: + +```toml +[package.build.config] +compilers = [] + +[package.build.target.linux-64.config] +compilers = ["c", "cuda"] +# Result for linux-64: ["mojo", "c", "cuda"] +``` + +!!! info "Comprehensive Compiler Documentation" + For detailed information about available compilers, platform-specific behavior, and how conda-forge compilers work, see the [Compilers Documentation](../key_concepts/compilers.md). Note that the mojo compiler has special behavior as described above. + +### `bins` + +- **Type**: `Array` +- **Default**: Auto-derived if not specified + +List of binary configurations to build. The created binary will be placed in the `$PREFIX/bin` dir and will be in the path after running `pixi install` assuming the package is listed as a dependency as in the example above. `pixi build` will create a conda package that includes the binary. + +**Auto-derive behavior:** +- If `bins` is not specified, pixi-build-mojo will search for a `main.mojo` or `main.🔥` file in the project root +- If found, it creates a binary with the name set to the project name +- If a pkg has been manually configured, a bin will not be auto-derived and must be manually configured. + +#### `bins[].name` + +- **Type**: `String` +- **Default**: Project name (with dashes converted to underscores) for the first binary + +The name of the binary executable to create. If not specified: +- For the first binary in the list, defaults to the project name +- For additional binaries, this field is required + +```toml +[[package.build.config.bins]] +# name = "greet" # Optional for first binary, defaults to project name +``` + +#### `bins[].path` + +- **Type**: `String` (path) +- **Default**: Auto-derived for the first binary + +The path to the Mojo file that contains a `main` function. If not specified: +- For the first binary, searches for `main.mojo` or `main.🔥` in the project root +- For additional binaries, this field is required + +```toml +[[package.build.config.bins]] +# path = "./main.mojo" # Optional if main.mojo exists in project root +``` + +#### `bins[].extra-args` + +- **Type**: `Array` +- **Default**: `[]` + +Additional command-line arguments to pass to the Mojo compiler when building this binary. + +```toml +[[package.build.config.bins]] +extra-args = ["-I", "special-thing"] +``` + +### `pkg` + +- **Type**: `PkgConfig` +- **Default**: Auto-derived if not specified + +Package configuration for creating Mojo package. The created Mojo package will be placed in the `$PREFIX/lib/mojo` dir, which will make it discoverable to anything that depends on the package. + +**Auto-derive behavior:** +- If `pkg` is not specified, pixi-build-mojo will search for a directory containing `__init__.mojo` or `__init__.🔥` in the following order: + 1. `//` + 2. `/src/` +- If found, it creates a package with the name set to the project name +- If no valid package directory is found, no package is built +- If a binary is manually configured, a pkg will not be auto-derived and must be manually specified. +- If a binary is also auto-derive, a pkg will not be generated and must be manually specified + +#### `pkg.name` + +- **Type**: `String` +- **Default**: Project name (with dashes converted to underscores) + +The name to give the Mojo package. The `.mojopkg` suffix will be added automatically. If not specified, defaults to the project name. + +```toml +[package.build.config.pkg] +name = "greetings" +``` + +#### `pkg.path` + +- **Type**: `String` (path) +- **Default**: Auto-derive + +The path to the directory that constitutes the package. If not specified, searches for a directory with `__init__.mojo` or `__init__.🔥` as described above. + +```toml +[package.build.config.pkg] +path = "greetings" +``` + +#### `pkg.extra-args` + +- **Type**: `Array` +- **Default**: `[]` + +Additional command-line arguments to pass to the Mojo compiler when building this package. + +```toml +[package.build.config.pkg] +extra-args = ["-I", "special-thing"] +``` + +## Default Variants + +On Windows platforms, the backend automatically sets the following default variants: + +- `c_compiler`: `vs2022` - Visual Studio 2022 C compiler +- `cxx_compiler`: `vs2022` - Visual Studio 2022 C++ compiler + +These variants are used when you specify compilers in your [`[package.build.config.compilers]`](#compilers) configuration. +Note that setting these default variants does not automatically add compilers to your build - you still need to explicitly configure which compilers to use. + +This default is set to align with conda-forge's switch to Visual Studio 2022 and because [mainstream support for Visual Studio 2019 ended in 2024](https://learn.microsoft.com/en-us/lifecycle/products/visual-studio-2019). +The `vs2022` compiler is more widely supported on modern GitHub runners and build environments. + +You can override these defaults by explicitly setting variants using [`[workspace.build-variants]`](https://pixi.sh/latest/reference/pixi_manifest/#build-variants-optional) in your `pixi.toml`: + +```toml +[workspace.build-variants] +c_compiler = ["vs2019"] +cxx_compiler = ["vs2019"] +``` + +## See Also + +- [Mojo Pixi Basic](https://docs.modular.com/pixi/) +- [Modular Community Packages](https://github.com/modular/modular-community) diff --git a/docs/build/backends/pixi-build-python.md b/docs/build/backends/pixi-build-python.md new file mode 100644 index 0000000000..62f7407c49 --- /dev/null +++ b/docs/build/backends/pixi-build-python.md @@ -0,0 +1,423 @@ +# pixi-build-python + +The `pixi-build-python` backend is designed for building Python projects using standard Python packaging tools. It provides seamless integration with Pixi's package management workflow while supporting both [PEP 517](https://peps.python.org/pep-0517/) and [PEP 518](https://peps.python.org/pep-0518/) compliant projects. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + + +## Overview + +This backend automatically generates conda packages from Python projects by: + +- **PEP 517/518 compliance**: Works with modern Python packaging standards including `pyproject.toml` +- **PyPI-to-conda mapping** (opt-in): Maps `project.dependencies` and `build-system.requires` from `pyproject.toml` to conda packages (see [`ignore-pypi-mapping`](#ignore-pypi-mapping)) +- **Automatic compiler detection**: Detects build tools like `maturin` or `setuptools-rust` and automatically adds required compilers +- **Cross-platform support**: Works consistently across Linux, macOS, and Windows +- **Flexible installation**: Automatically selects between `pip` and `uv` for package installation + +## Basic Usage + +To use the Python backend in your `pixi.toml`, add it to your package's build configuration: + +```toml +[package] +name = "python_package" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-python", version = "*" } +channels = ["https://prefix.dev/conda-forge"] + +``` + +### Required Dependencies + +The backend automatically includes the following build tools: + +- `python` - The Python interpreter +- `pip` - Python package installer (or `uv` if specified) + +You can add these to your [`host-dependencies`](https://pixi.sh/latest/build/dependency_types/) if you need specific versions: + +```toml +[package.build-dependencies] +python = "3.11" +``` + +The backend will be automatically selected by the automatic PyPI dependency mapping feature if you have `pyproject.toml` in your source directory. +Otherwise, you need to explicitly add it to your package definition in the `[host-dependencies]`: +```toml +[package.host-dependencies] +hatchling = "*" +``` + +## Configuration Options + +You can customize the Python backend behavior using the `[package.build.config]` section in your `pixi.toml`. The backend supports the following configuration options: + +### `noarch` + +- **Type**: `Boolean` +- **Default**: `true` (unless [compilers](#compilers) are specified) +- **Target Merge Behavior**: `Overwrite` - Platform-specific noarch setting takes precedence over base + +Controls whether to build a platform-independent (noarch) package or a platform-specific package. +The backend tries to derive whether the package can be built as `noarch` based on the presence of [compilers](#compilers). +If compilers are specified, the backend assume that native extensions are build as part of the build process. +Most of the time these are platform-specific, so the package will be built as a platform-specific package. +If no compilers are specified, the default value for `noarch` is `true`, meaning the package will be built as a noarch python package. + +```toml +[package.build.config] +noarch = false # Build platform-specific package +``` + +For target-specific configuration, platform-specific noarch setting overrides the base: + +```toml +[package.build.config] +noarch = true + +[package.build.target.win-64.config] +noarch = false # Windows needs platform build +# Result for win-64: false +``` + +### `env` + +- **Type**: `Map` +- **Default**: `{}` +- **Target Merge Behavior**: `Merge` - Platform environment variables override base variables with same name, others are merged + +Environment variables to set during the build process. These variables are available during package installation. + +```toml +[package.build.config] +env = { SETUPTOOLS_SCM_PRETEND_VERSION = "1.0.0" } +``` + +For target-specific configuration, platform environment variables are merged with base variables: + +```toml +[package.build.config] +env = { PYTHONPATH = "/base/path", COMMON_VAR = "base" } + +[package.build.target.win-64.config] +env = { COMMON_VAR = "windows", WIN_SPECIFIC = "value" } +# Result for win-64: { PYTHONPATH = "/base/path", COMMON_VAR = "windows", WIN_SPECIFIC = "value" } +``` + +### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside the work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; if present, a warning is emitted to highlight that the setting no longer has any effect. +### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Additional glob patterns to include as input files for the build process. These patterns are added to the default input globs that include Python source files, configuration files (`setup.py`, `pyproject.toml`, etc.), and other build-related files. + +```toml +[package.build.config] +extra-input-globs = [ + "data/**/*", + "templates/*.html", + "*.md" +] +``` + +For target-specific configuration, platform-specific globs completely replace the base: + +```toml +[package.build.config] +extra-input-globs = ["*.py"] + +[package.build.target.win-64.config] +extra-input-globs = ["*.py", "*.dll", "*.pyd", "windows-resources/**/*"] +# Result for win-64: ["*.py", "*.dll", "*.pyd", "windows-resources/**/*"] +``` + +### `compilers` + +- **Type**: `Array` +- **Default**: `[]` (no compilers) +- **Target Merge Behavior**: `Overwrite` - Platform-specific compilers completely replace base compilers + +List of compilers to use for the build. Most pure Python packages don't need compilers, but this is useful for packages with C extensions or other compiled components. The backend automatically generates appropriate compiler dependencies using conda-forge's compiler infrastructure. + +```toml +[package.build.config] +compilers = ["c", "cxx"] +``` + +For target-specific configuration, platform compilers completely replace the base configuration: + +```toml +[package.build.config] +compilers = [] + +[package.build.target.win-64.config] +compilers = ["c", "cxx"] +# Result for win-64: ["c", "cxx"] (only on Windows) +``` + +!!! info "Pure Python vs. Extension Packages" + The Python backend defaults to no compilers (`[]`) since most Python packages are pure Python and don't need compilation. This is different from other backends like CMake which default to `["cxx"]`. Only specify compilers if your package has C extensions or other compiled components: + + ```toml + # Pure Python package (default behavior) + [package.build.config] + # No compilers needed - defaults to [] + + # Python package with C extensions + [package.build.config] + compilers = ["c", "cxx"] + ``` + +!!! info "Automatic Compiler Detection" + The backend automatically detects compilers required by certain build tools in your `build-system.requires`. For example: + + - `maturin` → "rust" + - `setuptools-rust` → "rust" + + These detected compilers are merged with any explicitly configured compilers. You only need to manually specify compilers if your package uses build tools that aren't auto-detected. + +!!! info "Comprehensive Compiler Documentation" + For detailed information about available compilers, platform-specific behavior, and how conda-forge compilers work, see the [Compilers Documentation](../key_concepts/compilers.md). + +### `extra-args` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Extra arguments to pass to `pip`. +A use-case could be [`pip`'s `--config-settings` parameter](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-C). + +```toml +[package.build.config] +extra-args = ["-Cbuilddir=mybuilddir"] +``` + +For target-specific configuration, platform-specific globs completely replace the base: + +```toml +[package.build.config] +extra-args = ["-Cbuilddir=mybuilddir"] + +[package.build.target.win-64.config] +extra-args = ["-Cbuilddir=foo"] +# Result for win-64: ["-Cbuilddir=foo"] +``` + +### `ignore-pyproject-manifest` + +- **Type**: `Boolean` +- **Default**: `false` +- **Target Merge Behavior**: `Overwrite` - Platform-specific setting takes precedence over base + +Controls whether to ignore the `pyproject.toml` manifest file and rely solely on the project model for package metadata. When set to `true`, the backend will not extract metadata (name, version, description, license, URLs) from `pyproject.toml` and will use only the information provided in the Pixi project model. + +```toml +[package.build.config] +ignore-pyproject-manifest = true # Ignore pyproject.toml metadata +``` + +This option is useful when you want complete control over package metadata through the Pixi project configuration, or when the `pyproject.toml` contains metadata that conflicts with your conda package requirements. + +For target-specific configuration, platform-specific setting overrides the base: + +```toml +[package.build.config] +ignore-pyproject-manifest = false + +[package.build.target.win-64.config] +ignore-pyproject-manifest = true # Ignore pyproject.toml on Windows only +# Result for win-64: true +``` + +!!! info "Metadata Extraction from pyproject.toml" + By default (when `ignore-pyproject-manifest` is `false`), the backend automatically extracts package metadata from your `pyproject.toml` file, including: + + - **name**: Package name from `project.name` + - **version**: Package version from `project.version` + - **description/summary**: From `project.description` + - **license**: From `project.license` (supports text, file, or SPDX formats) + - **homepage**: From `project.urls.Homepage` + - **repository**: From `project.urls.Repository`, `project.urls.Source`, or `project.urls."Source Code"` + - **documentation**: From `project.urls.Documentation` or `project.urls.Docs` + + This metadata is automatically included in the generated conda recipe. The `pyproject.toml` file itself is also added to the input globs for incremental build detection. + +### `ignore-pypi-mapping` + +- **Type**: `Boolean` +- **Default**: `true` +- **Target Merge Behavior**: `Overwrite` - Platform-specific setting takes precedence over base + +Controls whether to ignore the automatic PyPI-to-conda dependency mapping feature. +When set to `true` (the default), dependencies from `pyproject.toml` will not be automatically mapped to conda packages. +Set to `false` to enable automatic mapping. + +```toml +[package.build.config] +ignore-pypi-mapping = false # Enable automatic PyPI-to-conda mapping +``` + +!!! note "Default Behavior" + This option currently defaults to `true` (mapping disabled) to avoid breaking existing setups. + In a future release, the default will change to `false` (mapping enabled). + If you want to opt-in to automatic dependency mapping now, explicitly set `ignore-pypi-mapping = false`. + +For target-specific configuration, platform-specific setting overrides the base: + +```toml +[package.build.config] +ignore-pypi-mapping = false + +[package.build.target.win-64.config] +ignore-pypi-mapping = true # Disable mapping on Windows only +# Result for win-64: true +``` + +## Automatic PyPI Dependency Mapping + +The Python backend can automatically map PyPI dependencies from your `pyproject.toml` to their corresponding conda packages. +This means you don't need to manually duplicate your dependencies in both `pyproject.toml` and `pixi.toml`. + +!!! warning "Opt-in Feature" + This feature is currently disabled by default. To enable automatic PyPI-to-conda dependency mapping, set `ignore-pypi-mapping = false` in your build configuration: + + ```toml + [package.build.config] + ignore-pypi-mapping = false + ``` + +### How It Works + +The backend reads dependencies from two sources in your `pyproject.toml`: + +1. **`project.dependencies`** → Added to conda **run** dependencies +2. **`build-system.requires`** → Added to conda **host** dependencies + +For each PyPI package, the backend queries a mapping service to find the corresponding conda-forge package name. The mapping is cached locally for 24 hours to improve performance. + +### Example + +Given this `pyproject.toml`: + +```toml +[project] +name = "my-package" +version = "1.0.0" +dependencies = [ + "requests>=2.28", + "pydantic>=2.0,<3.0", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" +``` + +The backend automatically adds: + +- `requests >=2.28` and `pydantic >=2.0,<3.0` to run dependencies +- `hatchling` to host dependencies + +### Precedence Rules + +Dependencies specified in your `pixi.toml` take precedence over those inferred from `pyproject.toml`: + +- If you specify `requests = ">=2.30"` in `[package.run-dependencies]`, it will override the `requests>=2.28` from `pyproject.toml` +- Dependencies not in `pixi.toml` are added from `pyproject.toml` + +This allows you to: + +- Use `pyproject.toml` as the single source of truth for most dependencies +- Override specific packages in `pixi.toml` when you need different versions or conda-specific packages + +### Limitations + +- **Environment markers** (e.g., `requests>=2.28; python_version >= "3.8"`) are only partially supported. +At the moment, only `platform_system`, `os_name`, `platform_machine` and `sys_platforms` are currently checked. +- **URL-based dependencies** (e.g., `package @ https://...`) are skipped +- Packages without a conda-forge mapping are logged as warnings and skipped + + +## Build Process + +The Python backend follows this build process: + +1. **Installer Detection**: Automatically chooses between `uv` and `pip` based on available dependencies +2. **Environment Setup**: Configures Python environment variables for the build +3. **Package Installation**: Executes the selected installer with the following options: + - `--no-deps`: Don't install dependencies (handled by conda) + - `--no-build-isolation`: Use the conda environment for building + - `-vv`: Verbose output for debugging +4. **Package Creation**: Creates either a noarch or platform-specific conda package + +## Installer Selection + +The backend automatically detects which Python installer to use: + +- **uv**: Used if `uv` is present in any dependency category (build, host, or run) +- **pip**: Used as the default fallback installer + +To use `uv` for faster installations, add it to your dependencies: + +```toml +[package.host-dependencies] +uv = "*" +``` + +# Editable Installations + +Until profiles are implemented, editable installations are not easily configurable. +This is the current behaviour: + +- `editable` is `true` when installing the package (e.g. with `pixi install`) +- `editable` is `false` when building the package (e.g. with `pixi build`) +- Set environment variable `BUILD_EDITABLE_PYTHON` to `true` or `false` to enforce a certain behavior + +## Default Variants + +On Windows platforms, the backend automatically sets the following default variants: + +- `c_compiler`: `vs2022` - Visual Studio 2022 C compiler +- `cxx_compiler`: `vs2022` - Visual Studio 2022 C++ compiler + +These variants are used when you specify compilers in your [`[package.build.config.compilers]`](#compilers) configuration. +Note that setting these default variants does not automatically add compilers to your build - you still need to explicitly configure which compilers to use. + +This default is set to align with conda-forge's switch to Visual Studio 2022 and because [mainstream support for Visual Studio 2019 ended in 2024](https://learn.microsoft.com/en-us/lifecycle/products/visual-studio-2019). +The `vs2022` compiler is more widely supported on modern GitHub runners and build environments. + +You can override these defaults by explicitly setting variants using [`[workspace.build-variants]`](https://pixi.sh/latest/reference/pixi_manifest/#build-variants-optional) in your `pixi.toml`: + +```toml +[workspace.build-variants] +c_compiler = ["vs2019"] +cxx_compiler = ["vs2019"] +``` + +## Limitations + +- Requires a PEP 517/518 compliant Python project with `pyproject.toml` +- Limited support for complex build customization compared to direct recipe-based approaches +- Limited ways to configure editable installations + + +## See Also + +- [Building Python Packages](https://pixi.sh/latest/build/python/) - Tutorial for building Python packages with Pixi +- [Python Packaging User Guide](https://packaging.python.org/) - Official Python packaging documentation +- [PEP 517](https://peps.python.org/pep-0517/) - A build-system independent format for source trees diff --git a/docs/build/backends/pixi-build-rattler-build.md b/docs/build/backends/pixi-build-rattler-build.md new file mode 100644 index 0000000000..bbe9d80805 --- /dev/null +++ b/docs/build/backends/pixi-build-rattler-build.md @@ -0,0 +1,151 @@ +# Rattler-Build Backend + +The `pixi-build-rattler-build` backend enables building conda packages using rattler-build recipes. +This backend is designed for projects that either have existing recipe.yaml files or where customization is necessary that isn't possible with the currently available backends. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + + +## Overview + +The rattler-build backend: + +- Uses existing `recipe.yaml` files as build manifests +- Supports all standard rattler-build recipe features and selectors +- Handles dependency resolution and virtual package detection automatically +- Can build multiple outputs from a single recipe + +## Usage + +To use the rattler-build backend in your `pixi.toml`, specify it in your build system configuration: + +```toml +[package] +name = "rattler_build_package" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-rattler-build", version = "*" } +channels = ["https://prefix.dev/conda-forge"] +``` + +The backend expects a rattler-build recipe file in one of these locations (searched in order): + +1. `recipe.yaml` or `recipe.yml` in the same directory as the package manifest +2. `recipe/recipe.yaml` or `recipe/recipe.yml` in a subdirectory of the package manifest + +If the package is defined in the same location as the workspace, it is heavily encouraged to place the recipe file in its own directory `recipe`. +Learn more about the `rattler-build`, and its recipe format in its [high level overview](https://rattler.build/latest/highlevel). + +!!! warning + If you expect your build script to be compatible with incremental compilation + (re-using files from previous builds to speed-up future builds), + you must ensure that the build directory for these files is set outside of the + root directory in order to enable the incremental compilation. + This is because we use a clean root directory for each build, + to ensure compatibility with recipes which make that assumption. + + In practice, this may look like changing directory to `../build_dir` in your + build script before commencing the build, or passing `../build_dir` as an + argument to your build system. + +## Specifying dependencies + +We only allow source dependencies (workspace packages) in project manifest. +Binary dependencies are not allowed in the project manifest when using `pixi-build-rattler-build`. +This is intentional because: + +1. The rattler-build recipe is the source of truth for binary dependencies. It already + specifies exact versions, build variants, and whether dependencies go in build/host/run. + +2. Allowing binary dependencies in both places would create duplication and potential + conflicts (e.g., recipe says "python >=3.10" but project model says "python >=3.9"). + +3. Source dependencies are different - they represent workspace packages built from local + source. The recipe can reference them by name, but can't know their workspace paths. + The project model provides this mapping. + +This way, the recipe maintains full control over binary dependencies while the project +model only provides the workspace structure information that the recipe cannot know. + +To specify source dependencies, add them to `build-dependencies`, `host-dependencies` or `run-dependencies` in the package manifest: + +```toml title="pixi.toml" +[package.build-dependencies] +a = { path = "../a" } +``` + +## Configuration Options + +The rattler-build backend supports the following TOML configuration options: + +### `experimental` + +- **Type**: `Boolean` +- **Default**: `false` +- **Target Merge Behavior**: Not allowed - must be set at root level only + +Enables experimental features in rattler-build. This is required for certain advanced features like the `cache:` functionality for multi-output recipes. + +```toml +[package.build.config] +experimental = true +``` + +Note: This option cannot be set in target-specific configurations. It must be set at the root `[package.build.config]` level only. + +### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside the work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; if it is still set in a manifest the backend emits a warning to make the change explicit. + +### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Additional glob patterns to include as input files for the build process. These patterns are added to the default input globs that are determined from the recipe sources and package directory structure. + +```toml +[package.build.config] +extra-input-globs = [ + "patches/**/*", + "scripts/*.sh", + "*.md" +] +``` + +For target-specific configuration, platform-specific globs completely replace the base: + +```toml +[package.build.config] +extra-input-globs = ["*.yaml", "*.md"] + +[package.build.target.linux-64.config] +extra-input-globs = ["*.yaml", "*.md", "*.sh", "patches-linux/**/*"] +# Result for linux-64: ["*.yaml", "*.md", "*.sh", "patches-linux/**/*"] +``` + +## Build Process + +The rattler-build backend follows this build process: + +1. **Recipe Discovery**: Locates the `recipe.yaml` file in standard locations +2. **Dependency Resolution**: Resolves build, host, and run dependencies from conda channels and workspace +3. **Virtual Package Detection**: Automatically detects system virtual packages +4. **Build Execution**: Runs the build script specified in the recipe +5. **Package Creation**: Creates conda packages according to the recipe specification + + +## Limitations + +- Requires an existing rattler-build recipe file - cannot infer build instructions automatically +- Build configuration is primarily controlled through the recipe file rather than `pixi.toml` +- Cannot specify binary dependencies in the manifest diff --git a/docs/build/backends/pixi-build-ros.md b/docs/build/backends/pixi-build-ros.md new file mode 100644 index 0000000000..c1936c3139 --- /dev/null +++ b/docs/build/backends/pixi-build-ros.md @@ -0,0 +1,319 @@ +# pixi-build-ros + +The `pixi-build-ros` backend is designed for building [ROS (Robot Operating System)](https://www.ros.org/) packages using the native ROS build systems. +No more requirement to use `colcon` or `catkin_tools` to build your ROS packages. +It provides seamless integration with Pixi's package management workflow while supporting ROS1 and ROS2 packages with automatic dependency resolution. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + +## Overview + +This backend automatically generates conda packages from ROS projects by: + +- **package.xml Integration**: Automatically reads package metadata (name, version, description, maintainers, dependencies) from your ROS `package.xml` file +- **Multi-build system support**: Supports ament_cmake, ament_python, catkin, and cmake build types +- **ROS Distribution Support**: Works with both ROS1 and ROS2 distributions (noetic, humble, jazzy, etc.) +- **Cross-platform support**: Supports Linux, macOS and Windows +- **Automatic dependency mapping**: Maps ROS dependencies to conda packages using RoboStack mappings + +## Basic Usage + +To use the ROS backend in your `pixi.toml`, add it to your package's build configuration: + +```toml +[workspace] +preview = ["pixi-build"] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/robostack-jazzy", # or robostack-humble, robostack-noetic, etc. + "https://prefix.dev/conda-forge" +] +platforms = ["linux-64", "osx-arm64"] + +[package.build] +backend = { name = "pixi-build-ros", version = "*" } + +[package.build.config] +distro = "jazzy" # or "humble", "noetic", etc. +``` + +??? Note "Workspace Configuration" + The workspace can be defined in the `pixi.toml` of the package or in a separate `pixi.toml` at the workspace root. + For example, with a workspace structure like this: + ```shell + tree -L 2 + . + ├── pixi.toml # Workspace configuration + └── src + └── my_ros_package + ├── package.xml # ROS package manifest + └── pixi.toml # Package configuration + ``` + +Then you can run `pixi build` to create conda packages for your ROS packages. +```shell +pixi build +``` + +When you want to install it into your environment, you can do so by adding the following to your workspace `pixi.toml`: + +```toml +[dependencies] +ros-jazzy-my-ros-package = { path = "." } +# or if the package is in a separate pixi.toml +# ros-jazzy-my-ros-package = { path = "src/my_ros_package" } +``` +Note that you need to specify the `ros-jazzy-` prefix when you use a distro configuration. + + +### Automatic Metadata Detection + +The backend will automatically read metadata from your `package.xml` file to populate package information **that is not** explicitly defined in your `pixi.toml`. +This includes: + +- **Package name and version**: Automatically used if not specified in `pixi.toml` +- **Description**: Uses the description from `package.xml` +- **Maintainers**: Extracted from maintainer fields in `package.xml` +- **Homepage**: From URL fields with type "website" in `package.xml` +- **Repository**: From URL fields with type "repository" in `package.xml` + +```xml + + my_ros_package + 1.0.0 + A useful ROS package for navigation + John Doe + https://github.com/user/my_ros_package + https://github.com/user/my_ros_package + +``` + +It would be equivalent to the following `pixi.toml`: + +```toml +[package] +name = "my_ros_package" +version = "1.0.0" +description = "A useful ROS package for navigation" +maintainers = ["John Doe -` format. + +The `` part of the package name is automatically generated based on the `distro` configuration. + +## Configuration Options + +You can customize the ROS backend behavior using the `[package.build.config]` section in your `pixi.toml`. The backend supports the following configuration options: + +### `distro` (Optional) + +- **Type**: `String` +- **Default**: Uses the [automated detection](#automatic-distro-detection) based on the `channels` in the workspace. +- **Target Merge Behavior**: `Overwrite` - Platform-specific distro takes precedence over base + +The ROS distribution to build for. This affects dependency mapping and build configuration. +If set the package name will be prefixed with `ros--` automatically, otherwise the package name from `pixi.toml` or `package.xml` is used. + +```toml +[package.build.config] +distro = "jazzy" # or "humble", "noetic", "iron", etc. +``` + +### `env` + +- **Type**: `Map` +- **Default**: `{}` +- **Target Merge Behavior**: `Merge` - Platform environment variables override base variables with same name, others are merged + +Environment variables to set during the build process. These variables are available during compilation. + +```toml +[package.build.config] +env = { AMENT_CMAKE_ENVIRONMENT_HOOKS_ENABLED = "1" } +``` + +#### Automatically injected environment variables + +The ROS backend keeps the following variables in sync with the selected distro, so you do not need to set them manually in `env`: + +- `ROS_DISTRO` — set to the distro name you configure in `distro`. +- `ROS_VERSION` — set to `"1"` for ROS 1 distros and `"2"` for ROS 2 distros. + +These values are available both while evaluating `package.xml` conditionals and during the generated build script. Any custom entries you provide in `env` are merged on top of these defaults. +If you explicitly set `ROS_DISTRO` or `ROS_VERSION` in `env`, your values take precedence over the defaults. + +### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside the work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; if it is still present in a manifest the backend emits a warning so you can safely remove it. + +### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Additional glob patterns to include as input files for the build process. These patterns are added to the default input globs that include ROS-specific files. + +```toml title="pixi.toml" +[package.build.config] +extra-input-globs = [ + "launch/**/*.py", + "config/*.yaml", + "msgs/**/*.msg", + "srvs/**/*.srv" +] +``` + +Default input globs include: +- Source files: `**/*.{c,cpp,h,hpp,rs,sh,py,pyx}` +- ROS configuration: `package.xml`, `setup.py`, `setup.cfg`, `pyproject.toml` +- Build files: `CMakeLists.txt` + +### `extra-package-mappings` + +- **Type**: `List | RelativeFileName>>>` +- **Default**: `[]` + +Additional dependency mappings to apply to the dependency mapping process. +These mappings are used to extend the usage of the dependencies in the `package.xml` file. + +```toml title="pixi.toml" +[package.build.config] +extra-package-mappings = [ + {"ros-custom" = { ros = ["ros-custom-msgs"] }}, + "mapping.yml" +] +``` + +Or using a toml array of tables: + +```toml title="pixi.toml" +[[package.build.config.extra-package-mappings]] +custom_msgs = { ros = ["custom-messages"] } +``` + +Or you can use a file directly in the list: + +```toml title="pixi.toml" +[package.build.config] +extra-package-mappings = ["mapping.yml"] +``` + +The mapping file can contain the following: + +```yaml title="mapping.yml" +package_name: # The name of the package in the package.xml + conda: conda-package-name # Maps to a conda package, e.g. from `conda-forge` +package_name2: # The name of the package in the package.xml + conda: [package1, package2] # Maps to a list of conda packages +ros_package: # The name of the package in the package.xml + ros: ros_package # Maps to a RoboStack style package name, e.g. `ros--ros-package` +``` + + +## Default Variants + +On Windows platforms, the backend automatically sets the following default variants: + +- `c_compiler`: `vs2022` - Visual Studio 2022 C compiler +- `cxx_compiler`: `vs2022` - Visual Studio 2022 C++ compiler + +This default is set to align with conda-forge's switch to Visual Studio 2022 and because [mainstream support for Visual Studio 2019 ended in 2024](https://learn.microsoft.com/en-us/lifecycle/products/visual-studio-2019). +The `vs2022` compiler is more widely supported on modern GitHub runners and build environments. + +You can override these defaults by explicitly setting variants using [`[workspace.build-variants]`](https://pixi.sh/latest/reference/pixi_manifest/#build-variants-optional) in your `pixi.toml`: + +```toml +[workspace.build-variants] +c_compiler = ["vs2019"] +cxx_compiler = ["vs2019"] +``` + +## Build Process + +The ROS backend follows this build process: + +1. **Package Detection**: Parses `package.xml` to determine build type (`ament_cmake`, `ament_python`, `catkin`) +2. **Dependency Resolution**: Maps ROS dependencies to conda packages using RoboStack mappings +3. **Environment Setup**: Configures ROS-specific environment variables +4. **Build Execution**: Uses the appropriate build template based on package type. +5. **Installation**: Installs built artifacts to the conda package prefix + +## ROS Package Types + +The backend supports different ROS package build types: + +### ament_cmake (ROS2) +For C++ packages using ament build system: +```xml + + ament_cmake + +``` + +### ament_python (ROS2) +For Python packages using ament build system: +```xml + + ament_python + +``` + +### catkin (ROS1) +For ROS1 packages using catkin build system: +```xml + + catkin + +``` + +## Limitations + +- **Version constraints**: Dependency versions from `package.xml` are currently ignored +- **Conditional dependencies**: Dependencies with conditions are not fully supported yet +- **Target-specific dependencies**: Platform-specific dependencies in `package.xml` need manual handling + +## See Also + +- [ROS Documentation](https://docs.ros.org/) - Official ROS documentation +- [RoboStack](https://robostack.github.io/) - Conda packages for the Robot Operating System +- [ament Build System](https://docs.ros.org/en/rolling/Concepts/Build-System-Development/ament.html) - ROS2 build system +- [catkin Build System](http://wiki.ros.org/catkin) - ROS1 build system diff --git a/docs/build/backends/pixi-build-rust.md b/docs/build/backends/pixi-build-rust.md new file mode 100644 index 0000000000..89d0dc7cb8 --- /dev/null +++ b/docs/build/backends/pixi-build-rust.md @@ -0,0 +1,284 @@ +# pixi-build-rust + +The `pixi-build-rust` backend is designed for building Rust projects using [Cargo](https://doc.rust-lang.org/cargo/), Rust's native build system and package manager. It provides seamless integration with Pixi's package management workflow while maintaining cross-platform compatibility. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + + +## Overview + +This backend automatically generates conda packages from Rust projects by: + +- **Using Cargo**: Leverages Rust's native build system for compilation and installation +- **Cargo.toml Integration**: Automatically reads package metadata (name, version, description, license, etc.) from your `Cargo.toml` file when not specified in `pixi.toml` +- **Cross-platform support**: Works consistently across Linux, macOS, and Windows +- **Optimization support**: Automatically detects and integrates with `sccache` for faster compilation +- **OpenSSL integration**: Handles OpenSSL linking when available in the environment + +## Basic Usage + +To use the Rust backend in your `pixi.toml`, add it to your package's build configuration: + +```toml +[package] +name = "rust_package" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-rust", version = "*" } +channels = ["https://prefix.dev/conda-forge"] + +``` + +### Automatic Metadata Detection + +The backend will automatically read metadata from your `Cargo.toml` file to populate package information **that is not** explicitly defined in your `pixi.toml`. +This includes: + +- **Package name and version**: Automatically used if not specified in `pixi.toml` +- **License**: Extracted from `Cargo.toml` license field +- **Description**: Uses the description from `Cargo.toml` +- **Homepage**: From the homepage field in `Cargo.toml` +- **Repository**: From the repository field in `Cargo.toml` +- **Documentation**: From the documentation field in `Cargo.toml` + +For example, if your `Cargo.toml` contains: + +```toml +[package] +name = "my-rust-tool" +version = "1.0.0" +description = "A useful Rust command-line tool" +license = "MIT" +homepage = "https://github.com/user/my-rust-tool" +repository = "https://github.com/user/my-rust-tool" +``` + +You can create a minimal `pixi.toml`: + +```toml +[package.build] +backend = { name = "pixi-build-rust", version = "*" } +channels = ["https://prefix.dev/conda-forge"] +``` + +The backend will automatically use the metadata from `Cargo.toml` to generate a complete conda package. + +??? warning "It still requires you to specify the `name` and `version`" + We're in the process of making this optional in `pixi`, but for now, you need to specify them explicitly. + This is the tracking issue to fix this in [Pixi](https://github.com/prefix-dev/pixi/issues/4317) + + +### Required Dependencies + +The backend automatically includes the following build tools: + +- `rust` - The Rust compiler and toolchain +- `cargo` - Rust's package manager (included with rust) + +You can add these to your [`build-dependencies`](https://pixi.sh/latest/build/dependency_types/) if you need specific versions: + +```toml +[package.build-dependencies] +rust = "1.70" +``` + +## Configuration Options + +You can customize the Rust backend behavior using the `[package.build.config]` section in your `pixi.toml`. The backend supports the following configuration options: + +### `extra-args` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific arguments completely replace base arguments + +Additional command-line arguments to pass to the `cargo install` command. These arguments are appended to the cargo command that builds and installs your project. + +```toml +[package.build.config] +extra-args = [ + "--features", "serde,tokio", + "--bin", "my-binary" +] +``` + +For target-specific configuration, platform arguments completely replace the base configuration: + +```toml +[package.build.config] +extra-args = ["--release"] + +[package.build.target.linux-64.config] +extra-args = ["--features", "linux-specific", "--target", "x86_64-unknown-linux-gnu"] +# Result for linux-64: ["--features", "linux-specific", "--target", "x86_64-unknown-linux-gnu"] +``` + +### `env` + +- **Type**: `Map` +- **Default**: `{}` +- **Target Merge Behavior**: `Merge` - Platform environment variables override base variables with same name, others are merged + +Environment variables to set during the build process. These variables are available during compilation. + +```toml +[package.build.config] +env = { RUST_LOG = "debug", CARGO_PROFILE_RELEASE_LTO = "true" } +``` + +For target-specific configuration, platform environment variables are merged with base variables: + +```toml +[package.build.config] +env = { RUST_LOG = "info", COMMON_VAR = "base" } + +[package.build.target.linux-64.config] +env = { COMMON_VAR = "linux", CARGO_PROFILE_RELEASE_LTO = "true" } +# Result for linux-64: { RUST_LOG = "info", COMMON_VAR = "linux", CARGO_PROFILE_RELEASE_LTO = "true" } +``` + +### `debug-dir` + +The backend always writes JSON-RPC request/response logs and the generated intermediate recipe to the `debug` subdirectory inside the work directory (for example `/debug`). The deprecated `debug-dir` configuration option is ignored; when present a warning is emitted so you can safely remove the setting. + +### `extra-input-globs` + +- **Type**: `Array` +- **Default**: `[]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific globs completely replace base globs + +Additional glob patterns to include as input files for the build process. These patterns are added to the default input globs that include Rust source files (`**/*.rs`), Cargo configuration files (`Cargo.toml`, `Cargo.lock`), build scripts (`build.rs`), and other build-related files. + +```toml +[package.build.config] +extra-input-globs = [ + "assets/**/*", + "migrations/*.sql", + "*.md" +] +``` + +For target-specific configuration, platform-specific globs completely replace the base: + +```toml +[package.build.config] +extra-input-globs = ["*.txt"] + +[package.build.target.linux-64.config] +extra-input-globs = ["*.txt", "*.so", "linux-configs/**/*"] +# Result for linux-64: ["*.txt", "*.so", "linux-configs/**/*"] +``` + +### `ignore-cargo-manifest` + +- **Type**: `Boolean` +- **Default**: `false` +- **Target Merge Behavior**: `Overwrite` - Platform-specific value overrides base value if set + +When set to `true`, disables automatic metadata extraction from `Cargo.toml`. +The backend will only use metadata explicitly defined in your `pixi.toml` file, ignoring any information from the Cargo manifest. + +```toml +[package.build.config] +ignore-cargo-manifest = true +``` + +This is useful when: + +- You want to explicitly control all package metadata through `pixi.toml` +- The `Cargo.toml` contains metadata that conflicts with your conda package requirements +- When using the `Cargo.toml` results in an error that you cannot resolve. + +For target-specific configuration: + +```toml +[package.build.config] +ignore-cargo-manifest = false + +[package.build.target.linux-64.config] +ignore-cargo-manifest = true +# Result for linux-64: Cargo.toml metadata will be ignored +``` + +### `compilers` + +- **Type**: `Array` +- **Default**: `["rust"]` +- **Target Merge Behavior**: `Overwrite` - Platform-specific compilers completely replace base compilers + +List of compilers to use for the build. The backend automatically generates appropriate compiler dependencies using conda-forge's compiler infrastructure. + +```toml +[package.build.config] +compilers = ["rust", "c", "cxx"] +``` + +For target-specific configuration, platform compilers completely replace the base configuration: + +```toml +[package.build.config] +compilers = ["rust"] + +[package.build.target.linux-64.config] +compilers = ["rust", "c", "cxx"] +# Result for linux-64: ["rust", "c", "cxx"] +``` + +!!! info "Comprehensive Compiler Documentation" + For detailed information about available compilers, platform-specific behavior, and how conda-forge compilers work, see the [Compilers Documentation](../key_concepts/compilers.md). + + +## Build Process + +The Rust backend follows this build process: + +1. **Environment Setup**: Configures OpenSSL paths if available in the environment +2. **Compiler Caching**: Sets up `sccache` as `RUSTC_WRAPPER` if available for faster compilation +3. **Build and Install**: Executes `cargo install` with the following default options: + - `--locked`: Use the exact versions from `Cargo.lock` + - `--root "$PREFIX"`: Install to the conda package prefix + - `--path .`: Install from the current source directory + - `--no-track`: Don't track installation metadata + - `--force`: Force installation even if already installed +4. **Cache Statistics**: Displays `sccache` statistics if available + +## Default Variants + +On Windows platforms, the backend automatically sets the following default variants: + +- `c_compiler`: `vs2022` - Visual Studio 2022 C compiler +- `cxx_compiler`: `vs2022` - Visual Studio 2022 C++ compiler + +These variants are used when you specify compilers in your [`[package.build.config.compilers]`](#compilers) configuration. +Note that setting these default variants does not automatically add compilers to your build - you still need to explicitly configure which compilers to use. + +This default is set to align with conda-forge's switch to Visual Studio 2022 and because [mainstream support for Visual Studio 2019 ended in 2024](https://learn.microsoft.com/en-us/lifecycle/products/visual-studio-2019). +The `vs2022` compiler is more widely supported on modern GitHub runners and build environments. + +You can override these defaults by explicitly setting variants using [`[workspace.build-variants]`](https://pixi.sh/latest/reference/pixi_manifest/#build-variants-optional) in your `pixi.toml`: + +```toml +[workspace.build-variants] +c_compiler = ["vs2019"] +cxx_compiler = ["vs2019"] +``` + +## Limitations + +- Currently, uses `cargo install` which builds in release mode by default +- No support for custom Cargo profiles in the build configuration +- Limited workspace support for multi-crate projects + +## See Also + +- [Cargo Documentation](https://doc.rust-lang.org/cargo/) - Official Cargo documentation +- [The Rust Programming Language](https://doc.rust-lang.org/book/) - Official Rust book +- [sccache](https://github.com/mozilla/sccache) - Shared compilation cache for Rust diff --git a/docs/build/key_concepts/compilers.md b/docs/build/key_concepts/compilers.md new file mode 100644 index 0000000000..05c09203f9 --- /dev/null +++ b/docs/build/key_concepts/compilers.md @@ -0,0 +1,184 @@ +# Compilers in pixi-build + +Some `pixi-build` backends support configurable compiler selection through the `compilers` configuration option. This feature integrates with conda-forge's compiler infrastructure to provide cross-platform, ABI-compatible builds. + +!!! warning + `pixi-build` is a preview feature, and will change until it is stabilized. + This is why we require users to opt in to that feature by adding "pixi-build" to `workspace.preview`. + + ```toml + [workspace] + preview = ["pixi-build"] + ``` + +## How Conda-forge Compilers Work + +Understanding conda-forge's compiler system is essential for effectively using `pixi-build` compiler configuration. + +### Compiler Selection and Platform Resolution + +When you specify `compilers = ["c", "cxx"]` in your `pixi-build` configuration, the backend automatically selects the appropriate platform-specific compiler packages based on your target platform and build variants. +If you are cross-compiling the target platform will be the platform you are compiling for. +Otherwise, it the target platform is your current platform. + +If your target platform is `amd64`, this will result in the following packages to be selected by default. + +| Compiler | Linux | macOS | Windows | +|----------|-------|--------|---------| +| `c` | `gcc_linux-64` | `clang_osx-64` | `vs2019_win-64` | +| `cxx` | `gxx_linux-64` | `clangxx_osx-64` | `vs2019_win-64` | +| `fortran` | `gfortran_linux-64` | `gfortran_osx-64` | `vs2019_win-64` | + +### Build Variants and Compiler Selection + +Compiler selection works through a build variant system. Build variants allow you to specify different versions or types of compilers for your builds, creating a build matrix that can target multiple compiler configurations. + +### Overriding Compilers in Pixi Workspaces + +Pixi workspaces provide powerful mechanisms to override compiler variants through build variant configuration. +This allows users to customize compiler selection without modifying individual package recipes. + +To overwrite the default C compiler you can modify your `pixi.toml` file in the workspace root: + +```toml +# pixi.toml +[workspace.build-variants] +c_compiler = ["clang"] +c_compiler_version = ["11.4"] +``` + +To overwrite the c/cxx compiler specifically for Windows you can use the `workspace.target` section to specify platform-specific compiler variants: + +```toml +# pixi.toml +[workspace.target.win.build-variants] +c_compiler = ["vs2022"] +cxx_compiler = ["vs2022"] +``` + +Or + +```toml +[workspace.target.win.build-variants] +c_compiler = ["vs"] +cxx_compiler = ["vs"] +c_compiler_version = ["2022"] +cxx_compiler_version = ["2022"] +``` + +#### How Compilers Are Selected + +When you specify `compilers = ["c"]` in your pixi-build configuration, the system doesn't directly install a package named "c". Instead, it uses a **variant system** to determine the exact compiler package for your platform. + +1. **Determine which compilers to add** + + If you specified the compiler in the configuration, it will use that. + If the configuration has this entry `compilers = ["c"]`, the C compiler will be requested. + If there's no compiler configuration, the [default](./compilers.md#backend-specific-defaults) of the backend will be used. + +2. **For each compiler, determine the variants to take into account** + + The variant names follow the pattern `{language}_compiler` and `{language}_compiler_version`. + In our example that would lead to `c_compiler` and `c_compiler_version`. + +3. **For each variant combination, create an output** + + Each variant can have multiple values and each combination of these values are outputs that can be selected. + For example with the following example multiple `gcc` versions could be used to build this package. + + ```toml + [workspace.build-variants] + c_compiler = ["gcc"] + c_compiler_version = ["11.4", "14.0"] + ``` + + If `{language}_compiler_version` is not set, then there's no constraint on the compiler version. + + If `{language}_compiler` is not set, the build-backends set default values for certain languages: + + - c: `gcc` on Linux, `clang` on osx and `vs2017` on Windows + - cxx: `gxx` on Linux, `clangxx` on osx and `vs2017` on Windows + - fortran: `gfortran` on Linux, `gfortran` on osx and `vs2017` on Windows + - rust: `rust` + +4. **Request a package for each output** + + For each output a package will be requested as build dependency with the following pattern `{compiler}_{target_platform} {compiler_version}`. + `compiler` and `compiler_version` has been determined in the step before. + `target_platform` is the platform you are compiling for, if you are cross compiling the target platform would differ from your current platform. + + In our example we would create two outputs. + If we build on linux-64, one output would request `gcc_linux-64 11.4` and one would request `gcc_linux-64 14.0` + + + +## Available Compilers + +Which compilers are available depends on the channels you target but through the conda-forge infrastructure the following compilers are generally available across all platforms. +The table below lists the core compilers, specialized compilers, and some backend language-specific compilers that can be configured in `pixi-build`. + +### Core Compilers + +| Compiler | Description | Platforms | +|----------|-------------|-----------| +| `c` | C compiler | Linux (gcc), macOS (clang), Windows (vs2019) | +| `cxx` | C++ compiler | Linux (gxx), macOS (clangxx), Windows (vs2019) | +| `fortran` | Fortran compiler | Linux (gfortran), macOS (gfortran), Windows (vs2019) | +| `rust` | Rust compiler | All platforms | +| `go` | Go compiler | All platforms | + +### Specialized Compilers + +| Compiler | Description | Platforms | +|----------|-------------|-----------| +| `cuda` | NVIDIA CUDA compiler | Linux, Windows, (limited macOS) | + +## Backend-Specific Defaults + +Only certain `pixi-build` backends support the `compilers` configuration option. Each supporting backend has sensible defaults based on the typical requirements for that language ecosystem: + +| Backend | Compiler Support | Default Compilers | Rationale | +|---------|------------------|-------------------|-----------| +| **[pixi-build-cmake](../backends/pixi-build-cmake.md#compilers)** | ✅ **Supported** | `["cxx"]` | Most CMake projects are C++ | +| **[pixi-build-rust](../backends/pixi-build-rust.md#compilers)** | ✅ **Supported** | `["rust"]` | Rust projects need the Rust compiler | +| **[pixi-build-python](../backends/pixi-build-python.md#compilers)** | ✅ **Supported** | `[]` | Pure Python packages typically don't need compilers | +| **[pixi-build-mojo](../backends/pixi-build-mojo.md#compilers)** | ✅ **Supported** | `[]` | `mojo-compiler` must be specified in the `package.*-dependencies` manually. | +| **pixi-build-rattler-build** | ❌ **Not Supported** | N/A | Uses direct `recipe.yaml` - configure compilers directly in recipe | + +!!! info "Adding Compiler Support to Other Backends" + Backend developers can add compiler configuration support by implementing the `compilers` field in their backend configuration and integrating with the shared compiler infrastructure in `pixi-build-backend`. + +## Configuration Examples + +To configure compilers in your `pixi-build` project, you can use the `compilers` configuration option in your `pixi.toml` file. Below are some examples of how to set up compiler configurations for different scenarios. + +!!! note "Backend Support" +Compiler configuration is only available in backends that have specifically implemented this feature. Not all backends support the `compilers` configuration option. Check your backend's documentation to see if it supports compiler configuration. + +### Basic Compiler Configuration + +```toml +# Use default compilers for the backend +[package.build.config] +# No compilers specified - uses backend defaults + +# Override with specific compilers +[package.build.config] +compilers = ["c", "cxx", "fortran"] +``` + +### Platform-Specific Compiler Configuration + +```toml +# Base configuration for most platforms +[package.build.config] +compilers = ["cxx"] + +# Linux needs additional CUDA support +[package.build.target.linux-64.config] +compilers = ["cxx", "cuda"] + +# Windows needs additional C compiler for some dependencies +[package.build.target.win-64.config] +compilers = ["c", "cxx"] +``` diff --git a/mkdocs.yml b/mkdocs.yml index cb3f9fd555..02a42f4a6d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -144,7 +144,16 @@ nav: - Variants: build/variants.md - Advanced Building Using rattler-build: build/advanced_cpp.md - Dependency Types: build/dependency_types.md - - Build Backends: build/backends.md + - Build Backends: + - Overview: build/backends.md + - CMake: build/backends/pixi-build-cmake.md + - Python: build/backends/pixi-build-python.md + - rattler-build: build/backends/pixi-build-rattler-build.md + - ROS: build/backends/pixi-build-ros.md + - Rust: build/backends/pixi-build-rust.md + - Mojo: build/backends/pixi-build-mojo.md + - Key Concepts: + - Compilers: build/key_concepts/compilers.md - Package Source: build/package_source.md - Dev Packages: build/dev.md - Distributing: diff --git a/pixi-build-backends/backends/pixi-build-ros/README.md b/pixi-build-backends/backends/pixi-build-ros/README.md new file mode 100644 index 0000000000..99b27ad7d9 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/README.md @@ -0,0 +1,35 @@ +# ROS pixi backend +The is a PROTOTYPE pixi build backend for ROS packages. + +This can be used from a path in a pixi package. It works if you add the following to your `pixi.toml`: + +```toml +[package] +name = "undefined" # Will be replaced by the value from the `package.xml` +version = "0.0.0" # Will be replaced by the value from the `package.xml` + +[package.build] +backend = { name = "pixi-build-ros", path = "/absolute/path/to/pixi-build-backends/backends/pixi-build-ros" } +configuration = { distro = "jazzy" } +``` + +# Interesting links used in development +- RoboStack stacks: + - https://github.com/RoboStack/ros-noetic + - https://github.com/RoboStack/ros-humble + - https://github.com/RoboStack/ros-jazzy +- RoboStack Vinca: https://github.com/RoboStack/vinca +- How `rosdep` works: https://docs.ros.org/en/humble/Tutorials/Intermediate/Rosdep.html#how-does-rosdep-work + +# Questions +- How to handle the [distribution yaml files](https://github.com/RoboStack/ros-humble/blob/main/robostack.yaml)? + - Should we fetch them from the specific robostack repo? + - How should users add to this on the go? + - Should there be logic to handle the full mapping to `conda-forge`? +- How to deal with `conditions` in a `depend`? e.g.: `catkin`, `hobot-multimedia-dev` +- How do we handle `target` specific dependencies in a `package.xml`? + +# Big TODOs +- [ ] Add the version of the dependencies to the requirements. They are fully ignored at the moment. +- [ ] Proper e2e tests. +- [ ] Add support for Windows. \ No newline at end of file diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.lock b/pixi-build-backends/backends/pixi-build-ros/pixi.lock new file mode 100644 index 0000000000..a8993dfcf9 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.lock @@ -0,0 +1,2898 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_hbe8b877_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-h5922b0e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mypy-1.19.1-py314h5bd0f2a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.1-py314h0f05182_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.10-h4196e79_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: ../../py-pixi-build-backend + build: hb0f4dca_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.1-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/psutil-7.2.1-py312hd41f8a7_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py312h5eb8f6c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.12.12-h91f4b29_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: ../../py-pixi-build-backend + build: he8cfe8b_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.19.1-py312hefc2c51_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.1-py312hb3ab3e3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py312h6ef9ec0_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-h18782d2_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: ../../py-pixi-build-backend + build: h60d57d3_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + win-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/mypy-1.19.1-py314h5a2d7ad_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-win_hba80fca_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda + - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - conda: ../../py-pixi-build-backend + build: h9490d1a_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + lint: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.10-h4196e79_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.1-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + test: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_hbe8b877_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-h5922b0e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mypy-1.19.1-py314h5bd0f2a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.1-py314h0f05182_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: ../../py-pixi-build-backend + build: hb0f4dca_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.1-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/psutil-7.2.1-py312hd41f8a7_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py312h5eb8f6c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.12.12-h91f4b29_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: ../../py-pixi-build-backend + build: he8cfe8b_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.19.1-py312hefc2c51_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.1-py312hb3ab3e3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py312h6ef9ec0_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-h18782d2_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: ../../py-pixi-build-backend + build: h60d57d3_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ + win-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/mypy-1.19.1-py314h5a2d7ad_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-win_hba80fca_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda + - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - conda: ../../py-pixi-build-backend + build: h9490d1a_0 + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: ./ +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + md5: aaa2a381ccc56eac91d63b6c1240312f + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + purls: [] + size: 8191 + timestamp: 1744137672556 +- conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18074 + timestamp: 1733247158254 +- conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + sha256: fe2580dfa3711d7de59ae7e044f7eea6bfdd969cc5c36d814a569225d7f7f243 + md5: 1bc3e6c577a1a206c36456bdeae406de + depends: + - binutils_impl_linux-64 >=2.45,<2.46.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 35432 + timestamp: 1766513140840 +- conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + sha256: 17fbb32191430310d3eb8309f80a8df54f0d66eda9cf84b2ae5113e6d74e24d8 + md5: e410a8f80e22eb6d840e39ac6a34bd0e + depends: + - ld_impl_linux-64 2.45 default_hbd61a6d_105 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 3719982 + timestamp: 1766513109980 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01 + md5: 2921ac0b541bf37c69e66bd6d9a43bca + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 192536 + timestamp: 1757437302703 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 55977 + timestamp: 1757437738856 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + sha256: 4ddcb01be03f85d3db9d881407fb13a673372f1b9fac9c836ea441893390e049 + md5: 84d389c9eee640dda3d26fc5335c67d8 + depends: + - __win + license: ISC + purls: [] + size: 147139 + timestamp: 1767500904211 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + name: catkin-pkg + version: 1.1.0 + sha256: 7f5486b4f5681b5f043316ce10fc638c8d0ba8127146e797c85f4024e4356027 + requires_dist: + - docutils + - packaging + - python-dateutil + - pyparsing + - setuptools + - flake8 ; extra == 'test' + - flake8-blind-except ; extra == 'test' + - flake8-builtins ; extra == 'test' + - flake8-class-newline ; extra == 'test' + - flake8-comprehensions ; extra == 'test' + - flake8-deprecated ; extra == 'test' + - flake8-docstrings ; extra == 'test' + - flake8-import-order ; extra == 'test' + - flake8-quotes ; extra == 'test' + - pytest ; extra == 'test' + requires_python: '>=3.6' +- conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_0.conda + sha256: d9de0207f048c94416e1bf376e4ea59d2b853698049881ec3d57786715f6149e + md5: 820b3523977ea31a102b53962d1ec640 + depends: + - binutils + - clang-21 21.1.8 default_h99862b1_0 + - clang_impl_linux-64 21.1.8 default_hbe8b877_0 + - libgcc-devel_linux-64 + - llvm-openmp >=21.1.8 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 28204 + timestamp: 1767777316508 +- conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_0.conda + sha256: 8067c357a1130a5262d47e60d4067e7cb1d303e83b9f1decdd7e91cd9d896cb4 + md5: db466eaae2374153dbac4b31f073adbc + depends: + - __glibc >=2.17,<3.0.a0 + - compiler-rt21 21.1.8.* + - libclang-cpp21.1 21.1.8 default_h99862b1_0 + - libgcc >=14 + - libllvm21 >=21.1.8,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 832983 + timestamp: 1767777243062 +- conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_hbe8b877_0.conda + sha256: 724f73abc182658a37e8f1b9d3c94bf1a4d32bcb9075ffb23fdb587ce1fa826f + md5: 8bf720b8201f75684a517085adfe6315 + depends: + - binutils_impl_linux-64 + - clang-21 21.1.8 default_h99862b1_0 + - compiler-rt 21.1.8.* + - compiler-rt_linux-64 + - libgcc-devel_linux-64 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 27709 + timestamp: 1767777302725 +- conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + sha256: f64336959429404a763e04c14e04f76dbc325d24a25139e6f93f659cb22c83c3 + md5: 6d3723f76cef4a9fe56da659a35b94f4 + depends: + - compiler-rt21 21.1.8 hb700be7_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 15903 + timestamp: 1765964516247 +- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + sha256: 36b1eea589ba2491a73edc493ff94f3f8bc72c10558d6aa232b735d72526fb16 + md5: 2605a7b74e3e1704a0ee354dfca4698f + depends: + - __glibc >=2.17,<3.0.a0 + - compiler-rt21_linux-64 21.1.8.* + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 113924 + timestamp: 1765964515117 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + sha256: 517732d3d4418ad2e1c98275665e51af3c97156cd08576e446723f01476e14aa + md5: b57b330b71eaad89b12e1b37db8aede8 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 46093098 + timestamp: 1765964436590 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + sha256: 97927b118d1666c81f8d512863e7c6d34a701bf5943d0d3f4b53b3d32eb3ec67 + md5: c6a239a22f4adad76e5c0f0a96697cc9 + depends: + - compiler-rt21_linux-64 21.1.8 hffcefe0_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 15953 + timestamp: 1765964515874 +- conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + noarch: generic + sha256: b88c76a6d6b45378552ccfd9e88b2a073161fe83fd1294c8fa103ffd32f7934a + md5: 99d689ccc1a360639eec979fd7805be9 + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 45767 + timestamp: 1761175217281 +- conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + noarch: generic + sha256: 9e345f306446500956ffb1414b773f5476f497d7a2b5335a59edd2c335209dbb + md5: 30f999d06f347b0116f0434624b6e559 + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + purls: [] + size: 49298 + timestamp: 1765020324943 +- pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + name: distro + version: 1.9.0 + sha256: 7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + name: docutils + version: 0.22.4 + sha256: d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de + requires_python: '>=3.9' +- conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab + depends: + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21333 + timestamp: 1763918099466 +- conda: https://prefix.dev/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda + sha256: 7d6463d0be5092b2ae8f2fad34dc84de83eab8bd44cc0d4be8931881c973c48f + md5: 518e9bbbc3e3486d6a4519192ba690f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12722920 + timestamp: 1766299101259 +- conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.1-hb1525cb_0.conda + sha256: 550c581d08eefe420f9ed14148f1c1d59a3e33de78806a1b8d610d207d06374c + md5: 5eba836ceb0cccf969d9518ca884de2a + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12835377 + timestamp: 1766304007889 +- conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=compressed-mapping + size: 13387 + timestamp: 1760831448842 +- conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1278712 + timestamp: 1765578681495 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca + md5: 3ec0aa5037d39b06554109a01e6fb0c6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 730831 + timestamp: 1766513089214 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + sha256: 12e7341b89e9ea319a3b4de03d02cd988fa02b8a678f4e46779515009b5e475c + md5: 849c4cbbf8dd1d71e66c13afed1d2f12 + depends: + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-aarch64 2.45 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 876257 + timestamp: 1766513180236 +- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_0.conda + sha256: e1db2f22479bff125d2e1b4241a91f3d039f240ace78285ffd6a32c9b3ceba13 + md5: e55b5f69f6b53ec33cdaac390131f77a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm21 >=21.1.8,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 21065215 + timestamp: 1767777165976 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f + md5: 8b09ae86839581147ef2e5c5e229d164 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 76643 + timestamp: 1763549731408 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + sha256: cc2581a78315418cc2e0bb2a273d37363203e79cefe78ba6d282fed546262239 + md5: b414e36fbb7ca122030276c75fa9c34a + depends: + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 76201 + timestamp: 1763549910086 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 + md5: b79875dbb5b1db9a4a22a4520f918e1a + depends: + - __osx >=11.0 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 67800 + timestamp: 1763549994166 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e + md5: 8c9e4f1a0e688eef2e95711178061a0f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 70137 + timestamp: 1763550049107 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 57821 + timestamp: 1760295480630 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + sha256: 6c3332e78a975e092e54f87771611db81dcb5515a3847a3641021621de76caea + md5: 0c5ad486dcfb188885e3cf8ba209b97b + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 55586 + timestamp: 1760295405021 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40251 + timestamp: 1760295839166 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 + md5: ba4ad812d2afc22b9a34ce8327a0930f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 44866 + timestamp: 1760295760649 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 + md5: 6d0363467e6ed84f11435eb309f2ff06 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1042798 + timestamp: 1765256792743 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + sha256: 44bfc6fe16236babb271e0c693fe7fd978f336542e23c9c30e700483796ed30b + md5: cf9cd6739a3b694dcf551d898e112331 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 h8acb6b2_16 + - libgcc-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 620637 + timestamp: 1765256938043 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda + sha256: 48d7d8dded34100d9065d1c0df86a11ab2cd8ddfd1590512b304527ed25b6d93 + md5: e67832fdbf2382757205bb4b38800643 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3094906 + timestamp: 1765256682321 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + sha256: 22d7e63a00c880bd14fbbc514ec6f553b9325d705f08582e9076c7e73c93a2e1 + md5: 3e54a6d0f2ff0172903c0acfda9efc0e + depends: + - libgcc 15.2.0 h8acb6b2_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27356 + timestamp: 1765256948637 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 + md5: 26c46f90d0e727e95c6c9498a33a09f3 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603284 + timestamp: 1765256703881 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + sha256: 0a9d77c920db691eb42b78c734d70c5a1d00b3110c0867cfff18e9dd69bc3c29 + md5: 4d2f224e8186e7881d53e3aead912f6c + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 587924 + timestamp: 1765256821307 +- conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda + sha256: b9e6340da35245d5f3b7b044b4070b4980809d340bddf16c942a97a83f146aa4 + md5: 4fe840c6d6b3719b4231ed89d389bb17 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2449346 + timestamp: 1765089858592 +- conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 790176 + timestamp: 1754908768807 +- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + sha256: 91bb4f5be1601b40b4995911d785e29387970f0b3c80f33f7f9028f95335399f + md5: 1a2708a460884d6861425b7f9a7bef99 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 44333366 + timestamp: 1765959132513 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + sha256: 498ea4b29155df69d7f20990a7028d75d91dbea24d04b2eb8a3d6ef328806849 + md5: 7d362346a479256857ab338588190da0 + depends: + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 125103 + timestamp: 1749232230009 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + sha256: ef8697f934c80b347bf9d7ed45650928079e303bad01bd064995b0e3166d6e7a + md5: 78cfed3f76d6f3f279736789d319af76 + depends: + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 114064 + timestamp: 1748393729243 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + sha256: c0dc4d84198e3eef1f37321299e48e2754ca83fd12e6284754e3cb231357c3a5 + md5: d5d58b2dc3e57073fe22303f5fed4db7 + depends: + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34831 + timestamp: 1750274211 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + sha256: d614540c55f22ad555633f75e174089018ddfc65c49f447f7bbdbc3c3013bec1 + md5: b1f35e70f047918b49fb4b181e40300e + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 943451 + timestamp: 1766319676469 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda + sha256: f80893874d5ba5ac754b2d65ec392c46841bfe57bd89499aa0e1965c720babbd + md5: 9fd37e702b4e7c85462fe79baf13974d + depends: + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 943924 + timestamp: 1766319577347 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + sha256: f2c3cbf2ca7d697098964a748fbf19d6e4adcefa23844ec49f0166f1d36af83c + md5: 8c3951797658e10b610929c3e57e9ad9 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 905861 + timestamp: 1766319901587 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + sha256: d6d86715a1afe11f626b7509935e9d2e14a4946632c0ac474526e20fc6c55f99 + md5: be65be5f758709fc01b01626152e96b0 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1292859 + timestamp: 1766319616777 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 + md5: 68f68355000ec3f1d6f26ea13e8f525f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5856456 + timestamp: 1765256838573 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + sha256: 4db11a903707068ae37aa6909511c68e9af6a2e97890d1b73b0a8d87cb74aba9 + md5: 52d9df8055af3f1665ba471cce77da48 + depends: + - libgcc 15.2.0 h8acb6b2_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5541149 + timestamp: 1765256980783 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 + md5: cf2861212053d05f27ec49c3784ff8bb + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43453 + timestamp: 1766271546875 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + sha256: 047be059033c394bd32ae5de66ce389824352120b3a7c0eff980195f7ed80357 + md5: 417955234eccd8f252b86a265ccdab7f + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 hca6bf5a_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 45402 + timestamp: 1766327161688 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + sha256: 8331284bf9ae641b70cdc0e5866502dd80055fc3b9350979c74bb1d192e8e09e + md5: 3fdd8d99683da9fe279c2f4cecd1e048 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + purls: [] + size: 555747 + timestamp: 1766327145986 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + sha256: a5a7ad16eecbe35cac63e529ea9c261bef4ccdd68cb1db247409f04529423989 + md5: f8640b709b37dc7758ddce45ea18d000 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - intel-openmp <0.0a0 + - openmp 21.1.8|21.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 6127279 + timestamp: 1765964409311 +- conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda + sha256: c3ea2cc85167c5c14145d59c7b861818b9fa5461ef24f8bc1f277d5d3997b0e6 + md5: dfa4c299d528a457ae3b47ba7ff5f1fd + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 103866 + timestamp: 1752824520127 +- conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-h5922b0e_1.conda + sha256: 88fbd8365b544743697847e2439a2e4379d3e5362a03a4f79e18f04d86a40e6e + md5: 6285e85a0250fa6e9cc608edb2191ada + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - mimalloc >=3.1.5,<3.1.6.0a0 + - openssl >=3.5.4,<4.0a0 + - tbb >=2022.3.0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 3087387 + timestamp: 1764777133970 +- conda: https://prefix.dev/conda-forge/linux-64/mypy-1.19.1-py314h5bd0f2a_0.conda + sha256: 4e607095b92cac2ec6dbb8de348d8e006408291c9c2805926f01e4a30e94edbb + md5: 0490f2b08d179719201fdb9514d67157 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.14,<3.15.0a0 + - python-librt >=0.6.2 + - python_abi 3.14.* *_cp314 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 18632958 + timestamp: 1765795548407 +- conda: https://prefix.dev/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda + sha256: 090e71c8c15e44427fafedee771ddd41458ac4693dd7b92199c400d9500050ce + md5: ffb1dec0b34372b6f0a9be000498b3ef + depends: + - libgcc >=14 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-librt >=0.6.2 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 18170658 + timestamp: 1765796391426 +- conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.19.1-py312hefc2c51_0.conda + sha256: 6d3e7afb2c0d07c1cc18394749b33466103599024691ccd01a413b33e3ca7058 + md5: 066e48f36dc3c70fa25b3228d781b57c + depends: + - __osx >=11.0 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-librt >=0.6.2 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 11025065 + timestamp: 1765796035384 +- conda: https://prefix.dev/conda-forge/win-64/mypy-1.19.1-py314h5a2d7ad_0.conda + sha256: 59c5f9046ad3ab9a449dee682392799d9589c12e470f0c6fed7f2aaa9b8e8ca2 + md5: 4ca21331a3962c4fcf658d6d47df4c0b + depends: + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.14,<3.15.0a0 + - python-librt >=0.6.2 + - python_abi 3.14.* *_cp314 + - typing_extensions >=4.6.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 9114684 + timestamp: 1765795714379 +- conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 11766 + timestamp: 1745776666688 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3165399 + timestamp: 1762839186699 +- conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + sha256: 8dd3b4c31fe176a3e51c5729b2c7f4c836a2ce3bd5c82082dc2a503ba9ee0af3 + md5: 7624c6e01aecba942e9115e0f5a2af9d + depends: + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3705625 + timestamp: 1762841024958 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3108371 + timestamp: 1762839712322 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 + md5: 84f8fb4afd1157f59098f618cd2437e4 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9440812 + timestamp: 1762841722179 +- conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 62477 + timestamp: 1745345660407 +- conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + sha256: 2f1caf273c7816fcff6e8438138c29d08264f8371dc0e23f86e993ccc7e978dc + md5: 5a6bde274af5252392b446ead19047d0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 136130 + timestamp: 1745559387060 +- conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + sha256: c2d058ffe4f8caae71793a6e6f52bcbd0be660f11958ed2349b6476287117714 + md5: 9873e55afc3f873196da6ac80382918b + depends: + - python >=3.10 + license: MPL-2.0 + purls: + - pkg:pypi/pathspec?source=compressed-mapping + size: 53017 + timestamp: 1767759872637 +- conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda + sha256: 9e8451c57ff19875c8b8b878b781e6e339890e1b2879bf276c673acab8da6194 + license: BSD-3-Clause + size: 1971 + timestamp: 1767791335095 +- pypi: ./ + name: pixi-build-ros + version: 0.3.2 + sha256: 2baf955d1db02bfbf21b4a14fd11b7b76081ebbe9d1420653740cf937e01617c + requires_dist: + - rosdistro + - catkin-pkg + - pytest + - toml + - pyyaml + - pydantic + - py-rattler +- conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda + sha256: c84a62f421f3ba388df06df7f414d7b568ad4bc3c33a7799b3405f213a3b1ff5 + md5: 07b709969aa53039501c5960e45794b8 + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7034 + timestamp: 1763572165675 +- conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-win_hba80fca_0.conda + sha256: c0399f79f0656df7e265ae53630e08cad2d2203a2f39181ff1a68b3b39466d0d + md5: 6dea6b7cca5948b0cfd6eeb5ddecce67 + depends: + - __win + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7042 + timestamp: 1763572121812 +- conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=compressed-mapping + size: 25877 + timestamp: 1764896838868 +- conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.1-py314h0f05182_0.conda + sha256: 324455a702ef721290de6e51d9af4f7ca057546d6398bbc6e88454db17cdaf6b + md5: 28af9719e28f0054e9aee68153899293 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 228170 + timestamp: 1767012382363 +- conda: https://prefix.dev/conda-forge/linux-aarch64/psutil-7.2.1-py312hd41f8a7_0.conda + sha256: 49a432310a54d2119cbf4f1a2c02874498c53ed2eb3d9a19dc66748fe3e252b9 + md5: f402b3fedc8ed86db85102808bc71972 + depends: + - python + - python 3.12.* *_cpython + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 227219 + timestamp: 1767012387664 +- conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.1-py312hb3ab3e3_0.conda + sha256: bf67f8107e06f9414c387fc149bbae58b596e4620fcf2643c3efd6b07e0cce4d + md5: 3cc4a5c8e49c40441f03dab773f2bc28 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 235288 + timestamp: 1767012551069 +- conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda + sha256: d776855d47e14d8b1521a3949c1d1dc3848c690170253ecc439264e219859e22 + md5: 65df3730bedf9c24f54414c8316f8e72 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=compressed-mapping + size: 245991 + timestamp: 1767012412984 +- conda: ../../py-pixi-build-backend + name: py-pixi-build-backend + version: 0.4.0 + build: h60d57d3_0 + subdir: osx-arm64 + variants: + target_platform: osx-arm64 + depends: + - typing-extensions + - pixi-build-api-version >=4,<5 + - python >=3.8 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause +- conda: ../../py-pixi-build-backend + name: py-pixi-build-backend + version: 0.4.0 + build: h9490d1a_0 + subdir: win-64 + variants: + target_platform: win-64 + depends: + - typing-extensions + - pixi-build-api-version >=4,<5 + - python >=3.8 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause +- conda: ../../py-pixi-build-backend + name: py-pixi-build-backend + version: 0.4.0 + build: hb0f4dca_0 + subdir: linux-64 + variants: + target_platform: linux-64 + depends: + - typing-extensions + - pixi-build-api-version >=4,<5 + - python >=3.8 + - python_abi 3.14.* *_cp314 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause +- conda: ../../py-pixi-build-backend + name: py-pixi-build-backend + version: 0.4.0 + build: he8cfe8b_0 + subdir: linux-aarch64 + variants: + target_platform: linux-aarch64 + depends: + - typing-extensions + - pixi-build-api-version >=4,<5 + - python >=3.8 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause +- conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda + noarch: python + sha256: 8ced54c9247b69d9f0da92a7effd06633ab7531197ae7a2a25149aceee606ecd + md5: e626ddd4e881ea86f066cdda1c6c7772 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.4,<4.0a0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/py-rattler?source=hash-mapping + size: 10200820 + timestamp: 1765481312205 +- conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda + noarch: python + sha256: 5d8f8cc9d84eb740e145cb0855670f8670a5565a0b83983b8d2cc90fbc3ab4bf + md5: dc912cf137f45f174ea4ea27f958f92a + depends: + - python + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.10 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/py-rattler?source=hash-mapping + size: 10323339 + timestamp: 1765481317936 +- conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda + noarch: python + sha256: aa18db1118a602164d7dd0c799f76b996f356af19021e3c9b79eb0ec9395341e + md5: 77ac0648ed29eccbb1b6f202a4044d43 + depends: + - python + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/py-rattler?source=hash-mapping + size: 8624878 + timestamp: 1765481428521 +- conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda + noarch: python + sha256: 7d101f3ce0704eba438303f7142a6e7dcccdb852766cbb1822f3b0ac41871b38 + md5: b58816942c896e6581be801630cc876b + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/py-rattler?source=hash-mapping + size: 10119462 + timestamp: 1765481330248 +- conda: https://prefix.dev/conda-forge/noarch/py_rattler-0.20.0-h88c55c7_0.conda + sha256: ef50cf98e108a91806a63b0850e0bd9a0e132caa34ee799461e7464201fe40dd + md5: 66fb56d893ca5782c70b1da861d8400d + depends: + - py-rattler >=0.20.0,<0.20.1.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4696 + timestamp: 1765481312208 +- conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d + md5: c3946ed24acdb28db1b5d63321dbca7d + depends: + - typing-inspection >=0.4.2 + - typing_extensions >=4.14.1 + - python >=3.10 + - typing-extensions >=4.6.1 + - annotated-types >=0.6.0 + - pydantic-core ==2.41.5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic?source=hash-mapping + size: 340482 + timestamp: 1764434463101 +- conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f + md5: 432b0716a1dfac69b86aa38fdd59b7e6 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1943088 + timestamp: 1762988995556 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py312h5eb8f6c_1.conda + sha256: 0fa7865617f5f8df979c5976817016a563f5c1b9009fc318cd651efb7acac768 + md5: 6977d372f3465d6546492bc33ce2fa75 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - python 3.12.* *_cpython + - libgcc >=14 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1820020 + timestamp: 1762989058164 +- conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py312h6ef9ec0_1.conda + sha256: 048da0a49d644dba126905a1abcea0aee75efe88b5d621b9007b569dd753cfbc + md5: 88a76b4c912b6127d64298e3d8db980c + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1769018 + timestamp: 1762989029329 +- conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + sha256: 51773479d973c0b0b96cf581cb8444061eaac9b6c28f1cc6d33afc39201d5f13 + md5: c1f37669ed289c378f3193b35c9df2a7 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1971476 + timestamp: 1762989023313 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 889287 + timestamp: 1750615908735 +- pypi: https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl + name: pyparsing + version: 3.3.1 + sha256: 023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82 + requires_dist: + - railroad-diagrams ; extra == 'diagrams' + - jinja2 ; extra == 'diagrams' + requires_python: '>=3.9' +- conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 + md5: da0c42269086f5170e2b296878ec13a6 + depends: + - pygments >=2.7.2 + - python >=3.10 + - iniconfig >=1 + - packaging >=20 + - pluggy >=1.5,<2 + - tomli >=1 + - colorama >=0.4 + - exceptiongroup >=1 + - python + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 294852 + timestamp: 1762354779909 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + build_number: 100 + sha256: a120fb2da4e4d51dd32918c149b04a08815fd2bd52099dad1334647984bb07f1 + md5: 1cef1236a05c3a98f68c33ae9425f656 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 36790521 + timestamp: 1765021515427 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.12.12-h91f4b29_1_cpython.conda + build_number: 1 + sha256: a635a01f696d4c62b739073eb241e83a35894f1aabb0f590957a05a23aa3ad28 + md5: 823e8543dd3abc98b2982fea10f3daea + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13683458 + timestamp: 1761175192478 +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + build_number: 100 + sha256: 41adf6ee7a953ef4f35551a4a910a196b0a75e1ded458df5e73ef321863cb3f2 + md5: 432459e6961a5bc4cfe7cd080aee721a + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 37217543 + timestamp: 1765020325291 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-h18782d2_1_cpython.conda + build_number: 1 + sha256: 626da9bb78459ce541407327d1e22ee673fd74e9103f1a0e0f4e3967ad0a23a7 + md5: 0322f2ddca2cafbf34ef3ddbea100f73 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 12062421 + timestamp: 1761176476561 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + build_number: 100 + sha256: 1a93782e90b53e04c2b1a50a0f8bf0887936649d19dba6a05b05c4b44dae96b7 + md5: 14f15ab0d31a2ee5635aa56e77132594 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 13575758 + timestamp: 1765021280625 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + build_number: 100 + sha256: 6857d7c97cc71fe9ba298dcb1d3b66cc7df425132ab801babd655faa3df48f32 + md5: c3c73414d5ae3f543c531c978d9cc8b8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 16833248 + timestamp: 1765020224759 + python_site_packages_path: Lib/site-packages +- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + name: python-dateutil + version: 2.9.0.post0 + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + requires_dist: + - six>=1.5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + sha256: 59f17182813f8b23709b7d4cfda82c33b72dd007cb729efa0033c609fbd92122 + md5: c20172b4c59fbe288fa50cdc1b693d73 + depends: + - cpython 3.12.12.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 45888 + timestamp: 1761175248278 +- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + sha256: 8203dc90a5cb6687f5bfcf332eeaf494ec95d24ed13fca3c82ef840f0bb92a5d + md5: 0064ab66736c4814864e808169dc7497 + depends: + - cpython 3.14.2.* + - python_abi * *_cp314 + license: Python-2.0 + purls: [] + size: 49287 + timestamp: 1765020424843 +- conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda + sha256: 82a8ebcc427905cacbd47dca0a801720a8dfb4f1a432cee58c6ce46b464a9597 + md5: bf338174b5eb98d714c97648235f4cdc + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=hash-mapping + size: 63125 + timestamp: 1767361382395 +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda + sha256: ef5a51fd4623981be90e71a8ab54ef1a1c6447b02d8cee09b6cbab3ce0620d12 + md5: 8411eb35ae46ae2f399198bc6b631653 + depends: + - python + - python 3.12.* *_cpython + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=hash-mapping + size: 68666 + timestamp: 1767361485664 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda + sha256: ed0cef61a5911751b32670648f3dcc243dab299f847f3d5b232f4b88fef927b5 + md5: 6041943d4467046aff71db1d7f531795 + depends: + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=hash-mapping + size: 61695 + timestamp: 1767361432723 +- conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda + sha256: e75c66cf333191c1696a83acfb5233d26c10b5589299b25ffe7e0d57eb3bfdea + md5: 5aa38e3a7306797fbf6c64a00d247c75 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=hash-mapping + size: 46721 + timestamp: 1767361439570 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + build_number: 8 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6958 + timestamp: 1752805918820 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6989 + timestamp: 1752805904792 +- conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + sha256: a36ea7841495798a66007a3bd27080953f7955cd1af475cae9db8679f2a97b85 + md5: 76d8bb670990f40536e4158b14fb8377 + depends: + - python >=3.10 + - tokenize-rt >=6.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyupgrade?source=hash-mapping + size: 46652 + timestamp: 1763517885466 +- pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + name: pyyaml + version: 6.0.3 + sha256: 4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl + name: pyyaml + version: 6.0.3 + sha256: fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: pyyaml + version: 6.0.3 + sha256: 9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 + requires_python: '>=3.8' +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 + md5: 3d49cad61f829f4f0e0611547a9cda12 + depends: + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 357597 + timestamp: 1765815673644 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + name: rosdistro + version: 1.0.1 + sha256: 587da10e1bc9f1ff8dc026ac9361ac1a1d2a79a434dfcb73175e45110880651c + requires_dist: + - pyyaml + - setuptools + - catkin-pkg + - rospkg + - pytest ; extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + name: rospkg + version: 1.6.1 + sha256: 3a09b0ab5c1753536e4a171b480889c6afd65a6573a327ead3e2d3bb2c6f3fcd + requires_dist: + - catkin-pkg + - pyyaml + - distro>=1.4.0 ; python_full_version >= '3.8' + - pytest ; extra == 'test' + requires_python: '>=3.6' +- conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.10-h4196e79_0.conda + noarch: python + sha256: 997b45ce89554f677e4a30cd1d64565949be9d25c806727c3d844fee0d55d7d2 + md5: ddecdee0806589993d96a950ad51b927 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 11472103 + timestamp: 1766094973645 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda + noarch: python + sha256: 4aa64574aba358480d03e86846e6a8444499e580b87b280f5d36ce1940e6e3f4 + md5: cd19c0de4d78564fc9e4758fa2280606 + depends: + - python + - libgcc >=14 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 10995544 + timestamp: 1766094986744 +- conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda + noarch: python + sha256: dcae2c2d8c3a07782c0ce900f44488e2c2a2acd3720850181165a4e0034219fc + md5: d506e661dcc8c2053b2661edb0d3c57c + depends: + - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 10468468 + timestamp: 1766095111371 +- conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda + noarch: python + sha256: 2ca5b7a6ab0a4cddec16f390e1c2d89b5cacd1780963745e463f1bb2e8ab4893 + md5: 987a8290e4bfd9e42e3c58be4481929c + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 11908812 + timestamp: 1766095035171 +- pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + name: setuptools + version: 80.9.0 + sha256: 062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922 + requires_dist: + - pytest>=6,!=8.1.* ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel>=0.44.0 ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=24.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.7.2 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test>=5.5 ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - towncrier<24.7 ; extra == 'doc' + - packaging>=24.2 ; extra == 'core' + - more-itertools>=8.8 ; extra == 'core' + - jaraco-text>=3.7 ; extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - wheel>=0.43.0 ; extra == 'core' + - platformdirs>=4.2.2 ; extra == 'core' + - jaraco-functools>=4 ; extra == 'core' + - more-itertools ; extra == 'core' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - ruff>=0.8.0 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + - mypy==1.14.* ; extra == 'type' + - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' + - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + name: six + version: 1.17.0 + sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda + sha256: 3ff00f26d7920901ba528190088048b322791239d443009edc5aebb7060e4654 + md5: 805fe17ec5dec0d30e6c8450ac01a273 + depends: + - pytest >=8.0.0,<9.0.0 + - python >=3.10,<4.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/syrupy?source=hash-mapping + size: 44936 + timestamp: 1759112392766 +- conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + size: 24008591 + timestamp: 1765578833462 +- conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda + sha256: 2e3238234ae094d5a5f7c559410ea8875351b6bac0d9d0e576bf64b732b8029e + md5: e3259be3341da4bc06c5b7a78c8bf1bd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libhwloc >=2.12.1,<2.12.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 181262 + timestamp: 1762509955687 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3284905 + timestamp: 1763054914403 +- conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + sha256: 154e73f6269f92ad5257aa2039278b083998fd19d371e150f307483fb93c07ae + md5: 631db4799bc2bfe4daccf80bb3cbc433 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3333495 + timestamp: 1763059192223 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125484 + timestamp: 1763055028377 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790 + md5: 7cb36e506a7dba4817970f8adb6396f9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3472313 + timestamp: 1763055164278 +- conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + sha256: b8da0c728e1313e116a06084ea770c6ad752b9cd086d52b20fcd464bdce52e4b + md5: 0a42378794e0425eb5defc9d63e60607 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tokenize-rt?source=hash-mapping + size: 12383 + timestamp: 1748092106333 +- pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + name: toml + version: 0.10.2 + sha256: 806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b + requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff + md5: d2732eb636c264dc9aa4cbee404b1a53 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 20973 + timestamp: 1760014679845 +- conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + sha256: ba565f80b5dc5d88f34587b391f21807efd54099516f11beae5cb29a7925fd3d + md5: 0fcb42ddc8e8ba6f906274108e6d891d + depends: + - python >=3.10 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/types-pyyaml?source=hash-mapping + size: 22060 + timestamp: 1762942278334 +- conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: edd329d7d3a4ab45dcf905899a7a6115 + depends: + - typing_extensions ==4.15.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 91383 + timestamp: 1756220668932 +- conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 + md5: a0a4a3035667fc34f29bfbd5c190baa6 + depends: + - python >=3.10 + - typing_extensions >=4.12.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typing-inspection?source=hash-mapping + size: 18923 + timestamp: 1764158430324 +- conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 51692 + timestamp: 1756220668932 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 694692 + timestamp: 1756385147981 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19356 + timestamp: 1767320221521 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_34 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 683233 + timestamp: 1767320219644 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 115235 + timestamp: 1767320173250 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 +- conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 + md5: c3655f82dcea2aa179b291e7099c1fcc + depends: + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 614429 + timestamp: 1764777145593 +- conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 433413 + timestamp: 1764777166076 +- conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 388453 + timestamp: 1764777142545 diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml new file mode 100644 index 0000000000..df6eff1a2e --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -0,0 +1,84 @@ +[workspace] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +platforms = ["osx-arm64", "win-64", "linux-64", "linux-aarch64"] +preview = ["pixi-build"] + +[activation.env] +CARGO_TARGET_DIR = "target/pixi" + +[tasks] +lint.depends-on = ["fmt", "lint-ruff", "lint-mypy"] + +[target.linux-64.dependencies] +clang = ">=21.1,<21.2" +mold = ">=2.33.0,<3.0" +patchelf = "==0.18.0" + +[target.linux-64.activation] +scripts = ["../../scripts/activate.sh"] + +[dependencies] +pydantic = ">=2.8.2,<3" +py_rattler = ">=0.20,<0.21" +py-pixi-build-backend = "*" + +[pypi-dependencies] +pixi-build-ros = { path = ".", editable = true } + +[environments] +default = { features = ["test", "lint"], solve-group = "default" } +test = { features = ["test"], solve-group = "default" } +lint = { features = ["lint"], no-default-feature = true } + +[feature.test.tasks] +test = "pytest tests" +lint-mypy = "mypy" + +[feature.test.dependencies] +pixi-pycharm = ">=0.0.8,<0.1" +pytest = "*" +mypy = ">=1.18.2,<2" +syrupy = ">=5,<6" +types-pyyaml = "*" +# You can skip this as it's a long build, uncomment this when developing only in this package +#py-pixi-build-backend = "*" +py-pixi-build-backend = { path = "../../py-pixi-build-backend" } + +[feature.lint.dependencies] +ruff = "*" +pyupgrade = ">=3.20.0,<4" + +[feature.lint.tasks] +lint-ruff = "ruff check ." +fmt-pyupgrade = "pyupgrade --py310-plus **/**/*.py" +fmt-ruff = "ruff format src tests" +fmt = { depends-on = ["fmt-pyupgrade", "fmt-ruff"] } + +## Package section +[package.build.backend] +name = "pixi-build-python" +version = "*" + +[package.build.config] +extra-input-globs = ["!tests/**"] + +[package.host-dependencies] +hatchling = "*" +python = ">=3.10" + +[package.run-dependencies] +python = ">=3.10" +rosdistro = "*" +pydantic = ">=2.8.2,<3" +py_rattler = ">=0.15.0,<0.16" +catkin_pkg = "*" +pyyaml = "*" +pixi-build-api-version = ">=4,<5" +# should be added to `py-pixi-build-backend` +typing-extensions = "*" +# this depends has to match the test dependency, so switch comments if needed +#py-pixi-build-backend = "*" +py-pixi-build-backend = { path = "../../py-pixi-build-backend" } diff --git a/pixi-build-backends/backends/pixi-build-ros/pyproject.toml b/pixi-build-backends/backends/pixi-build-ros/pyproject.toml new file mode 100644 index 0000000000..3037796644 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/pyproject.toml @@ -0,0 +1,48 @@ +[project] +dependencies = [ + "rosdistro", + "catkin_pkg", + "pytest", + "toml", + "pyyaml", + "pydantic", + "py_rattler", + # TODO: publish to pypi + # "py-pixi-build-backend", +] +name = "pixi-build-ros" +version = "0.3.3" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[project.scripts] +pixi-build-ros = "pixi_build_ros.main:main" + +[tool.hatch.build.targets.wheel] +packages = ["src/pixi_build_ros"] + +[tool.hatch.build.targets.wheel.shared-data] +"templates" = "site-packages/pixi_build_ros/templates" +"robostack.yaml" = "site-packages/pixi_build_ros/robostack.yaml" + +[tool.hatch.build.targets.editable] +packages = ["src/pixi_build_ros"] + +[tool.hatch.build.targets.editable.shared-data] +"templates" = "site-packages/pixi_build_ros/templates" +"robostack.yaml" = "site-packages/pixi_build_ros/robostack.yaml" + +[tool.ruff] +line-length = 120 +target-version = "py310" +fix = true + +[tool.mypy] +python_version = "3.10" +files = ["src/pixi_build_ros"] +strict = true +ignore_missing_imports = true +enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] +disable_error_code = ["empty-body", "no-untyped-call"] diff --git a/pixi-build-backends/backends/pixi-build-ros/robostack.yaml b/pixi-build-backends/backends/pixi-build-ros/robostack.yaml new file mode 100644 index 0000000000..4884d346c5 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/robostack.yaml @@ -0,0 +1,1049 @@ +# This file is part of the RoboStack noetic project. for testing purposes. +acl: + robostack: + linux: [libacl] + osx: [] + win64: [] +alsa-oss: + robostack: [alsa-lib] +apr: + robostack: [apr] +armadillo: + robostack: [armadillo] +asio: + robostack: [asio] +assimp: + robostack: [assimp] +assimp-dev: + robostack: [assimp] +avahi-daemon: + robostack: [python-avahi] +benchmark: + robostack: [benchmark] +binutils: + robostack: + linux: [binutils] + osx: [] + win64: [] +bison: + robostack: [bison] +boost: + robostack: [libboost-devel, libboost-python-devel] +bullet: + robostack: [bullet] +bzip2: + robostack: [bzip2] +cartographer: + robostack: [cartographer] +ca-certificates: + robostack: [ca-certificates] +clang-format: + robostack: [clang-format] +clang-tidy: + robostack: [clang-tools] +cmake: + robostack: [cmake] +coinor-libcbc-dev: + robostack: [coin-or-cbc] +coinor-libcgl-dev: + robostack: [coin-or-cgl] +coinor-libclp-dev: + robostack: [coin-or-clp] +coinor-libcoinutils-dev: + robostack: [coin-or-utils] +coinor-libipopt-dev: + robostack: [ipopt] +collada-dom: + robostack: [collada-dom] +cppcheck: + robostack: [cppcheck] +cppunit: + robostack: + linux: [cppunit] + osx: [cppunit] + win64: [] +cppzmq: + robostack: [cppzmq] +curl: + robostack: [libcurl] +cython: + robostack: [cython] +doxygen: + robostack: [doxygen, graphviz] +draco: + robostack: [draco] +eigen: + robostack: [eigen] +emacs: + # Wait until https://github.com/robostack-forge/gtk3-feedstock/pull/74 is resolved + # and emacs is rebuilt for harfbuzz=10 + # robostack: [emacs] + robostack: [] +festival: + robostack: + linux: [festival, festvox-kallpc16k] + osx: [] + win64: [] +# This is not available on Windows, and it is only +# required by libcurl_vendor (see https://index.ros.org/d/file/) +# but it is not actually used if libcurl is not compiled, +# so we can just ignore it on Windows. +file: + robostack: + linux: [file] + osx: [file] + win64: [] +ffmpeg: + robostack: [ffmpeg] +ffmpeg-dev: + robostack: [ffmpeg] +flac: + robostack: [libflac] +flex: + robostack: [flex] +fmt: + robostack: [fmt] +g++-static: + robostack: [] +gawk: + robostack: [gawk] +gazebo: + robostack: [gazebo, libprotobuf, libabseil] +gazebo11: + robostack: [gazebo, libprotobuf, libabseil] +gazebo9: + robostack: [gazebo, libprotobuf, libabseil] +geographiclib: + robostack: [geographiclib-cpp] +geographiclib-tools: + robostack: [geographiclib-cpp] +git: + robostack: [git] +glslang-dev: + robostack: [glslang] +glut: + robostack: + linux: [freeglut] + osx: [] + win64: [freeglut] +google-mock: + robostack: [gmock] +graphicsmagick: + robostack: [graphicsmagick] +graphviz: + robostack: [graphviz] +gstreamer1.0: + robostack: [gstreamer] +gstreamer1.0-alsa: + robostack: [gstreamer] +gstreamer1.0-plugins-base: + robostack: [gst-plugins-base] +gstreamer1.0-plugins-good: + robostack: [gst-plugins-good] +# only sound-play requests it, but doesn't actually need it +# do not pull it in as migrations lack behind +gstreamer1.0-plugins-ugly: + robostack: [] +gtest: + robostack: [gtest] +gtk2: + robostack: [gtk2] +gtk3: + robostack: [ + libglib, + glib, + gtk3, + harfbuzz, + libxcb, + pthread-stubs, + xorg-libxau, + xorg-libxi, + xorg-libxrandr, + xorg-libxcursor, + xorg-libxtst, + xorg-libxcomposite, + xorg-libxdamage, + xorg-libxinerama, + xorg-xineramaproto, + epoxy, + REQUIRE_GL, + ] +ignition-common4: + robostack: [libignition-common4] +ignition-cmake2: + robostack: [libignition-cmake2] +ignition-gazebo3: + robostack: [libignition-gazebo6] +ignition-gazebo5: + robostack: [libignition-gazebo6] +ignition-gazebo6: + robostack: [libignition-gazebo6] +ignition-gui5: + robostack: [libignition-gui6] +ignition-math6: + robostack: [libignition-math6] +ignition-msgs5: + robostack: [libignition-msgs8] +ignition-msgs8: + robostack: [libignition-msgs8] +ignition-msgs7: + robostack: [libignition-msgs8] +ignition-rendering5: + robostack: [libignition-rendering6] +ignition-transport8: + robostack: [libignition-transport11] +ignition-transport10: + robostack: [libignition-transport11] +ignition-transport11: + robostack: [libignition-transport11] +java: + robostack: [openjdk] +jupyter-notebook: + robostack: [notebook] +ipython3: + robostack: [ipython] +kitchen: + robostack: [kitchen] +lcov: + robostack: [lcov] +leveldb: + robostack: [leveldb] +libabsl-dev: + robostack: [libabseil] +libblas-dev: + robostack: [libblas, libcblas] +libboost: + robostack: [libboost] +libboost-chrono-dev: + robostack: [libboost-devel] +libboost-date-time: + robostack: [libboost] +libboost-date-time-dev: + robostack: [libboost-devel] +libboost-dev: + robostack: [libboost-devel] +libboost-filesystem: + robostack: [libboost] +libboost-filesystem-dev: + robostack: [libboost-devel] +libboost-iostreams-dev: + robostack: [libboost-devel] +libboost-program-options: + robostack: [libboost] +libboost-program-options-dev: + robostack: [libboost-devel] +libboost-python: + robostack: [libboost-python] +libboost-python-dev: + robostack: [libboost-python-devel] +libboost-random: + robostack: [libboost] +libboost-random-dev: + robostack: [libboost-devel] +libboost-regex-dev: + robostack: [libboost-devel] +libboost-serialization: + robostack: [libboost] +libboost-serialization-dev: + robostack: [libboost-devel] +libboost-system: + robostack: [libboost] +libboost-system-dev: + robostack: [libboost-devel] +libboost-thread: + robostack: [libboost] +libboost-thread-dev: + robostack: [libboost-devel] +libcairo2-dev: + robostack: [cairo] +libcap-dev: + robostack: + linux: [libcap] + osx: [] + win64: [] +libccd-dev: + robostack: [libccd-double] +libceres-dev: + robostack: [ceres-solver] +libclang-dev: + robostack: [libclang] +libconsole-bridge-dev: + robostack: [console_bridge] +libcunit-dev: + robostack: [cunit] +libcurl: + robostack: [libcurl] +libcurl-dev: + robostack: [libcurl] +libdc1394-dev: + robostack: [libdc1394] +libdw-dev: + robostack: + linux: [elfutils] + osx: [] + win64: [] +libfcl-dev: + robostack: [fcl] +libffi-dev: + robostack: [libffi] +libflann-dev: + robostack: [flann] +libfltk-dev: + robostack: [fltk] +libfreeimage-dev: + robostack: [freeimage] +libfreenect-dev: + robostack: [] +libfreetype-dev: + robostack: [freetype] +libfreetype6: + robostack: [freetype] +libfreetype6-dev: + robostack: [freetype] +libftdi-dev: + robostack: [libftdi, libusb] +libgazebo11-dev: + robostack: [gazebo, libprotobuf, libabseil] +libgazebo9-dev: + robostack: [gazebo, libprotobuf, libabseil] +libgdal-dev: + robostack: [libgdal] +libgeos++-dev: + robostack: [geos] +libgflags-dev: + robostack: [gflags] +libglew-dev: + robostack: [glew] +libglfw3-dev: + robostack: [glfw 3.*] +libglu-dev: + robostack: + linux: [libglu] + osx: [] + win64: [] +libgoogle-glog-dev: + robostack: [glog] +libgpgme-dev: + robostack: + linux: [gpgme] + osx: [gpgme] + win64: [] +libgps: + robostack: [gpsd] +libgsl: + robostack: [gsl] +libgstreamer-plugins-base1.0-dev: + robostack: [gst-plugins-base] +libgstreamer1.0-dev: + robostack: [gstreamer] +libgts: + robostack: [gts] +libhdf5-dev: + robostack: [hdf5] +libi2c-dev: + robostack: [libi2c] +liblttng-ust-dev: + robostack: ["${{ \"lttng-ust\" if linux }}"] +libjpeg: + robostack: [libjpeg-turbo] +libjsoncpp: + robostack: [jsoncpp] +libjsoncpp-dev: + robostack: [jsoncpp] +liblapack-dev: + robostack: [liblapack] +liblz4: + robostack: [lz4] +liblz4-dev: + robostack: [lz4] +libmicrohttpd: + robostack: [libmicrohttpd] +libnanoflann-dev: + robostack: [nanoflann] +libncurses-dev: + robostack: + linux: [ncurses] + osx: [ncurses] + win64: [] +libnl-3: + robostack: [libnl 3.*] +libnl-3-dev: + robostack: [libnl 3.*] +libnlopt-cxx-dev: + robostack: [nlopt] +libnlopt-dev: + robostack: [nlopt] +libnlopt0: + robostack: [nlopt] +libogg: + robostack: [libogg] +libogre: + robostack: [ogre] +libogre-dev: + robostack: [ogre] +libomp-dev: + robostack: + linux: [libgomp] + osx: [llvm-openmp] + win64: [] +libopenblas-dev: + robostack: [libblas] +libopencv-dev: + robostack: [py-opencv, libopencv, REQUIRE_OPENGL] +libopencv-imgproc-dev: + robostack: [py-opencv, libopencv, REQUIRE_OPENGL] +libopenni-dev: + robostack: [] +liborocos-kdl: + robostack: [orocos-kdl] +liborocos-kdl-dev: + robostack: [orocos-kdl] +libpcap: + robostack: [libpcap] +libpcl-all: + robostack: [pcl] +libpcl-all-dev: + robostack: [pcl, libboost-devel, vtk-base, REQUIRE_OPENGL] +libpcl-common: + robostack: [pcl] +libpcl-filters: + robostack: [pcl] +libpcl-io: + robostack: [pcl] +libpng-dev: + robostack: [libpng] +libpoco-dev: + robostack: [poco] +libpqxx: + robostack: [libpqxx] +libpqxx-dev: + robostack: [libpqxx] +libqglviewer2-qt5: + robostack: [libqglviewer] +libqglviewer-dev-qt5: + robostack: [libqglviewer] +libqhull: + robostack: [qhull] +libqt5-core: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-gui: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-opengl: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-opengl-dev: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-svg: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-svg-dev: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-websockets-dev: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5-widgets: + robostack: [qt-main, REQUIRE_OPENGL] +libqt5x11extras5-dev: + robostack: [qt-main, REQUIRE_OPENGL] +libreadline: + robostack: [readline] +libreadline-dev: + robostack: [readline] +libshaderc-dev: + robostack: [shaderc] +libsndfile1-dev: + robostack: [libsndfile] +libspnav-dev: + robostack: [libspnav, xorg-xorgproto] +libsqlite3-dev: + robostack: [sqlite 3.*] +libssl-dev: + robostack: [openssl] +libtheora: + robostack: [libtheora] +libtool: + robostack: [libtool] +libturbojpeg: + robostack: [libjpeg-turbo] +libtins-dev: + robostack: [libtins] +libudev-dev: + robostack: + linux: [libusb, libudev] + osx: [libusb] + win64: [libusb] +liburdfdom-dev: + robostack: [urdfdom] +liburdfdom-headers-dev: + robostack: [urdfdom_headers] +liburdfdom-tools: + robostack: [urdfdom] +libusb-1.0: + robostack: + linux: [libusb, libudev] + osx: [libusb] + win64: [libusb] +libusb-1.0-dev: + robostack: + linux: [libusb, libudev] + osx: [libusb] + win64: [libusb] +libusb-dev: + robostack: + linux: [libusb, libudev] + osx: [libusb] + win64: [libusb] +libuvc-dev: + robostack: + linux: [libusb, libudev, libuvc] + osx: [libusb, libuvc] + win64: [libusb, libuvc] +libvtk: + robostack: [vtk] +libvtk-qt: + robostack: [vtk] +libvulkan-dev: + robostack: + linux: [libvulkan-headers, libvulkan-loader] + osx: [] + win64: [libvulkan-headers, libvulkan-loader] +libx11: + robostack: [xorg-libx11, xorg-xorgproto, REQUIRE_OPENGL] +libx11-dev: + robostack: [xorg-libx11, xorg-xorgproto, REQUIRE_OPENGL] +libxaw: + robostack: + linux: [xorg-libxaw] + osx: [xorg-libxaw] + win64: [] +libxext: + robostack: [xorg-libxext] +libxi-dev: + robostack: [xorg-libxi] +libxml2: + robostack: [libxml2] +libxml2-utils: + robostack: [libxml2] +libxmlrpc-c++: + robostack: [xmlrpc-c] +libxmu-dev: + robostack: [xorg-libxmu] +libxrandr: + robostack: + linux: [xorg-libxrandr] + osx: [xorg-libxrandr] + win64: [] +libxt-dev: + robostack: [xorg-libxt] +libxxf86vm: + robostack: [REQUIRE_OPENGL] +libyaml: + robostack: [yaml] +libyaml-dev: + robostack: [yaml] +libzip-dev: + robostack: [libzip] +libzmq3-dev: + robostack: [zeromq, cppzmq] +libzstd-dev: + robostack: [zstd] +linux-kernel-headers: + robostack: [] +log4cxx: + robostack: [log4cxx] +lua5.2-dev: + robostack: [lua] +lua-dev: + robostack: [lua] +lz4: + robostack: [lz4] +maven: + robostack: [maven] +mongodb: + robostack: [mongodb] +mosquitto: + robostack: [paho-mqtt] +msgpack: + robostack: [msgpack-python] +muparser: + robostack: [muparser] +netpbm: + robostack: + linux-aarch64: [] + osx-arm64: [] + linux: [netpbm] + osx: [netpbm] + win64: [] +nlohmann-json-dev: + robostack: [nlohmann_json] +nlopt: + robostack: [nlopt] +ocl-icd-opencl-dev: + robostack: [ocl-icd] +opengl: + robostack: + linux: [REQUIRE_OPENGL] + osx: [REQUIRE_OPENGL] + win64: [] +openssl: + robostack: [openssl] +pcre: + robostack: [pcre] +pkg-config: + robostack: [pkg-config] +portaudio19-dev: + robostack: [portaudio] +postgresql: + robostack: [postgresql] +proj: + robostack: [proj] +protobuf: + robostack: [libprotobuf, protobuf] +protobuf-dev: + robostack: [libprotobuf, protobuf] +pugixml-dev: + robostack: [pugixml] +pybind11-dev: + robostack: [pybind11] +pycodestyle: + robostack: [pycodestyle] +pydocstyle: + robostack: [pydocstyle] +pydrive-pip: + robostack: [pydrive] +pyflakes3: + robostack: [pyflakes] +python: + robostack: [python] +python-argparse: + robostack: [] +python-autobahn: + robostack: [autobahn] +python-bson: + robostack: [pymongo] +python-cairo: + robostack: [pycairo] +python-catkin-pkg: + robostack: [catkin_pkg] +python-catkin-pkg-modules: + robostack: [catkin_pkg] +python-chainer-pip: + robostack: [chainer] +python-coverage: + robostack: [coverage] +python-crypto: + robostack: [pycrypto] +python-defusedxml: + robostack: [defusedxml] +python-dev: + robostack: [python] +python-dlib: + robostack: [dlib] +python-empy: + robostack: [empy] +python-enum34: + robostack: [enum34] +python-freezegun-pip: + robostack: [freezegun] +python-gdown-pip: + robostack: [gdown] +python-gnupg: + robostack: [python-gnupg] +python-imaging: + robostack: [pillow] +python-inject-pip: + robostack: [inject] +python-lxml: + robostack: [lxml] +python-matplotlib: + robostack: [matplotlib-base] +python-mock: + robostack: [mock] +python-netifaces: + robostack: [netifaces] +python-nose: + robostack: [nose] +python-numpy: + robostack: [numpy] +python-opencv: + robostack: [py-opencv, libopencv] +python-opengl: + robostack: [pyopengl, REQUIRE_OPENGL] +python-paramiko: + robostack: [paramiko] +python-psutil: + robostack: [psutil] +python-pyassimp: + robostack: [pyassimp] +python-pycryptodome: + robostack: [pycryptodome, pycryptodomex] +python-pydot: + robostack: [pydot] +python-pygithub3: + robostack: [pygithub] +python-pygraphviz: + robostack: [pygraphviz] +python-pyusb-pip: + robostack: [pyusb] +python-qt5-bindings: + robostack: [pyqt, pyqt-builder] +python-rosdep: + robostack: [rosdep] +python-rosdep-modules: + robostack: [rosdep] +python-rospkg: + robostack: [rospkg] +python-rospkg-modules: + robostack: [rospkg] +python-setuptools: + robostack: [setuptools] +python-sip: + robostack: [sip 6.7.*] +python-six: + robostack: [six] +python-slacker-cli: + robostack: [slacker] +python-speechrecognition-pip: + robostack: [speechrecognition] +python-tabulate-pip: + robostack: [tabulate] +python-tk: + robostack: [tk] +python-tornado: + robostack: [tornado] +python-twisted-core: + robostack: [twisted] +python-wxtools: + robostack: [wxpython] +python-yaml: + robostack: [pyyaml] +python3: + robostack: [python] +python3-argcomplete: + robostack: [argcomplete] +python3-autobahn: + robostack: [autobahn] +python3-bson: + robostack: [pymongo] +python3-cairo: + robostack: [pycairo] +python3-catkin-pkg: + robostack: [catkin_pkg] +python3-catkin-pkg-modules: + robostack: [catkin_pkg] +python3-catkin-tools: + robostack: [catkin_tools] +python3-cherrypy3: + robostack: [cherrypy] +python3-click: + robostack: [click] +python3-collada: + robostack: [pycollada] +python3-colorama: + robostack: [colorama] +python3-coverage: + robostack: [coverage] +python3-cryptography: + robostack: [cryptography] +python3-defusedxml: + robostack: [defusedxml] +python3-deprecated: + robostack: [deprecated] +python3-dev: + robostack: [python] +python3-docopt: + robostack: [docopt] +python3-docutils: + robostack: [docutils] +python3-empy: + robostack: [empy] +python3-flake8: + robostack: [flake8] +python3-flake8-comprehensions: + robostack: [flake8-comprehensions] +python3-flask: + robostack: [flask] +python3-flask-cors: + robostack: [flask-cors] +python3-fiona: + robostack: [fiona] +python3-future: + robostack: [future] +python3-gi: + robostack: [pygobject] +python3-git: + robostack: [gitpython] +python3-github: + robostack: [pygithub] +python3-github3: + robostack: [pygithub] +python3-gnupg: + robostack: [python-gnupg] +python3-grpc-tools: + robostack: [grpcio-tools] +python3-grpcio: + robostack: [grpcio] +python3-h5py: + robostack: [h5py] +python3-ifcfg: + robostack: [ifcfg] +python3-imageio: + robostack: [imageio] +python3-importlib-metadata: + robostack: [importlib-metadata] +python3-importlib-resources: + robostack: [importlib_resources] +python3-jinja2: + robostack: [jinja2] +python3-kitchen: + robostack: [kitchen] +python3-lark-parser: + robostack: [lark-parser] +python3-lxml: + robostack: [lxml] +python3-matplotlib: + robostack: [matplotlib-base] +python3-mechanize: + robostack: [mechanize] +python3-mock: + robostack: [mock] +python3-msgpack: + robostack: [msgpack-python] +python3-mypy: + robostack: [mypy] +python3-netifaces: + robostack: [netifaces] +python3-nose: + robostack: [nose] +python3-numpy: + robostack: [numpy] +python3-opencv: + robostack: [py-opencv, libopencv] +python3-opengl: + robostack: [pyopengl, REQUIRE_OPENGL] +python3-packaging: + robostack: [packaging] +python3-pandas: + robostack: [pandas] +python3-paramiko: + robostack: [paramiko] +python3-pep8: + robostack: [pep8] +python3-pil: + robostack: [pillow] +python3-pip: + robostack: [pip] +python3-pkg-resources: + robostack: [] +python3-protobuf: + robostack: [protobuf] +python3-psutil: + robostack: [psutil] +python3-pyassimp: + robostack: [pyassimp] +python3-pycodestyle: + robostack: [pycodestyle] +python3-pycryptodome: + robostack: [pycryptodome, pycryptodomex] +python3-pydot: + robostack: [pydot] +python3-pygraphviz: + robostack: [pygraphviz] +python3-pykdl: + robostack: [python-orocos-kdl] +python3-pymongo: + robostack: [pymongo] +python3-pyproj: + robostack: [pyproj] +python3-pysnmp: + robostack: [pysnmp] +python3-pytest: + robostack: [pytest] +python3-pytest-cov: + robostack: [pytest-cov] +python3-pytest-mock: + robostack: [pytest-mock] +python3-pytest-timeout: + robostack: [pytest-timeout] +python3-qt5-bindings: + robostack: [pyqt, pyqt-builder] +python3-qt5-bindings-gl: + robostack: [pyqt, pyqt-builder] +python3-qt5-bindings-webkit: + robostack: [pyqtwebengine] +python3-requests: + robostack: [requests] +python3-requests-oauthlib: + robostack: [requests-oauthlib] +python3-rtree: + robostack: [rtree] +python3-rosdep: + robostack: [rosdep] +python3-rosdep-modules: + robostack: [rosdep] +python3-rosdistro-modules: + robostack: [rosdistro] +python3-rospkg: + robostack: [rospkg] +python3-rospkg-modules: + robostack: [rospkg] +python3-ruamel.yaml: + robostack: [ruamel.yaml] +python3-ruff: + robostack: [ruff] +python3-scipy: + robostack: [scipy] +python3-serial: + robostack: [pyserial] +python3-setuptools: + robostack: [setuptools] +python3-simplejson: + robostack: [simplejson] +python3-six: + robostack: [six] +python3-shapely: + robostack: [shapely] +python3-skimage: + robostack: [scikit-image] +python3-sklearn: + robostack: [scikit-learn] +python3-sphinx: + robostack: [sphinx] +python3-termcolor: + robostack: [termcolor] +python3-texttable: + robostack: [texttable] +python3-tk: + robostack: [tk] +python3-tornado: + robostack: [tornado] +python3-transforms3d: + robostack: [transforms3d] +python3-twisted: + robostack: [twisted] +python3-typeguard: + robostack: [typeguard] +python3-types-pyyaml: + robostack: [types-pyyaml] +python3-unidiff: + robostack: [unidiff] +python3-usb: + robostack: [pyusb] +python3-vcstool: + robostack: [vcstool] +python3-flake8-docstrings: + robostack: [flake8-docstrings] +python3-flake8-import-order: + robostack: [flake8-import-order] +python3-flake8-builtins: + robostack: [flake8-builtins] +python3-flake8-quotes: + robostack: [flake8-quotes] +python3-venv: + robostack: [virtualenv, pip, pip-tools, setuptools] +python3-websocket: + robostack: [websocket-client] +python3-yaml: + robostack: [pyyaml] +python3-zmq: + robostack: [pyzmq] +qt5-image-formats-plugins: + robostack: [qt-main, REQUIRE_OPENGL] +qt5-qmake: + robostack: [qt-main, REQUIRE_OPENGL] +qtbase5-dev: + robostack: [qt-main, REQUIRE_OPENGL] +rapidjson-dev: + robostack: [rapidjson] +roboticstoolbox-python: + robostack: [roboticstoolbox-python] +rsync: + robostack: [rsync] +rti-connext-dds-5.3.1: + robostack: [] +ruby: + robostack: [ruby] +sbcl: + robostack: + linux: [sbcl] + osx: [sbcl] + win64: [] +screen: + robostack: [screen] +sdformat: + robostack: [libsdformat] +sdformat12: + robostack: [libsdformat12] +sdl: + robostack: [sdl] +sdl-image: + robostack: [sdl_image] +sdl2: + robostack: [sdl2] +socat: + robostack: [socat] +spacenavd: + robostack: [libspnav] +spdlog: + robostack: [spdlog] +sshpass: + robostack: [sshpass] +subversion: + robostack: [subversion] +suitesparse: + robostack: [suitesparse] +sqlite3: + robostack: [sqlite 3.*] +swig: + robostack: [swig] +sysstat: + robostack: [sysstat] +tango-icon-theme: + robostack: [] +tbb: + robostack: [tbb, tbb-devel] +time: + robostack: [time] +tinyxml: + robostack: [tinyxml] +tinyxml2: + robostack: [tinyxml2] +udev: + robostack: + linux: [libusb, libudev] + osx: [libusb] + win64: [libusb] +uncrustify: + robostack: [uncrustify] +unzip: + robostack: [unzip] +uuid: + robostack: + linux: [libuuid] + osx: [] + win64: [] +virtualenv: + robostack: [virtualenv] +libwebsocketpp-dev: + robostack: [websocketpp] +wget: + robostack: [wget] +xsimd: + robostack: [xsimd] +xtensor: + robostack: [xtensor ==0.24.7] +wx-common: + robostack: [wxpython] +wxpython: + robostack: [wxpython] +wxwidgets: + robostack: [wxpython] +x11-dev: + robostack: [xorg-libx11, REQUIRE_OPENGL] +yaml: + robostack: [yaml, yaml-cpp] +yaml-cpp: + robostack: [yaml-cpp] +zbar: + robostack: [zbar] +zlib: + robostack: [zlib] +zziplib: + robostack: [zziplib] diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/__init__.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/build_script.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/build_script.py new file mode 100644 index 0000000000..230cdc5d63 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/build_script.py @@ -0,0 +1,82 @@ +""" +Build script generation for Python backend. +""" + +from enum import Enum +from pathlib import Path +import platform +from catkin_pkg.package import Package as CatkinPackage +from importlib.resources import files + +from pixi_build_ros.distro import Distro + + +class BuildPlatform(Enum): + """Build platform types.""" + + WINDOWS = "windows" + UNIX = "unix" + + @classmethod + def current(cls) -> "BuildPlatform": + """Get current build platform.""" + return cls.WINDOWS if platform.system() == "Windows" else cls.UNIX + + +class BuildScriptContext: + """Context for build script generation.""" + + def __init__( + self, + script_content: str, + build_platform: BuildPlatform, + source_dir: Path, + ): + self.script_content = script_content + self.build_platform = build_platform + self.source_dir = source_dir + + def render(self) -> list[str]: + """Render the build script content into a list of lines.""" + return self.script_content.splitlines() + + @classmethod + def load_from_template( + cls, pkg: CatkinPackage, platform: BuildPlatform, source_dir: Path, distro: Distro + ) -> "BuildScriptContext": + """Get the build script from the template directory based on the package type.""" + # TODO: deal with other script languages, e.g. for Windows + if pkg.get_build_type() in ["ament_cmake"]: + template_name = "build_ament_cmake.sh" if platform == BuildPlatform.UNIX else "bld_ament_cmake.bat" + elif pkg.get_build_type() in ["ament_python"]: + template_name = "build_ament_python.sh" if platform == BuildPlatform.UNIX else "bld_ament_python.bat" + elif pkg.get_build_type() in ["cmake", "catkin"]: + template_name = "build_catkin.sh" if platform == BuildPlatform.UNIX else "bld_catkin.bat" + else: + raise ValueError(f"Unsupported build type: {pkg.get_build_type()}") + + script_content = "" + try: + # Try to load from installed package data first + templates_pkg = files("pixi_build_ros") / "templates" + template_file = templates_pkg / template_name + script_content = template_file.read_text() + except (ImportError, FileNotFoundError): + # Fallback to the development path + templates_pkg = Path(__file__).parent.parent.parent / "templates" + script_path = templates_pkg / template_name + with open(script_path) as f: + script_content = f.read() + + script_content = ( + script_content.replace("@SRC_DIR@", str(source_dir)) + .replace("@DISTRO@", distro.name) + .replace("@BUILD_DIR@", "build") + .replace("@BUILD_TYPE@", "Release") + ) + + return cls( + script_content=script_content, + build_platform=platform, + source_dir=source_dir, + ) diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/config.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/config.py new file mode 100644 index 0000000000..b79be25159 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/config.py @@ -0,0 +1,249 @@ +import os +import re +import warnings +from pathlib import Path +from typing import Any + +import pydantic +import yaml + +from pixi_build_ros.distro import Distro + + +def _parse_str_as_abs_path(value: str | Path, manifest_root: Path) -> Path: + """Parse a string as a Path.""" + # Ensure the debug directory is a Path object + if isinstance(value, str): + value = Path(value) + # Ensure it's an absolute path + if not value.is_absolute(): + # Convert to absolute path relative to manifest root + return (manifest_root / value).resolve() + return value + + +def _extract_distro_from_channels_list(channels: list[str] | None) -> str | None: + """Extract ROS distro from a list of channel URLs/names. + + Looks for channels matching the pattern 'robostack-' and returns + the first distro found. + + Args: + channels: List of channel URLs or names + + Returns: + The distro name if found, None otherwise + """ + if not channels: + return None + + # Pattern to match robostack- in channel URLs or names + robostack_pattern = re.compile(r".?robostack-(?!staging\b)(\w+)") + + for channel in channels: + # Extract the last path component or the whole channel name if it's not a URL + # This handles both "robostack-humble" and "https://prefix.dev/robostack-humble" + channel_name = channel.rstrip("/").split("/")[-1] + match = robostack_pattern.search(channel_name) + if match: + return match.group(1) + return None + + +PackageMapEntry = dict[str, list[str] | dict[str, list[str]]] + + +class PackageMappingSource: + """Describes where additional package mapping data comes from.""" + + def __init__(self, mapping: dict[str, PackageMapEntry], source_file: Path | None = None): + if mapping is None: + raise ValueError("PackageMappingSource mapping cannot be null.") + if not isinstance(mapping, dict): + raise TypeError("PackageMappingSource mapping must be a dictionary.") + # Copy to keep the source immutable for callers. + self.mapping: dict[str, PackageMapEntry] = dict(mapping) + # Track the source file path if this came from a file + self.source_file: Path | None = source_file + + @classmethod + def from_mapping(cls, mapping: dict[str, PackageMapEntry]) -> "PackageMappingSource": + """Create a source directly from a mapping dictionary.""" + return cls(mapping, source_file=None) + + @classmethod + def from_file(cls, file_path: str | Path) -> "PackageMappingSource": + """Create a source from a mapping file.""" + path = Path(file_path) + if not path.exists(): + raise ValueError(f"Additional package map file '{path}' not found.") + with open(path) as f: + data = yaml.safe_load(f) or {} + if not isinstance(data, dict): + raise TypeError("Expected package map file to contain a dictionary.") + return cls(data, source_file=path) + + def get_package_mapping(self) -> dict[str, PackageMapEntry]: + return dict(self.mapping) + + def get_source_file(self) -> Path | None: + """Return the source file path if this mapping came from a file.""" + return self.source_file + + +class ROSBackendConfig(pydantic.BaseModel, extra="forbid", arbitrary_types_allowed=True): + """ROS backend configuration.""" + + # ROS distribution to use, e.g., "foxy", "galactic", "humble" + # Can be auto-detected from robostack- channel if not explicitly specified + distro_: Distro | None = pydantic.Field(default=None, alias="distro") + + noarch: bool | None = None + # Environment variables to set during the build + env: dict[str, str] | None = None + # Directory for debug files of this script + debug_dir: Path | None = pydantic.Field( + default=None, validation_alias=pydantic.AliasChoices("debug-dir", "debug_dir") + ) + # Extra input globs to include in the build hash + extra_input_globs: list[str] | None = pydantic.Field(default=None, alias="extra-input-globs") + + # Extra package mappings to use in the build + extra_package_mappings: list[PackageMappingSource] = pydantic.Field( + default_factory=list, alias="extra-package-mappings" + ) + + def is_noarch(self) -> bool: + """Whether to build a noarch package or a platform-specific package.""" + return self.noarch is None or self.noarch + + def get_package_mapping_file_paths(self) -> list[Path]: + """Get all file paths from package mappings that came from files.""" + file_paths = [] + for source in self.extra_package_mappings: + if source_file := source.get_source_file(): + file_paths.append(source_file) + return file_paths + + @pydantic.field_validator("distro_", mode="before") + @classmethod + def _parse_distro(cls, value: Any) -> Distro | None: + """Parse a distro string.""" + if isinstance(value, str): + return Distro(value) + if isinstance(value, Distro): + return value + return None + + def resolve_distro( + self, + channels: list[str] | None = None, + ) -> "ROSBackendConfig": + """Resolve the distro field, auto-detecting from channels if not explicitly set. + + This should be called after config validation to fill in the distro if needed. + + Args: + config: The config instance (possibly with distro=None) + channels: List of channel URLs from the build system + + Returns: + Config with distro resolved + + Raises: + ValueError: If distro cannot be determined + """ + # If distro is already set, nothing to do + if self.distro_: + return self + + # Try to auto-detect from channels + detected_distro_name = None + if channels: + detected_distro_name = _extract_distro_from_channels_list(channels) + + if detected_distro_name: + self.distro_ = Distro(detected_distro_name) + return self + + # If we couldn't detect a distro, raise an error + raise ValueError( + "ROS distro must be either explicitly configured or auto-detected from robostack channels." + f"A 'robostack-' channel (e.g. 'robostack-kilted') was not found in the provided channels: {channels}." + ) + + @pydantic.model_validator(mode="after") + def _ensure_distro( + self, + info: pydantic.ValidationInfo, + ) -> "ROSBackendConfig": + """Ensure distro is resolved after validation.""" + context = info.context or {} + channels = context.get("channels") + return self.resolve_distro(channels=channels) + + @pydantic.field_validator("debug_dir", mode="before") + @classmethod + def _parse_debug_dir(cls, value: Any, info: pydantic.ValidationInfo) -> Path | None: + """Parse debug directory if set.""" + if value is None: + return None + base_path = Path(os.getcwd()) + if info.context and "manifest_root" in info.context: + base_path = Path(info.context["manifest_root"]) + return _parse_str_as_abs_path(value, base_path) + + @pydantic.model_validator(mode="after") + def _warn_deprecated_debug_dir(self) -> "ROSBackendConfig": + """Warn when the deprecated debug_dir setting is used.""" + if self.debug_dir: + warnings.warn( + "`debug-dir` backend configuration is deprecated and ignored, it will be removed later. " + "Debug data is now written to the build work directory.", + UserWarning, + stacklevel=2, + ) + return self + + @pydantic.field_validator("extra_package_mappings", mode="before") + @classmethod + def _parse_package_mappings( + cls, input_value: Any, info: pydantic.ValidationInfo + ) -> list[PackageMappingSource] | None: + """Parse additional package mappings if set.""" + if input_value is None: + return [] + + base_path = Path.cwd() + if info.context and "manifest_root" in info.context: + base_path = Path(info.context["manifest_root"]) + + result: list[PackageMappingSource] = [] + for raw_entry in input_value: + # match for cases + # it's already a package mapping source (usually for testing) + if isinstance(raw_entry, PackageMappingSource): + entry = raw_entry + elif isinstance(raw_entry, dict): + if "file" in raw_entry: + file_value = raw_entry["file"] + entry = PackageMappingSource.from_file(_parse_str_as_abs_path(file_value, base_path)) + elif "mapping" in raw_entry: + mapping_value = raw_entry["mapping"] + entry = PackageMappingSource.from_mapping(mapping_value) + else: + entry = PackageMappingSource.from_mapping(raw_entry) + elif isinstance(raw_entry, (str, Path)): + entry = PackageMappingSource.from_file(_parse_str_as_abs_path(raw_entry, base_path)) + else: + raise ValueError( + f"Unrecognized entry for extra-package-mappings: {raw_entry} of type {type(raw_entry)}." + ) + result.append(entry) + return result + + @property + def distro(self) -> Distro: + if not self.distro_: + raise ValueError("Distro could not be resolved from the channels or the `distro` build config.") + return self.distro_ diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/distro.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/distro.py new file mode 100644 index 0000000000..cab5292a99 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/distro.py @@ -0,0 +1,37 @@ +from typing import cast + +from rosdistro import get_cached_distribution, get_index, get_index_url + +# This modifies the file + + +class Distro: + def __init__(self, distro_name: str): + index = get_index(get_index_url()) + self._distro = get_cached_distribution(index, distro_name) + self.distro_name = distro_name + + # cache distribution type + self._distribution_type: str = index.distributions[distro_name]["distribution_type"] + self._python_version: str = index.distributions[distro_name]["python_version"] + + @property + def name(self) -> str: + return self.distro_name + + def check_ros1(self) -> bool: + return self._distribution_type == "ros1" + + @property + def ros_distro_mutex_name(self) -> str: + return f"ros{'' if self.check_ros1() else '2'}-distro-mutex" + + def get_python_version(self) -> str: + return self._python_version + + def get_package_names(self) -> list[str]: + return cast(list[str], self._distro.release_packages.keys()) + + def has_package(self, package_name: str) -> bool: + """Check if the distribution has a specific package.""" + return package_name in self._distro.release_packages diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/main.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/main.py new file mode 100644 index 0000000000..d5e7b051c7 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/main.py @@ -0,0 +1,8 @@ +from .ros_generator import ROSGenerator +from pixi_build_backend.main import run_backend + + +def main() -> None: + """Main entry point for the script.""" + generator = ROSGenerator() + run_backend(generator) diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py new file mode 100644 index 0000000000..14e2f40f2d --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py @@ -0,0 +1,230 @@ +""" +ROS-specific metadata provider that extracts metadata from package.xml files. +""" + +from pixi_build_backend.types import MetadataProvider + + +class MaintainerInfo: + """Container for maintainer information from package.xml.""" + + def __init__(self, name: str, email: str): + self.name = name + self.email = email + + +class PackageData: + """Container for parsed package.xml data.""" + + def __init__( + self, + name: str | None = None, + version: str | None = None, + description: str | None = None, + maintainers: list[MaintainerInfo] | None = None, + licenses: list[str] | None = None, + homepage: str | None = None, + repository: str | None = None, + ): + self.name = name + self.version = version + self.description = description + # TODO: this is currently unused + self.maintainers = maintainers or [] + self.licenses = licenses or [] + self.homepage = homepage + self.repository = repository + + +class PackageXmlMetadataProvider(MetadataProvider): # type: ignore[misc] # MetadatProvider is not typed + """ + Metadata provider that extracts metadata from ROS package.xml files. + + This provider reads ROS package.xml files and extracts package metadata + like name, version, description, maintainers, etc. + """ + + def __init__( # type: ignore[no-untyped-def] # no typing for args and kwargs + self, + package_xml_path: str, + manifest_root: str, + *args, + extra_input_globs: list[str] | None = None, + package_mapping_files: list[str] | None = None, + **kwargs, + ): + """ + Initialize the metadata provider with a package.xml file path. + + Args: + package_xml_path: Path to the package.xml file + manifest_root: Path to the manifest root directory + extra_input_globs: Additional glob patterns to include + package_mapping_files: Package mapping file paths to track as inputs + """ + super().__init__(*args, **kwargs) + self.package_xml_path = package_xml_path + self.manifest_root = manifest_root + self._package_data: PackageData | None = None + self._extra_input_globs = list(extra_input_globs or []) + self._package_mapping_files = list(package_mapping_files or []) + # Early load the package.xml data to ensure it's valid + _ = self._package_xml_data + + @property + def _package_xml_data(self) -> PackageData: + """Load and parse the package.xml file.""" + if self._package_data is not None: + return self._package_data + + try: + import xml.etree.ElementTree as ET + + tree = ET.parse(self.package_xml_path) + root = tree.getroot() + + # Extract basic package information + name_elem = root.find("name") + version_elem = root.find("version") + description_elem = root.find("description") + + # Extract maintainer and author information + maintainers: list[MaintainerInfo] = [] + for maintainer in root.findall("maintainer"): + maintainer_info = MaintainerInfo( + name=maintainer.text.strip() if maintainer.text else "", email=maintainer.get("email", "") + ) + maintainers.append(maintainer_info) + + # Extract license information + licenses = [] + for license_elem in root.findall("license"): + if license_elem.text: + licenses.append(license_elem.text.strip()) + + # Extract URL information + homepage = None + repository = None + for url in root.findall("url"): + url_type = url.get("type", "") + if url_type == "repository" and not repository: + repository = url.text.strip() if url.text else None + if url_type == "website" or not homepage: + homepage = url.text.strip() if url.text else None + + self._package_data = PackageData( + name=name_elem.text.strip() if name_elem is not None and name_elem.text else None, + version=version_elem.text.strip() if version_elem is not None and version_elem.text else None, + description=description_elem.text.strip() + if description_elem is not None and description_elem.text + else None, + maintainers=maintainers, + licenses=licenses, + homepage=homepage, + repository=repository, + ) + + except Exception as e: + raise RuntimeError(f"Failed to parse package.xml at: '{self.package_xml_path}'. Error: {e}\n") + + return self._package_data + + def name(self) -> str | None: + """Return the package name from package.xml.""" + return self._package_xml_data.name + + def version(self) -> str | None: + """Return the package version from package.xml.""" + return self._package_xml_data.version + + def homepage(self) -> str | None: + """Return the homepage URL from package.xml.""" + return self._package_xml_data.homepage + + def license(self) -> str | None: + """Return the license from package.xml.""" + # ROS package.xml does not enforce SPDX as strictly as rattler-build + # So use LicenseRef for now if there's a single license specified + if len(self._package_xml_data.licenses) == 1 and "TODO" not in self._package_xml_data.licenses[0]: + return f"LicenseRef-{self._package_xml_data.licenses[0]}" + # TODO: Handle License parsing to conform to SPDX standards, + return None + + def license_files(self) -> list[str] | None: + """Return package.xml as the license files, relative to manifest_root.""" + # TODO: This does not work currently, so return None + return None + + def summary(self) -> str | None: + """Return the description as summary from package.xml.""" + description = self._package_xml_data.description + if description and len(description) > 100: + # Truncate long descriptions for summary + return description[:97] + "..." + return description + + def description(self) -> str | None: + """Return the full description from package.xml.""" + return self._package_xml_data.description + + def documentation(self) -> str | None: + """Return None as package.xml doesn't typically specify documentation URLs separately.""" + return None + + def repository(self) -> str | None: + """Return the repository URL from package.xml.""" + return self._package_xml_data.repository + + def input_globs(self) -> list[str]: + """Return input globs that affect this metadata provider.""" + base_globs = ["package.xml", "CMakeLists.txt", "setup.py", "setup.cfg"] + all_globs = base_globs + self._extra_input_globs + self._package_mapping_files + return list(set(all_globs)) + + +class ROSPackageXmlMetadataProvider(PackageXmlMetadataProvider): + """ + ROS-specific metadata provider that formats names according to ROS conventions. + + This provider extends PackageXmlMetadataProvider to format package names + as 'ros--' according to ROS conda packaging conventions. + """ + + def __init__( + self, + package_xml_path: str, + manifest_root: str, + distro_name: str | None = None, + *, + extra_input_globs: list[str] | None = None, + package_mapping_files: list[str] | None = None, + ): + """ + Initialize the ROS metadata provider. + + Args: + package_xml_path: Path to the package.xml file + manifest_root: Path to the manifest root directory + distro_name: ROS distro. If None, will use the base package name without distro prefix. + extra_input_globs: Additional glob patterns to include + package_mapping_files: Package mapping file paths to track as inputs + """ + super().__init__( + package_xml_path, + manifest_root=manifest_root, + extra_input_globs=extra_input_globs, + package_mapping_files=package_mapping_files, + ) + self._distro_name: str | None = distro_name + + def name(self) -> str | None: + """Return the ROS-formatted package name (ros--).""" + base_name = super().name() + if base_name is None: + return None + + if self._distro_name: + # Convert underscores to hyphens per ROS conda naming conventions + formatted_name = base_name.replace("_", "-") + return f"ros-{self._distro_name}-{formatted_name}" + return base_name diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py new file mode 100644 index 0000000000..40ade33b19 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py @@ -0,0 +1,188 @@ +""" +ROS generator implementation using Python bindings. +""" + +import os +from pathlib import Path +from importlib.resources import files +from unittest.mock import patch + +from typing import Any +from pixi_build_backend.types.generated_recipe import ( + GenerateRecipeProtocol, + GeneratedRecipe, +) +from .metadata_provider import ROSPackageXmlMetadataProvider +from pixi_build_backend.types.intermediate_recipe import Script + +from pixi_build_backend.types.item import ItemPackageDependency +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel +from pixi_build_backend.types.python_params import PythonParams + +from .build_script import BuildScriptContext, BuildPlatform +from .utils import ( + get_build_input_globs, + package_xml_to_conda_requirements, + convert_package_xml_to_catkin_package, + get_package_xml_content, + load_package_map_data, + merge_requirements, +) +from .config import ROSBackendConfig, PackageMappingSource + + +class ROSGenerator(GenerateRecipeProtocol): # type: ignore[misc] # MetadatProvider is not typed + """ROS recipe generator using Python bindings.""" + + def generate_recipe( + self, + model: ProjectModel, + config: dict[str, Any], + manifest_path: str, + host_platform: Platform, + _python_params: PythonParams | None = None, + channels: list[str] | None = None, + ) -> GeneratedRecipe: + """Generate a recipe for a Python package.""" + manifest_path_obj = Path(manifest_path) + # nichmor: I'm confused here what we should expect + # an absolute path to package.xml or a directory containing it + # so I'm handling both cases + if manifest_path_obj.is_file(): + manifest_root = manifest_path_obj.parent + else: + manifest_root = manifest_path_obj + + backend_config: ROSBackendConfig = ROSBackendConfig.model_validate( + config, + context={ + "manifest_root": manifest_root, + "channels": channels, + }, + ) + # Resolve distro after validation, using channels from build system + backend_config = ROSBackendConfig.resolve_distro( + backend_config, + channels=channels, + ) + + # Create metadata provider for package.xml + package_xml_path = manifest_root / "package.xml" + # Get package mapping file paths to include in input globs + package_mapping_files = [str(path) for path in backend_config.get_package_mapping_file_paths()] + metadata_provider = ROSPackageXmlMetadataProvider( + str(package_xml_path), + str(manifest_root), + backend_config.distro.name, + extra_input_globs=list(backend_config.extra_input_globs or []), + package_mapping_files=package_mapping_files, + ) + + # Create base recipe from model with metadata provider + generated_recipe = GeneratedRecipe.from_model(model, metadata_provider) + + # Read package.xml for dependency extraction + package_xml_str = get_package_xml_content(package_xml_path) + ros_env_defaults = { + "ROS_DISTRO": backend_config.distro.name, + "ROS_VERSION": "1" if backend_config.distro.check_ros1() else "2", + } + user_env = dict(backend_config.env or {}) + patched_env = {**ros_env_defaults, **user_env} + + # Ensure ROS-related environment variables are available while evaluating conditions. + # uses the unitest patch for this + with patch.dict(os.environ, patched_env, clear=False): + package_xml = convert_package_xml_to_catkin_package(package_xml_str) + + # load package map + + # TODO: Currently hardcoded and not able to override, this should be configurable + package_files = files("pixi_build_ros") + robostack_file = Path(str(package_files)) / "robostack.yaml" + # workaround for from source install + if not robostack_file.is_file(): + robostack_file = Path(__file__).parent.parent.parent / "robostack.yaml" + + package_map_data = load_package_map_data( + backend_config.extra_package_mappings + [PackageMappingSource.from_file(robostack_file)] + ) + + # Get requirements from package.xml + package_requirements = package_xml_to_conda_requirements( + package_xml, backend_config.distro, host_platform, package_map_data + ) + + # Add standard dependencies + build_deps = [ + "ninja", + "python", + "setuptools", + "git", + "git-lfs", + "cmake", + "cpython", + ] + if host_platform.is_unix: + build_deps.extend(["patch", "make", "coreutils"]) + if host_platform.is_windows: + build_deps.extend(["m2-patch"]) + if host_platform.is_osx: + build_deps.extend(["tapi"]) + + for dep in build_deps: + package_requirements.build.append(ItemPackageDependency(name=dep)) + + # Add compiler dependencies + package_requirements.build.append(ItemPackageDependency("${{ compiler('c') }}")) + package_requirements.build.append(ItemPackageDependency("${{ compiler('cxx') }}")) + + host_deps = ["python", "numpy", "pip", "pkg-config"] + + for dep in host_deps: + package_requirements.host.append(ItemPackageDependency(name=dep)) + + # add a simple default host and run dependency on the ros{2}-distro-mutex + package_requirements.host.append(ItemPackageDependency(name=backend_config.distro.ros_distro_mutex_name)) + package_requirements.run.append(ItemPackageDependency(name=backend_config.distro.ros_distro_mutex_name)) + + # Merge package requirements into the model requirements + requirements = merge_requirements(generated_recipe.recipe.requirements, package_requirements) + generated_recipe.recipe.requirements = requirements + + # Determine build platform + build_platform = BuildPlatform.current() + + # Generate build script + build_script_context = BuildScriptContext.load_from_template( + package_xml, build_platform, manifest_root, backend_config.distro + ) + build_script_lines = build_script_context.render() + + script_env = dict(ros_env_defaults) + script_env.update(user_env) + + generated_recipe.recipe.build.script = Script( + content=build_script_lines, + env=script_env, + ) + + # Test the build script before running to early out. + # TODO: returned script.content list is not a list of strings, a container for that + # so it cant be compared directly with the list yet + # assert generated_recipe.recipe.build.script.content == build_script_lines, f"Script content {generated_recipe.recipe.build.script.content}, build script lines {build_script_lines}" + return generated_recipe + + def extract_input_globs_from_build(self, config: dict[str, Any], workdir: Path, editable: bool) -> list[str]: + """Extract input globs for the build.""" + return get_build_input_globs(config, editable) + + def default_variants(self, host_platform: Platform) -> dict[str, Any]: + """Get the default variants for the generator.""" + variants = {} + if host_platform.is_windows: + # Default to Visual Studio 2022 on Windows as it's the one conda-forge uses. + variants["cxx_compiler"] = ["vs2022"] + variants["c_compiler"] = ["vs2022"] + return variants diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/utils.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/utils.py new file mode 100644 index 0000000000..f21b4162cd --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/utils.py @@ -0,0 +1,345 @@ +import dataclasses +import os +from itertools import chain +from pathlib import Path +from typing import Any + +from catkin_pkg.package import Package as CatkinPackage, parse_package_string, Dependency + +from pixi_build_backend.types.intermediate_recipe import ConditionalRequirements +from pixi_build_backend.types.item import ItemPackageDependency, VecItemPackageDependency +from pixi_build_backend.types.platform import Platform +from pixi_build_ros.distro import Distro +from rattler import Version +from .config import PackageMapEntry, PackageMappingSource + + +@dataclasses.dataclass +class PackageNameWithSpec: + """Package name with spec.""" + + name: str + spec: str | None = None + + +# Any in here means ROSBackendConfig +def get_build_input_globs(config: dict[str, Any], editable: bool) -> list[str]: + """Get build input globs for ROS package.""" + base_globs = [ + # Source files + "**/*.c", + "**/*.cpp", + "**/*.h", + "**/*.hpp", + "**/*.rs", + "**/*.sh", + # Project configuration + "package.xml", + "setup.py", + "setup.cfg", + "pyproject.toml", + # Build configuration + "Makefile", + "CMakeLists.txt", + "MANIFEST.in", + "tests/**/*.py", + "docs/**/*.rst", + "docs/**/*.md", + ] + + python_globs = [] if editable else ["**/*.py", "**/*.pyx"] + + all_globs = base_globs + python_globs + if config.get("extra-input-globs"): + all_globs.extend(config["extra-input-globs"]) + return all_globs + + +def get_package_xml_content(package_xml_path: Path) -> str: + """Read package.xml file from the manifest root.""" + if not package_xml_path.exists(): + raise FileNotFoundError(f"package.xml not found at {package_xml_path}") + + with open(package_xml_path) as f: + return f.read() + + +def convert_package_xml_to_catkin_package(package_xml_content: str) -> CatkinPackage: + """Convert package.xml content to a CatkinPackage object.""" + package_reading_warnings = None + package_xml = parse_package_string(package_xml_content, package_reading_warnings) + + # Evaluate conditions in the package.xml + # TODO: validate the need for dealing with configuration conditions + package_xml.evaluate_conditions(os.environ) + + return package_xml + + +def load_package_map_data(package_map_sources: list[PackageMappingSource]) -> dict[str, PackageMapEntry]: + """Load and merge package map data from files and inline mappings.""" + + result: dict[str, PackageMapEntry] = {} + for source in reversed(package_map_sources): + result.update(source.get_package_mapping()) + return result + + +def rosdep_to_conda_package_spec( + dep: Dependency, + distro: Distro, + host_platform: Platform, + package_map_data: dict[str, PackageMapEntry], +) -> list[str]: + """Convert a ROS dependency name to a conda package spec.""" + if host_platform.is_linux: + target_platform = "linux" + elif host_platform.is_windows: + target_platform = "win64" + elif host_platform.is_osx: + target_platform = "osx" + else: + raise RuntimeError(f"Unsupported platform: {host_platform}") + + spec_str = rosdep_nameless_matchspec(dep) + + if dep.name not in package_map_data: + # Package name isn't found in the package map, so we are going to assume it is a ROS package. + return [f"ros-{distro.name}-{dep.name.replace('_', '-')}{spec_str or ''}"] + + # Dependency found in package map + + # Case 1: It's a custom ROS dependency + if "ros" in package_map_data[dep.name]: + return [f"ros-{distro.name}-{dep.replace('_', '-')}{spec_str}" for dep in package_map_data[dep.name]["ros"]] + + # Case 2: It's a custom package name + elif "conda" in package_map_data[dep.name] or "robostack" in package_map_data[dep.name]: + # determine key + key = "robostack" if "robostack" in package_map_data[dep.name] else "conda" + + # Get the conda packages for the dependency + conda_packages = package_map_data[dep.name].get(key, []) + + if isinstance(conda_packages, dict): + # TODO: Handle different platforms + conda_packages = conda_packages.get(target_platform, []) + + additional_packages = [] + # Deduplicate of the code in: + # https://github.com/RoboStack/vinca/blob/7d3a05e01d6898201a66ba2cf6ea771250671f58/vinca/main.py#L562 + if "REQUIRE_GL" in conda_packages: + conda_packages.remove("REQUIRE_GL") + if "linux" in target_platform: + additional_packages.append("libgl-devel") + if "REQUIRE_OPENGL" in conda_packages: + conda_packages.remove("REQUIRE_OPENGL") + if "linux" in target_platform: + # TODO: this should only go into the host dependencies + additional_packages.extend(["libgl-devel", "libopengl-devel"]) + if target_platform in ["linux", "osx", "unix"]: + # TODO: force this into the run dependencies + additional_packages.extend(["xorg-libx11", "xorg-libxext"]) + + # Add the version specifier if it exists and it is only one package defined + if spec_str: + if len(conda_packages) == 1: + if " " not in conda_packages[0]: + conda_packages = [f"{conda_packages[0]}{spec_str}"] + else: + raise ValueError( + f"Version specifier can only be used for a package without constraint already present, " + f"but found {conda_packages[0]} for {dep.name} " + f"in the package map." + ) + else: + raise ValueError( + f"Version specifier can only be used for one package, " + f"but found {len(conda_packages)} packages for {dep.name} " + f"in the package map." + ) + + return conda_packages + additional_packages + else: + raise ValueError(f"Unknown package map entry: {dep.name}.") + + +def rosdep_nameless_matchspec(dep: Dependency) -> str: + """Format the version constraints from a ros package.xml to a nameless matchspec""" + right_ineq = [dep.version_lt, dep.version_lte] + left_ineq = [dep.version_gt, dep.version_gte] + eq = dep.version_eq + + for version in left_ineq + right_ineq + [eq]: + if version is None: + continue + elif version == "": + raise ValueError( + f"Incorrect version specification in package.xml: '{dep.name}': version is empty string (\"\")" + ) + try: + # check if we can parse the version + Version(version) + except TypeError as e: + raise ValueError( + f"Incorrect version specification in package.xml: '{dep.name}' at version '{version}' " + ) from e + + def not_none(p: Any) -> bool: + return p is not None + + if all(map(not_none, right_ineq)): + raise ValueError(f"Dependency {dep.name} cannot be specified by both `<` and `<=`") + if all(map(not_none, left_ineq)): + raise ValueError(f"Dependency {dep.name} cannot be specified by both `>` and `>=`") + + some_inequality = any(map(lambda p: p is not None, right_ineq + left_ineq)) + if eq and some_inequality: + raise ValueError(f"Dependency {dep.name} cannot be specified by both `=` and some inequality") + + if eq: + return f"=={eq}" + + pair = [] + + if dep.version_gt: + pair.append(f">{dep.version_gt}") + if dep.version_gte: + pair.append(f">={dep.version_gte}") + + if dep.version_lt: + pair.append(f"<{dep.version_lt}") + if dep.version_lte: + pair.append(f"<={dep.version_lte}") + + res = ",".join(pair) + + return " " + res if len(pair) > 0 else res + + +def package_xml_to_conda_requirements( + pkg: CatkinPackage, + distro: Distro, + host_platform: Platform, + package_map_data: dict[str, PackageMapEntry], +) -> ConditionalRequirements: + """Convert a CatkinPackage to ConditionalRequirements for conda.""" + # All build related dependencies go into the build requirements + build_deps = pkg.buildtool_depends + # TODO: should the export dependencies be included here? + build_deps += pkg.buildtool_export_depends + build_deps += pkg.build_depends + build_deps += pkg.build_export_depends + # Also add test dependencies, because they might be needed during build (i.e. for pytest/catch2 etc in CMake macros) + build_deps += pkg.test_depends + build_deps = [d for d in build_deps if d.evaluated_condition] + # Add the ros_workspace dependency as a default build dependency for ros2 packages + if not distro.check_ros1(): + build_deps += [Dependency(name="ros_workspace")] + conda_build_deps_chain = [ + rosdep_to_conda_package_spec(dep, distro, host_platform, package_map_data) for dep in build_deps + ] + conda_build_deps = list(chain.from_iterable(conda_build_deps_chain)) + + run_deps = pkg.run_depends + run_deps += pkg.exec_depends + run_deps += pkg.build_export_depends + run_deps += pkg.buildtool_export_depends + run_deps = [d for d in run_deps if d.evaluated_condition] + conda_run_deps_chain = [ + rosdep_to_conda_package_spec(dep, distro, host_platform, package_map_data) for dep in run_deps + ] + conda_run_deps = list(chain.from_iterable(conda_run_deps_chain)) + + build_requirements = [ItemPackageDependency(name) for name in conda_build_deps] + run_requirements = [ItemPackageDependency(name) for name in conda_run_deps] + + cond = ConditionalRequirements() + # TODO: should we add all build dependencies to the host requirements? + cond.host = build_requirements + cond.build = build_requirements + cond.run = run_requirements + + return cond + + +def find_matching(list_to_find: list[ItemPackageDependency], name: str) -> ItemPackageDependency | None: + for dep in list_to_find: + if dep.concrete.package_name == name: + return dep + else: + return None + + +def normalize_spec(spec: str | None, package_name: str) -> str: + """Normalize a spec by removing package name and handling None.""" + if not spec: + return "" + return spec.removeprefix(package_name).strip() + + +def merge_specs(spec1: str | None, spec2: str | None, package_name: str) -> str: + # remove the package name + version_spec1 = normalize_spec(spec1, package_name) + version_spec2 = normalize_spec(spec2, package_name) + + if " " in version_spec1 or " " in version_spec2: + raise ValueError(f"{version_spec1}, or {version_spec2} contains spaces, cannot merge specifiers.") + + # early out with *, empty or == + if version_spec1 in ["*", ""] or "==" in version_spec2 or version_spec1 == version_spec2: + return spec2 or "" + if version_spec2 in ["*", ""] or "==" in version_spec1: + return spec1 or "" + return package_name + " " + ",".join([version_spec1, version_spec2]) + + +def merge_unique_items( + model: list[ItemPackageDependency] | VecItemPackageDependency, + package: list[ItemPackageDependency] | VecItemPackageDependency, +) -> list[ItemPackageDependency]: + """Merge unique items from source into target.""" + + result: list[ItemPackageDependency] = [] + templates_in_model = [str(i.template) for i in model] + for item in list(model) + list(package): + # It's concrete (i.e. no template) + if item.concrete is not None: + # It does not exist yet in model + item_in_result = find_matching(result, item.concrete.package_name) + if not item_in_result: + result.append(item) + elif item_in_result.concrete.is_source: + # If the existing dependency is source, don't merge - keep the source one + continue + elif item.concrete.is_source: + # If a new item is source, replace the existing one + result = [dep for dep in result if dep.concrete.package_name != item.concrete.package_name] + result.append(item) + else: + new_dep = ItemPackageDependency( + name=merge_specs( + item_in_result.concrete.binary_spec, item.concrete.binary_spec, item.concrete.package_name + ) + ) + result.remove(item_in_result) + result.append(new_dep) + + elif str(item.template) not in templates_in_model: + result.append(item) + return result + + +def merge_requirements( + model_requirements: ConditionalRequirements, + package_requirements: ConditionalRequirements, +) -> ConditionalRequirements: + """Merge two sets of requirements.""" + merged = ConditionalRequirements() + + merged.host = merge_unique_items(model_requirements.host, package_requirements.host) + merged.build = merge_unique_items(model_requirements.build, package_requirements.build) + merged.run = merge_unique_items(model_requirements.run, package_requirements.run) + + # If the dependency is of type Source in one of the requirements, we need to set them to Source for all variants + return merged diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_cmake.bat b/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_cmake.bat new file mode 100644 index 0000000000..038d37c25c --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_cmake.bat @@ -0,0 +1,58 @@ +:: Generated by vinca http://github.com/RoboStack/vinca. +:: DO NOT EDIT! +setlocal EnableDelayedExpansion + +:: Rattler-build will not set the SRC_DIR anymore so we set it through templating +set "SRC_DIR=@SRC_DIR@" + +set "BUILD_DIR=@BUILD_DIR@" +set "BUILD_TYPE=@BUILD_TYPE@" + +set "PYTHONPATH=%LIBRARY_PREFIX%\lib\site-packages;%SP_DIR%" + +:: MSVC is preferred. +set CC=cl.exe +set CXX=cl.exe + +:: Create build directory when not available +if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%" +pushd %BUILD_DIR% + +set "CMAKE_GENERATOR=Ninja" +:: We use the Visual Studio generator as a workaround for +:: problems in Ninja when using long paths, see https://github.com/RoboStack/ros-humble/pull/229#issuecomment-2564856467 +:: Once those are solved, we can switch back to use Ninja +:: set "CMAKE_GENERATOR=Visual Studio %VS_MAJOR% %VS_YEAR%" + +:: PYTHON_INSTALL_DIR should be a relative path, see +:: https://github.com/ament/ament_cmake/blob/2.3.2/ament_cmake_python/README.md +:: So we compute the relative path of %SP_DIR% w.r.t. to LIBRARY_PREFIX, +:: but it is not trivial to do this in Command Prompt scripting, so let's do it via +:: python + +:: This line is scary, but it basically assigns the output of the command inside (` and `) +:: to the variable specified after DO SET +:: The equivalent in bash is PYTHON_INSTALL_DIR=`python -c ...` +FOR /F "tokens=* USEBACKQ" %%i IN (`python -c "import os;print(os.path.relpath(os.environ['SP_DIR'],os.environ['LIBRARY_PREFIX']).replace('\\','/'))"`) DO SET PYTHON_INSTALL_DIR=%%i + +cmake ^ + -G "%CMAKE_GENERATOR%" ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^ + -DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=True ^ + -DPYTHON_EXECUTABLE=%PYTHON% ^ + -DPython_EXECUTABLE=%PYTHON% ^ + -DPython3_EXECUTABLE=%PYTHON% ^ + -DSETUPTOOLS_DEB_LAYOUT=OFF ^ + -DBUILD_SHARED_LIBS=ON ^ + -DBUILD_TESTING=OFF ^ + -DCMAKE_OBJECT_PATH_MAX=255 ^ + --compile-no-warning-as-error ^ + -DPYTHON_INSTALL_DIR=%PYTHON_INSTALL_DIR% ^ + %SRC_DIR% +if errorlevel 1 exit 1 + +:: We explicitly pass %CPU_COUNT% to cmake --build as we are not using Ninja, +:: see the comment before setting the CMAKE_GENERATOR env variable +cmake --build . --config Release --parallel %CPU_COUNT% --target install +if errorlevel 1 exit 1 diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_python.bat b/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_python.bat new file mode 100644 index 0000000000..396087989b --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/bld_ament_python.bat @@ -0,0 +1,34 @@ +:: Generated by vinca http://github.com/RoboStack/vinca. +:: DO NOT EDIT! +setlocal + +set "PYTHONPATH=%LIBRARY_PREFIX%\lib\site-packages;%SP_DIR%" + +:: Rattler-build will not set the SRC_DIR anymore so we set it through templating +set "SRC_DIR=@SRC_DIR@" + +pushd %SRC_DIR% +set "PKG_NAME_SHORT=%PKG_NAME:*ros-@DISTRO@-=%" +set "PKG_NAME_SHORT=%PKG_NAME_SHORT:-=_%" + +:: If there is a setup.cfg that contains install-scripts then use pip to install +findstr install[-_]scripts setup.cfg +if "%errorlevel%" == "0" ( + %PYTHON% setup.py install --single-version-externally-managed --record=files.txt ^ + --prefix=%LIBRARY_PREFIX% ^ + --install-lib=%SP_DIR% ^ + --install-scripts=%LIBRARY_PREFIX%\lib\%PKG_NAME_SHORT% +) else ( + %PYTHON% setup.py install --single-version-externally-managed --record=files.txt ^ + --prefix=%LIBRARY_PREFIX% ^ + --install-lib=%SP_DIR% ^ + --install-scripts=%LIBRARY_PREFIX%\bin +) + +:: Cleanup build artifacts +for /d %%d in (*.egg-info) do rmdir /s /q "%%d" 2>nul +if exist build rmdir /s /q build 2>nul +if exist files.txt del /q files.txt 2>nul + + +if errorlevel 1 exit 1 diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin.bat b/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin.bat new file mode 100644 index 0000000000..790874931f --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin.bat @@ -0,0 +1,86 @@ +:: Generated by vinca http://github.com/RoboStack/vinca. +:: DO NOT EDIT! + +setlocal +:: Rattler-build will not set the SRC_DIR anymore so we set it through templating +set "SRC_DIR=@SRC_DIR@" + +set "PYTHONPATH=%LIBRARY_PREFIX%\lib\site-packages;%SP_DIR%" + +:: MSVC is preferred. +set CC=cl.exe +set CXX=cl.exe + +:: ROS_BUILD_SHARED_LIBS is always defined in CMake by catkin +:: if ROS (1) is build as shared library . However, some packages are not +:: passing compilation flags from CMake to other build systems (such as qmake), +:: so we enable it explicitly via the CL environment variable, see +:: https://learn.microsoft.com/en-us/cpp/build/reference/cl-environment-variables?view=msvc-170 +set CL=/DROS_BUILD_SHARED_LIBS=1 /DNOGDI=1 + +set "CATKIN_BUILD_BINARY_PACKAGE_ARGS=-DCATKIN_BUILD_BINARY_PACKAGE=1" +if "%PKG_NAME%" == "ros-@DISTRO@-catkin" ( + :: create catkin cookie to make it is a catkin workspace + type NUL > %LIBRARY_PREFIX%\.catkin + :: keep the workspace activation scripts (e.g., local_setup.bat) + set CATKIN_BUILD_BINARY_PACKAGE_ARGS= +) + +rd /s /q build +mkdir build +pushd build + +:: TODO: setup testing logic +set SKIP_TESTING=true + +cmake ^ + -G "Ninja" ^ + --compile-no-warning-as-error ^ + -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=ON ^ + -DBUILD_SHARED_LIBS=ON ^ + -DPYTHON_EXECUTABLE=%PYTHON% ^ + -DPython_EXECUTABLE=%PYTHON% ^ + -DPython3_EXECUTABLE=%PYTHON% ^ + -DSETUPTOOLS_DEB_LAYOUT=OFF ^ + -DBoost_USE_STATIC_LIBS=OFF ^ + %CATKIN_BUILD_BINARY_PACKAGE_ARGS% ^ + -DCATKIN_SKIP_TESTING=%SKIP_TESTING% ^ + %SRC_DIR% +if errorlevel 1 exit 1 + +if "%PKG_NAME%" == "ros-@DISTRO@-eigenpy" ( + cmake --build . --config Release --target all --parallel 1 + if errorlevel 1 exit 1 +) else ( + cmake --build . --config Release --target all + if errorlevel 1 exit 1 +) + +if "%SKIP_TESTING%" == "OFF" ( + cmake --build . --config Release --target run_tests + if errorlevel 1 exit 1 +) + +cmake --build . --config Release --target install +if errorlevel 1 exit 1 + +if "%PKG_NAME%" == "ros-@DISTRO@-catkin" ( + :: Copy the [de]activate scripts to %PREFIX%\etc\conda\[de]activate.d. + :: This will allow them to be run on environment activation. + for %%F in (activate deactivate) DO ( + if not exist %PREFIX%\etc\conda\%%F.d mkdir %PREFIX%\etc\conda\%%F.d + copy %RECIPE_DIR%\%%F.bat %PREFIX%\etc\conda\%%F.d\%PKG_NAME%_%%F.bat + ) +) + +if "%PKG_NAME%" == "ros-@DISTRO@-ros-workspace" ( + :: Copy the [de]activate scripts to %PREFIX%\etc\conda\[de]activate.d. + :: This will allow them to be run on environment activation. + for %%F in (activate deactivate) DO ( + if not exist %PREFIX%\etc\conda\%%F.d mkdir %PREFIX%\etc\conda\%%F.d + copy %RECIPE_DIR%\%%F.bat %PREFIX%\etc\conda\%%F.d\%PKG_NAME%_%%F.bat + copy %RECIPE_DIR%\%%F.ps1 %PREFIX%\etc\conda\%%F.d\%PKG_NAME%_%%F.ps1 + ) +) diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin_merge.bat b/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin_merge.bat new file mode 100644 index 0000000000..7ff5a7ae64 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/bld_catkin_merge.bat @@ -0,0 +1,34 @@ +:: Generated by vinca http://github.com/RoboStack/vinca. +:: DO NOT EDIT! +setlocal + +:: MSVC is preferred. +set CC=cl.exe +set CXX=cl.exe + +:: ROS_BUILD_SHARED_LIBS is always defined in CMake by catkin +:: if ROS (1) is build as shared library . However, some packages are not +:: passing compilation flags from CMake to other build systems (such as qmake), +:: so we enable it explicitly via the CL environment variable, see +:: https://learn.microsoft.com/en-us/cpp/build/reference/cl-environment-variables?view=msvc-170 +set CL=/DROS_BUILD_SHARED_LIBS=1 /DNOGDI=1 + +set CATKIN_MAKE_ISOLATED=src\ros-@(ros_distro)-catkin\bin\catkin_make_isolated +set CMAKE_PREFIX_PATH=%CMAKE_PREFIX_PATH:\=/% + +%PYTHON% %CATKIN_MAKE_ISOLATED% ^ + --install-space %LIBRARY_PREFIX% ^ + --use-ninja ^ + --install ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DBUILD_SHARED_LIBS=ON ^ + -DPYTHON_EXECUTABLE=%PYTHON% ^ + -DCATKIN_SKIP_TESTING=ON +if errorlevel 1 exit 1 + +:: Copy the [de]activate scripts to %PREFIX%\etc\conda\[de]activate.d. +:: This will allow them to be run on environment activation. +for %%F in (activate deactivate) DO ( + if not exist %PREFIX%\etc\conda\%%F.d mkdir %PREFIX%\etc\conda\%%F.d + copy %RECIPE_DIR%\%%F.bat %PREFIX%\etc\conda\%%F.d\%PKG_NAME%_%%F.bat +) diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/bld_colcon_merge.bat b/pixi-build-backends/backends/pixi-build-ros/templates/bld_colcon_merge.bat new file mode 100644 index 0000000000..b795d97dc5 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/bld_colcon_merge.bat @@ -0,0 +1,38 @@ +:: Generated by vinca http://github.com/RoboStack/vinca. +:: DO NOT EDIT! +setlocal + +:: MSVC is preferred. +set CC=cl.exe +set CXX=cl.exe + +:: PYTHON_INSTALL_DIR should be a relative path, see +:: https://github.com/ament/ament_cmake/blob/2.3.2/ament_cmake_python/README.md +:: So we compute the relative path of %SP_DIR% w.r.t. to LIBRARY_PREFIX, +:: but it is not trivial to do this in Command Prompt scripting, so let's do it via +:: python + +:: This line is scary, but it basically assigns the output of the command inside (` and `) +:: to the variable specified after DO SET +:: The equivalent in bash is PYTHON_INSTALL_DIR=`python -c ...` +FOR /F "tokens=* USEBACKQ" %%i IN (`python -c "import os;print(os.path.relpath(os.environ['SP_DIR'],os.environ['LIBRARY_PREFIX']).replace('\\','/'))"`) DO SET PYTHON_INSTALL_DIR=%%i + +colcon build ^ + --event-handlers console_cohesion+ ^ + --merge-install ^ + --install-base %LIBRARY_PREFIX% ^ + --cmake-args ^ + --compile-no-warning-as-error ^ + -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DBUILD_TESTING=OFF ^ + -DPYTHON_INSTALL_DIR=%PYTHON_INSTALL_DIR% ^ + -DPYTHON_EXECUTABLE=%PYTHON% +if errorlevel 1 exit 1 + +:: Copy the [de]activate scripts to %PREFIX%\etc\conda\[de]activate.d. +:: This will allow them to be run on environment activation. +for %%F in (activate deactivate) DO ( + if not exist %PREFIX%\etc\conda\%%F.d mkdir %PREFIX%\etc\conda\%%F.d + copy %RECIPE_DIR%\%%F.bat %PREFIX%\etc\conda\%%F.d\%PKG_NAME%_%%F.bat +) diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh new file mode 100644 index 0000000000..0625260280 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh @@ -0,0 +1,80 @@ +# Generated by vinca http://github.com/RoboStack/vinca. +# DO NOT EDIT! +set -eo pipefail + +BUILD_DIR=@BUILD_DIR@ + +if [ ! -d "$BUILD_DIR" ]; then + mkdir -p "$BUILD_DIR" +fi +pushd $BUILD_DIR + +BUILD_TYPE=@BUILD_TYPE@ + +# necessary for correctly linking SIP files (from python_qt_bindings) +export LINK=$CXX + +if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then + PYTHON_EXECUTABLE=$PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config + export QT_HOST_PATH="$PREFIX" +else + PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config + export QT_HOST_PATH="$BUILD_PREFIX" +fi + +# Only support 11.0+ for now +OSX_DEPLOYMENT_TARGET="11.0" + +# Added to help make portable builds when using in C++ code. +if [[ $target_platform =~ linux.* ]]; then + export CFLAGS="${CFLAGS} -D__STDC_FORMAT_MACROS=1" + export CXXFLAGS="${CXXFLAGS} -D__STDC_FORMAT_MACROS=1" +fi; + +echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" +echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}" +export ROS_PYTHON_VERSION=3 +echo "Using Python ${ROS_PYTHON_VERSION}" +echo "Using PREFIX: $PREFIX" +echo "Using SP_DIR: $SP_DIR" +echo "Using CONDA_BUILD: $CONDA_BUILD" +echo "Using CPU_COUNT: $CPU_COUNT" +export PY_VER=${ROS_PYTHON_VERSION} +echo "Using PY_VER: $PY_VER" +echo "Using PYTHON: $PYTHON" +echo "Using STDLIB_DIR: $STDLIB_DIR" +echo "Using ROS_PYTHON_VERSION: $ROS_PYTHON_VERSION" +echo "Using SRC_DIR: $SRC_DIR" +export PYTHON_INSTALL_DIR=$(realpath --relative-to="$PREFIX" "$SP_DIR") +echo "Using PYTHON_INSTALL_DIR: $PYTHON_INSTALL_DIR" + +if [ ! -f "build.ninja" ]; then + cmake \ + -G "Ninja" \ + -S @SRC_DIR@ \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DAMENT_PREFIX_PATH=$PREFIX \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_FIND_STRATEGY=LOCATION \ + -DPKG_CONFIG_EXECUTABLE=$PKG_CONFIG_EXECUTABLE \ + -DPYTHON_INSTALL_DIR=$PYTHON_INSTALL_DIR \ + -DSETUPTOOLS_DEB_LAYOUT=OFF \ + -DCATKIN_SKIP_TESTING=$SKIP_TESTING \ + -DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=True \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DCMAKE_IGNORE_PREFIX_PATH="/opt/homebrew;/usr/local/homebrew" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=$OSX_DEPLOYMENT_TARGET \ + --compile-no-warning-as-error \ + $EXTRA_CMAKE_ARGS \ + . +fi + +cmake --build . --config $BUILD_TYPE --target install diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh new file mode 100644 index 0000000000..65f9ffc40d --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh @@ -0,0 +1,25 @@ +# Generated by vinca http://github.com/RoboStack/vinca. +# DO NOT EDIT! + +set -eo pipefail + +# Rattler-build will not set the SRC_DIR anymore so we set it through templating +export SRC_DIR="@SRC_DIR@" + +pushd $SRC_DIR + +# If there is a setup.cfg that contains install-scripts then we should not set it here +if [ -f setup.cfg ] && grep -q "install[-_]scripts" setup.cfg; then + # Remove e.g. ros-humble- from PKG_NAME + PKG_NAME_SHORT=${PKG_NAME#*ros-@DISTRO@-} + # Substitute "-" with "_" + PKG_NAME_SHORT=${PKG_NAME_SHORT//-/_} + INSTALL_SCRIPTS_ARG="--install-scripts=$PREFIX/lib/$PKG_NAME_SHORT" + echo "WARNING: setup.cfg not set, will set INSTALL_SCRIPTS_ARG to: $INSTALL_SCRIPTS_ARG" + $PYTHON setup.py install --prefix="$PREFIX" --install-lib="$SP_DIR" $INSTALL_SCRIPTS_ARG --single-version-externally-managed --record=files.txt + # Remove build artifacts from setup.py install + rm -rf *.egg-info 2>/dev/null || true + rm -rf build/ 2>/dev/null || true +else + $PYTHON -m pip install . --no-deps -vvv +fi diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh new file mode 100644 index 0000000000..4f6044f07c --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh @@ -0,0 +1,153 @@ +# Generated by vinca http://github.com/RoboStack/vinca. +# DO NOT EDIT! +set -eo pipefail + +CATKIN_BUILD_BINARY_PACKAGE="ON" + +# Rattler-build will not set the SRC_DIR anymore so we set it through templating +export SRC_DIR="@SRC_DIR@" + +if [ "${PKG_NAME}" == "ros-noetic-catkin" ]; then + # create catkin cookie to make it is a catkin workspace + touch $PREFIX/.catkin + # keep the workspace activation scripts (e.g., local_setup.bat) + CATKIN_BUILD_BINARY_PACKAGE="OFF" +fi + +mkdir -p build +cd build + +# necessary for correctly linking SIP files (from python_qt_bindings) +export LINK=$CXX + +if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then + PYTHON_EXECUTABLE=$PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config + OSX_DEPLOYMENT_TARGET="10.15" +else + PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config + OSX_DEPLOYMENT_TARGET="11.0" +fi + +if [[ "${CONDA_BUILD_CROSS_COMPILATION:-}" == "1" ]]; then + export QT_HOST_PATH="$BUILD_PREFIX" +else + export QT_HOST_PATH="$PREFIX" +fi + +echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" +echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}" + +export ROS_PYTHON_VERSION=`$PYTHON_EXECUTABLE -c "import sys; print('%i.%i' % (sys.version_info[0:2]))"` +echo "Using Python $ROS_PYTHON_VERSION" +# Fix up SP_DIR which for some reason might contain a path to a wrong Python version +FIXED_SP_DIR=$(echo $SP_DIR | sed -E "s/python[0-9]+\.[0-9]+/python$ROS_PYTHON_VERSION/") +echo "Using site-package dir ${FIXED_SP_DIR}" + +# see https://github.com/conda-forge/cross-python-feedstock/issues/24 +if [[ "$CONDA_BUILD_CROSS_COMPILATION" == "1" ]]; then + find $PREFIX/lib/cmake -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/share/rosidl* -type f -exec sed -i "s~$PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/share/rosidl* -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/lib/cmake -type f -exec sed -i "s~message(FATAL_ERROR \"The imported target~message(WARNING \"The imported target~g" {} + || true + # way around bad CPU type issues + # rm $PREFIX/bin/doxygen || echo "doxygen not found" + # rm $PREFIX/bin/dia || echo "dia not found" + # rm $PREFIX/bin/dot || echo "dot not found" +fi + +# NOTE: there might be undefined references occurring +# in the Boost.system library, depending on the C++ versions +# used to compile Boost. We can avoid them by forcing the use of +# the header-only version of the library. +export CXXFLAGS="$CXXFLAGS -DBOOST_ERROR_CODE_HEADER_ONLY" + +if [[ $target_platform =~ linux.* ]]; then + export CFLAGS="$CFLAGS -D__STDC_FORMAT_MACROS=1"; + export CXXFLAGS="$CXXFLAGS -D__STDC_FORMAT_MACROS=1"; + # I am too scared to turn this on for now ... + # export LDFLAGS="$LDFLAGS -lrt"; + # Some qt stuff uses g++ directly - fix these use cases + ln --symbolic --force $GXX $BUILD_PREFIX/bin/g++ +fi + +if [[ $target_platform =~ emscripten.* ]]; then + export CONDA_BUILD_CROSS_COMPILATION="1" + echo "set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)"> $SRC_DIR/__vinca_shared_lib_patch.cmake + echo "set(CMAKE_STRIP FALSE) # used by default in pybind11 on .so modules">> $SRC_DIR/__vinca_shared_lib_patch.cmake + echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) # fixes an error where numpy header files are not found correctly">> $SRC_DIR/__vinca_shared_lib_patch.cmake + export EXTRA_CMAKE_ARGS=" \ + -DCMAKE_FIND_ROOT_PATH=$PREFIX \ + -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_PROJECT_INCLUDE=$SRC_DIR/__vinca_shared_lib_patch.cmake \ + " +fi + +export SKIP_TESTING=true + +if [ "${PKG_NAME}" == "ros-noetic-euslisp" ] || [ "${PKG_NAME}" = "ros-noetic-jskeus" ] || [ "${PKG_NAME}" = "ros-noetic-roseus" ]; then + GENERATOR="Unix Makefiles" +else + GENERATOR="Ninja" +fi + +cmake ${CMAKE_ARGS} --compile-no-warning-as-error \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \ + -DCMAKE_FIND_FRAMEWORK=LAST \ + -DCMAKE_AUTOMOC_EXECUTABLE=$CMAKE_AUTOMOC_EXECUTABLE \ + -DBUILD_SHARED_LIBS=ON \ + -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_FIND_STRATEGY=LOCATION \ + -DPYTHON_INSTALL_DIR=$FIXED_SP_DIR \ + -DPKG_CONFIG_EXECUTABLE=$PKG_CONFIG_EXECUTABLE \ + -DSETUPTOOLS_DEB_LAYOUT=OFF \ + -DCATKIN_SKIP_TESTING=$SKIP_TESTING \ + -DCATKIN_BUILD_BINARY_PACKAGE=$CATKIN_BUILD_BINARY_PACKAGE \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=$OSX_DEPLOYMENT_TARGET \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + $EXTRA_CMAKE_ARGS \ + -G "$GENERATOR" \ + $SRC_DIR + +cmake --build . --config Release --target all + +if [[ "$SKIP_TESTING" == "OFF" ]]; then + cmake --build . --config Release --target run_tests +fi + +cmake --build . --config Release --target install + +if [ "${PKG_NAME}" == "ros-noetic-catkin" ]; then + # Copy the [de]activate scripts to $PREFIX/etc/conda/[de]activate.d. + # This will allow them to be run on environment activation. + for CHANGE in "activate" "deactivate" + do + mkdir -p "${PREFIX}/etc/conda/${CHANGE}.d" + cp "${RECIPE_DIR}/${CHANGE}.sh" "${PREFIX}/etc/conda/${CHANGE}.d/${PKG_NAME}_${CHANGE}.sh" + done +fi + +if [ "${PKG_NAME}" == "ros-noetic-environment" ]; then + for SCRIPT in "1.ros_distro.sh" "1.ros_etc_dir.sh" "1.ros_package_path.sh" "1.ros_python_version.sh" "1.ros_version.sh" + do + mkdir -p "${PREFIX}/etc/conda/activate.d" + cp "${PREFIX}/etc/catkin/profile.d/${SCRIPT}" "${PREFIX}/etc/conda/activate.d/${SCRIPT}" + done +fi + +if [ "${PKG_NAME}" == "ros-noetic-ros-workspace" ]; then + # Copy the [de]activate scripts to $PREFIX/etc/conda/[de]activate.d. + # This will allow them to be run on environment activation. + for CHANGE in "activate" "deactivate" + do + mkdir -p "${PREFIX}/etc/conda/${CHANGE}.d" + cp "${RECIPE_DIR}/${CHANGE}.sh" "${PREFIX}/etc/conda/${CHANGE}.d/${PKG_NAME}_${CHANGE}.sh" + done +fi diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_package_xml.ambr b/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_package_xml.ambr new file mode 100644 index 0000000000..4133fae18a --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_package_xml.ambr @@ -0,0 +1,135 @@ +# serializer version: 1 +# name: test_package_xml_condition_evaluation[ros1-default] + dict({ + 'distro': 'noetic', + 'env': dict({ + 'ROS_DISTRO': 'noetic', + 'ROS_VERSION': '1', + }), + 'filtered_build': list([ + 'ros-noetic-catkin', + 'ros-noetic-roscpp', + ]), + 'filtered_run': list([ + 'ros-noetic-roscpp', + ]), + 'override_env': dict({ + }), + }) +# --- +# name: test_package_xml_condition_evaluation[ros1-override-to-ros2] + dict({ + 'distro': 'noetic', + 'env': dict({ + 'ROS_DISTRO': 'custom-noetic', + 'ROS_VERSION': '2', + }), + 'filtered_build': list([ + 'ros-noetic-ament-cmake', + 'ros-noetic-rclcpp', + ]), + 'filtered_run': list([ + 'ros-noetic-rclcpp', + ]), + 'override_env': dict({ + 'ROS_DISTRO': 'custom-noetic', + 'ROS_VERSION': '2', + }), + }) +# --- +# name: test_package_xml_condition_evaluation[ros2-default] + dict({ + 'distro': 'jazzy', + 'env': dict({ + 'ROS_DISTRO': 'jazzy', + 'ROS_VERSION': '2', + }), + 'filtered_build': list([ + 'ros-jazzy-ament-cmake', + 'ros-jazzy-rclcpp', + ]), + 'filtered_run': list([ + 'ros-jazzy-rclcpp', + ]), + 'override_env': dict({ + }), + }) +# --- +# name: test_package_xml_condition_evaluation[ros2-override-to-ros1] + dict({ + 'distro': 'jazzy', + 'env': dict({ + 'ROS_DISTRO': 'custom-jazzy', + 'ROS_VERSION': '1', + }), + 'filtered_build': list([ + 'ros-jazzy-catkin', + 'ros-jazzy-roscpp', + ]), + 'filtered_run': list([ + 'ros-jazzy-roscpp', + ]), + 'override_env': dict({ + 'ROS_DISTRO': 'custom-jazzy', + 'ROS_VERSION': '1', + }), + }) +# --- +# name: test_recipe_includes_project_run_dependency + ''' + context: {} + package: + name: custom_ros + version: 0.0.1 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: + - ros-noetic-catkin + - ros-noetic-ros-package + - ros-noetic-multi-package + - ninja + - python + - setuptools + - git + - git-lfs + - cmake + - cpython + - patch + - make + - coreutils + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + host: + - ros-noetic-catkin + - ros-noetic-ros-package + - ros-noetic-multi-package + - python + - numpy + - pip + - pkg-config + - ros-distro-mutex + run: + - rich >=10.0 + - ros-noetic-ros-package + - ros-noetic-multi-package + - ros-distro-mutex + run_constraints: [] + tests: [] + about: + homepage: https://test.io/custom_ros + license: LicenseRef-Apache License 2.0 + license_file: null + summary: Demo + description: Demo + documentation: null + repository: https://github.com/test/custom_ros + extra: null + + ''' +# --- diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_version_constraints.ambr b/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_version_constraints.ambr new file mode 100644 index 0000000000..c129d6b555 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/__snapshots__/test_version_constraints.ambr @@ -0,0 +1,310 @@ +# serializer version: 1 +# name: test_generate_recipe_with_explicit_package_xml_path + ''' + context: {} + package: + name: ros-noetic-custom-ros + version: 0.0.1 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ninja + - python + - setuptools + - git + - git-lfs + - cmake + - cpython + - patch + - make + - coreutils + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + host: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - python + - numpy + - pip + - pkg-config + - ros-distro-mutex + run: + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ros-distro-mutex + run_constraints: [] + tests: [] + about: + homepage: null + license: LicenseRef-Apache License 2.0 + license_file: null + summary: Demo + description: Demo + documentation: null + repository: null + extra: null + + ''' +# --- +# name: test_generate_recipe_with_mutex_version + ''' + context: {} + package: + name: custom_ros + version: 0.0.1 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ninja + - python + - setuptools + - git + - git-lfs + - cmake + - cpython + - patch + - make + - coreutils + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + host: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - python + - numpy + - pip + - pkg-config + - ros-distro-mutex 0.5.* + run: + - rich >=10.0 + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ros-distro-mutex + run_constraints: [] + tests: [] + about: + homepage: null + license: LicenseRef-Apache License 2.0 + license_file: null + summary: Demo + description: Demo + documentation: null + repository: null + extra: null + + ''' +# --- +# name: test_generate_recipe_with_versions + ''' + context: {} + package: + name: ros-noetic-custom-ros + version: 0.0.1 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ninja + - python + - setuptools + - git + - git-lfs + - cmake + - cpython + - patch + - make + - coreutils + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + host: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - python + - numpy + - pip + - pkg-config + - ros-distro-mutex + run: + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ros-distro-mutex + run_constraints: [] + tests: [] + about: + homepage: null + license: LicenseRef-Apache License 2.0 + license_file: null + summary: Demo + description: Demo + documentation: null + repository: null + extra: null + + ''' +# --- +# name: test_generate_recipe_with_versions_in_model_and_package + ''' + context: {} + package: + name: custom_ros + version: 0.0.1 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - ninja + - python + - setuptools + - git + - git-lfs + - cmake + - cpython + - patch + - make + - coreutils + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + host: + - ros-noetic-catkin + - libgl-devel + - libopengl-devel + - xorg-libx11 + - xorg-libxext + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio <10.0.0 + - python + - numpy + - pip + - pkg-config + - ros-distro-mutex + run: + - ros-noetic-ros-package <=2.0.0 + - ros-noetic-ros-package-msgs <=2.0.0 + - ros-noetic-ros-package2 <2.0.0a0 + - qt-main >=5.15.0,<5.16.0 + - tinyxml2 ==10.0.0 + - asio >=9.0,<10.0.0,<10.0.0,<10.0.0 + - ros-distro-mutex + run_constraints: [] + tests: [] + about: + homepage: null + license: LicenseRef-Apache License 2.0 + license_file: null + summary: Demo + description: Demo + documentation: null + repository: null + extra: null + + ''' +# --- diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/conftest.py new file mode 100644 index 0000000000..db620de0a0 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/conftest.py @@ -0,0 +1,53 @@ +from pathlib import Path + +import pytest + +from pixi_build_ros.distro import Distro +from pixi_build_ros.utils import ( + PackageMapEntry, + load_package_map_data, + PackageMappingSource, +) + + +@pytest.fixture +def test_data_dir() -> Path: + """Fixture to provide the path to the test data directory.""" + return Path(__file__).parent / "data" + + +@pytest.fixture +def package_xmls(test_data_dir) -> Path: + """Fixture to read the package.xml content from the test data directory.""" + return test_data_dir / "package_xmls" + + +@pytest.fixture +def package_map() -> dict[str, PackageMapEntry]: + """Load the package map""" + robostack_file = Path(__file__).parent.parent / "robostack.yaml" + return load_package_map_data([PackageMappingSource.from_file(robostack_file)]) + + +@pytest.fixture(scope="session") +def distro(): + """Reusable default distro fixture.""" + return Distro("jazzy") + + +@pytest.fixture(scope="session") +def distro_noetic(): + """Reusable distro noetic fixture.""" + return Distro("noetic") + + +@pytest.fixture +def distro_variant(request, distro: Distro, distro_noetic: Distro) -> Distro: + """Parameterizable fixture that yields either a ROS1 or ROS2 distro.""" + match request.param: + case "ros2": + return distro + case "ros1": + return distro_noetic + case other: + raise ValueError(f"Unknown distro marker: {other}") diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/other_package_map.yaml b/pixi-build-backends/backends/pixi-build-ros/tests/data/other_package_map.yaml new file mode 100644 index 0000000000..2013650046 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/other_package_map.yaml @@ -0,0 +1,8 @@ +alsa-oss: + conda: [other-alsa-oss] +new_package: + conda: new-package +multi_package: + conda: [multi-package-a, multi-package-b] +ros_package: + ros: [ros_package, ros_package_msgs] diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/broken.xml b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/broken.xml new file mode 100644 index 0000000000..dc761d88ae --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/broken.xml @@ -0,0 +1,18 @@ + + + + custom_ros + 0.0.1 + + Demo + + https://test.io/custom_ros + https://github.com/test/custom_ros + + Tester the Tester + + Apache License 2.0 + catkin + + + diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/custom_ros.xml b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/custom_ros.xml new file mode 100644 index 0000000000..db9edc113c --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/custom_ros.xml @@ -0,0 +1,20 @@ + + + + custom_ros + 0.0.1 + + Demo + + https://test.io/custom_ros + https://github.com/test/custom_ros + + Tester the Tester + + Apache License 2.0 + catkin + ros_package + multi_package + + + diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demo_nodes_cpp.xml b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demo_nodes_cpp.xml new file mode 100644 index 0000000000..f22c8b0e16 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demo_nodes_cpp.xml @@ -0,0 +1,53 @@ + + + + demo_nodes_cpp + 0.37.1 + + C++ nodes which were previously in the ros2/examples repository but are now just used for demo purposes. + + + Aditya Pande + Audrow Nash + + Apache License 2.0 + + Mabel Zhang + William Woodall + + ament_cmake + + example_interfaces + rcl + rclcpp + rclcpp_components + rcl_interfaces + rcpputils + rcutils + rmw + std_msgs + + example_interfaces + launch_ros + launch_xml + rcl + rclcpp + rclcpp_components + rcl_interfaces + rcpputils + rcutils + rmw + std_msgs + + ament_cmake_pytest + ament_lint_auto + ament_lint_common + launch + launch_testing + launch_testing_ament_cmake + launch_testing_ros + + + ament_cmake + + diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demos_action_tutorials_interfaces.xml b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demos_action_tutorials_interfaces.xml new file mode 100644 index 0000000000..5b4707f3c5 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/demos_action_tutorials_interfaces.xml @@ -0,0 +1,28 @@ + + + + action_tutorials_interfaces + 0.33.5 + Action tutorials action + + Aditya Pande + Audrow Nash + + Apache License 2.0 + + Jacob Perron + Mabel Zhang + + ament_cmake + rosidl_default_generators + + rosidl_default_runtime + + ament_lint_auto + ament_lint_common + + rosidl_interface_packages + + ament_cmake + + diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/version_constraints.xml b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/version_constraints.xml new file mode 100644 index 0000000000..d08ff622d9 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/data/package_xmls/version_constraints.xml @@ -0,0 +1,22 @@ + + + + custom_ros + 0.0.1 + + Demo + + + Tester the Tester + + Apache License 2.0 + catkin + ros_package + ros_package2 + libqt5-core + tinyxml2 + asio + + + + diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_distro.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_distro.py new file mode 100644 index 0000000000..424c4716e6 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_distro.py @@ -0,0 +1,45 @@ +import pprint + +from rosdistro import get_cached_distribution, get_index, get_index_url +from rosdistro.manifest_provider import get_release_tag + +from pixi_build_ros.distro import Distro + + +def test_rosdistro(): + """Testing rosdistro tools to access ROS distributions.""" + index = get_index(get_index_url()) + pprint.pprint(index.distributions) + + distro_name = "jazzy" + + distro = get_cached_distribution(index, distro_name) + python_version = index.distributions[distro_name]["python_version"] + distribution_type = index.distributions[distro_name]["distribution_type"] + + print(f"Distribution: {distro.name}") + print(f"Version: {distro.version}") + print(f"Python Version: {python_version}") + print(f"Distribution Type: {distribution_type}") + + pkg_name = "rclcpp" + pkg = distro.release_packages[pkg_name] + repo = distro.repositories[pkg.repository_name].release_repository + print(f"Release Tag: {get_release_tag(repo, pkg_name)}") + + +def test_distro_class(distro: Distro): + """Testing the Distro class.""" + distro_name = "jazzy" + + print(f"Distro Name: {distro.name}") + print(f"Is ROS1: {distro.check_ros1()}") + print(f"Python Version: {distro.get_python_version()}") + + package_names = distro.get_package_names() + print(f"Packages in {distro_name}: {package_names}") + + assert distro.has_package("rclcpp"), f"Package rclcpp should exist in {distro_name} distribution." + assert not distro.has_package("non_existent_package"), ( + f"Package non_existent_package should not exist in {distro_name} distribution." + ) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_distro_detection.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_distro_detection.py new file mode 100644 index 0000000000..a40e9fd1e9 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_distro_detection.py @@ -0,0 +1,96 @@ +"""Tests for automatic distro detection from robostack channels.""" + +import pytest + +from pixi_build_ros.config import ROSBackendConfig, _extract_distro_from_channels_list + + +def test_extract_distro_from_full_url(): + """Test extracting distro from full robostack URL.""" + channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/robostack-jazzy", + "https://prefix.dev/conda-forge", + ] + + distro = _extract_distro_from_channels_list(channels) + assert distro == "jazzy" + + +def test_extract_distro_from_short_channel_name(): + """Test extracting distro from short robostack channel name.""" + channels = ["robostack-humble", "conda-forge"] + + distro = _extract_distro_from_channels_list(channels) + assert distro == "humble" + + +def test_dont_extract_from_staging(): + """Test extracting distro from short robostack channel name.""" + channels = ["robostack-staging", "conda-forge"] + + distro = _extract_distro_from_channels_list(channels) + assert distro is None + + +def test_extract_distro_with_trailing_slash(): + """Test extracting distro from URL with trailing slash.""" + channels = ["https://prefix.dev/robostack-noetic/"] + + distro = _extract_distro_from_channels_list(channels) + assert distro == "noetic" + + +def test_extract_distro_multiple_robostack_channels(): + """Test that the first robostack channel is used when multiple exist.""" + channels = [ + "https://prefix.dev/robostack-humble", + "https://prefix.dev/robostack-jazzy", + ] + + distro = _extract_distro_from_channels_list(channels) + assert distro == "humble" + + +def test_extract_distro_no_robostack_channel(): + """Test that None is returned when no robostack channel exists.""" + channels = [ + "https://prefix.dev/conda-forge", + "https://prefix.dev/some-other-channel", + ] + + distro = _extract_distro_from_channels_list(channels) + assert distro is None + + +def test_config_auto_detects_distro_from_channel(): + """Test that ROSBackendConfig auto-detects distro from channel list provided by the caller.""" + # Create config without distro specified + config = ROSBackendConfig.model_validate({}, context={"channels": ["https://prefix.dev/robostack-jazzy"]}) + + assert config.distro is not None + assert config.distro.name == "jazzy" + + +def test_config_explicit_distro_overrides_channel(): + """Test that explicit distro config takes precedence over channel detection.""" + # Create config with explicit distro + config = ROSBackendConfig.model_validate( + {"distro": "humble"}, + context={"channels": ["https://prefix.dev/robostack-jazzy"]}, + ) + + assert config.distro is not None + assert config.distro.name == "humble" + + +def test_config_fails_without_distro_or_channel(): + """Test that config validation fails when distro cannot be determined.""" + with pytest.raises(ValueError, match="ROS distro must be either"): + ROSBackendConfig.model_validate({}, context={"channels": ["conda-forge"]}) + + +def test_config_fails_without_channels_context(): + """Test that config validation fails when no channels are provided.""" + with pytest.raises(ValueError, match="ROS distro must be either"): + ROSBackendConfig.model_validate({}) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_meta_data_provider.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_meta_data_provider.py new file mode 100644 index 0000000000..102e62183f --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_meta_data_provider.py @@ -0,0 +1,103 @@ +from pathlib import Path +import pytest + +from pixi_build_ros.metadata_provider import ( + PackageXmlMetadataProvider, + ROSPackageXmlMetadataProvider, +) + + +def test_metadata_provider(package_xmls: Path): + """Test the MetaDataProvider class.""" + package_xml_path = package_xmls / "custom_ros.xml" + metadata_provider = PackageXmlMetadataProvider(str(package_xml_path), str(package_xmls)) + assert metadata_provider.name() == "custom_ros" + assert metadata_provider.version() == "0.0.1" + assert metadata_provider.license() == "LicenseRef-Apache License 2.0" + assert metadata_provider.description() == "Demo" + assert metadata_provider.homepage() == "https://test.io/custom_ros" + assert metadata_provider.repository() == "https://github.com/test/custom_ros" + assert metadata_provider.license_files() is None + + +def test_ros_metadata_provider(package_xmls: Path): + """Test the RosMetaDataProvider class.""" + package_xml_path = package_xmls / "custom_ros.xml" + metadata_provider = ROSPackageXmlMetadataProvider(str(package_xml_path), str(package_xmls), distro_name="noetic") + assert metadata_provider.name() == "ros-noetic-custom-ros" + assert metadata_provider.version() == "0.0.1" + assert metadata_provider.license() == "LicenseRef-Apache License 2.0" + assert metadata_provider.description() == "Demo" + assert metadata_provider.homepage() == "https://test.io/custom_ros" + assert metadata_provider.repository() == "https://github.com/test/custom_ros" + assert metadata_provider.license_files() is None + + +def test_metadata_provider_raises_on_broken_xml(package_xmls: Path): + """Test that metadata provider raises an error when parsing broken XML.""" + broken_xml_path = package_xmls / "broken.xml" + + with pytest.raises(RuntimeError) as exc_info: + ROSPackageXmlMetadataProvider(str(broken_xml_path), str(package_xmls), distro_name="noetic") + + # Verify the exception contains location information + error = exc_info.value + assert "Failed to parse package.xml" in str(error) + + +def test_metadata_provider_includes_package_mapping_files_in_input_globs(): + """Test that package mapping files from config are included in input_globs.""" + import tempfile + import yaml + from pixi_build_ros.config import ROSBackendConfig + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Create a package.xml inline + package_xml_content = """ + + test_package + 1.0.0 + Test package + Test + Apache-2.0 + +""" + package_xml_path = temp_path / "package.xml" + package_xml_path.write_text(package_xml_content) + + # Create a mapping file inline + mapping_content = {"custom_package": {"conda": ["custom-conda-package"]}} + mapping_file_path = temp_path / "custom_mapping.yaml" + with open(mapping_file_path, "w") as f: + yaml.dump(mapping_content, f) + + # Create config with the mapping file + config = { + "distro": "noetic", + "extra-package-mappings": [str(mapping_file_path)], + } + + backend_config = ROSBackendConfig.model_validate(config, context={"manifest_root": temp_path}) + + # Get package mapping file paths + package_mapping_files = [str(path) for path in backend_config.get_package_mapping_file_paths()] + + # Create metadata provider + metadata_provider = ROSPackageXmlMetadataProvider( + str(package_xml_path), + str(temp_path), + distro_name="noetic", + package_mapping_files=package_mapping_files, + ) + + # Get input globs + input_globs = metadata_provider.input_globs() + + # Verify the mapping file is included + assert str(mapping_file_path) in input_globs + + # Verify base globs are still present + assert "package.xml" in input_globs + assert "CMakeLists.txt" in input_globs diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_package_map.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_package_map.py new file mode 100644 index 0000000000..2f9c096822 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_package_map.py @@ -0,0 +1,170 @@ +from pathlib import Path +import tempfile +import pytest +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel + +from pixi_build_ros.distro import Distro +from pixi_build_ros.ros_generator import ROSGenerator, ROSBackendConfig +from pixi_build_ros.utils import load_package_map_data, PackageMappingSource + + +def test_package_loading(test_data_dir: Path): + """Load the package map with overwrites.""" + robostack_file = Path(__file__).parent.parent / "robostack.yaml" + other_package_map = test_data_dir / "other_package_map.yaml" + result = load_package_map_data( + [ + PackageMappingSource.from_file(other_package_map), + PackageMappingSource.from_file(robostack_file), + ] + ) + assert "new_package" in result + assert result["new_package"]["conda"] == "new-package", "Should be added" + assert result["alsa-oss"]["conda"] == ["other-alsa-oss"], "Should be overwritten" + assert "robostack" not in result["alsa-oss"], "Should be overwritten due to priority of package maps" + assert "zlib" in result, "Should still be present" + + +def test_package_loading_with_inline_mappings(test_data_dir: Path, distro_noetic: Distro): + """Load package map data from a mix of files and inline entries.""" + robostack_file = Path(__file__).parent.parent / "robostack.yaml" + inline_entries = { + "inline-package": {"conda": ["inline-conda"]}, + "inline-ros": {"ros": ["inline-ros"]}, + } + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [ + "other_package_map.yaml", + inline_entries, + robostack_file, + ], + } + parsed_config = ROSBackendConfig.model_validate(config, context={"manifest_root": test_data_dir}) + result = load_package_map_data(parsed_config.extra_package_mappings) + + assert result["inline-package"]["conda"] == ["inline-conda"] + assert result["inline-ros"]["ros"] == ["inline-ros"] + assert "zlib" in result, "Should still contain base entries" + + +def test_generate_recipe_with_custom_ros(package_xmls: Path, test_data_dir: Path, distro_noetic: Distro): + """Test the generate_recipe function of ROSGenerator.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "custom_ros.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create a minimal ProjectModel instance + model = ProjectModel() + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [str(test_data_dir / "other_package_map.yaml")], + } + + # Create host platform + host_platform = Platform.current() + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has the expected requirements + assert generated_recipe.recipe.package.name.get_concrete() == "ros-noetic-custom-ros" + + req_string = list(str(req) for req in generated_recipe.recipe.requirements.run) + assert "ros-noetic-ros-package" in req_string + assert "ros-noetic-ros-package-msgs" in req_string + assert "multi-package-a" in req_string + assert "multi-package-b" in req_string + + +def test_generate_recipe_with_inline_package_mappings(package_xmls: Path, test_data_dir: Path, distro_noetic: Distro): + """Inline entries should be merged into the package map.""" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + package_xml_source = package_xmls / "custom_ros.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + model = ProjectModel() + + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [ + {"ros_package": {"ros": ["ros-custom2", "ros-custom2-msgs"]}}, + str(test_data_dir / "other_package_map.yaml"), + ], + } + + host_platform = Platform.current() + + generator = ROSGenerator() + + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + req_string = list(str(req) for req in generated_recipe.recipe.requirements.run) + assert "ros-noetic-ros-custom2" in req_string + assert "ros-noetic-ros-custom2-msgs" in req_string + + +def test_package_map_does_not_exist(package_xmls: Path, test_data_dir: Path, distro_noetic: Distro): + """Test the generate_recipe function of ROSGenerator.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "custom_ros.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create a minimal ProjectModel instance + model = ProjectModel() + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [("does-not-exist.yaml")], + } + + # Create host platform + host_platform = Platform.current() + + # Create ROSGenerator instance + generator = ROSGenerator() + + with pytest.raises(ValueError) as excinfo: + generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + assert "Additional package map file" in str(excinfo.value) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_package_xml.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_package_xml.py new file mode 100644 index 0000000000..d9c3fee292 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_package_xml.py @@ -0,0 +1,442 @@ +import json +import tempfile +from pathlib import Path + +from catkin_pkg.package import Dependency + +import pytest +from pixi_build_backend.types.intermediate_recipe import Script + +from pixi_build_ros.distro import Distro +from pixi_build_ros.ros_generator import ROSGenerator +from pixi_build_ros.utils import ( + convert_package_xml_to_catkin_package, + package_xml_to_conda_requirements, + rosdep_to_conda_package_spec, + PackageMapEntry, +) +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel + + +def test_package_xml_to_recipe_config(package_xmls: Path, package_map: dict[str, PackageMapEntry], distro: Distro): + # Read content from the file in the test data directory + package_xml_path = package_xmls / "demo_nodes_cpp.xml" + package_content = package_xml_path.read_text(encoding="utf-8") + package = convert_package_xml_to_catkin_package(package_content) + + requirements = package_xml_to_conda_requirements(package, distro, Platform.current(), package_map) + + # Build + expected_build_packages = [ + "example-interfaces", + "rcl", + "rclcpp", + "rclcpp-components", + "rcl-interfaces", + "rcpputils", + "rcutils", + "rmw", + "std-msgs", + ] + build_names = [pkg.concrete.package_name for pkg in requirements.build] + print(f"{requirements.build[0].concrete.package_name}") + for pkg in expected_build_packages: + assert f"ros-{distro.name}-{pkg}" in build_names + + # TODO: Check the host packages when we figure out how to handle them + + # Run + expected_run_packages = [ + "example-interfaces", + "launch-ros", + "launch-xml", + "rcl", + "rclcpp", + "rclcpp-components", + "rcl-interfaces", + "rcpputils", + "rcutils", + "rmw", + "std-msgs", + ] + run_names = [pkg.concrete.package_name for pkg in requirements.run] + for pkg in expected_run_packages: + assert f"ros-{distro.name}-{pkg}" in run_names + + +@pytest.mark.parametrize( + ("distro_variant", "override_env"), + [ + pytest.param("ros2", None, id="ros2-default"), + pytest.param("ros1", None, id="ros1-default"), + pytest.param("ros2", {"ROS_VERSION": "1", "ROS_DISTRO": "custom-jazzy"}, id="ros2-override-to-ros1"), + pytest.param("ros1", {"ROS_VERSION": "2", "ROS_DISTRO": "custom-noetic"}, id="ros1-override-to-ros2"), + ], + indirect=["distro_variant"], +) +def test_package_xml_condition_evaluation( + tmp_path: Path, + distro_variant: Distro, + override_env: dict[str, str] | None, + snapshot, +): + """Ensure package.xml respect conditional dependencies. Set through ROS environment variables""" + inline_package_xml = """ + + conditional_pkg + 0.1.0 + Conditional dependency test + Tester + MIT + ament_cmake + catkin + rclcpp + roscpp + rclcpp + roscpp + +""" + package_xml_path = tmp_path / "package.xml" + package_xml_path.write_text(inline_package_xml, encoding="utf-8") + + model_payload = { + "name": "conditional_pkg", + "version": "0.1.0", + "targets": { + "defaultTarget": { + "hostDependencies": {}, + "buildDependencies": {}, + "runDependencies": {}, + }, + "targets": {}, + }, + } + model = ProjectModel.from_json(json.dumps(model_payload)) + generator = ROSGenerator() + + config = {"distro": distro_variant, "noarch": False} + if override_env is not None: + config["env"] = override_env + + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(tmp_path), + host_platform=Platform("linux-64"), + ) + + build_names = [dep.concrete.package_name for dep in generated_recipe.recipe.requirements.build if dep.concrete] + run_names = [dep.concrete.package_name for dep in generated_recipe.recipe.requirements.run if dep.concrete] + + # Only track the dependencies declared in the inline package.xml snippet above. + declared_deps = {"ament_cmake", "catkin", "rclcpp", "roscpp"} + normalized_declared_deps = {dep.replace("_", "-") for dep in declared_deps} + prefix = f"ros-{distro_variant.name}-" + filtered_build = sorted( + dep for dep in build_names if dep.startswith(prefix) and dep.removeprefix(prefix) in normalized_declared_deps + ) + filtered_run = sorted( + dep for dep in run_names if dep.startswith(prefix) and dep.removeprefix(prefix) in normalized_declared_deps + ) + + # Only use the env variables we are interested in + env_repr = str(generated_recipe.recipe.build.script.env) + env_dict: dict[str, str] = {} + for item in env_repr.strip("{} ,").split(","): + item = item.strip() + if not item: + continue + key, value = item.split(":", 1) + env_dict[key.strip()] = value.strip() + + snapshot.assert_match( + { + "distro": distro_variant.name, + "override_env": override_env or {}, + "filtered_build": filtered_build, + "filtered_run": filtered_run, + "env": dict(sorted(env_dict.items())), + } + ) + + +def test_ament_cmake_package_xml_to_recipe_config( + package_xmls: Path, package_map: dict[str, PackageMapEntry], distro: Distro +): + # Read content from the file in the test data directory + package_xml_path = package_xmls / "demos_action_tutorials_interfaces.xml" + package_content = package_xml_path.read_text(encoding="utf-8") + package = convert_package_xml_to_catkin_package(package_content) + + requirements = package_xml_to_conda_requirements(package, distro, Platform.current(), package_map) + + assert requirements.build[0].concrete.package_name == "ros-jazzy-ament-cmake" + + +def test_generate_recipe(package_xmls: Path, distro: Distro): + """Test the generate_recipe function of ROSGenerator.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "demo_nodes_cpp.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create a minimal ProjectModel instance + model = ProjectModel() + + # Create config for ROS backend + config = {"distro": distro, "noarch": False} + + # Create host platform + host_platform = Platform.current() + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has expected properties + assert generated_recipe.recipe.package.name.get_concrete() == "ros-jazzy-demo-nodes-cpp" + assert generated_recipe.recipe.package.version.get_concrete() == "0.37.1" + + # Verify build script is generated + assert generated_recipe.recipe.build.script is not None + assert generated_recipe.recipe.build.script.content is not None + + # Verify ROS dependencies are included in build requirements + build_deps = [dep.concrete.package_name for dep in generated_recipe.recipe.requirements.build if dep.concrete] + expected_ros_deps = [ + "ros-jazzy-ament-cmake", + "ros-jazzy-example-interfaces", + "ros-jazzy-rclcpp", + ] + + for expected_dep in expected_ros_deps: + assert expected_dep in build_deps, ( + f"Expected dependency {expected_dep} not found in build deps: {build_deps}" + ) + + # Verify standard build tools are included + expected_build_tools = ["ninja", "python", "setuptools", "cmake"] + for tool in expected_build_tools: + assert tool in build_deps, f"Expected build tool {tool} not found in build deps: {build_deps}" + + # Verify run dependencies + run_deps = [dep.concrete.package_name for dep in generated_recipe.recipe.requirements.run if dep.concrete] + expected_run_deps = [ + "ros-jazzy-example-interfaces", + "ros-jazzy-rclcpp", + "ros-jazzy-launch-ros", + ] + + for expected_dep in expected_run_deps: + assert expected_dep in run_deps, ( + f"Expected runtime dependency {expected_dep} not found in run deps: {run_deps}" + ) + + +def test_recipe_includes_project_run_dependency(package_xmls: Path, distro: Distro, snapshot): + """Ensure dependencies declared in project manifest merge into run requirements.""" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + package_xml_source = package_xmls / "custom_ros.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + model_payload = { + "name": "custom_ros", + "version": "0.0.1", + "description": "Demo", + "authors": ["Tester the Tester"], + "targets": { + "defaultTarget": { + "hostDependencies": {}, + "buildDependencies": {}, + "runDependencies": {"rich": {"binary": {"version": ">=10.0"}}}, + }, + "targets": {}, + }, + } + model = ProjectModel.from_json(json.dumps(model_payload)) + + config = {"distro": "noetic", "noarch": False} + host_platform = Platform("linux-64") + generator = ROSGenerator() + + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has the mutex requirements + # remove the build script as it container a tmp variable + generated_recipe.recipe.build.script = Script("") + assert generated_recipe.recipe.to_yaml() == snapshot + + +def test_robostack_target_platform_linux(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test that target platform correctly selects Linux packages from robostack.yaml.""" + + # Create a mock Linux platform + linux_platform = Platform("linux-64") + + # Test packages with platform-specific mappings + acl_packages = rosdep_to_conda_package_spec(Dependency(name="acl"), distro, linux_platform, package_map) + assert acl_packages == ["libacl"], f"Expected ['libacl'] for acl on Linux, got {acl_packages}" + + +def test_robostack_target_platform_osx(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test that target platform correctly selects macOS packages from robostack.yaml.""" + # Create a mock macOS platform + osx_platform = Platform("osx-64") + + # Test packages with platform-specific mappings + acl_packages = rosdep_to_conda_package_spec(Dependency(name="acl"), distro, osx_platform, package_map) + assert acl_packages == [], f"Expected [] for acl on macOS, got {acl_packages}" + + +def test_robostack_target_platform_windows(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test that target platform correctly selects Windows packages from robostack.yaml.""" + # Create a mock Windows platform + win_platform = Platform("win-64") + + # Test packages with platform-specific mappings + binutils_packages = rosdep_to_conda_package_spec(Dependency(name="binutils"), distro, win_platform, package_map) + assert binutils_packages == [], f"Expected [] for binutils on Windows, got {binutils_packages}" + + +def test_robostack_target_platform_cross_platform(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test packages that have different mappings across all platforms.""" + linux_platform = Platform("linux-64") + osx_platform = Platform("osx-64") + win_platform = Platform("win-64") + + # libudev-dev has different packages for each platform + linux_udev = rosdep_to_conda_package_spec(Dependency(name="libudev-dev"), distro, linux_platform, package_map) + osx_udev = rosdep_to_conda_package_spec(Dependency(name="libudev-dev"), distro, osx_platform, package_map) + win_udev = rosdep_to_conda_package_spec(Dependency(name="libudev-dev"), distro, win_platform, package_map) + + assert linux_udev == [ + "libusb", + "libudev", + ], f"Expected ['libusb', 'libudev'] for libudev-dev on Linux, got {linux_udev}" + assert osx_udev == ["libusb"], f"Expected ['libusb'] for libudev-dev on macOS, got {osx_udev}" + assert win_udev == ["libusb"], f"Expected ['libusb'] for libudev-dev on Windows, got {win_udev}" + + # libomp-dev has different OpenMP implementations per platform + linux_omp = rosdep_to_conda_package_spec(Dependency(name="libomp-dev"), distro, linux_platform, package_map) + osx_omp = rosdep_to_conda_package_spec(Dependency(name="libomp-dev"), distro, osx_platform, package_map) + win_omp = rosdep_to_conda_package_spec(Dependency(name="libomp-dev"), distro, win_platform, package_map) + + assert linux_omp == ["libgomp"], f"Expected ['libgomp'] for libomp-dev on Linux, got {linux_omp}" + assert osx_omp == ["llvm-openmp"], f"Expected ['llvm-openmp'] for libomp-dev on macOS, got {osx_omp}" + assert win_omp == [], f"Expected [] for libomp-dev on Windows, got {win_omp}" + + +def test_robostack_require_opengl_handling(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test that REQUIRE_OPENGL is correctly handled for different platforms.""" + linux_platform = Platform("linux-64") + osx_platform = Platform("osx-64") + win_platform = Platform("win-64") + + # opengl package has REQUIRE_OPENGL handling + linux_opengl = rosdep_to_conda_package_spec(Dependency(name="opengl"), distro, linux_platform, package_map) + osx_opengl = rosdep_to_conda_package_spec(Dependency(name="opengl"), distro, osx_platform, package_map) + win_opengl = rosdep_to_conda_package_spec(Dependency(name="opengl"), distro, win_platform, package_map) + + # According to the code, REQUIRE_OPENGL should be replaced with actual packages on Linux + # and should add xorg packages for linux/osx/unix platforms + assert "libgl-devel" in linux_opengl, f"Expected libgl-devel in Linux opengl packages, got {linux_opengl}" + assert "libopengl-devel" in linux_opengl, f"Expected libopengl-devel in Linux opengl packages, got {linux_opengl}" + assert "xorg-libx11" in linux_opengl, f"Expected xorg-libx11 in Linux opengl packages, got {linux_opengl}" + assert "xorg-libxext" in linux_opengl, f"Expected xorg-libxext in Linux opengl packages, got {linux_opengl}" + + # macOS should get xorg packages but no gl-devel packages + assert "xorg-libx11" in osx_opengl, f"Expected xorg-libx11 in macOS opengl packages, got {osx_opengl}" + assert "xorg-libxext" in osx_opengl, f"Expected xorg-libxext in macOS opengl packages, got {osx_opengl}" + assert "libgl-devel" not in osx_opengl, f"Did not expect libgl-devel in macOS opengl packages, got {osx_opengl}" + + # Windows should have empty packages + assert win_opengl == [], f"Expected [] for opengl on Windows, got {win_opengl}" + + +def test_spec_with_entry_in_map(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test using a specifier string with a package which has already defined one in the package map""" + with pytest.raises(ValueError) as excinfo: + rosdep_to_conda_package_spec( + Dependency(name="xtensor", version_eq="2.0"), distro, Platform.current(), package_map + ) + assert "Version specifier can only be used for a package without constraint already present" in str(excinfo) + + +def test_spec_with_multiple_entries_in_map(package_map: dict[str, PackageMapEntry], distro: Distro): + """Test using a specifier string with a package which has multiple packages defined one in the package map""" + with pytest.raises(ValueError) as excinfo: + rosdep_to_conda_package_spec( + Dependency(name="boost", version_eq="2.0"), distro, Platform.current(), package_map + ) + assert "Version specifier can only be used for one package" in str(excinfo) + + +def test_rosdep_to_conda_package_spec_doesnt_add_matchspec_for_special_rosdeps(): + distro = Distro("jazzy") + host_platform = Platform("linux-64") + dep = Dependency(name="ament_cmake", version_eq="1.2.3") + + packages = rosdep_to_conda_package_spec(dep, distro, host_platform, {}) + + assert packages == ["ros-jazzy-ament-cmake==1.2.3"] + + +def test_rosdep_to_conda_package_spec_adds_matchspec_for_distro_packages(): + distro = Distro("jazzy") + host_platform = Platform("linux-64") + dep = Dependency(name="rclcpp", version_gte="18.0.0", version_lt="20.0.0") + + packages = rosdep_to_conda_package_spec(dep, distro, host_platform, {}) + + assert packages == ["ros-jazzy-rclcpp >=18.0.0,<20.0.0"] + + +def test_rosdep_to_conda_package_spec_adds_matchspec_for_ros_package_map_entries(): + distro = Distro("jazzy") + host_platform = Platform("linux-64") + package_map: dict[str, PackageMapEntry] = {"custom_ros_dep": {"ros": ["foo_util"]}} + dep = Dependency(name="custom_ros_dep", version_gte="3.1") + + packages = rosdep_to_conda_package_spec(dep, distro, host_platform, package_map) + + assert packages == ["ros-jazzy-foo-util >=3.1"] + + +def test_rosdep_to_conda_package_spec_adds_matchspec_for_unknown_dependencies(): + distro = Distro("jazzy") + host_platform = Platform("linux-64") + dep = Dependency(name="customlib", version_gt="1.0.0") + + packages = rosdep_to_conda_package_spec(dep, distro, host_platform, {}) + + assert packages == ["ros-jazzy-customlib >1.0.0"] + + +def test_rosdep_to_conda_package_spec_exception(): + distro = Distro("jazzy") + host_platform = Platform("linux-64") + dep = Dependency(name="rclcpp", version_gt="18.0.0", version_gte="20.0.0") + + with pytest.raises(ValueError, match=".* `>` and `>=`"): + rosdep_to_conda_package_spec(dep, distro, host_platform, {}) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_spec_merging.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_spec_merging.py new file mode 100644 index 0000000000..e5f784533d --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_spec_merging.py @@ -0,0 +1,56 @@ +import pytest +from pixi_build_backend.types.item import ItemPackageDependency +from pixi_build_ros.utils import merge_unique_items + + +def test_with_star_items(): + list1 = [ItemPackageDependency("ros-noetic *")] + list2 = [ItemPackageDependency("ros-noetic <=2.0")] + for res in merge_unique_items(list1, list2), merge_unique_items(list2, list1): + assert len(res) == 1 + assert res[0].concrete.binary_spec == "ros-noetic <=2.0" + + +def test_equal_items(): + list1 = [ItemPackageDependency("ros-noetic ==2.0")] + list2 = [ItemPackageDependency("ros-noetic <=2.0")] + for res in merge_unique_items(list1, list2), merge_unique_items(list2, list1): + assert len(res) == 1 + assert res[0].concrete.binary_spec == "ros-noetic ==2.0" + + +def test_multiple_specs_items(): + list1 = [ItemPackageDependency("ros-noetic >=2.0")] + list2 = [ItemPackageDependency("ros-noetic <=2.0,<3.0")] + res = merge_unique_items(list1, list2) + assert len(res) == 1 + assert res[0].concrete.binary_spec == "ros-noetic >=2.0,<=2.0,<3.0" + + +def test_different_specs_items(): + list1 = [ItemPackageDependency("ros-noetic >=2.0")] + list2 = [ItemPackageDependency("ros-noetic2 <=2.0,<3.0")] + res = merge_unique_items(list1, list2) + assert len(res) == 2 + + +def test_specs_with_spaces(): + list1 = [ItemPackageDependency("ros-noetic 2.* noetic")] + list2 = [ItemPackageDependency("ros-noetic <=2.0,<3.0")] + with pytest.raises(ValueError) as exc: + merge_unique_items(list1, list2) + assert "contains spaces" in str(exc) + + +def test_specs_with_none(): + list1 = [ItemPackageDependency("ros-noetic")] + list2 = [ItemPackageDependency("ros-noetic <=2.0,<3.0")] + result = merge_unique_items(list1, list2) + assert result[0].concrete.binary_spec == list2[0].concrete.binary_spec + + +def test_specs_with_source(): + list1 = [ItemPackageDependency('ros-noetic[url="https://blabla"]')] + list2 = [ItemPackageDependency("ros-noetic <=2.0,<3.0")] + result = merge_unique_items(list1, list2) + assert str(result[0].concrete.source_spec.spec) == str(list1[0].concrete.source_spec.spec) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/test_version_constraints.py b/pixi-build-backends/backends/pixi-build-ros/tests/test_version_constraints.py new file mode 100644 index 0000000000..2b17705ac2 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/test_version_constraints.py @@ -0,0 +1,206 @@ +from pathlib import Path +import tempfile + +from pixi_build_backend.types.intermediate_recipe import Script +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel + +from pixi_build_ros.distro import Distro +from pixi_build_ros.ros_generator import ROSGenerator + + +def test_generate_recipe_with_versions(package_xmls: Path, test_data_dir: Path, distro_noetic: Distro, snapshot): + """Test the generate_recipe function of ROSGenerator with versions.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "version_constraints.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create a minimal ProjectModel instance + model = ProjectModel() + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [str(test_data_dir / "other_package_map.yaml")], + } + + # Create host platform + host_platform = Platform("linux-64") + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has the expected requirements + # remove the build script as it container a tmp variable + generated_recipe.recipe.build.script = Script("") + assert generated_recipe.recipe.to_yaml() == snapshot + + +def test_generate_recipe_with_mutex_version(package_xmls: Path, test_data_dir: Path, distro_noetic: Distro, snapshot): + """Test the generate_recipe function of ROSGenerator with versions.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "version_constraints.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [str(test_data_dir / "other_package_map.yaml")], + } + + model_payload = { + "name": "custom_ros", + "version": "0.0.1", + "description": "Demo", + "authors": ["Tester the Tester"], + "targets": { + "defaultTarget": { + "hostDependencies": {"ros-distro-mutex": {"binary": {"version": "0.5.*"}}}, + "buildDependencies": {}, + "runDependencies": {"rich": {"binary": {"version": ">=10.0"}}}, + }, + "targets": {}, + }, + } + model = ProjectModel.from_dict(model_payload) + + # Create host platform + host_platform = Platform("linux-64") + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has the mutex requirements + # remove the build script as it container a tmp variable + generated_recipe.recipe.build.script = Script("") + assert generated_recipe.recipe.to_yaml() == snapshot + + +def test_generate_recipe_with_versions_in_model_and_package( + package_xmls: Path, test_data_dir: Path, distro_noetic: Distro, snapshot +): + """Test the generate_recipe function of ROSGenerator with versions.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "version_constraints.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [str(test_data_dir / "other_package_map.yaml")], + } + + model_payload = { + "name": "custom_ros", + "version": "0.0.1", + "description": "Demo", + "authors": ["Tester the Tester"], + "targets": { + "defaultTarget": { + "hostDependencies": {}, + "buildDependencies": {}, + "runDependencies": {"asio": {"binary": {"version": ">=9.0"}}}, + }, + "targets": {}, + }, + } + model = ProjectModel.from_dict(model_payload) + + # Create host platform + host_platform = Platform("linux-64") + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + manifest_path=str(temp_path), + host_platform=host_platform, + ) + + # Verify the generated recipe has the mutex requirements + # remove the build script as it container a tmp variable + generated_recipe.recipe.build.script = Script("") + assert generated_recipe.recipe.to_yaml() == snapshot + + +def test_generate_recipe_with_explicit_package_xml_path( + package_xmls: Path, test_data_dir: Path, distro_noetic: Distro, snapshot +): + """Test the generate_recipe function of ROSGenerator with versions.""" + # Create a temporary directory to simulate the package directory + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + # Copy the test package.xml to the temp directory + package_xml_source = package_xmls / "version_constraints.xml" + package_xml_dest = temp_path / "package.xml" + package_xml_dest.write_text(package_xml_source.read_text(encoding="utf-8")) + + # Create a minimal ProjectModel instance + model = ProjectModel() + + # Create config for ROS backend + config = { + "distro": distro_noetic, + "noarch": False, + "extra-package-mappings": [str(test_data_dir / "other_package_map.yaml")], + } + + # Create host platform + host_platform = Platform("linux-64") + + # Create ROSGenerator instance + generator = ROSGenerator() + + # Generate the recipe + generated_recipe = generator.generate_recipe( + model=model, + config=config, + # in other tests we always pass a directory, + # here we pass the explicit package.xml path + # to handle the situation that we do not multiply package.xml filename + manifest_path=str(package_xml_dest), + host_platform=host_platform, + ) + + # Verify the generated recipe has the expected requirements + # remove the build script as it container a tmp variable + generated_recipe.recipe.build.script = Script("") + assert generated_recipe.recipe.to_yaml() == snapshot diff --git a/pixi-build-backends/py-pixi-build-backend/.gitattributes b/pixi-build-backends/py-pixi-build-backend/.gitattributes new file mode 100644 index 0000000000..887a2c18f0 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/pixi-build-backends/py-pixi-build-backend/.gitignore b/pixi-build-backends/py-pixi-build-backend/.gitignore new file mode 100644 index 0000000000..ee6ef49b76 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/.gitignore @@ -0,0 +1,79 @@ +/target +!Cargo.lock +!pixi.lock + +# Byte-compiled / optimized / DLL files +__pycache__/ +.pytest_cache/ +*.py[cod] +.mypy_cache/ + +# C extensions +*.so + +# Distribution / packaging +.Python +.venv/ +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +include/ +man/ +venv/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt +pip-selfcheck.json + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +.DS_Store + +# Sphinx documentation +docs/_build/ + +# MkDocs build +site/ + +# PyCharm +.idea/ + +# VSCode +.vscode/ + +# Pyenv +.python-version +.ruff_cache diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.lock b/pixi-build-backends/py-pixi-build-backend/Cargo.lock new file mode 100644 index 0000000000..ff075feb8a --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.lock @@ -0,0 +1,7535 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if 1.0.4", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if 1.0.4", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "archspec" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9db67cd9cf4f56a10d2cbae6a3b552e5bd36701fd37b74a18c14a231bdf446c7" +dependencies = [ + "cfg-if 1.0.4", + "itertools 0.12.1", + "libc", + "serde", + "serde_json", + "sysctl", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e86f6d3dc9dc4352edeea6b8e499e13e3f5dc3b964d7ca5fd411415a3498473" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fd-lock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7569377d7062165f6f7834d9cb3051974a2d141433cc201c2f94c149e993cccf" +dependencies = [ + "async-trait", + "cfg-if 1.0.4", + "pin-project", + "rustix 0.38.44", + "thiserror 1.0.69", + "tokio", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if 1.0.4", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.2", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if 1.0.4", + "event-listener", + "futures-lite", + "rustix 1.1.2", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if 1.0.4", + "futures-core", + "futures-io", + "rustix 1.1.2", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-config" +version = "1.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0149602eeaf915158e14029ba0c78dedb8c08d554b024d54c8f239aab46511d" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sdk-signin", + "aws-sdk-sso", + "aws-sdk-ssooidc", + "aws-sdk-sts", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "base64-simd", + "bytes", + "fastrand", + "hex", + "http 1.4.0", + "p256", + "rand 0.8.5", + "ring", + "sha2", + "time", + "tokio", + "tracing", + "url", + "uuid", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01c9521fa01558f750d183c8c68c81b0155b9d193a4ba7f84c36bd1b6d04a06" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "zeroize", +] + +[[package]] +name = "aws-runtime" +version = "1.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce527fb7e53ba9626fc47824f25e256250556c40d8f81d27dd92aa38239d632" +dependencies = [ + "aws-credential-types", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "http-body 0.4.6", + "percent-encoding", + "pin-project-lite", + "tracing", + "uuid", +] + +[[package]] +name = "aws-sdk-s3" +version = "1.116.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4c10050aa905b50dc2a1165a9848d598a80c3a724d6f93b5881aa62235e4a5" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "fastrand", + "hex", + "hmac", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "lru", + "percent-encoding", + "regex-lite", + "sha2", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-signin" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539a464c46384f614b887611bf958ec5a9fb3bf6e3ee966f18fd0b040ced9996" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-sso" +version = "1.90.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f18e53542c522459e757f81e274783a78f8c81acdfc8d1522ee8a18b5fb1c66" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "1.92.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532f4d866012ffa724a4385c82e8dd0e59f0ca0e600f3f22d4c03b6824b34e4a" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "1.94.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be6fbbfa1a57724788853a623378223fe828fc4c09b146c992f0c95b6256174" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "1.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +dependencies = [ + "aws-credential-types", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "form_urlencoded", + "hex", + "hmac", + "http 0.2.12", + "http 1.4.0", + "percent-encoding", + "sha2", + "time", + "tracing", +] + +[[package]] +name = "aws-smithy-async" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.63.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "crc-fast", + "hex", + "http 0.2.12", + "http-body 0.4.6", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" +dependencies = [ + "aws-smithy-types", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.62.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "futures-util", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http-client" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "h2", + "http 1.4.0", + "hyper 1.8.1", + "hyper-rustls", + "hyper-util", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.61.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +dependencies = [ + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-observability" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +dependencies = [ + "aws-smithy-runtime-api", +] + +[[package]] +name = "aws-smithy-query" +version = "0.60.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +dependencies = [ + "aws-smithy-types", + "urlencoding", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-observability", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "fastrand", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "http-body 1.0.1", + "pin-project-lite", + "pin-utils", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +dependencies = [ + "aws-smithy-async", + "aws-smithy-types", + "bytes", + "http 0.2.12", + "http 1.4.0", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-types" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util 0.7.17", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "1.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +dependencies = [ + "aws-credential-types", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "rustc_version", + "tracing", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if 1.0.4", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bytes-utils" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + +[[package]] +name = "cache_control" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap-verbosity-flag" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d92b1fab272fe943881b77cc6e920d6543e5b1bfadbd5ed81c7c5a755742394" +dependencies = [ + "clap", + "log", + "tracing-core", +] + +[[package]] +name = "clap_builder" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_complete" +version = "4.5.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_complete_nushell" +version = "4.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" +dependencies = [ + "clap", + "clap_complete", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "coalesced_map" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cf5a7a58a9d5b914bddb0a3a2bd920af2be897114dc8128af022af81fc43b8b" +dependencies = [ + "dashmap", + "tokio", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "comfy-table" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +dependencies = [ + "crossterm", + "unicode-segmentation", + "unicode-width 0.2.2", +] + +[[package]] +name = "compression-codecs" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302266479cb963552d11bd042013a58ef1adc56768016c8b82b4199488f2d4ad" +dependencies = [ + "bzip2", + "compression-core", + "flate2", + "memchr", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "configparser" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" + +[[package]] +name = "console" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "content_inspector" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +dependencies = [ + "memchr", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc-fast" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" +dependencies = [ + "crc", + "digest", + "rand 0.9.2", + "regex", + "rustversion", +] + +[[package]] +name = "crc32c" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if 1.0.4", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.10.0", + "crossterm_winapi", + "document-features", + "parking_lot 0.12.5", + "rustix 1.1.2", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if 1.0.4", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "dbus" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "dbus-secret-service" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" +dependencies = [ + "aes", + "block-padding", + "cbc", + "dbus", + "fastrand", + "hkdf", + "num", + "once_cell", + "sha2", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "diffy" +version = "0.4.2" +source = "git+https://github.com/prefix-dev/diffy.git?branch=master#63377faae8a8aee053e4130ffd0189d6f3119d63" +dependencies = [ + "nu-ansi-term 0.50.3", + "strsim", + "thiserror 2.0.17", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "doc-comment" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "elsa" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9abf33c656a7256451ebb7d0082c5a471820c31269e49d807c538c252352186e" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if 1.0.4", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fancy-regex" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +dependencies = [ + "bit-set", + "regex-automata 0.4.13", + "regex-syntax 0.8.8", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "file_url" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765662dc0b26e038099a5a1529f5d48443111eea45377c312be892997651710e" +dependencies = [ + "itertools 0.14.0", + "percent-encoding", + "thiserror 2.0.17", + "typed-path", + "url", +] + +[[package]] +name = "filetime" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "libredox", + "windows-sys 0.60.2", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d91fd049c123429b018c47887d3f75a265540dd3c30ba9cb7bae9197edb03a" +dependencies = [ + "autocfg", + "tokio", +] + +[[package]] +name = "fs4" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" +dependencies = [ + "fs-err", + "rustix 1.1.2", + "tokio", + "windows-sys 0.59.0", +] + +[[package]] +name = "fslock" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if 1.0.4", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if 1.0.4", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.13", + "regex-syntax 0.8.8", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "goblin" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db6758c546e6f81f265638c980e5e84dfbda80cfd8e89e02f83454c8e8124bd" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.0", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util 0.7.17", + "tracing", +] + +[[package]] +name = "halfbrown" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed2f2edad8a14c8186b847909a41fbb9c3eafa44f88bd891114ed5019da09" +dependencies = [ + "hashbrown 0.16.1", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "http-cache-semantics" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92baf25cf0b8c9246baecf3a444546360a97b569168fdf92563ee6a47829920c" +dependencies = [ + "http 1.4.0", + "http-serde", + "reqwest", + "serde", + "time", +] + +[[package]] +name = "http-range-client" +version = "0.9.1" +source = "git+https://github.com/pka/http-range-client.git#fccfa852dbe7e875a50802c55ee6c5f69c634827" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "read-logger", + "reqwest", + "thiserror 1.0.69", +] + +[[package]] +name = "http-serde" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" +dependencies = [ + "http 1.4.0", + "serde", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http 1.4.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.4.0", + "hyper 1.8.1", + "hyper-util", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.1", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.13", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" +dependencies = [ + "console", + "portable-atomic", + "unicode-width 0.2.2", + "unit-prefix", + "vt100", + "web-time", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if 1.0.4", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f300e415e2134745ef75f04562dd0145405c2f7fd92065db029ac4b16b57fe90" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures", + "hyper 0.14.32", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + +[[package]] +name = "jsonrpc-stdio-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6878586767497326eb3d011bd6dbb583e9f008b11528f82fd47798ec46bb6c26" +dependencies = [ + "futures", + "jsonrpc-core", + "log", + "tokio", + "tokio-util 0.6.10", +] + +[[package]] +name = "keyring" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" +dependencies = [ + "byteorder", + "dbus-secret-service", + "log", + "secret-service", + "security-framework 2.11.1", + "security-framework 3.5.1", + "windows-sys 0.60.2", + "zbus", + "zeroize", +] + +[[package]] +name = "known-folders" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d463f34ca3c400fde3a054da0e0b8c6ffa21e4590922f3e18281bb5eeef4cbdc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "lazy-regex" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libdbus-sys" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if 1.0.4", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall 0.5.18", +] + +[[package]] +name = "libz-rs-sys" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b484ba8d4f775eeca644c452a56650e544bf7e617f1d170fe7298122ead5222" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "line-ending" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834e592123b39b7b3ba3fdc4b7e4822fad3ced449010f8229f843fe6dd1a33f1" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lzma-rust2" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fa48f5024824ecd3e8282cc948bd46fbd095aed5a98939de0594601a59b4e2b" + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "marked-yaml" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76cf4e66a8ffccfce983161b0faafe61a5ef03fe875ef2e3deb897e4e915fa" +dependencies = [ + "doc-comment", + "hashlink", + "yaml-rust2", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if 1.0.4", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if 1.0.4", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minijinja" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ea9ac0a51fb5112607099560fdf0f90366ab088a2a9e6e8ae176794e9806aa" +dependencies = [ + "aho-corasick", + "serde", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi", +] + +[[package]] +name = "netrc-rs" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2970fbbc8c785e8246234a7bd004ed66cd1ed1a35ec73669a92545e419b836" + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.10.0", + "cfg-if 1.0.4", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", + "cfg-if 1.0.4", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom-language" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2de2bc5b451bfedaef92c90b8939a8fff5770bdcc1fafd6239d086aab8fa6b29" +dependencies = [ + "nom", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opendal" +version = "0.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42afda58fa2cf50914402d132cc1caacff116a85d10c72ab2082bb7c50021754" +dependencies = [ + "anyhow", + "backon", + "base64", + "bytes", + "chrono", + "crc32c", + "futures", + "getrandom 0.2.16", + "http 1.4.0", + "http-body 1.0.1", + "log", + "md-5", + "percent-encoding", + "quick-xml 0.38.4", + "reqsign", + "reqwest", + "serde", + "serde_json", + "tokio", + "uuid", +] + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.0", + "cfg-if 1.0.4", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "ordermap" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed637741ced8fb240855d22a2b4f208dab7a06bcce73380162e5253000c16758" +dependencies = [ + "indexmap 2.12.1", + "serde", + "serde_core", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owo-colors" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.4", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path_resolver" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3604448dbdd00c6884479c066f040f503bf26f6b58de5358b5d2376ef4e78d11" +dependencies = [ + "ahash", + "fs-err", + "indexmap 2.12.1", + "itertools 0.14.0", + "proptest", + "tempfile", + "tracing", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.12.1", + "serde", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pixi-build-backend" +version = "0.1.5" +dependencies = [ + "async-trait", + "chrono", + "clap", + "clap-verbosity-flag", + "fs-err", + "indexmap 2.12.1", + "itertools 0.14.0", + "jsonrpc-core", + "jsonrpc-http-server", + "jsonrpc-stdio-server", + "miette", + "minijinja", + "ordermap", + "pathdiff", + "pixi_build_types", + "rattler-build", + "rattler_conda_types", + "rattler_digest", + "rattler_virtual_packages", + "recipe-stage0", + "serde", + "serde_json", + "serde_yaml", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "pixi_build_types" +version = "0.1.0" +source = "git+https://github.com/prefix-dev/pixi?branch=main#b2eae1791c2ddbc465ebc4b83a1a409fa0cd3649" +dependencies = [ + "ordermap", + "pixi_stable_hash", + "rattler_conda_types", + "rattler_digest", + "serde", + "serde_json", + "serde_with", + "url", +] + +[[package]] +name = "pixi_stable_hash" +version = "0.1.0" +source = "git+https://github.com/prefix-dev/pixi?branch=main#b2eae1791c2ddbc465ebc4b83a1a409fa0cd3649" +dependencies = [ + "ordermap", + "rattler_conda_types", + "rattler_digest", + "url", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64", + "indexmap 2.12.1", + "quick-xml 0.38.4", + "serde", + "time", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if 1.0.4", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppmd-rust" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax 0.8.8", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "purl" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60ebe4262ae91ddd28c8721111a0a6e9e58860e211fc92116c4bb85c98fd96ad" +dependencies = [ + "hex", + "percent-encoding", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "py-pixi-build-backend" +version = "0.4.1" +dependencies = [ + "async-trait", + "indexmap 2.12.1", + "miette", + "paste", + "pixi-build-backend", + "pixi_build_types", + "pyo3", + "pyo3-async-runtimes", + "pyo3-build-config", + "pythonize", + "rattler-build", + "rattler_conda_types", + "recipe-stage0", + "serde", + "serde_json", + "serde_yaml", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "pyo3" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba0117f4212101ee6544044dae45abe1083d30ce7b29c4b5cbdfa2354e07383" +dependencies = [ + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "serde", + "unindent", +] + +[[package]] +name = "pyo3-async-runtimes" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ee6d4cb3e8d5b925f5cdb38da183e0ff18122eb2048d4041c9e7034d026e23" +dependencies = [ + "futures", + "once_cell", + "pin-project-lite", + "pyo3", + "tokio", +] + +[[package]] +name = "pyo3-build-config" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc6ddaf24947d12a9aa31ac65431fb1b851b8f4365426e182901eabfb87df5f" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "025474d3928738efb38ac36d4744a74a400c901c7596199e20e45d98eb194105" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e64eb489f22fe1c95911b77c44cc41e7c19f3082fc81cce90f657cdc42ffded" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100246c0ecf400b475341b8455a9213344569af29a3c841d29270e53102e0fcf" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "pythonize" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11e06e4cff9be2bbf2bddf28a486ae619172ea57e79787f856572878c62dcfe2" +dependencies = [ + "pyo3", + "serde", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.1", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.1", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "rattler" +version = "0.39.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e81e973659132f6efba166ac6d5a6589fe80fe7f64dcfffd34f847416b490d7" +dependencies = [ + "anyhow", + "clap", + "console", + "digest", + "dirs", + "fs-err", + "futures", + "humantime", + "indexmap 2.12.1", + "indicatif", + "itertools 0.14.0", + "memchr", + "memmap2", + "once_cell", + "parking_lot 0.12.5", + "path_resolver", + "rattler_cache", + "rattler_conda_types", + "rattler_digest", + "rattler_menuinst", + "rattler_networking", + "rattler_package_streaming", + "rattler_shell", + "rayon", + "reflink-copy", + "regex", + "reqwest", + "reqwest-middleware", + "serde_json", + "simple_spawn_blocking", + "smallvec", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "rattler-build" +version = "0.53.0" +source = "git+https://github.com/prefix-dev/rattler-build?branch=main#126f56a74d7b4c11bf33577ff490892c882e2a47" +dependencies = [ + "anyhow", + "async-once-cell", + "async-recursion", + "base64", + "bzip2", + "chrono", + "clap", + "clap-verbosity-flag", + "clap_complete", + "clap_complete_nushell", + "comfy-table", + "console", + "content_inspector", + "dialoguer", + "diffy", + "dunce", + "flate2", + "fs-err", + "futures", + "globset", + "goblin", + "hex", + "http-range-client", + "ignore", + "indexmap 2.12.1", + "indicatif", + "itertools 0.14.0", + "lazy_static", + "line-ending", + "marked-yaml", + "memchr", + "memmap2", + "miette", + "minijinja", + "num_cpus", + "pathdiff", + "petgraph", + "rattler", + "rattler_cache", + "rattler_conda_types", + "rattler_config", + "rattler_digest", + "rattler_index", + "rattler_menuinst", + "rattler_networking", + "rattler_package_streaming", + "rattler_redaction", + "rattler_repodata_gateway", + "rattler_shell", + "rattler_solve", + "rattler_upload", + "rattler_virtual_packages", + "rayon", + "reflink-copy", + "regex", + "reqwest", + "reqwest-middleware", + "reqwest-retry 0.8.0", + "retry-policies 0.5.1", + "scroll", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "serde_yaml", + "sevenz-rust2", + "sha1", + "sha2", + "spdx", + "strum", + "tar", + "tempfile", + "terminal_size", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "toml", + "tracing", + "tracing-core", + "tracing-subscriber", + "unicode-normalization", + "url", + "walkdir", + "which", + "xz2", + "zip", + "zstd", +] + +[[package]] +name = "rattler_cache" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bc4a8e82344ee1df7d7db799121cd3b0539e5d32fa938d933a9030893a05e5" +dependencies = [ + "ahash", + "anyhow", + "dashmap", + "digest", + "dirs", + "fs-err", + "fs4", + "futures", + "itertools 0.14.0", + "parking_lot 0.12.5", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "rattler_redaction", + "rayon", + "reqwest", + "reqwest-middleware", + "serde_json", + "simple_spawn_blocking", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "rattler_conda_types" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195f89520ef4ef1f4514e25a45e1ac8f58d53aad25b26912c6e5230a65d27f4a" +dependencies = [ + "ahash", + "chrono", + "core-foundation 0.10.1", + "dirs", + "fancy-regex", + "file_url", + "fs-err", + "glob", + "hex", + "indexmap 2.12.1", + "itertools 0.14.0", + "lazy-regex", + "memmap2", + "nom", + "nom-language", + "purl", + "rattler_digest", + "rattler_macros", + "rattler_redaction", + "rayon", + "regex", + "serde", + "serde-untagged", + "serde_json", + "serde_repr", + "serde_with", + "serde_yaml", + "simd-json", + "smallvec", + "strum", + "tempfile", + "thiserror 2.0.17", + "tracing", + "typed-path", + "url", +] + +[[package]] +name = "rattler_config" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7df0b22cfc135ea3ebf4672557f413d784df96a63ea0c1f132929be451ca9a" +dependencies = [ + "console", + "fs-err", + "indexmap 2.12.1", + "rattler_conda_types", + "serde", + "serde_json", + "thiserror 2.0.17", + "toml", + "tracing", + "url", +] + +[[package]] +name = "rattler_digest" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dd76e371c2abd364cde7172105fdb6036d8d09df9cddeda5153846e2e964959" +dependencies = [ + "blake2", + "digest", + "generic-array", + "hex", + "md-5", + "serde", + "serde_bytes", + "serde_with", + "sha2", + "tokio", + "url", +] + +[[package]] +name = "rattler_index" +version = "0.27.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87262224940ddb7b88bfe1701d62aa02fcab07c7e896093326599b2faa407958" +dependencies = [ + "ahash", + "anyhow", + "bytes", + "chrono", + "clap", + "clap-verbosity-flag", + "console", + "fs-err", + "futures", + "indexmap 2.12.1", + "indicatif", + "opendal", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "rattler_s3", + "reqwest", + "retry-policies 0.4.0", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "tar", + "tokio", + "tracing", + "tracing-subscriber", + "url", + "zstd", +] + +[[package]] +name = "rattler_macros" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "988d5d7ace4fb1d7549008236cf08de95e8ea2f1f80754109324a08c31e6dc6a" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "rattler_menuinst" +version = "0.2.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf1641a7c96b3ad2a64197f67c9ce98d6f7057a582cd3375b02c52daf620c7b" +dependencies = [ + "chrono", + "configparser", + "dirs", + "fs-err", + "known-folders", + "once_cell", + "plist", + "quick-xml 0.37.5", + "rattler_conda_types", + "rattler_shell", + "regex", + "serde", + "serde_json", + "sha2", + "shlex", + "tempfile", + "thiserror 2.0.17", + "tracing", + "unicode-normalization", + "which", + "windows 0.61.3", + "windows-registry", +] + +[[package]] +name = "rattler_networking" +version = "0.25.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b8f4315b911308b1fe2ca1cbb6e77e203cf9b6c04ba58366358009c826c0762" +dependencies = [ + "anyhow", + "async-once-cell", + "async-trait", + "base64", + "dirs", + "fs-err", + "getrandom 0.3.4", + "http 1.4.0", + "itertools 0.14.0", + "keyring", + "netrc-rs", + "rattler_config", + "reqwest", + "reqwest-middleware", + "retry-policies 0.4.0", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.17", + "tracing", + "url", +] + +[[package]] +name = "rattler_package_streaming" +version = "0.23.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2670f4759e4bdbc8782dd2b95ecc2cb0c8d15144944989603ed0e5d0543a6461" +dependencies = [ + "bzip2", + "chrono", + "fs-err", + "futures-util", + "getrandom 0.2.16", + "getrandom 0.3.4", + "num_cpus", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_redaction", + "reqwest", + "reqwest-middleware", + "serde_json", + "simple_spawn_blocking", + "tar", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "tracing", + "url", + "zip", + "zstd", +] + +[[package]] +name = "rattler_pty" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86a84e6b351c46c7588bb8f5c90994be23d5c3c31cf87f9ec903cd91d9fc4246" +dependencies = [ + "libc", + "nix 0.30.1", + "signal-hook", + "tokio", +] + +[[package]] +name = "rattler_redaction" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aa5057629aeb20861919e9ae56875985d58028f3c6f433a20b5ded086e1cec5" +dependencies = [ + "reqwest", + "reqwest-middleware", + "url", +] + +[[package]] +name = "rattler_repodata_gateway" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f1b62b1f07e607be302037ea4208855fe347e16b2de0fb60ebeae221ede6bc8" +dependencies = [ + "anyhow", + "async-compression", + "async-fd-lock", + "async-trait", + "blake2", + "bytes", + "cache_control", + "cfg-if 1.0.4", + "chrono", + "coalesced_map", + "dashmap", + "dirs", + "file_url", + "fs-err", + "fslock", + "futures", + "hex", + "http 1.4.0", + "http-cache-semantics", + "humansize", + "humantime", + "itertools 0.14.0", + "json-patch", + "libc", + "memmap2", + "parking_lot 0.12.5", + "pin-project-lite", + "rattler_cache", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "rattler_redaction", + "reqwest", + "reqwest-middleware", + "retry-policies 0.4.0", + "rmp-serde", + "self_cell", + "serde", + "serde_json", + "serde_with", + "simple_spawn_blocking", + "strum", + "superslice", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "tracing", + "url", + "wasmtimer", + "windows-sys 0.60.2", + "zstd", +] + +[[package]] +name = "rattler_s3" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ad1587ca2b3eaee9b6456bac5dc9b96c57673b90aae8d4c1a0d50b548712fa" +dependencies = [ + "aws-config", + "aws-credential-types", + "aws-sdk-s3", + "aws-smithy-http-client", + "clap", + "rattler_networking", + "thiserror 2.0.17", + "tracing", + "url", +] + +[[package]] +name = "rattler_shell" +version = "0.25.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf943b29b84afe15168723a20f30a452e553413cf9680cffb45e25327a8f8b45" +dependencies = [ + "anyhow", + "enum_dispatch", + "fs-err", + "indexmap 2.12.1", + "itertools 0.14.0", + "rattler_conda_types", + "rattler_pty", + "serde_json", + "shlex", + "sysinfo", + "tempfile", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "rattler_solve" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7efc6be47e3df5a68a2091a81b14ca8cc980a257fba2c4c130da6242f33aa03" +dependencies = [ + "chrono", + "futures", + "humantime", + "itertools 0.14.0", + "rattler_conda_types", + "rattler_digest", + "resolvo", + "serde", + "tempfile", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "rattler_upload" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dcbc9a2a7dbef7b99bf1ea9684a0c72b73adb396cdb76b20e9725014a50b5ff" +dependencies = [ + "base64", + "clap", + "fs-err", + "futures", + "indicatif", + "miette", + "opendal", + "rattler_conda_types", + "rattler_config", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "rattler_redaction", + "rattler_solve", + "reqwest", + "reqwest-middleware", + "reqwest-retry 0.7.0", + "serde", + "serde_json", + "serde_yaml", + "sha2", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "tracing", + "url", +] + +[[package]] +name = "rattler_virtual_packages" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4d231340dda9a83849c40e3a353bfbdac4f9403dd235c200e05dfa0cb0e703a" +dependencies = [ + "archspec", + "libloading", + "nom", + "once_cell", + "plist", + "rattler_conda_types", + "regex", + "serde", + "thiserror 2.0.17", + "tracing", + "winver", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-logger" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7f715a23c7db804b71eb9162a9cf210b89e99db9c3649a2a038d13b7594a99" +dependencies = [ + "log", +] + +[[package]] +name = "recipe-stage0" +version = "0.1.1" +dependencies = [ + "hashlink", + "indexmap 2.12.1", + "itertools 0.14.0", + "marked-yaml", + "rattler-build", + "rattler_conda_types", + "serde", + "serde_yaml", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "reflink-copy" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23bbed272e39c47a095a5242218a67412a220006842558b03fe2935e8f3d7b92" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "rustix 1.1.2", + "windows 0.62.2", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.13", + "regex-syntax 0.8.8", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.8", +] + +[[package]] +name = "regex-lite" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqsign" +version = "0.16.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43451dbf3590a7590684c25fb8d12ecdcc90ed3ac123433e500447c7d77ed701" +dependencies = [ + "anyhow", + "async-trait", + "base64", + "chrono", + "form_urlencoded", + "getrandom 0.2.16", + "hex", + "hmac", + "home", + "http 1.4.0", + "log", + "percent-encoding", + "quick-xml 0.37.5", + "rand 0.8.5", + "reqwest", + "rust-ini", + "serde", + "serde_json", + "sha1", + "sha2", + "tokio", +] + +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "async-compression", + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util 0.7.17", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "git+https://github.com/astral-sh/reqwest-middleware?rev=7650ed76215a962a96d94a79be71c27bffde7ab2#7650ed76215a962a96d94a79be71c27bffde7ab2" +dependencies = [ + "anyhow", + "async-trait", + "http 1.4.0", + "reqwest", + "serde", + "thiserror 2.0.17", + "tower-service", +] + +[[package]] +name = "reqwest-retry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c73e4195a6bfbcb174b790d9b3407ab90646976c55de58a6515da25d851178" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "getrandom 0.2.16", + "http 1.4.0", + "hyper 1.8.1", + "parking_lot 0.11.2", + "reqwest", + "reqwest-middleware", + "retry-policies 0.4.0", + "thiserror 1.0.69", + "tokio", + "tracing", + "wasm-timer", +] + +[[package]] +name = "reqwest-retry" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "105747e3a037fe5bf17458d794de91149e575b6183fc72c85623a44abb9683f5" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "getrandom 0.2.16", + "http 1.4.0", + "hyper 1.8.1", + "reqwest", + "reqwest-middleware", + "retry-policies 0.5.1", + "thiserror 2.0.17", + "tokio", + "tracing", + "wasmtimer", +] + +[[package]] +name = "resolvo" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670175f9a825ad2419bea0e14bfe74e5dcc0227ec7a652a655b1c11e2b911754" +dependencies = [ + "ahash", + "bitvec", + "elsa", + "event-listener", + "futures", + "indexmap 2.12.1", + "itertools 0.14.0", + "petgraph", + "tracing", +] + +[[package]] +name = "retry-policies" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5875471e6cab2871bc150ecb8c727db5113c9338cc3354dc5ee3425b6aa40a1c" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "retry-policies" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a4bd6027df676bcb752d3724db0ea3c0c5fc1dd0376fec51ac7dcaf9cc69be" +dependencies = [ + "rand 0.9.2", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if 1.0.4", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if 1.0.4", + "ordered-multimap", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secret-service" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4d35ad99a181be0a60ffcbe85d680d98f87bdc4d7644ade319b87076b9dbfd4" +dependencies = [ + "aes", + "cbc", + "futures-util", + "generic-array", + "hkdf", + "num", + "once_cell", + "rand 0.8.5", + "serde", + "sha2", + "zbus", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "indexmap 2.12.1", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.1.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.12.1", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sevenz-rust2" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414256b6bb303a2a38ad800096664c3b332295c17b7ef0674bf0acf44284036c" +dependencies = [ + "aes", + "bzip2", + "cbc", + "crc32fast", + "getrandom 0.3.4", + "js-sys", + "lzma-rust2", + "ppmd-rust", + "sha2", + "wasm-bindgen", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures", + "digest", + "sha2-asm", +] + +[[package]] +name = "sha2-asm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +dependencies = [ + "cc", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd-json" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4255126f310d2ba20048db6321c81ab376f6a6735608bf11f0785c41f01f64e3" +dependencies = [ + "halfbrown", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple_spawn_blocking" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55c0b0b683828aa9d4f5c0e59b0c856a12c30a65b5f1ca4292664734d76fa9c2" +dependencies = [ + "tokio", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spdx" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cf87c0efffc158b9dde4d6e0567a43e4383adc4c949e687a2039732db2f23a" +dependencies = [ + "smallvec", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "superslice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f" + +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sysctl" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" +dependencies = [ + "bitflags 2.10.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "sysinfo" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.61.3", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix 1.1.2", + "windows-sys 0.60.2", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if 1.0.4", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot 0.12.5", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.1", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap 2.12.1", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term 0.46.0", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typed-path" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c462d18470a2857aa657d338af5fa67170bb48bcc80a296710ce3b0802a32566" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "rand 0.9.2", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-trait" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e80f0c733af0720a501b3905d22e2f97662d8eacfe082a75ed7ffb5ab08cb59" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "vt100" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ff75fb8fa83e609e685106df4faeffdf3a735d3c74ebce97ec557d5d36fd9" +dependencies = [ + "itoa", + "unicode-width 0.2.2", + "vte", +] + +[[package]] +name = "vte" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" +dependencies = [ + "arrayvec", + "memchr", +] + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if 1.0.4", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if 1.0.4", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.12.5", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" +dependencies = [ + "env_home", + "rustix 1.1.2", + "winsafe", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "winver" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0e7162b9e282fd75a0a832cce93994bdb21208d848a418cd05a5fdd9b9ab33" +dependencies = [ + "windows 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.2", +] + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap 2.12.1", + "memchr", + "time", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36134c44663532e6519d7a6dfdbbe06f6f8192bde8ae9ed076e9b213f0e31df7" + +[[package]] +name = "zmij" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3280a1b827474fcd5dbef4b35a674deb52ba5c312363aef9135317df179d81b" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.toml b/pixi-build-backends/py-pixi-build-backend/Cargo.toml new file mode 100644 index 0000000000..cf8d10285d --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.toml @@ -0,0 +1,81 @@ +[package] +name = "py-pixi-build-backend" +version = "0.4.1" +edition = "2024" + +[lib] +name = "pixi_build_backend" +crate-type = ["cdylib"] + +[features] +default = ["rustls-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] +native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] + +[dependencies] +# PyO3 for Python bindings +pyo3 = { version = "0.26", features = [ + "extension-module", + "abi3-py38", + "serde", + "py-clone", + "experimental-async", +] } +pyo3-async-runtimes = { version = "0.26.0", features = ["tokio-runtime"] } + +# Core pixi-build dependencies (local crates) +pixi-build-backend = { path = "../crates/pixi-build-backend" } +recipe-stage0 = { path = "../crates/recipe-stage0" } + +# Pixi types +pixi_build_types = { git = "https://github.com/prefix-dev/pixi", branch = "main" } + +# Async support +async-trait = "0.1" + +# Core serialization and async support +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +serde_yaml = "0.9" +tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread", "rt"] } +rattler_conda_types = { version = "0.42.0", default-features = false } + +# Rattler-build +rattler-build = { git = "https://github.com/prefix-dev/rattler-build", branch = "main", default-features = false } + +# Error handling +miette = "7.5.0" +thiserror = "2.0.12" + +# Utilities +indexmap = "2.7.1" +pythonize = "0.26" +paste = "1.0.15" + +[build-dependencies] +pyo3-build-config = "0.26" + +[profile.ci] +codegen-units = 16 +inherits = "release" +lto = false +opt-level = 0 +strip = false + +# Prevent package from thinking it's in the workspace +[workspace] + + +[patch.crates-io] +# This is a temporary patch to get `cargo vendor` to work with the `uv` and pep508_rs` crates. +reqwest-middleware = { git = "https://github.com/astral-sh/reqwest-middleware", rev = "7650ed76215a962a96d94a79be71c27bffde7ab2" } + +[patch."https://github.com/prefix-dev/pixi"] +#pixi_build_types = { git = "https://github.com/prefix-dev/pixi", branch = "main" } + +# Local path overrides for development +#pixi_build_types = { path = "../../pixi_build_types/crates/pixi_build_types" } +#pixi_consts = { path = "../../pixi/crates/pixi_consts" } +#pixi_manifest = { path = "../../pixi/crates/pixi_manifest" } +#pixi_spec = { path = "../../pixi/crates/pixi_spec" } +#pixi_build_type_conversions = { path = "../../pixi/crates/pixi_build_type_conversions" } diff --git a/pixi-build-backends/py-pixi-build-backend/build.rs b/pixi-build-backends/py-pixi-build-backend/build.rs new file mode 100644 index 0000000000..dace4a9ba9 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/build.rs @@ -0,0 +1,3 @@ +fn main() { + pyo3_build_config::add_extension_module_link_args(); +} diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/__init__.py b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/build_script.py b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/build_script.py new file mode 100644 index 0000000000..054781c5a3 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/build_script.py @@ -0,0 +1,78 @@ +""" +Build script generation for Python backend. +""" + +from enum import Enum +from pathlib import Path +from typing import Any, Dict, List +import platform + + +class Installer(Enum): + """Available Python installers.""" + + UV = "uv" + PIP = "pip" + + def package_name(self) -> str: + """Get the package name for this installer.""" + return self.value + + @classmethod + def determine_installer(cls, dependencies: Dict[str, Any]) -> "Installer": + """Determine which installer to use based on dependencies.""" + if "uv" in dependencies: + return cls.UV + return cls.PIP + + +class BuildPlatform(Enum): + """Build platform types.""" + + WINDOWS = "windows" + UNIX = "unix" + + @classmethod + def current(cls) -> "BuildPlatform": + """Get current build platform.""" + return cls.WINDOWS if platform.system() == "Windows" else cls.UNIX + + +class BuildScriptContext: + """Context for build script generation.""" + + def __init__( + self, + installer: Installer, + build_platform: BuildPlatform, + editable: bool, + manifest_root: Path, + ): + self.installer = installer + self.build_platform = build_platform + self.editable = editable + self.manifest_root = manifest_root + + def render(self) -> List[str]: + """Render the build script.""" + if self.build_platform == BuildPlatform.WINDOWS: + python_var = "%PYTHON%" + src_dir = str(self.manifest_root) if self.editable else "%SRC_DIR%" + else: + python_var = "$PYTHON" + src_dir = str(self.manifest_root) if self.editable else "$SRC_DIR" + + editable_option = " --editable" if self.editable else "" + common_options = f"-vv --no-deps --no-build-isolation{editable_option}" + + if self.installer == Installer.UV: + command = f'uv pip install --python "{python_var}" {common_options} "{src_dir}"' + else: + command = f'"{python_var}" -m pip install --ignore-installed {common_options} "{src_dir}"' + + lines = [command] + + if self.build_platform == BuildPlatform.WINDOWS: + lines.append("if errorlevel 1 exit 1") + + return lines diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/main.py b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/main.py new file mode 100644 index 0000000000..a82a72168c --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/main.py @@ -0,0 +1,8 @@ +from .python_generator import PythonGenerator +from pixi_build_backend.main import run_backend + + +def main() -> None: + """Main entry point for the script.""" + generator = PythonGenerator() + run_backend(generator) diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/python_generator.py b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/python_generator.py new file mode 100644 index 0000000000..55ab7e46c7 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/python_generator.py @@ -0,0 +1,118 @@ +""" +Python generator implementation using Python bindings. +""" + +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, Optional, List, Any +from pixi_build_backend.types.generated_recipe import ( + GenerateRecipeProtocol, + GeneratedRecipe, +) +from pixi_build_backend.types.intermediate_recipe import NoArchKind, Python, Script +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel +from pixi_build_backend.types.python_params import PythonParams +from pixi_build_backend.types.item import ItemPackageDependency + +from .build_script import BuildScriptContext, Installer, BuildPlatform +from .utils import extract_entry_points +from .utils import read_pyproject_toml, get_build_input_globs, get_editable_setting + + +@dataclass +class PythonBackendConfig: + """Python backend configuration.""" + + noarch: Optional[bool] = None + env: Optional[Dict[str, str]] = None + debug_dir: Optional[Path] = None + extra_input_globs: Optional[List[str]] = None + + def is_noarch(self) -> bool: + """Whether to build a noarch package or a platform-specific package.""" + return self.noarch is None or self.noarch + + def get_debug_dir(self) -> Optional[Path]: + """Get debug directory if set.""" + return self.debug_dir + + +class PythonGenerator(GenerateRecipeProtocol): + """Python recipe generator using Python bindings.""" + + def generate_recipe( + self, + model: ProjectModel, + config: Dict[str, Any], + manifest_path: str, + host_platform: Platform, + python_params: Optional[PythonParams] = None, + channels: Optional[List[str]] = None, + ) -> GeneratedRecipe: + """Generate a recipe for a Python package.""" + backend_config: PythonBackendConfig = PythonBackendConfig(**config) + + manifest_root = Path(manifest_path).parent + + # Create base recipe from model + generated_recipe = GeneratedRecipe.from_model(model) + + # Get recipe components + recipe = generated_recipe.recipe + requirements = recipe.requirements + + # Resolve requirements for the host platform + resolved_requirements = requirements.resolve(host_platform) + + # Determine installer (pip or uv) + installer = Installer.determine_installer(resolved_requirements.host) + installer_name = installer.package_name() + + # Add installer to host requirements if not present + if installer_name not in resolved_requirements.host: + requirements.host.append(ItemPackageDependency(installer_name)) + + # Add python to both host and run requirements if not present + if "python" not in resolved_requirements.host: + requirements.host.append(ItemPackageDependency("python")) + if "python" not in resolved_requirements.run: + requirements.run.append(ItemPackageDependency("python")) + + # Determine build platform + build_platform = BuildPlatform.current() + + # Get editable setting + editable = get_editable_setting(python_params) + + # Generate build script + build_script_context = BuildScriptContext( + installer=installer, + build_platform=build_platform, + editable=editable, + manifest_root=manifest_root, + ) + build_script_lines = build_script_context.render() + + # Determine noarch setting + noarch_kind = NoArchKind.python() if backend_config.is_noarch() else None + + # Read pyproject.toml + pyproject_manifest = read_pyproject_toml(manifest_root) + + # Extract entry points + entry_points = extract_entry_points(pyproject_manifest) + + # Update recipe components + recipe.build.python = Python(entry_points=entry_points) + recipe.build.noarch = noarch_kind + recipe.build.script = Script( + content=build_script_lines, + env=backend_config.env, + ) + + return generated_recipe + + def extract_input_globs_from_build(self, config: PythonBackendConfig, workdir: Path, editable: bool) -> List[str]: + """Extract input globs for the build.""" + return get_build_input_globs(config, workdir, editable) diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/utils.py b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/utils.py new file mode 100644 index 0000000000..30f5979025 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pixi_build_python/utils.py @@ -0,0 +1,155 @@ +import os +from pathlib import Path +from typing import Any, Optional, Dict, List +import re +import toml + + +def parse_entry_points_from_scripts(scripts: Dict[str, str]) -> List[str]: + """ + Parse entry points from a dictionary of scripts. + + This function validates entry point format and converts a scripts dictionary + to a list of properly formatted entry point strings. + + Parameters + ---------- + scripts : Dict[str, str] + Dictionary mapping script names to entry points (e.g., {"script": "module:function"}) + + Returns + ------- + List[str] + List of formatted entry point strings (e.g., ["script = module:function"]) + + Raises + ------ + ValueError + If any entry point has invalid format + + Examples + -------- + >>> scripts = {"my_script": "mymodule:main", "other": "pkg.mod:func"} + >>> parse_entry_points_from_scripts(scripts) + ['my_script = mymodule:main', 'other = pkg.mod:func'] + """ + if not scripts: + return [] + + entry_points = [] + # Entry point format validation regex: name should be valid Python identifier-like, + # and entry point should be in format "module:function" or "module.submodule:function" + entry_point_pattern = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*:[a-zA-Z_][a-zA-Z0-9_]*$") + + for name, entry_point in scripts.items(): + # Validate entry point format + if not entry_point_pattern.match(entry_point): + raise ValueError(f"Invalid entry point format: {entry_point}") + + # Format as "name = entry_point" + formatted_entry_point = f"{name} = {entry_point}" + entry_points.append(formatted_entry_point) + + return entry_points + + +def extract_entry_points(pyproject_manifest: Optional[Dict[str, Any]]) -> List[str]: + """ + Extract entry points from pyproject.toml. + + Parameters + ---------- + pyproject_manifest : Optional[dict] + The pyproject.toml manifest dictionary. + + Returns + ------- + list + A list of entry points, or empty list if no scripts found. + + Examples + -------- + ```python + >>> manifest = {"project": {"scripts": {"my_script": "module:function"}}} + >>> extract_entry_points(manifest) + ['my_script = module:function'] + >>> extract_entry_points(None) + [] + >>> extract_entry_points({}) + [] + >>> + ``` + """ + if not pyproject_manifest: + return [] + + project = pyproject_manifest.get("project", {}) + scripts: Dict[str, str] = project.get("scripts", {}) + + if not scripts: + return [] + + # Use the Python implementation instead of FFI + return parse_entry_points_from_scripts(scripts) + + +def read_pyproject_toml(manifest_root: Path) -> Optional[Dict[str, Any]]: + """Read pyproject.toml if it exists.""" + pyproject_path = manifest_root / "pyproject.toml" + if pyproject_path.exists(): + return toml.load(pyproject_path) + return None + + +def get_build_input_globs(config: Any, workdir: Path, editable: bool) -> List[str]: + """Get build input globs for Python package.""" + base_globs = [ + # Source files + "**/*.c", + "**/*.cpp", + "**/*.rs", + "**/*.sh", + # Common data files + "**/*.json", + "**/*.yaml", + "**/*.yml", + "**/*.txt", + # Project configuration + "setup.py", + "setup.cfg", + "pyproject.toml", + "requirements*.txt", + "Pipfile", + "Pipfile.lock", + "poetry.lock", + "tox.ini", + # Build configuration + "Makefile", + "MANIFEST.in", + "tests/**/*.py", + "docs/**/*.rst", + "docs/**/*.md", + # Versioning + "VERSION", + "version.py", + ] + + python_globs = [] if editable else ["**/*.py", "**/*.pyx"] + + all_globs = base_globs + python_globs + if hasattr(config, "extra_input_globs"): + all_globs.extend(config.extra_input_globs) + + return all_globs + + +def get_editable_setting(python_params: Any) -> bool: + """Get editable setting from environment or params.""" + env_editable = os.environ.get("BUILD_EDITABLE_PYTHON", "").lower() == "true" + if env_editable: + return True + + if python_params and hasattr(python_params, "editable"): + return bool(python_params.editable) + + return False diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml new file mode 100644 index 0000000000..937b6226f0 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml @@ -0,0 +1,58 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "pixi-build-python" +description = "Python bindings for pixi-build-backends" +requires-python = ">=3.8" +license = { text = "MIT OR Apache-2.0" } +authors = [{ name = "pixi contributors" }] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Rust", + "Topic :: Software Development :: Build Tools", +] +keywords = ["build", "conda", "package", "python", "rust"] +version = "0.0.1" +dependencies = [ + "py-rattler", + "asyncio", + "toml", + # "py-pixi-build-backend @ file:../../" +] + +[project.scripts] +pixi-build-python = "pixi_build_python.main:main" + + +[project.urls] +Homepage = "https://github.com/prefix-dev/pixi-build-backends" +Repository = "https://github.com/prefix-dev/pixi-build-backends" +"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.pixi.workspace] +channels = ["https://prefix.dev/conda-forge"] +preview = ["pixi-build"] + +[tool.pixi.package.build] +backend = { name = "pixi-build-python", version = "*" } +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[tool.pixi.package.host-dependencies] +hatchling = "*" diff --git a/pixi-build-backends/py-pixi-build-backend/pixi.lock b/pixi-build-backends/py-pixi-build-backend/pixi.lock new file mode 100644 index 0000000000..e3171e6fbc --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi.lock @@ -0,0 +1,1620 @@ +version: 6 +environments: + ci: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.44-h4bf12b8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.1.0-h4393ad2_4.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.1.0-h4c094af_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.1.0-h97b714f_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/maturin-1.10.2-py310hb4e1661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mypy-1.17.1-py313h07c4f96_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.0.0-py313h07c4f96_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.8-h813ae00_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/maturin-1.10.2-py310h646694a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/mypy-1.17.1-py312h2f459f6_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/psutil-7.0.0-py312h2f459f6_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.8-hd9f4cfa_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/maturin-1.10.2-py310ha114163_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.17.1-py313hcdf3177_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.0.0-py313hcdf3177_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.8-h382de68_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/maturin-1.10.2-py310h24db72e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/mypy-1.17.1-py312he06e257_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/psutil-7.0.0-py312he06e257_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.8-h15e3a1f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + default: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.44-h4bf12b8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.1.0-h4393ad2_4.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.1.0-h4c094af_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.1.0-h97b714f_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/maturin-1.10.2-py310hb4e1661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mypy-1.17.1-py313h07c4f96_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.0.0-py313h07c4f96_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.8-h813ae00_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/maturin-1.10.2-py310h646694a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/mypy-1.17.1-py312h2f459f6_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/psutil-7.0.0-py312h2f459f6_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.8-hd9f4cfa_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/maturin-1.10.2-py310ha114163_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.17.1-py313hcdf3177_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.0.0-py313hcdf3177_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.8-h382de68_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/maturin-1.10.2-py310h24db72e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/mypy-1.17.1-py312he06e257_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/psutil-7.0.0-py312he06e257_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.8-h15e3a1f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.44-h4bf12b8_1.conda + sha256: 8556847f91a85c31ef65b05b7e9182a52775616d5d4e550dfb48cdee5fd35687 + md5: e45cfedc8ca5630e02c106ea36d2c5c6 + depends: + - ld_impl_linux-64 2.44 h1423503_1 + - sysroot_linux-64 + license: GPL-3.0-only + license_family: GPL + size: 3781716 + timestamp: 1752032761608 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + size: 154489 + timestamp: 1754210967212 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + size: 154402 + timestamp: 1754210968730 +- conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + size: 21284 + timestamp: 1746947398083 +- conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.1.0-h4393ad2_4.conda + sha256: 59e2af2cb3d0592d0b61ee81eaba60a24321676c053630f092957909c70d6940 + md5: bd50f28da1e011caf83ebfe967dbcc94 + depends: + - binutils_impl_linux-64 >=2.40 + - libgcc >=15.1.0 + - libgcc-devel_linux-64 15.1.0 h4c094af_104 + - libgomp >=15.1.0 + - libsanitizer 15.1.0 h97b714f_4 + - libstdcxx >=15.1.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 77268492 + timestamp: 1753903968595 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11474 + timestamp: 1733223232820 +- conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + sha256: 305c22a251db227679343fd73bfde121e555d466af86e537847f4c8b9436be0d + md5: ff007ab0f0fdc53d245972bba8a6d40c + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 1272697 + timestamp: 1752669126073 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 676044 + timestamp: 1752032747103 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 72450 + timestamp: 1752719744781 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 141322 + timestamp: 1752719767870 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 44978 + timestamp: 1743435053850 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824153 + timestamp: 1753903866511 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.1.0-h4c094af_104.conda + sha256: 90a2a128bed4926ab90db5e19989d68a0bff412e993c1324fe004ef02337e3e9 + md5: 05eec361e8eca1ad47bad0f8b97a9d67 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2726287 + timestamp: 1753903789289 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29249 + timestamp: 1753903872571 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447289 + timestamp: 1753903801049 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104826 + timestamp: 1749230155443 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 91183 + timestamp: 1748393666725 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.1.0-h97b714f_4.conda + sha256: 1a65aeb39ffc7c1ed41c4aebd05263016d70b6f8da21a5185d0c3dba459a0931 + md5: 9577e03ec70b7986ab78a3f057af0df8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.1.0 + - libstdcxx >=15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 5139090 + timestamp: 1753903908812 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 932581 + timestamp: 1753948484112 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + sha256: 466366b094c3eb4b1d77320530cbf5400e7a10ab33e4824c200147488eebf7a6 + md5: 156bfb239b6a67ab4a01110e6718cbc4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 980121 + timestamp: 1753948554003 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 902645 + timestamp: 1753948599139 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1288499 + timestamp: 1753948889360 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + sha256: b5b239e5fca53ff90669af1686c86282c970dd8204ebf477cf679872eb6d48ac + md5: 3c376af8888c386b9d3d1c2701e2f3ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3903453 + timestamp: 1753903894186 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/maturin-1.10.2-py310hb4e1661_0.conda + noarch: python + sha256: 4781ee000a457223e8352a9bb3ac1def63fa6a443c5f5f204306f523dddaf12c + md5: c4de19da03e319e4ede50d1499905b5a + depends: + - python + - tomli >=1.1.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 7416822 + timestamp: 1763557505381 +- conda: https://prefix.dev/conda-forge/osx-64/maturin-1.10.2-py310h646694a_0.conda + noarch: python + sha256: 112f9c937744f348758f30945a927603d44422994aef6e8fb83330210393d8ed + md5: 2ef5323358e189ab242014e5dfceb52c + depends: + - python + - tomli >=1.1.0 + - __osx >=10.13 + - openssl >=3.5.4,<4.0a0 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 7130046 + timestamp: 1763557621552 +- conda: https://prefix.dev/conda-forge/osx-arm64/maturin-1.10.2-py310ha114163_0.conda + noarch: python + sha256: 8f93df754cd4ee81de8e3df3c281182aeaef5a2b1b5d0ad1004a94425ae9664f + md5: ec9d241f482996d89ca311b8143a9960 + depends: + - python + - tomli >=1.1.0 + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 6717179 + timestamp: 1763557650650 +- conda: https://prefix.dev/conda-forge/win-64/maturin-1.10.2-py310h24db72e_0.conda + noarch: python + sha256: fa3ea7a0da1c0c01b448de608eba7835ecd1bc5388bc4e0d54ee4a5d401f42f6 + md5: a4cd98feffbc44c973a5e7940dc5ab9f + depends: + - python + - tomli >=1.1.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + size: 6743391 + timestamp: 1763557491750 +- conda: https://prefix.dev/conda-forge/linux-64/mypy-1.17.1-py313h07c4f96_0.conda + sha256: c8f301b50cf1b43959304e31d4e1cf4b01ccc5a1ccb4ec4951df2cb0d2a2f146 + md5: e29be50293ada53990551bf37b3bd54c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + size: 17336937 + timestamp: 1754002027984 +- conda: https://prefix.dev/conda-forge/osx-64/mypy-1.17.1-py312h2f459f6_0.conda + sha256: d22d774f0aa5363205bf127fa19b2dfedf7630116ef5a506c795714dfb853cfa + md5: 7aa6026b32e0b4726b13b58cc58e1ad6 + depends: + - __osx >=10.13 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + size: 12827570 + timestamp: 1754001914845 +- conda: https://prefix.dev/conda-forge/osx-arm64/mypy-1.17.1-py313hcdf3177_0.conda + sha256: de86705b106363008fd1527174bc6a4e3d435e9e9c59bd0b577c98ad21dce670 + md5: dcbd013e9939fa4903e214344b560692 + depends: + - __osx >=11.0 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + size: 10482819 + timestamp: 1754001614290 +- conda: https://prefix.dev/conda-forge/win-64/mypy-1.17.1-py312he06e257_0.conda + sha256: cf163c187fa4a53fb9213c2a2da0db70adfd5432132b71323919fb9e915d1c5b + md5: 2350dfef1eb807972168872c1fed8b8b + depends: + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 10122280 + timestamp: 1754002942945 +- conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11766 + timestamp: 1745776666688 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822259 + timestamp: 1738196181298 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3165399 + timestamp: 1762839186699 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + sha256: 36fe9fb316be22fcfb46d5fa3e2e85eec5ef84f908b7745f68f768917235b2d5 + md5: 3f50cdf9a97d0280655758b735781096 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2778996 + timestamp: 1762840724922 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3108371 + timestamp: 1762839712322 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9275175 + timestamp: 1754467904482 +- conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + size: 62477 + timestamp: 1745345660407 +- conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + sha256: 2f1caf273c7816fcff6e8438138c29d08264f8371dc0e23f86e993ccc7e978dc + md5: 5a6bde274af5252392b446ead19047d0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + size: 136130 + timestamp: 1745559387060 +- conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + sha256: 4d5e2faca810459724f11f78d19a0feee27a7be2b3fc5f7abbbec4c9fdcae93d + md5: bf47878473e5ab9fdb4115735230e191 + depends: + - python >=3.13.0a0 + license: MIT + license_family: MIT + size: 1177084 + timestamp: 1762776338614 +- conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + sha256: b67692da1c0084516ac1c9ada4d55eaf3c5891b54980f30f3f444541c2706f1e + md5: c55515ca43c6444d2572e0f0d93cb6b9 + depends: + - python >=3.10,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + size: 1177534 + timestamp: 1762776258783 +- conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 24246 + timestamp: 1747339794916 +- conda: https://prefix.dev/conda-forge/linux-64/psutil-7.0.0-py313h07c4f96_1.conda + sha256: 9182273778a10b2a82343c5c1c8b57f4551dd07d9a639585d468f4a7fe5ff1e8 + md5: 5a7c24c9dc49128731ae565cf598cde4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 474571 + timestamp: 1755851494108 +- conda: https://prefix.dev/conda-forge/osx-64/psutil-7.0.0-py312h2f459f6_1.conda + sha256: 818b08bcb49a1d2384b6244c0910ec1daec5c7182bfdf0e7b878d7526c0683e9 + md5: d2d5563cc54683a441e2de5fd332911d + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 474384 + timestamp: 1755851651170 +- conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.0.0-py313hcdf3177_1.conda + sha256: 4964c94067fdf290d4790095ead992b2a3afb438bff8bd9b51c444d97fb63914 + md5: 1ce8cf644e210b54665d8e46850d7567 + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 484934 + timestamp: 1755851718841 +- conda: https://prefix.dev/conda-forge/win-64/psutil-7.0.0-py312he06e257_1.conda + sha256: 5da4eabbcf285a251d06827484b7f90ad43a7960b6753c57d4735966851d16e1 + md5: f3362e816f134b248cc0ac41924c7277 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 485245 + timestamp: 1755851679538 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 889287 + timestamp: 1750615908735 +- conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + sha256: 93e267e4ec35353e81df707938a6527d5eb55c97bf54c3b87229b69523afb59d + md5: a49c2283f24696a7b30367b7346a0144 + depends: + - colorama >=0.4 + - exceptiongroup >=1 + - iniconfig >=1 + - packaging >=20 + - pluggy >=1.5,<2 + - pygments >=2.7.2 + - python >=3.9 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 276562 + timestamp: 1750239526127 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + build_number: 102 + sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 + md5: 89e07d92cf50743886f41638d58c4328 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33273132 + timestamp: 1750064035176 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + sha256: ebda5b5e8e25976013fdd81b5ba253705b076741d02bdc8ab32763f2afb2c81b + md5: 06049132ecd09d0c1dc3d54d93cf1d5d + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 13571569 + timestamp: 1749049058713 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda + sha256: b69412e64971b5da3ced0fc36f05d0eacc9393f2084c6f92b8f28ee068d83e2e + md5: 6aa5e62df29efa6319542ae5025f4376 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 15829289 + timestamp: 1749047682640 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + build_number: 8 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6958 + timestamp: 1752805918820 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 7002 + timestamp: 1752805902938 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 256712 + timestamp: 1740379577668 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.8-h813ae00_0.conda + noarch: python + sha256: 4adf379daccb73f03297a6966d1200f6ea65e6a1513d749e7f782e32267fe2bb + md5: 295ce05c06920527a581a5e148a4eec6 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 11340280 + timestamp: 1764866215629 +- conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.8-hd9f4cfa_0.conda + noarch: python + sha256: 686d612b38fa11566e8ddbdd4e8f5558f0bac76926328158f1fbcc1dae9c01da + md5: 544c6d626cf0b56068f3f4c59e8651ac + depends: + - python + - __osx >=10.13 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 11286425 + timestamp: 1764866316890 +- conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.8-h382de68_0.conda + noarch: python + sha256: 97135a37ab2c55eac06d75569f08ff388af63ec1a0a2a122528b4951b8536027 + md5: f8c69cb8d0c9ac4ab0593926f21a2a3b + depends: + - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 10302078 + timestamp: 1764866315123 +- conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.8-h15e3a1f_0.conda + noarch: python + sha256: fbcaafffd55c7022464219b95658d38980ee04bb001d35c3d97e2e933d7c6bf7 + md5: 35ec53f16d22dc8b17e17865a98c2120 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + size: 11874411 + timestamp: 1764866263950 +- conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + sha256: fb9070195495b51787a08430d867a120da2fce4e795df82d77ccc0c62f1ef41a + md5: fd2dd28ade0a278a119bb2a46e3a3d53 + depends: + - __glibc >=2.17,<3.0.a0 + - gcc_impl_linux-64 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + - rust-std-x86_64-unknown-linux-gnu 1.90.0 h2c6d0dc_0 + - sysroot_linux-64 >=2.17 + license: MIT + license_family: MIT + size: 227708625 + timestamp: 1758350269748 +- conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + sha256: f158301bc661c61578713f21b19447d3dd20610dfde8140b849d81eb60139c83 + md5: e8e9dd3874cab00b98bd8ac0f44ff126 + depends: + - rust-std-x86_64-apple-darwin 1.90.0 h38e4360_0 + license: MIT + license_family: MIT + size: 194585927 + timestamp: 1758349806533 +- conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + sha256: d8af0ec389e84bd2b2f130e3be35aec799f6c556e9bc369a66a45fd44aabb350 + md5: 6a2a9ecb3dc980c89eb992afca9526f1 + depends: + - rust-std-aarch64-apple-darwin 1.90.0 hf6ec828_0 + license: MIT + license_family: MIT + size: 232594078 + timestamp: 1758350126185 +- conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + sha256: ecc1c42314bbe8ebd15c23177d8f1525c0a6a8992d25fdd7eac91125baa88820 + md5: 3ca8b58bb64c2c9828b507585ce9c635 + depends: + - rust-std-x86_64-pc-windows-msvc 1.90.0 h17fc481_0 + license: MIT + license_family: MIT + size: 251268829 + timestamp: 1758352792592 +- conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + sha256: 02f3d1a707b62b91ef2ae0f9a810e5e819f8b0559bfbda8e709545da23d568d3 + md5: 0cd189e71b846188cca9b789de366369 + depends: + - __unix + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 4099159 + timestamp: 1758349704068 +- conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + sha256: 04aaf10bee07340c0cc9f05a6bcf90ac10f3797554fedf73ad1d5b73d4d8a9d8 + md5: 49b13cc66e9ab3f9d88985df52afcad9 + depends: + - __win + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 4081987 + timestamp: 1758351259295 +- conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + sha256: 3c39f49325d0335c24ded6c2944734bb1ca3b072255a0a20942e4a0970065ad2 + md5: 051ab4f9607160ed71ad648cf0f222ab + depends: + - __unix + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 34394510 + timestamp: 1758349841329 +- conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + sha256: 3f13fa1574fd639cea0d9973123f2f0043a190f351a4fcee01c6c28d061af644 + md5: e6eb5faf6ec5d71128177b46b3262870 + depends: + - __unix + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 35756326 + timestamp: 1758349716765 +- conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + sha256: c5a361a1eda71d5f407d8f88b9ce41d2020ac80981555320cee43add0319b97a + md5: 5c723190ef48b23e181c99b3bc65856b + depends: + - __win + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 28433018 + timestamp: 1758352526907 +- conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + sha256: 364d902ca1b4aa1b92ff4d88e04abaa31713f02aeccd7e86ca854c0100291894 + md5: 3d77dd5f1eb34b823ea59e821c116bcf + depends: + - __unix + constrains: + - rust >=1.90.0,<1.90.1.0a0 + license: MIT + license_family: MIT + size: 38036262 + timestamp: 1758350135017 +- conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 748788 + timestamp: 1748804951958 +- conda: https://prefix.dev/conda-forge/noarch/syrupy-4.9.1-pyhd8ed1ab_0.conda + sha256: 62f549992509c3d1a0ecedd7a4784972c2542f23ec1c49ada92027c156cd31a5 + md5: f8e0fc78b3292b215266c19cdddaa6ab + depends: + - pytest >=7.0.0,<9.0.0 + - python >=3.9,<4.0 + license: Apache-2.0 + license_family: APACHE + size: 47524 + timestamp: 1742814070006 +- conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + sha256: 0053c17ffbd9f8af1a7f864995d70121c292e317804120be4667f37c92805426 + md5: 1bad93f0aa428d618875ef3a588a889e + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_8 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 24210909 + timestamp: 1752669140965 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + sha256: b24468006a96b71a5f4372205ea7ec4b399b0f2a543541e86f883de54cd623fc + md5: 9864891a6946c2fe037c02fca7392ab4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3259809 + timestamp: 1748387843735 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3466348 + timestamp: 1748388121356 +- conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + md5: b0dd904de08b7db706167240bf37b164 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 22132 + timestamp: 1734091907682 +- conda: https://prefix.dev/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + sha256: 040a5a05c487647c089ad5e05ad5aff5942830db2a4e656f1e300d73436436f1 + md5: 30a0a26c8abccf4b7991d590fe17c699 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 21238 + timestamp: 1753796677376 +- conda: https://prefix.dev/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + sha256: 6d4c574da215ba20eddb7f5b80ba34ac19b9f49e2e48f67169f135c6bb0e2e00 + md5: 353b9704e4851a6f210e641d3595755f + depends: + - python >=3.9 + license: Apache-2.0 AND MIT + size: 18489 + timestamp: 1733279721928 +- conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + sha256: 4f52390e331ea8b9019b87effaebc4f80c6466d09f68453f52d5cdc2a3e1194f + md5: e523f4f1e980ed7a4240d7e27e9ec81f + depends: + - python >=3.9 + - python + license: PSF-2.0 + license_family: PSF + size: 51065 + timestamp: 1751643513473 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 +- conda: https://prefix.dev/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + md5: 75cb7132eb58d97896e173ef12ac9986 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 62931 + timestamp: 1733130309598 diff --git a/pixi-build-backends/py-pixi-build-backend/pixi.toml b/pixi-build-backends/py-pixi-build-backend/pixi.toml new file mode 100644 index 0000000000..4a37e8f379 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi.toml @@ -0,0 +1,81 @@ +[workspace] +authors = ["Nichita Morcotilo "] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] +license = "BSD-3-Clause" +preview = ["pixi-build"] + +[package] +version = "0.4.0" + +[package.build.backend] +name = "pixi-build-python" +version = "*" + +[package.build.config] +compilers = ["rust"] + +[package.build-dependencies] +rust = ">=1.90.0,<1.91" + +[package.host-dependencies] +maturin = "*" + +[package.run-dependencies] +typing-extensions = "*" +pixi-build-api-version = ">=4,<5" + +[activation.env] +PIP_REQUIRE_VIRTUALENV = "false" + +[feature.build.dependencies] +python = "*" +maturin = "~=1.10.2" +pip = "~=25.3.0" +rust = ">=1.90.0,<1.91" + +[feature.build.target.linux-64.dependencies] +patchelf = "~=0.18.0" + +[dependencies] +# Skipping self as it's a long build, and it's not yet reused in the tests +#py-pixi-build-backend = { path = "." } + +# Testing and type checking +mypy = "*" +pytest = "*" +syrupy = "*" +toml = "*" +types-toml = "*" + +# Formatting and linting +ruff = ">=0.14,<0.15" + +[feature.dev.dependencies] +# Development tools (IDE support) +rust-src = ">=1.90.0,<1.91" + +[tasks] +build = "maturin develop" +build-release = "maturin develop --release" + +test = { cmd = "pytest --doctest-modules", depends-on = ["build"] } +test-fast = "pytest --doctest-modules" + +fmt = { depends-on = ["fmt-python", "fmt-rust"] } +fmt-python = "ruff format pixi_build_backend examples tests" +fmt-rust = "cargo fmt --all" + +lint = { depends-on = ["lint-python", "lint-rust"] } +lint-python = "ruff check ." +lint-rust = "cargo clippy --all -- -D warnings" + +[environments] +# Development environment with all tools (including rust-src for IDE support) +default = { features = ["build", "dev"], solve-group = "main" } + +# Minimal CI environment for automated testing and checks +ci = { features = ["build"], solve-group = "main" } diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/__init__.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/__init__.py new file mode 100644 index 0000000000..fec3d59fd6 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/__init__.py @@ -0,0 +1,3 @@ +""" +Python implementation of pixi-build-python backend using Python bindings. +""" diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/main.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/main.py new file mode 100644 index 0000000000..6cf2c0dd1f --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/main.py @@ -0,0 +1,29 @@ +""" +Main entry point for Python backend implementation. +""" + +import sys +from pixi_build_backend.types.generated_recipe import GenerateRecipeProtocol +from pixi_build_backend.pixi_build_backend import py_main, py_main_sync, PyGenerateRecipe + + +async def run_backend_async(instance: GenerateRecipeProtocol) -> None: + """Async version of the main entry point for the build backend""" + py_generator = PyGenerateRecipe(instance) + + try: + await py_main(py_generator, sys.argv) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + +def run_backend(instance: GenerateRecipeProtocol) -> None: + """Sync version of the main entry point for the build backend""" + py_generator = PyGenerateRecipe(instance) + + try: + py_main_sync(py_generator, sys.argv) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/__init__.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/__init__.py new file mode 100644 index 0000000000..24cb924ab1 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/__init__.py @@ -0,0 +1,2 @@ +# Re-export all the types +from .metadata_provider import MetadataProvider as MetadataProvider diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/conditional.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/conditional.py new file mode 100644 index 0000000000..ba3ee458e3 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/conditional.py @@ -0,0 +1,73 @@ +from typing import Optional +from typing_extensions import TypeAlias +from pixi_build_backend.pixi_build_backend import ( + PyConditionalString, + PyListOrItemString, + PyListOrItemPackageDependency, + PyConditionalPackageDependency, +) + + +# Type aliases for FFI types +ListOrItemString: TypeAlias = PyListOrItemString +ListOrItemPackageDependency: TypeAlias = PyListOrItemPackageDependency + + +class ConditionalString: + _inner: PyConditionalString + + def __init__(self, condition: str, then: ListOrItemString, else_: Optional[ListOrItemString]) -> None: + else_ = else_ if else_ is not None else ListOrItemString([]) + self._inner = PyConditionalString(condition, then, else_) + + @property + def condition(self) -> str: + """Get the condition string.""" + return self._inner.condition + + @property + def then_value(self) -> "ListOrItemString": + """Get the then value.""" + return self._inner.then_value + # return result + + @property + def else_value(self) -> ListOrItemString: + """Get the else value.""" + return self._inner.else_value + + def __str__(self) -> str: + return str(self._inner) + + def __eq__(self, other: object) -> bool: + """Check equality.""" + if not isinstance(other, ConditionalString): + return False + return self._inner == other._inner + + +class ConditionalPackageDependency: + _inner: PyConditionalPackageDependency + + def __init__(self, condition: str, then: ListOrItemPackageDependency, else_: ListOrItemPackageDependency) -> None: + self._inner = PyConditionalPackageDependency(condition, then, else_) + + @property + def condition(self) -> str: + """Get the condition string.""" + return self._inner.condition + + @condition.setter + def condition(self, value: str) -> None: + """Set the condition string.""" + self._inner.condition = value + + @property + def then_value(self) -> ListOrItemPackageDependency: + """Get the then value.""" + return self._inner.then_value + + @property + def else_value(self) -> ListOrItemPackageDependency: + """Get the else value.""" + return self._inner.else_value diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/generated_recipe.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/generated_recipe.py new file mode 100644 index 0000000000..bdcd75c664 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/generated_recipe.py @@ -0,0 +1,98 @@ +from pathlib import Path +from typing import Any, Dict, Optional, Protocol, List +from pixi_build_backend.types.intermediate_recipe import IntermediateRecipe +from pixi_build_backend.pixi_build_backend import PyGeneratedRecipe, PyGenerateRecipe +from pixi_build_backend.types.platform import Platform +from pixi_build_backend.types.project_model import ProjectModel +from pixi_build_backend.types.python_params import PythonParams +from pixi_build_backend.types.metadata_provider import MetadataProvider + + +class GeneratedRecipe: + """A generated recipe wrapper.""" + + _inner: PyGeneratedRecipe + + def __init__(self) -> None: + self._inner = PyGeneratedRecipe() + + @classmethod + def from_model(cls, model: ProjectModel, metadata_provider: Optional[MetadataProvider] = None) -> "GeneratedRecipe": + """Create a GeneratedRecipe from a ProjectModel.""" + instance = cls() + if metadata_provider is not None: + instance._inner = PyGeneratedRecipe().from_model_with_provider(model._inner, metadata_provider) + else: + instance._inner = PyGeneratedRecipe().from_model(model._inner) + return instance + + @property + def recipe(self) -> IntermediateRecipe: + """Get the recipe.""" + return IntermediateRecipe._from_inner(self._inner.recipe) + + @recipe.setter + def recipe(self, value: IntermediateRecipe) -> None: + """Set the recipe.""" + self._inner.recipe = value._inner + + @property + def metadata_input_globs(self) -> List[str]: + """Get the metadata input globs.""" + return self._inner.metadata_input_globs + + @property + def build_input_globs(self) -> List[str]: + """Get the build input globs.""" + return self._inner.build_input_globs + + def __repr__(self) -> str: + return self._inner.__repr__() + + def _into_py(self) -> PyGeneratedRecipe: + """ + Converts this object into a type that can be used by the Rust code. + """ + return self._inner + + +class GenerateRecipeProtocol(Protocol): + """ + Protocol for generating recipes. + This should be implemented by the Python generator. + """ + + def generate_recipe( + self, + model: ProjectModel, + config: Dict[str, Any], + manifest_path: str, + host_platform: Platform, + python_params: Optional[PythonParams] = None, + channels: Optional[List[str]] = None, + ) -> GeneratedRecipe: + """Generate a recipe for a Python package.""" + ... + + def extract_input_globs_from_build(self, config: dict[str, Any], workdir: Path, editable: bool) -> List[str]: + """Extract input globs for the build.""" + ... + + def default_variants(self, host_platform: Platform) -> Dict[str, Any]: + """Get the default variants for the generator.""" + ... + + +class GenerateRecipe: + """Protocol for generating recipes.""" + + _inner: PyGenerateRecipe + + def __init__(self, instance: GenerateRecipeProtocol): + self._inner = PyGenerateRecipe(instance) + + def _into_py(self) -> PyGenerateRecipe: + """ + Converts this object into a type that can be used by the Rust code. + """ + return self._inner diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/intermediate_recipe.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/intermediate_recipe.py new file mode 100644 index 0000000000..91fc110c28 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/intermediate_recipe.py @@ -0,0 +1,913 @@ +from typing import Optional, List, Dict, Union +from pathlib import Path +from pixi_build_backend.pixi_build_backend import ( + PyIntermediateRecipe, + PyPackage, + PyBuild, + PyConditionalRequirements, + PyAbout, + PyExtra, + PyScript, + PyPython, + PyNoArchKind, + PyValueString, + PyValueU64, + PySource, + PyUrlSource, + PyPathSource, + PyPackageSpecDependencies, + PyItemString, +) +from pixi_build_backend.types.item import VecItemPackageDependency, ItemPackageDependency +from pixi_build_backend.types.platform import Platform + + +ConditionalListPackageDependency = List["ItemPackageDependency"] +ConditionalListString = List["ItemString"] + + +class IntermediateRecipe: + """An intermediate recipe wrapper.""" + + _inner: PyIntermediateRecipe + + def __init__(self) -> None: + self._inner = PyIntermediateRecipe() + + @property + def package(self) -> "Package": + """Get the package information.""" + return Package._from_inner(self._inner.package) + + @package.setter + def package(self, value: "Package") -> None: + """Set the package information.""" + self._inner.package = value._inner + + @property + def build(self) -> "Build": + """Get the build configuration.""" + return Build._from_inner(self._inner.build) + + @build.setter + def build(self, value: "Build") -> None: + """Set the build configuration.""" + self._inner.build = value._inner + + @property + def requirements(self) -> "ConditionalRequirements": + """Get the requirements configuration.""" + return ConditionalRequirements._from_inner(self._inner.requirements) + + @requirements.setter + def requirements(self, value: "ConditionalRequirements") -> None: + """Set the requirements configuration.""" + self._inner.requirements = value._inner + + @property + def about(self) -> Optional["About"]: + """Get the about information.""" + inner_about = self._inner.about + return About._from_inner(inner_about) if inner_about else None + + @property + def extra(self) -> Optional["Extra"]: + """Get the extra information.""" + inner_extra = self._inner.extra + return Extra._from_inner(inner_extra) if inner_extra else None + + def __repr__(self) -> str: + return self._inner.__repr__() + + @classmethod + def _from_inner(cls, inner: PyIntermediateRecipe) -> "IntermediateRecipe": + """Create an IntermediateRecipe from a PyIntermediateRecipe.""" + instance = cls() + instance._inner = inner + return instance + + @staticmethod + def from_yaml(yaml: str) -> "IntermediateRecipe": + """ + Create an IntermediateRecipe from a YAML string. + + Parameters + ---------- + yaml : str + The YAML string representing the recipe. + + Returns + ------- + IntermediateRecipe + The constructed IntermediateRecipe object. + + Examples + -------- + ```python + >>> yaml_str = "package:\\n name: test\\n version: 1.0.0" + >>> recipe = IntermediateRecipe.from_yaml(yaml_str) + >>> recipe.package.name.get_concrete() + 'test' + >>> + ``` + """ + return IntermediateRecipe._from_inner(PyIntermediateRecipe.from_yaml(yaml)) + + def to_yaml(self) -> str: + """ + Convert the IntermediateRecipe to a YAML string. + + Returns + ------- + str + The YAML representation of the IntermediateRecipe. + + Examples + -------- + ```python + >>> recipe = IntermediateRecipe() + >>> yaml_output = recipe.to_yaml() + >>> isinstance(yaml_output, str) + True + >>> + ``` + """ + return self._inner.to_yaml() + + def __str__(self) -> str: + """ + Get the string representation of the IntermediateRecipe. + + Returns + ------- + str + The YAML representation of the IntermediateRecipe. + + """ + return str(self._inner) + + +class Package: + """A package wrapper.""" + + _inner: PyPackage + + def __init__(self, name: str, version: str): + self._inner = PyPackage(ValueString.concrete(name)._inner, ValueString.concrete(version)._inner) + + @property + def name(self) -> "ValueString": + """Get the package name.""" + return ValueString._from_inner(self._inner.name) + + @name.setter + def name(self, value: str) -> None: + """Set the package name.""" + self._inner.name = ValueString(value)._inner + + @property + def version(self) -> "ValueString": + """Get the package version.""" + return ValueString._from_inner(self._inner.version) + + @version.setter + def version(self, value: "ValueString") -> None: + """Set the package version.""" + self._inner.version = value._inner + + @classmethod + def _from_inner(cls, inner: PyPackage) -> "Package": + """Create a Package from a PyPackage.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class Build: + """A build configuration wrapper.""" + + _inner: PyBuild + + def __init__(self) -> None: + self._inner = PyBuild() + + @property + def number(self) -> Optional["ValueU64"]: + """Get the build number.""" + inner_number = self._inner.number + return ValueU64._from_inner(inner_number) if inner_number else None + + @number.setter + def number(self, value: Optional["ValueU64"]) -> None: + """Set the build number.""" + self._inner.number = value._inner if value else None + + @property + def script(self) -> "Script": + """Get the build script.""" + return Script._from_inner(self._inner.script) + + @script.setter + def script(self, value: "Script") -> None: + """Set the build script.""" + self._inner.script = value._inner + + @property + def noarch(self) -> Optional["NoArchKind"]: + """Get the noarch kind.""" + inner_noarch = self._inner.noarch + return NoArchKind._from_inner(inner_noarch) if inner_noarch else None + + @noarch.setter + def noarch(self, value: Optional["NoArchKind"]) -> None: + """Set the noarch kind.""" + self._inner.noarch = value._inner if value else None + + @property + def python(self) -> "Python": + """Get the Python configuration.""" + return Python._from_inner(self._inner.python) + + @python.setter + def python(self, value: "Python") -> None: + """Set the Python configuration.""" + self._inner.python = value._inner + + @classmethod + def _from_inner(cls, inner: PyBuild) -> "Build": + """Create a Build from a PyBuild.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """ + Get the string representation of the Build configuration. + + Returns + ------- + str + The string representation of the build configuration. + """ + return str(self._inner) + + +class Script: + """A script wrapper.""" + + _inner: PyScript + + def __init__(self, content: Union[str, List[str]], env: Optional[Dict[str, str]] = None): + # Convert to string for internal storage + if isinstance(content, list): + content_str = "\n".join(content) + else: + content_str = content if content else "" + self._inner = PyScript(content_str, env, None) + + @property + def content(self) -> List[str]: + """Get the script content.""" + # Convert string back to list for Python API + content_str = self._inner.content + if not content_str: + return [] + return content_str.split("\n") + + @content.setter + def content(self, value: Union[str, List[str]]) -> None: + """Set the script content.""" + if isinstance(value, str): + self._inner.content = value + else: + self._inner.content = "\n".join(value) + + @property + def env(self) -> Dict[str, str]: + """Get the environment variables.""" + return self._inner.env + + @env.setter + def env(self, value: Dict[str, str]) -> None: + """Set the environment variables.""" + self._inner.env = value + + @property + def secrets(self) -> List[str]: + """Get the secrets.""" + return self._inner.secrets + + @secrets.setter + def secrets(self, value: List[str]) -> None: + """Set the secrets.""" + self._inner.secrets = value + + @classmethod + def _from_inner(cls, inner: PyScript) -> "Script": + """Create a Script from a PyScript.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class Python: + """A Python configuration wrapper.""" + + _inner: PyPython + + def __init__(self, entry_points: List[str]): + self._inner = PyPython(entry_points) + + @property + def entry_points(self) -> List[str]: + """Get the entry points.""" + return self._inner.entry_points + + @entry_points.setter + def entry_points(self, value: List[str]) -> None: + """Set the entry points.""" + self._inner.set_entry_points(value) + + @classmethod + def _from_inner(cls, inner: PyPython) -> "Python": + """Create a Python from a PyPython.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """ + Get the string representation of the Python configuration. + + Returns + ------- + str + The string representation of the entry points. + """ + return str(self._inner) + + +class NoArchKind: + """A NoArch kind wrapper.""" + + _inner: PyNoArchKind + + @classmethod + def python(cls) -> "NoArchKind": + """ + Create a Python NoArch kind. + + Examples + -------- + ```python + >>> kind = NoArchKind.python() + >>> kind.is_python() + True + >>> kind.is_generic() + False + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyNoArchKind.python() + return instance + + @classmethod + def generic(cls) -> "NoArchKind": + """ + Create a Generic NoArch kind. + + Examples + -------- + ```python + >>> kind = NoArchKind.generic() + >>> kind.is_generic() + True + >>> kind.is_python() + False + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyNoArchKind.generic() + return instance + + def is_python(self) -> bool: + """ + Check if this is a Python NoArch kind. + + Examples + -------- + ```python + >>> NoArchKind.python().is_python() + True + >>> NoArchKind.generic().is_python() + False + >>> + ``` + """ + return self._inner.is_python() + + def is_generic(self) -> bool: + """ + Check if this is a Generic NoArch kind. + + Examples + -------- + ```python + >>> NoArchKind.generic().is_generic() + True + >>> NoArchKind.python().is_generic() + False + >>> + ``` + """ + return self._inner.is_generic() + + @classmethod + def _from_inner(cls, inner: PyNoArchKind) -> "NoArchKind": + """Create a NoArchKind from a PyNoArchKind.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """ + Get the string representation of the NoArch kind. + + Returns + ------- + str + The string representation of the NoArch kind. + """ + return str(self._inner) + + +class ValueString: + """A string value wrapper.""" + + _inner: PyValueString + + def __init__(self, value: str): + self._inner = PyValueString(value) + + @classmethod + def concrete(cls, value: str) -> "ValueString": + """ + Create a concrete string value. + + Examples + -------- + ```python + >>> val = ValueString.concrete("hello") + >>> val.is_concrete() + True + >>> val.get_concrete() + 'hello' + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyValueString.concrete(value) + return instance + + @classmethod + def template(cls, template: str) -> "ValueString": + """ + Create a template string value. + + Examples + -------- + ```python + >>> val = ValueString.template("{{ version }}") + >>> val.is_template() + True + >>> val.get_template() + '{{ version }}' + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyValueString.template(template) + return instance + + def is_concrete(self) -> bool: + """ + Check if this is a concrete value. + + Examples + -------- + ```python + >>> ValueString.concrete("test").is_concrete() + True + >>> ValueString.template("{{ var }}").is_concrete() + False + >>> + ``` + """ + return self._inner.is_concrete() + + def is_template(self) -> bool: + """ + Check if this is a template value. + + Examples + -------- + ```python + >>> ValueString.template("{{ var }}").is_template() + True + >>> ValueString.concrete("test").is_template() + False + >>> + ``` + """ + return self._inner.is_template() + + def get_concrete(self) -> Optional[str]: + """Get the concrete value.""" + return self._inner.get_concrete() + + def get_template(self) -> Optional[str]: + """Get the template value.""" + return self._inner.get_template() + + @classmethod + def _from_inner(cls, inner: PyValueString) -> "ValueString": + """Create a ValueString from a PyValueString.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """ + Get the string representation of the ValueString. + + Returns + ------- + str + The concrete value if available, otherwise the template. + """ + return str(self._inner) + + +class ValueU64: + """A U64 value wrapper.""" + + _inner: PyValueU64 + + @classmethod + def concrete(cls, value: int) -> "ValueU64": + """ + Create a concrete U64 value. + + Examples + -------- + ```python + >>> val = ValueU64.concrete(42) + >>> val.is_concrete() + True + >>> val.get_concrete() + 42 + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyValueU64.concrete(value) + return instance + + @classmethod + def template(cls, template: str) -> "ValueU64": + """ + Create a template U64 value. + + Examples + -------- + ```python + >>> val = ValueU64.template("{{ build_number }}") + >>> val.is_template() + True + >>> val.get_template() + '{{ build_number }}' + >>> + ``` + """ + instance = cls.__new__(cls) + instance._inner = PyValueU64.template(template) + return instance + + def is_concrete(self) -> bool: + """ + Check if this is a concrete value. + + Examples + -------- + ```python + >>> ValueU64.concrete(123).is_concrete() + True + >>> ValueU64.template("{{ num }}").is_concrete() + False + >>> + ``` + """ + return self._inner.is_concrete() + + def is_template(self) -> bool: + """ + Check if this is a template value. + + Examples + -------- + ```python + >>> ValueU64.template("{{ num }}").is_template() + True + >>> ValueU64.concrete(123).is_template() + False + >>> + ``` + """ + return self._inner.is_template() + + def get_concrete(self) -> Optional[int]: + """Get the concrete value.""" + return self._inner.get_concrete() + + def get_template(self) -> Optional[str]: + """Get the template value.""" + return self._inner.get_template() + + @classmethod + def _from_inner(cls, inner: PyValueU64) -> "ValueU64": + """Create a ValueU64 from a PyValueU64.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class ConditionalRequirements: + """A conditional requirements wrapper.""" + + _inner: PyConditionalRequirements + + def __init__(self) -> None: + self._inner = PyConditionalRequirements() + + @property + def build(self) -> "VecItemPackageDependency": + """Get the build requirements.""" + return VecItemPackageDependency._from_inner(self._inner.build) + + @build.setter + def build(self, value: Union[List[ItemPackageDependency], "VecItemPackageDependency"]) -> None: + """Set the build requirements.""" + if isinstance(value, VecItemPackageDependency): + self._inner.build = value._inner + + else: + vec = VecItemPackageDependency() + vec.extend(value) + self._inner.build = vec._inner + + @property + def host(self) -> "VecItemPackageDependency": + """Get the host requirements.""" + return VecItemPackageDependency._from_inner(self._inner.host) + + @host.setter + def host(self, value: Union[List[ItemPackageDependency], "VecItemPackageDependency"]) -> None: + """Set the host requirements.""" + if isinstance(value, VecItemPackageDependency): + self._inner.host = value._inner + else: + vec = VecItemPackageDependency() + vec.extend(value) + self._inner.host = vec._inner + + @property + def run(self) -> "VecItemPackageDependency": + """Get the run requirements.""" + return VecItemPackageDependency._from_inner(self._inner.run) + + @run.setter + def run(self, value: Union[List[ItemPackageDependency], "VecItemPackageDependency"]) -> None: + """Set the run requirements.""" + if isinstance(value, VecItemPackageDependency): + self._inner.run = value._inner + else: + vec = VecItemPackageDependency() + vec.extend(value) + self._inner.run = vec._inner + + @property + def run_constraints(self) -> "VecItemPackageDependency": + """Get the run constraints.""" + return VecItemPackageDependency._from_inner(self._inner.run_constraints) + + @run_constraints.setter + def run_constraints(self, value: Union[List[ItemPackageDependency], "VecItemPackageDependency"]) -> None: + """Set the run constraints.""" + if isinstance(value, VecItemPackageDependency): + self._inner.run_constraints = value._inner + else: + vec = VecItemPackageDependency() + vec.extend(value) + self._inner.run_constraints = vec._inner + + def resolve(self, host_platform: Optional[Platform] = None) -> "PackageSpecDependencies": + """Resolve the requirements.""" + py_platform = host_platform._inner if host_platform else None + return PackageSpecDependencies._from_inner(self._inner.resolve(py_platform)) + + @classmethod + def _from_inner(cls, inner: PyConditionalRequirements) -> "ConditionalRequirements": + """Create a ConditionalRequirements from a PyConditionalRequirements.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """ + Get the string representation of the ConditionalRequirements. + + Returns + ------- + str + The string representation of the build, host, run, and run constraints. + """ + return str(self._inner) + + +class About: + """An about information wrapper.""" + + _inner: PyAbout + + def __init__(self) -> None: + self._inner = PyAbout() + + @property + def homepage(self) -> Optional[str]: + """Get the homepage.""" + return self._inner.homepage + + @property + def license(self) -> Optional[str]: + """Get the license.""" + return self._inner.license + + @property + def summary(self) -> Optional[str]: + """Get the summary.""" + return self._inner.summary + + @property + def description(self) -> Optional[str]: + """Get the description.""" + return self._inner.description + + @classmethod + def _from_inner(cls, inner: PyAbout) -> "About": + """Create an About from a PyAbout.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class Extra: + """An extra information wrapper.""" + + _inner: PyExtra + + def __init__(self) -> None: + self._inner = PyExtra() + + @classmethod + def _from_inner(cls, inner: PyExtra) -> "Extra": + """Create an Extra from a PyExtra.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + @property + def recipe_maintainers(self) -> "ConditionalListString": + """Get the recipe maintainers.""" + return self._inner.recipe_maintainers + + +class PackageSpecDependencies: + """A package spec dependencies wrapper.""" + + _inner: PyPackageSpecDependencies + + @classmethod + def _from_inner(cls, inner: PyPackageSpecDependencies) -> "PackageSpecDependencies": + """Create a PackageSpecDependencies from a PyPackageSpecDependencies.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + @property + def host(self) -> Dict[str, str]: + """Get the host dependencies.""" + return self._inner.host + + @property + def run(self) -> Dict[str, str]: + """Get the run dependencies.""" + return self._inner.run + + @property + def run_constraints(self) -> Dict[str, str]: + """Get the run constraints.""" + return self._inner.run_constraints + + @property + def build(self) -> Dict[str, str]: + """Get the build dependencies.""" + return self._inner.build + + +class ItemString: + """A package dependency item wrapper.""" + + _inner: PyItemString + + @classmethod + def _from_inner(cls, inner: PyItemString) -> "ItemString": + """Create an ItemString from a FFI PyItemString.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class Source: + """A source wrapper.""" + + _inner: PySource + + @classmethod + def url(cls, url: str) -> "Source": + """Create a URL source.""" + instance = cls.__new__(cls) + instance._inner = PySource.url(PyUrlSource(url, None)) + return instance + + @classmethod + def path(cls, path: Path) -> "Source": + """Create a path source.""" + instance = cls.__new__(cls) + instance._inner = PySource.path(PyPathSource(str(path), None)) + return instance + + @classmethod + def _from_inner(cls, inner: PySource) -> "Source": + """Create a Source from a PySource.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class UrlSource: + """A URL source wrapper.""" + + _inner: PyUrlSource + + def __init__(self, url: str, sha: Optional[str] = None): + self._inner = PyUrlSource(url, sha) + + @classmethod + def _from_inner(cls, inner: PyUrlSource) -> "UrlSource": + """Create a UrlSource from a PyUrlSource.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + @property + def url(self) -> str: + """Get the URL.""" + return self._inner.url + + @property + def sha(self) -> Optional[str]: + """Get the SHA.""" + return self._inner.sha + + +class PathSource: + """A path source wrapper.""" + + _inner: PyPathSource + + def __init__(self, path: Path, sha: Optional[str] = None): + self._inner = PyPathSource(path, sha) + + @classmethod + def _from_inner(cls, inner: PyPathSource) -> "PathSource": + """Create a PathSource from a PyPathSource.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + @property + def path(self) -> str: + """Get the path.""" + return self._inner.path diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/item.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/item.py new file mode 100644 index 0000000000..7fd0459963 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/item.py @@ -0,0 +1,187 @@ +from __future__ import annotations +from typing import List, Optional, Iterable, Any, Union, overload, MutableSequence +from typing_extensions import SupportsIndex +from pixi_build_backend.pixi_build_backend import PyVecItemPackageDependency, PyItemPackageDependency +from pixi_build_backend.types.conditional import ConditionalPackageDependency +from pixi_build_backend.types.requirements import PackageDependency + + +class VecItemPackageDependency(MutableSequence["ItemPackageDependency"]): + """A wrapper for a list of ItemPackageDependency.""" + + _inner: PyVecItemPackageDependency + + def __init__(self, items: Optional[List[ItemPackageDependency]] = None) -> None: + """Initialize with optional items.""" + if items is None: + self._inner = PyVecItemPackageDependency() + else: + # Extract _inner from ItemPackageDependency objects + inner_items = [item._inner for item in items] + self._inner = PyVecItemPackageDependency(inner_items) + + @classmethod + def _from_inner(cls, inner: PyVecItemPackageDependency) -> VecItemPackageDependency: + """Create from PyVecItemPackageDependency.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __len__(self) -> int: + """Return the length of the list.""" + return len(self._inner) + + @overload + def __getitem__(self, index: int) -> ItemPackageDependency: ... + + @overload + def __getitem__(self, index: slice) -> VecItemPackageDependency: ... + + def __getitem__(self, index: Union[int, slice]) -> Union[ItemPackageDependency, VecItemPackageDependency]: + """Get item at index.""" + if isinstance(index, slice): + return VecItemPackageDependency._from_inner(self._inner[index]) + return ItemPackageDependency._from_inner(self._inner[index]) + + @overload + def __setitem__(self, index: int, value: ItemPackageDependency) -> None: ... + + @overload + def __setitem__(self, index: slice, value: Iterable[ItemPackageDependency]) -> None: ... + + def __setitem__( + self, index: Union[int, slice], value: Union[ItemPackageDependency, Iterable[ItemPackageDependency]] + ) -> None: + """Set item at index.""" + if isinstance(index, slice): + if isinstance(value, Iterable): + inner_values = [item._inner for item in value] + self._inner[index] = inner_values + else: + if isinstance(value, ItemPackageDependency): + inner_value = value._inner + self._inner[index] = inner_value + + def __delitem__(self, index: Union[int, slice]) -> None: + """Delete item at index.""" + del self._inner[index] + + def __iter__(self) -> Any: + """Return iterator.""" + for item in self._inner.__iter__(): + yield ItemPackageDependency._from_inner(item) + + def __contains__(self, item: object) -> bool: + """Check if item is in the list.""" + if isinstance(item, ItemPackageDependency): + return item._inner in self._inner + return item in self._inner + + def append(self, item: ItemPackageDependency) -> None: + """Append item to the list.""" + inner_item = item._inner + self._inner.append(inner_item) + + def extend(self, items: Iterable[ItemPackageDependency]) -> None: + """Extend the list with items.""" + inner_items = [item._inner for item in items] + self._inner.extend(inner_items) + + def insert(self, index: SupportsIndex, item: ItemPackageDependency) -> None: + """Insert item at index.""" + inner_item = item._inner + self._inner.insert(index, inner_item) + + def remove(self, item: ItemPackageDependency) -> None: + """Remove first occurrence of item.""" + inner_item = item._inner + self._inner.remove(inner_item) + + def pop(self, index: SupportsIndex = -1) -> ItemPackageDependency: + """Remove and return item at index.""" + return ItemPackageDependency._from_inner(self._inner.pop(index)) + + def clear(self) -> None: + """Remove all items.""" + self._inner.clear() + + def index(self, item: ItemPackageDependency, start: SupportsIndex = 0, stop: Optional[SupportsIndex] = None) -> int: + """Return index of first occurrence of item.""" + inner_item = item._inner + if stop is None: + return self._inner.index(inner_item, start) + else: + return self._inner.index(inner_item, start, stop) + + def count(self, item: ItemPackageDependency) -> int: + """Return count of occurrences of item.""" + inner_item = item._inner + return self._inner.count(inner_item) + + def reverse(self) -> None: + """Reverse the list in place.""" + self._inner.reverse() + + def sort(self, key: Optional[Any] = None, reverse: bool = False) -> None: + """Sort the list in place.""" + if key is None: + self._inner.sort(reverse=reverse) + else: + self._inner.sort(key=key, reverse=reverse) + + def copy(self) -> VecItemPackageDependency: + """Return a shallow copy.""" + return VecItemPackageDependency._from_inner(self._inner.copy()) + + def __eq__(self, other: Any) -> bool: + """Check equality.""" + if isinstance(other, VecItemPackageDependency): + return self._inner == other._inner + return False + + def __str__(self) -> str: + """Return string representation.""" + return str(self._inner) + + +class ItemPackageDependency: + """A package dependency item wrapper.""" + + _inner: PyItemPackageDependency + + def __init__(self, name: str): + self._inner = PyItemPackageDependency(name) + + @classmethod + def new_from_conditional(cls, conditional: ConditionalPackageDependency) -> ItemPackageDependency: + new_class = cls.__new__(cls) + new_class._inner = PyItemPackageDependency.new_from_conditional(conditional._inner) + return new_class + + @classmethod + def _from_inner(cls, inner: PyItemPackageDependency) -> ItemPackageDependency: + """Create an ItemPackageDependency from a FFI PyItemPackageDependency.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + return str(self._inner) + + @property + def concrete(self) -> Optional["PackageDependency"]: + """Get the concrete package dependency.""" + concrete = self._inner.concrete() + if concrete is None: + return None + return PackageDependency._from_inner(concrete) + + @property + def template(self) -> Optional[str]: + """Get the template string if this is a template.""" + return self._inner.template() + + @property + def conditional(self) -> Optional[ConditionalPackageDependency]: + """Get the conditional string if this is a conditional.""" + return self._inner.conditional() diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/metadata_provider.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/metadata_provider.py new file mode 100644 index 0000000000..a2e9841871 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/metadata_provider.py @@ -0,0 +1,50 @@ +""" +Python metadata provider types and protocols. +""" + +from typing import Optional, Protocol + + +class MetadataProvider(Protocol): + """ + Protocol for providing package metadata. + + This protocol defines the interface that metadata providers must implement + to supply package metadata like name, version, description, etc. + """ + + def name(self) -> Optional[str]: + """Return the package name or None if not available.""" + return None + + def version(self) -> Optional[str]: + """Return the package version or None if not available.""" + return None + + def homepage(self) -> Optional[str]: + """Return the package homepage URL or None if not available.""" + return None + + def license(self) -> Optional[str]: + """Return the package license or None if not available.""" + return None + + def license_files(self) -> Optional[str]: + """Return the path to the license file or None if not available.""" + return None + + def summary(self) -> Optional[str]: + """Return a short package summary or None if not available.""" + return None + + def description(self) -> Optional[str]: + """Return the package description or None if not available.""" + return None + + def documentation(self) -> Optional[str]: + """Return the documentation URL or None if not available.""" + return None + + def repository(self) -> Optional[str]: + """Return the repository URL or None if not available.""" + return None diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/platform.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/platform.py new file mode 100644 index 0000000000..efad18b2db --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/platform.py @@ -0,0 +1,117 @@ +from typing import Optional +from pixi_build_backend.pixi_build_backend import ( + PyPlatform, +) + + +class Platform: + """ + Example class for platform handling. + This should implement the Platform trait. + """ + + _inner = PyPlatform + + def __init__(self, value: str) -> None: + self._inner = PyPlatform(value) + + @classmethod + def current(cls) -> "Platform": + """ + Returns the current platform. + """ + return cls._from_py(PyPlatform.current()) + + @classmethod + def _from_py(cls, py_platform: PyPlatform) -> "Platform": + """Construct Rattler version from FFI PyArch object.""" + return cls(py_platform.name) + + def __str__(self) -> str: + return str(self._inner) + + def __repr__(self) -> str: + return "Platform({})".format(str(self._inner)) + + @property + def is_linux(self) -> bool: + """ + Return True if the platform is linux. + + Examples + -------- + ```python + >>> Platform("linux-64").is_linux + True + >>> Platform("osx-64").is_linux + False + >>> + ``` + """ + return self._inner.is_linux + + @property + def is_osx(self) -> bool: + """ + Return True if the platform is osx. + + Examples + -------- + ```python + >>> Platform("osx-64").is_osx + True + >>> Platform("linux-64").is_osx + False + >>> + ``` + """ + return self._inner.is_osx + + @property + def is_windows(self) -> bool: + """ + Return True if the platform is win. + + Examples + -------- + ```python + >>> Platform("win-64").is_windows + True + >>> Platform("linux-64").is_windows + False + >>> + ``` + """ + return self._inner.is_windows + + @property + def is_unix(self) -> bool: + """ + Return True if the platform is unix. + + Examples + -------- + ```python + >>> Platform("linux-64").is_unix + True + >>> Platform("win-64").is_unix + False + >>> + ``` + """ + return self._inner.is_unix + + @property + def only_platform(self) -> Optional[str]: + """ + Return the platform without the architecture. + + Examples + -------- + ```python + >>> Platform("linux-64").only_platform + 'linux' + >>> + ``` + """ + return self._inner.only_platform diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/project_model.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/project_model.py new file mode 100644 index 0000000000..5f8de7895d --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/project_model.py @@ -0,0 +1,145 @@ +from typing import Optional, List, Mapping, Dict, Any +from pathlib import Path +from pixi_build_backend.pixi_build_backend import ( + PyProjectModel, +) + + +class ProjectModel: + """A project model.""" + + _inner: PyProjectModel + + def __init__(self, name: Optional[str] = None, version: Optional[str] = None): + self._inner = PyProjectModel(name, version) + + @property + def name(self) -> str: + """ + Get the project name. + + Examples + -------- + ```python + >>> model = ProjectModel("my-project") + >>> model.name + 'my-project' + >>> + ``` + """ + return self._inner.name + + @classmethod + def _from_py(cls, model: PyProjectModel) -> "ProjectModel": + """Create a ProjectModel from a FFI PyProjectModel.""" + instance = cls.__new__(cls) + instance._inner = model + return instance + + @classmethod + def from_json(cls, json: str) -> "ProjectModel": + """Create a ProjectModel from a JSON document.""" + instance = cls.__new__(cls) + instance._inner = PyProjectModel.from_json(json) + return instance + + @classmethod + def from_dict(cls, data: Mapping[str, Any] | Dict[str, Any]) -> "ProjectModel": + """Create a ProjectModel from a Python mapping.""" + instance = cls.__new__(cls) + instance._inner = PyProjectModel.from_dict(dict(data)) + return instance + + @classmethod + def from_json_file(cls, path: Path | str) -> "ProjectModel": + """Create a ProjectModel from a JSON file.""" + instance = cls.__new__(cls) + instance._inner = PyProjectModel.from_json_file(str(path)) + return instance + + @property + def version(self) -> Optional[str]: + """ + Get the project version. + + Examples + -------- + ```python + >>> model = ProjectModel("my-project", "1.0.0") + >>> model.version + '1.0.0' + >>> ProjectModel("test").version is None + True + >>> + ``` + """ + return self._inner.version + + @property + def description(self) -> Optional[str]: + """ + Get the project description. + + Examples + -------- + ```python + >>> model = ProjectModel("test") + >>> model.description is None + True + >>> + ``` + """ + return self._inner.description + + @property + def authors(self) -> Optional[List[str]]: + """Get the project authors.""" + return self._inner.authors + + @property + def license(self) -> Optional[str]: + """Get the project license.""" + return self._inner.license + + @property + def license_files(self) -> Optional[str]: + """Get the project license file path.""" + return self._inner.license_files + + @property + def readme(self) -> Optional[str]: + """Get the project readme file path.""" + return self._inner.readme + + @property + def homepage(self) -> Optional[str]: + """ + Get the project homepage URL. + + Examples + -------- + ```python + >>> model = ProjectModel("test") + >>> model.homepage is None + True + >>> + ``` + """ + return self._inner.homepage + + @property + def repository(self) -> Optional[str]: + """Get the project repository URL.""" + return self._inner.repository + + @property + def documentation(self) -> Optional[str]: + """Get the project documentation URL.""" + return self._inner.documentation + + def __repr__(self) -> str: + return self._inner.__repr__() + + def _debug_str(self) -> str: + """Get a debug string representation of the project model.""" + return self._inner._debug_str() diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/python_params.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/python_params.py new file mode 100644 index 0000000000..61b7cd4ec0 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/python_params.py @@ -0,0 +1,73 @@ +from pixi_build_backend.pixi_build_backend import PyPythonParams + + +class PythonParams: + """A Python parameters wrapper.""" + + _inner: PyPythonParams + + def __init__(self, editable: bool = False): + """ + Initialize PythonParams. + + Parameters + ---------- + editable : bool, optional + Whether to enable editable mode, by default False + + Examples + -------- + ```python + >>> params = PythonParams() + >>> params.editable + False + >>> params_editable = PythonParams(editable=True) + >>> params_editable.editable + True + >>> + ``` + """ + self._inner = PyPythonParams(editable=editable) + + @property + def editable(self) -> bool: + """ + Get the editable flag. + + Examples + -------- + ```python + >>> params = PythonParams(editable=True) + >>> params.editable + True + >>> + ``` + """ + return self._inner.editable + + @editable.setter + def editable(self, value: bool) -> None: + """ + Set the editable flag. + + Examples + -------- + ```python + >>> params = PythonParams() + >>> params.editable = True + >>> params.editable + True + >>> + ``` + """ + self._inner.set_editable(value) + + def __repr__(self) -> str: + return self._inner.__repr__() + + @classmethod + def _from_py(cls, inner: PyPythonParams) -> "PythonParams": + """Create a PythonParams from a FFI PyPythonParams.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance diff --git a/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/requirements.py b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/requirements.py new file mode 100644 index 0000000000..805f0211b0 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pixi_build_backend/types/requirements.py @@ -0,0 +1,82 @@ +from typing import Optional +from pixi_build_backend.pixi_build_backend import PyPackageDependency, PySourceMatchSpec + + +class SourceMatchSpec: + """A source match spec wrapper.""" + + _inner: PySourceMatchSpec + + def __init__(self, spec: str, location: str) -> None: + self._inner = PySourceMatchSpec(spec, location) + + @property + def spec(self) -> str: + """Get the spec.""" + return self._inner.spec + + @property + def location(self) -> str: + """Get the location.""" + return self._inner.location + + def _into_py(self) -> PySourceMatchSpec: + """Convert to PySourceMatchSpec.""" + return self._inner + + @classmethod + def _from_inner(cls, inner: PySourceMatchSpec) -> "SourceMatchSpec": + """Create from PySourceMatchSpec.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + +class PackageDependency: + """A package dependency wrapper.""" + + _inner: PyPackageDependency + + def __init__(self, spec: str) -> None: + self._inner = PyPackageDependency(spec) + + @property + def is_binary(self) -> bool: + """Check if this is a binary dependency.""" + return self._inner.is_binary() + + @property + def is_source(self) -> bool: + """Check if this is a source dependency.""" + return self._inner.is_source() + + @property + def binary_spec(self) -> Optional[str]: + """Get the binary spec if this is a binary dependency.""" + return self._inner.get_binary() + + @property + def source_spec(self) -> Optional[SourceMatchSpec]: + """Get the source spec if this is a source dependency.""" + inner_spec = self._inner.get_source() + return SourceMatchSpec._from_inner(inner_spec) if inner_spec else None + + @property + def package_name(self) -> str: + """Get the package name.""" + return self._inner.package_name() + + def _into_py(self) -> PyPackageDependency: + """Convert to PyPackageDependency.""" + return self._inner + + @classmethod + def _from_inner(cls, inner: PyPackageDependency) -> "PackageDependency": + """Create from PyPackageDependency.""" + instance = cls.__new__(cls) + instance._inner = inner + return instance + + def __str__(self) -> str: + """Return string representation.""" + return str(self._inner) diff --git a/pixi-build-backends/py-pixi-build-backend/pyproject.toml b/pixi-build-backends/py-pixi-build-backend/pyproject.toml new file mode 100644 index 0000000000..506c1fe256 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/pyproject.toml @@ -0,0 +1,58 @@ +[build-system] +requires = ["maturin>=1.0,<2.0"] +build-backend = "maturin" + +[project] +name = "py-pixi-build-backend" +description = "Python bindings for pixi-build-backends" +requires-python = ">=3.8" +license = { text = "BSD-3-Clause" } +authors = [{ name = "pixi contributors" }] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Rust", + "Topic :: Software Development :: Build Tools", +] +keywords = ["build", "conda", "package", "python", "rust"] +dynamic = ["version"] + + +[project.urls] +Homepage = "https://github.com/prefix-dev/pixi-build-backends" +Repository = "https://github.com/prefix-dev/pixi-build-backends" +"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" + +[tool.maturin] +features = ["pyo3/extension-module"] + +[tool.ruff] +line-length = 120 +target-version = "py38" + +[tool.mypy] +python_version = "3.8" +files = ["pixi_build_backend", "tests", "examples"] +strict = true +enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] +disable_error_code = ["empty-body"] + +[[tool.mypy.overrides]] +module = ["pixi_build_backend.pixi_build_backend"] +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = ["pixi_build_backend.*"] +# We exclude the pixi_build_backend module from warn_return_any, because the PyO3 api does not have Python +# type annotations. See https://github.com/PyO3/pyo3/issues/1112 for a discussion on adding +# this capability. We could add a stub file for pixi_build_backend.pixi_build_backend (the PyO3 api), but that +# amounts to duplicating almost all type annotations on our api, as the Python api itself is a +# thin wrapper around the PyO3 api to start with. +warn_return_any = false diff --git a/pixi-build-backends/py-pixi-build-backend/src/cli/mod.rs b/pixi-build-backends/py-pixi-build-backend/src/cli/mod.rs new file mode 100644 index 0000000000..8efd090bc2 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/cli/mod.rs @@ -0,0 +1,43 @@ +use std::sync::Arc; + +use pixi_build_backend::{cli_main, intermediate_backend::IntermediateBackendInstantiator}; +use pyo3::{Bound, PyAny, PyResult, Python, pyfunction}; +use pyo3_async_runtimes::tokio::future_into_py; +use tokio::runtime::Runtime; + +use crate::error::PyPixiBuildBackendError; +use crate::types::PyGenerateRecipe; + +#[pyfunction] +pub fn py_main( + py: Python<'_>, + generator: PyGenerateRecipe, + args: Vec, +) -> PyResult> { + future_into_py(py, async move { + let generator = Arc::new(generator); + cli_main( + |log| IntermediateBackendInstantiator::::new(log, generator), + args, + ) + .await + .map_err(|e| PyPixiBuildBackendError::Cli(e.into()))?; + Ok(()) + }) +} + +#[pyfunction] +pub fn py_main_sync(generator: PyGenerateRecipe, args: Vec) -> PyResult<()> { + // Create the runtime + let rt = Runtime::new().unwrap(); + rt.block_on(async move { + let generator = Arc::new(generator); + cli_main( + |log| IntermediateBackendInstantiator::::new(log, generator), + args, + ) + .await + .map_err(|e| PyPixiBuildBackendError::Cli(e.into()))?; + Ok(()) + }) +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/error.rs b/pixi-build-backends/py-pixi-build-backend/src/error.rs new file mode 100644 index 0000000000..3a6983a8fb --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/error.rs @@ -0,0 +1,44 @@ +use std::error::Error; + +use pyo3::{PyErr, create_exception, exceptions::PyException}; +use thiserror::Error; + +#[derive(Error, Debug)] +#[allow(clippy::enum_variant_names)] +pub enum PyPixiBuildBackendError { + #[error(transparent)] + Cli(Box), + + #[error(transparent)] + GeneratedRecipe(Box), + + #[error(transparent)] + YamlSerialization(#[from] serde_yaml::Error), +} + +pub(crate) fn pretty_print_error(mut err: &dyn Error) -> String { + let mut result = err.to_string(); + while let Some(source) = err.source() { + result.push_str(&format!("\nCaused by: {source}")); + err = source; + } + result +} + +impl From for PyErr { + fn from(value: PyPixiBuildBackendError) -> Self { + match value { + PyPixiBuildBackendError::Cli(err) => CliException::new_err(pretty_print_error(&*err)), + PyPixiBuildBackendError::GeneratedRecipe(err) => { + GeneratedRecipeException::new_err(pretty_print_error(&*err)) + } + PyPixiBuildBackendError::YamlSerialization(err) => { + YamlSerializationException::new_err(pretty_print_error(&err)) + } + } + } +} + +create_exception!(exceptions, CliException, PyException); +create_exception!(exceptions, GeneratedRecipeException, PyException); +create_exception!(exceptions, YamlSerializationException, PyException); diff --git a/pixi-build-backends/py-pixi-build-backend/src/lib.rs b/pixi-build-backends/py-pixi-build-backend/src/lib.rs new file mode 100644 index 0000000000..e7cf389fca --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/lib.rs @@ -0,0 +1,135 @@ +use pyo3::prelude::*; + +use crate::error::{CliException, GeneratedRecipeException}; + +mod cli; +pub mod error; +mod recipe_stage0; +mod types; + +/// A simple macro wrapper that allows us to create a Py class +/// from an arbitrary Rust type +#[macro_export] +macro_rules! create_py_wrap { + // Version with custom Display implementation + ($name: ident, $type: ty, $display_impl: expr) => { + #[pyclass(str)] + #[derive(Clone, ::serde::Serialize, ::serde::Deserialize, Default)] + pub struct $name { + pub(crate) inner: $type, + } + + impl ::std::ops::Deref for $name { + type Target = $type; + fn deref(&self) -> &Self::Target { + &self.inner + } + } + + impl From<$type> for $name { + fn from(inner: $type) -> Self { + $name { inner } + } + } + + impl ::std::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let display_fn: fn(&$type, &mut std::fmt::Formatter<'_>) -> std::fmt::Result = + $display_impl; + display_fn(&self.inner, f) + } + } + }; + + // Version with default Display implementation (delegates to inner type) + ($name: ident, $type: ty) => { + #[pyclass(str)] + #[derive(Clone, ::serde::Serialize, ::serde::Deserialize, Default)] + pub struct $name { + pub(crate) inner: $type, + } + + impl ::std::ops::Deref for $name { + type Target = $type; + fn deref(&self) -> &Self::Target { + &self.inner + } + } + + impl From<$type> for $name { + fn from(inner: $type) -> Self { + $name { inner } + } + } + + impl ::std::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } + } + }; +} + +#[pymodule] +fn pixi_build_backend(py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { + // Add core types + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + // Add recipe_stage0 types + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + // Add requirements types + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + // Add conditional types + m.add_class::()?; + m.add_class::()?; + + m.add_class::()?; + + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + // ListOrItem python part + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + // Add entry points + m.add_function(wrap_pyfunction!(cli::py_main, m)?)?; + m.add_function(wrap_pyfunction!(cli::py_main_sync, m)?)?; + + // Exceptions + m.add("CliError", py.get_type::())?; + + m.add( + "GeneratedRecipeError", + py.get_type::(), + )?; + + Ok(()) +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional.rs b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional.rs new file mode 100644 index 0000000000..548067d34f --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional.rs @@ -0,0 +1,462 @@ +use ::serde::{Deserialize, Serialize}; +use pyo3::exceptions::PyTypeError; +use pyo3::types::{PyAnyMethods, PyList, PyListMethods}; +use pyo3::{Bound, FromPyObject, Py, PyAny, PyErr, PyResult, Python, intern, pyclass, pymethods}; +use recipe_stage0::matchspec::PackageDependency; +use recipe_stage0::recipe::{Conditional, Item, ListOrItem, Source, Value}; +use std::fmt::Display; + +use std::ops::Deref; + +use crate::create_py_wrap; +use crate::recipe_stage0::recipe::PySource; +use crate::recipe_stage0::requirements::PyPackageDependency; + +/// Creates a PyItem class for a given type. +/// The first argument is the name of the class, the second +/// is the type it wraps, and the third is the Python type. +/// It is necessary to provide the Python type because +/// the String equivalent is still String +/// but for other types it will be some type +/// prefixed with Py, like PyPackageDependency. +macro_rules! create_py_item { + ($name: ident, $type: ident, $py_type: ident) => { + paste::paste! { + #[pyclass] + #[derive(Clone, Serialize, Deserialize)] + pub struct $name { + pub(crate) inner: Item<$type>, + } + + #[pymethods] + impl $name { + #[new] + pub fn new(value: String) -> PyResult { + let item: Item<_> = value + .parse() + .map_err(|_| PyTypeError::new_err(format!("Failed to parse {value}")))?; + + Ok($name { inner: item }) + } + + #[staticmethod] + pub fn new_from_conditional( + py: Python, + conditional: [] + ) -> Self { + + let conditional = []::into_conditional(py, conditional); + + let item = Item::Conditional(conditional); + $name { inner: item } + } + + pub fn is_value(&self) -> bool { + matches!(self.inner, Item::Value(_)) + } + + pub fn is_template(&self) -> bool { + matches!(self.inner, Item::Value(Value::Template(_))) + } + + pub fn is_conditional(&self) -> bool { + matches!(self.inner, Item::Conditional(_)) + } + + pub fn __str__(&self) -> String { + self.inner.to_string() + } + + pub fn concrete(&self) -> Option<$py_type> { + if let Item::Value(Value::Concrete(val)) = &self.inner { + Some(val.clone().into()) + } else { + None + } + } + + pub fn template(&self) -> Option { + if let Item::Value(Value::Template(val)) = &self.inner { + Some(val.clone()) + } else { + None + } + } + + pub fn conditional(&self, py: Python) -> Option<[]> { + if let Item::Conditional(cond) = &self.inner { + Some([]::from_conditional(py, cond.clone())) + } else { + None + } + } + } + + impl Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } + } + + impl From> for $name { + fn from(item: Item<$type>) -> Self { + $name { inner: item } + } + } + + impl Deref for $name { + type Target = Item<$type>; + fn deref(&self) -> &Self::Target { + &self.inner + } + } + } + }; +} + +create_py_item!( + PyItemPackageDependency, + PackageDependency, + PyPackageDependency +); +create_py_item!(PyItemString, String, String); +create_py_item!(PyItemSource, Source, PySource); + +create_py_wrap!(PyVecString, Vec, |v: &Vec, + f: &mut std::fmt::Formatter< + '_, +>| { + write!(f, "[{}]", v.join(", ")) +}); + +macro_rules! create_pylist_or_item { + ($name: ident, $type: ident, $py_type: ident) => { + #[pyclass(str, eq)] + #[derive(Clone, PartialEq, Deserialize, Serialize)] + pub struct $name { + pub(crate) inner: ListOrItem<$type>, + } + + #[pymethods] + impl $name { + #[new] + pub fn new(item: Vec) -> Self { + let item: Vec<$type> = item + .into_iter() + .map(|s| s.parse().expect("Failed to parse item")) + .collect(); + + $name { + inner: ListOrItem::<$type>(item), + } + } + + pub fn is_single(&self) -> bool { + self.inner.len() == 1 + } + + pub fn is_list(&self) -> bool { + self.inner.len() > 1 + } + + pub fn __getitem__(&self, index: usize) -> PyResult<$py_type> { + Ok(Into::<$py_type>::into( + self.inner.0.get(index).cloned().unwrap(), + )) + } + + pub fn __len__(&self) -> usize { + self.inner.0.len() + } + + pub fn __contains__(&self, item: $py_type) -> bool { + let inner_item: $type = item.into(); + self.inner.0.contains(&inner_item) + } + + pub fn append(&mut self, item: $py_type) { + self.inner.0.push(item.into()); + } + + pub fn extend(&mut self, items: &Bound<'_, PyList>) { + let items: Vec<$type> = items + .iter() + .map(|item| item.extract::<$py_type>().unwrap().into()) + .collect(); + self.inner.0.extend(items); + } + + pub fn insert(&mut self, index: usize, item: $py_type) { + self.inner.0.insert(index, item.into()); + } + + pub fn remove(&mut self, item: $py_type) -> PyResult<()> { + let target_item: $type = item.clone().into(); + if let Some(pos) = self.inner.0.iter().position(|x| *x == target_item) { + self.inner.0.remove(pos); + Ok(()) + } else { + Err(pyo3::exceptions::PyValueError::new_err("item not found")) + } + } + + pub fn pop(&mut self, index: Option) -> PyResult<$py_type> { + let len = self.inner.0.len(); + if len == 0 { + return Err(pyo3::exceptions::PyIndexError::new_err( + "pop from empty list", + )); + } + + let idx = match index { + Some(i) => { + let idx = if i < 0 { + (len as isize + i) as usize + } else { + i as usize + }; + if idx >= len { + return Err(pyo3::exceptions::PyIndexError::new_err( + "pop index out of range", + )); + } + idx + } + None => len - 1, + }; + + let removed = self.inner.0.remove(idx); + Ok(Into::<$py_type>::into(removed)) + } + + pub fn index( + &self, + item: $py_type, + start: Option, + end: Option, + ) -> PyResult { + let start = start.unwrap_or(0); + let end = end.unwrap_or(self.inner.0.len()); + + if start >= self.inner.0.len() { + return Err(pyo3::exceptions::PyValueError::new_err("item not found")); + } + + for (i, existing_item) in self.inner.0[start..end.min(self.inner.0.len())] + .iter() + .enumerate() + { + let target_item: $type = item.clone().into(); + if *existing_item == target_item { + return Ok(start + i); + } + } + + Err(pyo3::exceptions::PyValueError::new_err("item not found")) + } + + pub fn count(&self, item: $py_type) -> usize { + let target_item: $type = item.clone().into(); + self.inner.0.iter().filter(|&x| *x == target_item).count() + } + + pub fn clear(&mut self) { + self.inner.0.clear(); + } + + pub fn reverse(&mut self) { + self.inner.0.reverse(); + } + + pub fn copy(&self) -> Self { + self.clone() + } + + pub fn __setitem__(&mut self, index: usize, value: $py_type) -> PyResult<()> { + if index >= self.inner.0.len() { + return Err(pyo3::exceptions::PyIndexError::new_err( + "list index out of range", + )); + } + self.inner.0[index] = value.into(); + Ok(()) + } + + pub fn __delitem__(&mut self, index: usize) -> PyResult<()> { + if index >= self.inner.0.len() { + return Err(pyo3::exceptions::PyIndexError::new_err( + "list index out of range", + )); + } + self.inner.0.remove(index); + Ok(()) + } + + pub fn __iter__( + slf: pyo3::pycell::PyRef<'_, Self>, + py: Python, + ) -> pyo3::PyResult> { + let py_list = PyList::empty(py); + for item in slf.inner.0.iter() { + let py_item: $py_type = item.clone().into(); + py_list.append(py_item)?; + } + Ok(py_list.into()) + } + } + + impl From> for $name { + fn from(inner: ListOrItem<$type>) -> Self { + $name { inner } + } + } + + impl Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } + } + }; +} + +create_pylist_or_item!(PyListOrItemString, String, String); +create_pylist_or_item!( + PyListOrItemPackageDependency, + PackageDependency, + PyPackageDependency +); +create_pylist_or_item!(PyListOrItemSource, Source, PySource); + +create_py_wrap!(PyWrapString, String); + +macro_rules! create_conditional_interface { + ($name: ident, $type: ident, $py_type: ident) => { + paste::paste! { + #[pyclass(str, get_all, set_all)] + #[derive(Clone, Deserialize, Serialize)] + pub struct $name { + #[serde(rename = "if")] + pub condition: String, + pub then: Py<[]>, + #[serde(rename = "else")] + pub else_value: Py<[]>, + } + + #[pymethods] + impl $name { + #[new] + pub fn new( + py: Python, + condition: String, + then_value: [], + else_value: [], + ) -> Self { + Self { + condition, + then: Py::new(py, then_value).unwrap(), + else_value: Py::new(py, else_value).unwrap(), + } + } + + #[getter] + pub fn condition(&self) -> String { + self.condition.clone() + } + + #[getter] + pub fn then_value(&self) -> Py<[]> { + self.then.clone() + } + + pub fn __eq__(&self, py: Python, other: &Self) -> bool { + + let then_value = self.then.borrow(py).clone(); + let other_then_value = other.then.borrow(py).clone(); + + let else_value = self.else_value.borrow(py).clone(); + let other_else_value = other.else_value.borrow(py).clone(); + + self.condition == other.condition + && then_value == other_then_value + && else_value == other_else_value + } + + } + + impl $name { + pub fn from_conditional( + py: Python, + conditional: Conditional<$type>, + ) -> Self { + let py_list_or_item: [] = conditional.then.clone().into(); + let py_list_or_item_else: [] = conditional.else_value.clone().into(); + + let then_value = Py::new(py, py_list_or_item).unwrap(); + let else_value = Py::new(py, py_list_or_item_else).unwrap(); + + Self { + condition: conditional.condition, + then: then_value, + else_value, + } + } + + pub fn into_conditional( + py: Python, + conditional: $name, + ) -> Conditional<$type> { + let then_list_or_item = conditional.then.borrow(py).clone().inner; + let else_value_list_or_item = conditional.else_value.borrow(py).clone().inner; + + let condition = conditional.condition.clone(); + + Conditional::<$type> { + condition, + then: then_list_or_item, + else_value: else_value_list_or_item, + } + } + } + + impl Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.condition) + } + } + } + }; +} + +create_conditional_interface!(PyConditionalString, String, PyWrapString); +create_conditional_interface!( + PyConditionalPackageDependency, + PackageDependency, + PyPackageDependency +); + +create_conditional_interface!(PyConditionalSource, Source, PySource); + +impl<'a> TryFrom> for PyItemPackageDependency { + type Error = PyErr; + fn try_from(value: Bound<'a, PyAny>) -> Result { + let intern_val = intern!(value.py(), "_inner"); + if !value.hasattr(intern_val)? { + return Err(PyTypeError::new_err( + "object is not a PackageDependency type", + )); + } + + let inner = value.getattr(intern_val)?; + if !inner.is_instance_of::() { + return Err(PyTypeError::new_err("'_inner' is invalid")); + } + + PyItemPackageDependency::extract_bound(&inner) + } +} + +impl From for ListOrItem { + fn from(py_list_or_item: PyListOrItemString) -> Self { + py_list_or_item.inner + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional_requirements.rs b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional_requirements.rs new file mode 100644 index 0000000000..74050537e4 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/conditional_requirements.rs @@ -0,0 +1,197 @@ +use std::fmt::{Display, Formatter}; + +use crate::{create_py_wrap, recipe_stage0::conditional::PyItemPackageDependency}; + +use pyo3::{prelude::*, types::PyList}; +use recipe_stage0::{matchspec::PackageDependency, recipe::Item}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Default, Deserialize, Serialize)] +#[pyclass(str)] +pub(crate) struct PyVecItemPackageDependency { + pub(crate) inner: Vec>, +} + +impl Display for PyVecItemPackageDependency { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "[")?; + for item in &self.inner { + write!(f, "{item}, ")?; + } + write!(f, "]") + } +} + +impl From>> for PyVecItemPackageDependency { + fn from(inner: Vec>) -> Self { + PyVecItemPackageDependency { inner } + } +} + +#[pymethods] +impl PyVecItemPackageDependency { + #[new] + pub fn new() -> Self { + PyVecItemPackageDependency { inner: Vec::new() } + } + + // Implementing the PyList interface + pub fn __getitem__(&self, index: usize) -> PyResult { + Ok(Into::::into( + self.inner.get(index).cloned().unwrap(), + )) + } + + pub fn __len__(&self) -> usize { + self.inner.len() + } + + pub fn __contains__(&self, item: PyItemPackageDependency) -> bool { + self.inner.contains(&item.inner) + } + + pub fn append(&mut self, item: PyItemPackageDependency) { + self.inner.push(item.inner); + } + + pub fn extend(&mut self, items: &Bound<'_, PyList>) { + let items: Vec = items + .iter() + .map(|item| item.extract::().unwrap()) + .collect(); + + let rust_items = items + .into_iter() + .map(|item| item.inner) + .collect::>>(); + + self.inner.extend(rust_items); + } + + pub fn insert(&mut self, index: usize, item: PyItemPackageDependency) { + self.inner.insert(index, item.inner); + } + + pub fn remove(&mut self, item: PyItemPackageDependency) -> PyResult<()> { + let target_item = item.clone().inner; + if let Some(pos) = self.inner.iter().position(|x| *x == target_item) { + self.inner.remove(pos); + Ok(()) + } else { + Err(pyo3::exceptions::PyValueError::new_err("item not found")) + } + } + + pub fn pop(&mut self, index: Option) -> PyResult { + let len = self.inner.len(); + if len == 0 { + return Err(pyo3::exceptions::PyIndexError::new_err( + "pop from empty list", + )); + } + + let idx = match index { + Some(i) => { + let idx = if i < 0 { + (len as isize + i) as usize + } else { + i as usize + }; + if idx >= len { + return Err(pyo3::exceptions::PyIndexError::new_err( + "pop index out of range", + )); + } + idx + } + None => len - 1, + }; + + let removed = self.inner.remove(idx); + Ok(Into::::into(removed)) + } + + pub fn index( + &self, + item: PyItemPackageDependency, + start: Option, + end: Option, + ) -> PyResult { + let start = start.unwrap_or(0); + let end = end.unwrap_or(self.inner.len()); + + if start >= self.inner.len() { + return Err(pyo3::exceptions::PyValueError::new_err("item not found")); + } + + for (i, existing_item) in self.inner[start..end.min(self.inner.len())] + .iter() + .enumerate() + { + let target_item = item.clone().inner; + if *existing_item == target_item { + return Ok(start + i); + } + } + + Err(pyo3::exceptions::PyValueError::new_err("item not found")) + } + + pub fn count(&self, item: PyItemPackageDependency) -> usize { + let target_item = item.clone().inner; + self.inner.iter().filter(|&x| *x == target_item).count() + } + + pub fn clear(&mut self) { + self.inner.clear(); + } + + pub fn reverse(&mut self) { + self.inner.reverse(); + } + + pub fn copy(&self) -> Self { + self.clone() + } + + pub fn __setitem__(&mut self, index: usize, value: PyItemPackageDependency) -> PyResult<()> { + if index >= self.inner.len() { + return Err(pyo3::exceptions::PyIndexError::new_err( + "list index out of range", + )); + } + self.inner[index] = value.inner; + Ok(()) + } + + pub fn __delitem__(&mut self, index: usize) -> PyResult<()> { + if index >= self.inner.len() { + return Err(pyo3::exceptions::PyIndexError::new_err( + "list index out of range", + )); + } + self.inner.remove(index); + Ok(()) + } + + pub fn __iter__(slf: pyo3::pycell::PyRef<'_, Self>, py: Python) -> pyo3::PyResult> { + let py_list = PyList::empty(py); + for item in slf.inner.iter() { + let py_item: PyItemPackageDependency = item.clone().into(); + py_list.append(py_item)?; + } + Ok(py_list.into()) + } +} + +create_py_wrap!( + _PyVecItemPackageDependency, + Vec>, + |vec: &Vec>, f: &mut Formatter<'_>| { + write!(f, "[")?; + for item in vec { + write!(f, "{item}, ")?; + } + write!(f, "]") + } +); diff --git a/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/mod.rs b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/mod.rs new file mode 100644 index 0000000000..7215405cf4 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/mod.rs @@ -0,0 +1,4 @@ +pub mod conditional; +pub mod conditional_requirements; +pub mod recipe; +pub mod requirements; diff --git a/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/recipe.rs b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/recipe.rs new file mode 100644 index 0000000000..4ecaa4cc46 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/recipe.rs @@ -0,0 +1,1029 @@ +use crate::{ + create_py_wrap, + error::PyPixiBuildBackendError, + recipe_stage0::{ + conditional::{PyItemSource, PyItemString}, + conditional_requirements::PyVecItemPackageDependency, + requirements::PyPackageSpecDependencies, + }, + types::{PyPlatform, PyVecString}, +}; +use ::serde::{Deserialize, Serialize}; +use indexmap::IndexMap; +use pyo3::{ + Py, PyResult, Python, + exceptions::PyValueError, + pyclass, pymethods, + types::{PyList, PyListMethods}, +}; +use rattler_conda_types::package::EntryPoint; +use recipe_stage0::recipe::{ + About, Build, ConditionalRequirements, Extra, IntermediateRecipe, Item, NoArchKind, Package, + PathSource, Python as RecipePython, Script, Source, Test, UrlSource, Value, +}; + +use std::fmt::{Display, Formatter}; +use std::{collections::HashMap, ops::Deref}; + +create_py_wrap!(PyHashMapValueString, HashMap, |map: &HashMap, f: &mut Formatter<'_>| { + write!(f, "{{")?; + for (k, v) in map { + write!(f, "{k}: {v}, ")?; + } + write!(f, "}}") +}); + +create_py_wrap!(PyVecItemSource, Vec, |vec: &Vec< + PyItemSource, +>, + f: &mut Formatter< + '_, +>| { + write!(f, "[")?; + for item in vec { + write!(f, "{item}, ")?; + } + write!(f, "]") +}); + +create_py_wrap!( + PyVecTest, + Vec, + |vec: &Vec, f: &mut Formatter<'_>| { + write!(f, "[")?; + for item in vec { + write!(f, "{item}, ")?; + } + write!(f, "]") + } +); + +create_py_wrap!( + PyOptionAbout, + Option, + |opt: &Option, f: &mut Formatter<'_>| { + match opt { + Some(about) => write!(f, "{about}"), + None => write!(f, "None"), + } + } +); +create_py_wrap!( + PyOptionExtra, + Option, + |opt: &Option, f: &mut Formatter<'_>| { + match opt { + Some(extra) => write!(f, "{extra}"), + None => write!(f, "None"), + } + } +); + +#[pyclass(get_all, set_all, str)] +#[derive(Clone, Serialize)] +pub struct PyIntermediateRecipe { + pub context: Py, + pub package: Py, + pub source: Py, + pub build: Py, + pub requirements: Py, + pub tests: Py, + pub about: Py, + pub extra: Py, +} + +impl Display for PyIntermediateRecipe { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{{ context: {}, package: {}, source: {}, build: {}, requirements: {}, tests: {}, about: {}, extra: {} }}", + self.context, + self.package, + self.source, + self.build, + self.requirements, + self.tests, + self.about, + self.extra + ) + } +} + +#[pymethods] +impl PyIntermediateRecipe { + #[new] + pub fn new(py: Python) -> PyResult { + Ok(PyIntermediateRecipe { + context: Py::new(py, PyHashMapValueString::default())?, + package: Py::new(py, PyPackage::default())?, + source: Py::new(py, PyVecItemSource::default())?, + build: Py::new(py, PyBuild::new(py))?, + requirements: Py::new(py, PyConditionalRequirements::new(py))?, + tests: Py::new(py, PyVecTest::default())?, + about: Py::new(py, PyOptionAbout::default())?, + extra: Py::new(py, PyOptionExtra::default())?, + }) + } + /// Creates a recipe from YAML string + #[staticmethod] + pub fn from_yaml(yaml: String, py: Python) -> PyResult { + // Preprocess the YAML to handle script content as both String and Vec + let preprocessed_yaml = Self::preprocess_script_content(yaml)?; + + let intermediate_recipe: IntermediateRecipe = serde_yaml::from_str(&preprocessed_yaml) + .map_err(PyPixiBuildBackendError::YamlSerialization)?; + + let py_intermediate_recipe = + PyIntermediateRecipe::from_intermediate_recipe(intermediate_recipe, py); + + Ok(py_intermediate_recipe) + } + + /// Converts the PyIntermediateRecipe to a YAML string. + pub fn to_yaml(&self, py: Python) -> PyResult { + let recipe = self.to_intermediate_recipe(py); + Ok(serde_yaml::to_string(&recipe).map_err(PyPixiBuildBackendError::YamlSerialization)?) + } +} + +impl PyIntermediateRecipe { + /// Preprocess YAML to convert script content from Vec to String + fn preprocess_script_content(yaml: String) -> PyResult { + use serde_yaml::Value; + + let mut value: Value = + serde_yaml::from_str(&yaml).map_err(PyPixiBuildBackendError::YamlSerialization)?; + + // Navigate to build.script.content + if let Value::Mapping(ref mut map) = value + && let Some(Value::Mapping(build_map)) = map.get_mut("build") + && let Some(Value::Mapping(script_map)) = build_map.get_mut("script") + && let Some(content_value) = script_map.get_mut("content") + { + // If content is a sequence (Vec), convert to String + if let &mut Value::Sequence(ref content_seq) = content_value { + let content_strings: Vec = content_seq + .iter() + .filter_map(|v| match v { + Value::String(s) => Some(s.clone()), + _ => None, + }) + .collect(); + + *content_value = Value::String(content_strings.join("\n")); + } + // If it's already a String, leave it as is + } + + Ok(serde_yaml::to_string(&value).map_err(PyPixiBuildBackendError::YamlSerialization)?) + } + + pub fn from_intermediate_recipe(recipe: IntermediateRecipe, py: Python) -> Self { + // Convert context (IndexMap>) to PyHashMap + let context_map = recipe + .context + .into_iter() + .map(|(k, v)| (k, v.into())) + .collect::>(); + + let py_context = PyHashMapValueString { inner: context_map }; + + // Convert package + let py_package: PyPackage = recipe.package.into(); + + // Convert source (ConditionalList) to PyVecItemSource + let py_sources: Vec = + recipe.source.into_iter().map(|item| item.into()).collect(); + + let py_vec_source: PyVecItemSource = py_sources.into(); + + // Convert build + let py_build: PyBuild = PyBuild::from_build(py, recipe.build); + + // Convert requirements + let py_requirements: PyConditionalRequirements = + PyConditionalRequirements::from_conditional_requirements(py, recipe.requirements); + + // Convert tests + let py_tests: Vec = recipe.tests.into_iter().map(|test| test.into()).collect(); + let py_vec_tests: PyVecTest = py_tests.into(); + + // Convert about (Option) + let py_about = PyOptionAbout { + inner: recipe.about.map(|about| about.into()), + }; + + // Convert extra (Option) + let py_extra = PyOptionExtra { + inner: recipe.extra.map(|extra| extra.into()), + }; + + PyIntermediateRecipe { + context: Py::new(py, py_context).unwrap(), + package: Py::new(py, py_package).unwrap(), + source: Py::new(py, py_vec_source).unwrap(), + build: Py::new(py, py_build).unwrap(), + requirements: Py::new(py, py_requirements).unwrap(), + tests: Py::new(py, py_vec_tests).unwrap(), + about: Py::new(py, py_about).unwrap(), + extra: Py::new(py, py_extra).unwrap(), + } + } + + pub fn to_intermediate_recipe(&self, py: Python) -> IntermediateRecipe { + let context: HashMap = (*self.context.borrow(py).clone()).clone(); + let context = context + .into_iter() + .map(|(k, v)| (k, (*v).clone())) + .collect(); + + let py_package = self.package.borrow(py).clone(); + let package: Package = (*py_package).clone(); + + let source: Vec> = (*self.source.borrow(py).clone()) + .clone() + .into_iter() + .map(|item| (*item).clone()) + .collect(); + + let build: Build = self.build.borrow(py).clone().into_build(py); + let requirements: ConditionalRequirements = self + .requirements + .borrow(py) + .clone() + .into_conditional_requirements(py); + + let tests: Vec = (*self.tests.borrow(py).clone()) + .clone() + .into_iter() + .map(|test| (*test).clone()) + .collect(); + + let about: Option = (*self.about.borrow(py).clone()) + .clone() + .map(|about| (*about).clone()); + let extra: Option = (*self.extra.borrow(py).clone()) + .clone() + .map(|extra| (*extra).clone()); + + IntermediateRecipe { + context, + package, + source, + build, + requirements, + tests, + about, + extra, + } + } +} + +#[pyclass(str)] +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct PyPackage { + pub(crate) inner: Package, +} + +impl Deref for PyPackage { + type Target = Package; + fn deref(&self) -> &Self::Target { + &self.inner + } +} +impl Display for PyPackage { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } +} + +#[pymethods] +impl PyPackage { + #[new] + pub fn new(name: PyValueString, version: PyValueString) -> Self { + PyPackage { + inner: Package { + name: name.inner, + version: version.inner, + }, + } + } + + #[getter] + pub fn name(&self) -> PyValueString { + PyValueString { + inner: self.inner.name.clone(), + } + } + + #[setter] + pub fn set_name(&mut self, name: PyValueString) { + self.inner.name = name.inner; + } + + #[getter] + pub fn version(&self) -> PyValueString { + PyValueString { + inner: self.inner.version.clone(), + } + } + + #[setter] + pub fn set_version(&mut self, version: PyValueString) { + self.inner.version = version.inner; + } +} + +impl From for PyPackage { + fn from(package: Package) -> Self { + PyPackage { inner: package } + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PySource { + pub(crate) inner: Source, +} + +#[pymethods] +impl PySource { + #[staticmethod] + pub fn url(url_source: PyUrlSource) -> Self { + PySource { + inner: Source::Url(url_source.inner), + } + } + + #[staticmethod] + pub fn path(path_source: PyPathSource) -> Self { + PySource { + inner: Source::Path(path_source.inner), + } + } + + pub fn is_url(&self) -> bool { + matches!(self.inner, Source::Url(_)) + } + + pub fn is_path(&self) -> bool { + matches!(self.inner, Source::Path(_)) + } +} + +impl From for PySource { + fn from(source: Source) -> Self { + PySource { inner: source } + } +} + +impl From for Source { + fn from(py_source: PySource) -> Self { + py_source.inner + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PyUrlSource { + pub(crate) inner: UrlSource, +} + +#[pymethods] +impl PyUrlSource { + #[new] + pub fn new(url: String, sha256: Option) -> PyResult { + Ok(PyUrlSource { + inner: UrlSource { + url: url + .parse() + .map_err(|e| PyValueError::new_err(format!("Invalid URL: {e}")))?, + sha256: sha256.map(Value::Concrete), + }, + }) + } + + #[getter] + pub fn url(&self) -> String { + self.inner.url.to_string() + } + + #[getter] + pub fn sha256(&self) -> Option { + self.inner + .sha256 + .clone() + .and_then(|v| v.concrete().cloned()) + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PyPathSource { + pub(crate) inner: PathSource, +} + +#[pymethods] +impl PyPathSource { + #[new] + pub fn new(path: String, sha256: Option) -> Self { + PyPathSource { + inner: PathSource { + path: Value::Concrete(path), + sha256: sha256.map(Value::Concrete), + }, + } + } + + #[getter] + pub fn path(&self) -> String { + self.inner.path.to_string() + } + + #[getter] + pub fn sha256(&self) -> Option { + self.inner + .sha256 + .clone() + .and_then(|v| v.concrete().cloned()) + } +} + +create_py_wrap!(PyOptionValueU64, Option, |opt: &Option< + PyValueU64, +>, + f: &mut Formatter< + '_, +>| { + match opt { + Some(value) => write!(f, "{value}"), + None => write!(f, "None"), + } +}); + +create_py_wrap!( + PyOptionPyNoArchKind, + Option, + |opt: &Option, f: &mut Formatter<'_>| { + match opt { + Some(value) => write!(f, "{value}"), + None => write!(f, "None"), + } + } +); + +#[pyclass(get_all, set_all, str)] +#[derive(Clone, Serialize, Deserialize)] +pub struct PyBuild { + pub number: Py, + pub script: Py, + pub noarch: Py, + pub python: Py, +} + +impl PyBuild { + pub fn into_build(self, py: Python) -> Build { + let noarch = self + .noarch + .borrow(py) + .clone() + .as_ref() + .map(|n| n.clone().inner); + + Build { + number: self + .number + .borrow(py) + .clone() + .as_ref() + .map(|n| n.deref().clone()), + script: self.script.borrow(py).clone().into_script(py), + noarch, + python: self.python.borrow(py).inner.clone(), + } + } + + pub fn from_build(py: Python, build: Build) -> PyBuild { + let py_value = build.number.map(PyValueU64::from); + let py_value: PyOptionValueU64 = py_value.into(); + + let py_noarch = build.noarch.map(PyNoArchKind::from); + + let py_noarch_value: PyOptionPyNoArchKind = py_noarch.into(); + + PyBuild { + number: Py::new(py, py_value).unwrap(), + script: Py::new(py, PyScript::from_script(py, build.script)).unwrap(), + noarch: Py::new(py, py_noarch_value).unwrap(), + python: Py::new(py, Into::::into(build.python)).unwrap(), + } + } +} + +#[pymethods] +impl PyBuild { + #[new] + pub fn new(py: Python) -> Self { + PyBuild { + number: Py::new(py, PyOptionValueU64::default()).unwrap(), + script: Py::new(py, PyScript::new(py, None, None, None)).unwrap(), + noarch: Py::new(py, PyOptionPyNoArchKind::default()).unwrap(), + python: Py::new(py, PyPython::new(None).unwrap()).unwrap(), + } + } +} + +impl Display for PyBuild { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{{ number: {}, script: {}, noarch: {}, python: {} }}", + self.number, self.script, self.noarch, self.python + ) + } +} + +create_py_wrap!(PyHashMap, HashMap, |map: &HashMap, f: &mut Formatter<'_>| { + write!(f, "{{")?; + for (k, v) in map { + write!(f, "{k}: {v}, ")?; + } + write!(f, "}}") +}); + +#[pyclass(get_all, set_all, str)] +#[derive(Clone, Serialize, Deserialize)] +pub struct PyScript { + pub content: String, + pub env: Py, + pub secrets: Py, +} + +impl Display for PyScript { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{{ content: {}, env: {}, secrets: {} }}", + self.content, self.env, self.secrets + ) + } +} + +#[pymethods] +impl PyScript { + #[new] + pub fn new( + py: Python, + content: Option, + env: Option>, + secrets: Option>, + ) -> Self { + let content = content.unwrap_or_default(); + let env = env.map(PyHashMap::from).unwrap_or_default(); + let secrets = secrets.map(PyVecString::from).unwrap_or_default(); + + PyScript { + content, + env: Py::new(py, env).unwrap(), + secrets: Py::new(py, secrets).unwrap(), + } + } +} + +impl PyScript { + pub fn into_script(self, py: Python) -> Script { + Script { + content: self.content, + env: (*self.env.borrow(py).clone()) + .clone() + .into_iter() + .collect::>(), + secrets: self.secrets.borrow(py).inner.clone(), + } + } + + pub fn from_script(py: Python, script: Script) -> Self { + let py_hashmap: PyHashMap = + PyHashMap::from(script.env.into_iter().collect::>()); + + let secrets_vec: PyVecString = script.secrets.into(); + + PyScript { + content: script.content, + env: Py::new(py, py_hashmap).unwrap(), + secrets: Py::new(py, secrets_vec).unwrap(), + } + } +} + +#[pyclass(str)] +#[derive(Clone, Serialize, Deserialize)] +pub struct PyPython { + pub(crate) inner: RecipePython, +} + +#[pymethods] +impl PyPython { + #[new] + pub fn new(entry_points: Option>) -> PyResult { + let entry_points: Result, _> = entry_points + .unwrap_or_default() + .into_iter() + .map(|s| s.parse()) + .collect(); + + match entry_points { + Ok(entry_points) => Ok(PyPython { + inner: RecipePython { entry_points }, + }), + Err(_) => Err(pyo3::exceptions::PyValueError::new_err( + "Invalid entry point format", + )), + } + } + + #[getter] + pub fn entry_points(&self) -> Vec { + self.inner + .entry_points + .iter() + .map(|e| e.to_string()) + .collect() + } + + #[setter] + pub fn set_entry_points(&mut self, entry_points: Vec) -> PyResult<()> { + let entry_points: Result, _> = + entry_points.into_iter().map(|s| s.parse()).collect(); + + match entry_points { + Ok(entry_points) => { + self.inner.entry_points = entry_points; + Ok(()) + } + Err(_) => Err(pyo3::exceptions::PyValueError::new_err( + "Invalid entry point format", + )), + } + } +} + +impl From for PyPython { + fn from(python: RecipePython) -> Self { + PyPython { inner: python } + } +} + +impl Display for PyPython { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } +} + +#[pyclass(str)] +#[derive(Clone, Serialize, Deserialize)] +pub struct PyNoArchKind { + pub(crate) inner: NoArchKind, +} + +impl Display for PyNoArchKind { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } +} + +#[pymethods] +impl PyNoArchKind { + #[staticmethod] + pub fn python() -> Self { + PyNoArchKind { + inner: NoArchKind::Python, + } + } + + #[staticmethod] + pub fn generic() -> Self { + PyNoArchKind { + inner: NoArchKind::Generic, + } + } + + pub fn is_python(&self) -> bool { + matches!(self.inner, NoArchKind::Python) + } + + pub fn is_generic(&self) -> bool { + matches!(self.inner, NoArchKind::Generic) + } +} + +impl From for PyNoArchKind { + fn from(noarch: NoArchKind) -> Self { + PyNoArchKind { inner: noarch } + } +} + +macro_rules! create_py_value { + ($name: ident, $type: ident) => { + #[pyclass(str)] + #[derive(Clone, Serialize, Deserialize)] + pub struct $name { + pub(crate) inner: Value<$type>, + } + + #[pymethods] + impl $name { + #[new] + pub fn new(value: String) -> Self { + $name { + inner: value.parse().unwrap(), + } + } + + #[staticmethod] + pub fn concrete(value: $type) -> Self { + $name { + inner: Value::Concrete(value), + } + } + + #[staticmethod] + pub fn template(template: String) -> Self { + $name { + inner: Value::Template(template), + } + } + + pub fn is_concrete(&self) -> bool { + matches!(self.inner, Value::Concrete(_)) + } + + pub fn is_template(&self) -> bool { + matches!(self.inner, Value::Template(_)) + } + + pub fn get_concrete(&self) -> Option<$type> { + match &self.inner { + Value::Concrete(v) => Some(v.clone()), + _ => None, + } + } + + pub fn get_template(&self) -> Option { + match &self.inner { + Value::Template(t) => Some(t.clone()), + _ => None, + } + } + } + + impl From> for $name { + fn from(value: Value<$type>) -> Self { + $name { inner: value } + } + } + + impl Deref for $name { + type Target = Value<$type>; + fn deref(&self) -> &Self::Target { + &self.inner + } + } + + impl Display for $name { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } + } + }; +} + +create_py_value!(PyValueString, String); +create_py_value!(PyValueU64, u64); + +#[pyclass(str, get_all, set_all)] +#[derive(Clone, Serialize, Deserialize)] +pub struct PyConditionalRequirements { + // pub(crate) inner: ConditionalRequirements, + // #[serde(default)] + pub(crate) build: Py, + // #[serde(default)] + pub(crate) host: Py, + // #[serde(default)] + pub(crate) run: Py, + // #[serde(default)] + pub(crate) run_constraints: Py, +} + +#[pymethods] +impl PyConditionalRequirements { + #[new] + pub fn new(py: Python) -> Self { + let build = PyVecItemPackageDependency::new(); + let host = PyVecItemPackageDependency::new(); + let run = PyVecItemPackageDependency::new(); + let run_constraints = PyVecItemPackageDependency::new(); + + PyConditionalRequirements { + build: Py::new(py, build).unwrap(), + host: Py::new(py, host).unwrap(), + run: Py::new(py, run).unwrap(), + run_constraints: Py::new(py, run_constraints).unwrap(), + } + } + + pub fn resolve( + &self, + py: Python, + host_platform: Option<&PyPlatform>, + ) -> PyPackageSpecDependencies { + let build = self.build.borrow(py).clone(); + // let build = *build; + + // let build: Vec> = *(self.build.borrow(py).clone()); + let host = self.host.borrow(py).clone(); + let run = self.run.borrow(py).clone(); + let run_constraints = self.run_constraints.borrow(py).clone(); + + let platform = host_platform.map(|p| p.inner); + + let resolved = ConditionalRequirements::resolve( + &build.inner, + &host.inner, + &run.inner, + &run_constraints.inner, + platform, + ); + + resolved.into() + } +} + +impl PyConditionalRequirements { + pub fn into_conditional_requirements(self, py: Python) -> ConditionalRequirements { + ConditionalRequirements { + build: (self.build.borrow(py).clone()) + .inner + .clone() + .into_iter() + .collect(), + host: (self.host.borrow(py).clone()) + .inner + .clone() + .into_iter() + .collect(), + run: (self.run.borrow(py).clone()) + .inner + .clone() + .into_iter() + .collect(), + run_constraints: (self.run_constraints.borrow(py).clone()) + .inner + .clone() + .into_iter() + .collect(), + } + } + + pub fn from_conditional_requirements( + py: Python, + requirements: ConditionalRequirements, + ) -> Self { + let build: PyVecItemPackageDependency = requirements.build.into(); + let host: PyVecItemPackageDependency = requirements.host.into(); + let run: PyVecItemPackageDependency = requirements.run.into(); + let run_constraints: PyVecItemPackageDependency = requirements.run_constraints.into(); + + PyConditionalRequirements { + build: Py::new(py, build).unwrap(), + host: Py::new(py, host).unwrap(), + run: Py::new(py, run).unwrap(), + run_constraints: Py::new(py, run_constraints).unwrap(), + } + } +} + +impl Display for PyConditionalRequirements { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{{ build: {} }}", self.build)?; + write!(f, "{{ host: {} }}", self.host)?; + write!(f, "{{ run: {} }}", self.run)?; + write!(f, "{{ run_constraints: {} }}", self.run_constraints)?; + Ok(()) + } +} + +create_py_wrap!(PyTest, Test); + +#[pyclass(str)] +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct PyAbout { + pub(crate) inner: About, +} + +#[pymethods] +impl PyAbout { + #[new] + pub fn new() -> Self { + PyAbout { + inner: About::default(), + } + } + + #[getter] + pub fn homepage(&self) -> Option { + self.inner + .homepage + .clone() + .and_then(|v| v.concrete().cloned()) + } + + #[getter] + pub fn license(&self) -> Option { + self.inner + .license + .clone() + .and_then(|v| v.concrete().cloned()) + } + + #[getter] + pub fn summary(&self) -> Option { + self.inner + .summary + .clone() + .and_then(|v| v.concrete().cloned()) + } + + #[getter] + pub fn description(&self) -> Option { + self.inner + .description + .clone() + .and_then(|v| v.concrete().cloned()) + } +} + +impl Display for PyAbout { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{{ {} }}", self.inner) + } +} + +impl From for PyAbout { + fn from(about: About) -> Self { + PyAbout { inner: about } + } +} + +impl Deref for PyAbout { + type Target = About; + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +#[pyclass(str)] +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct PyExtra { + pub(crate) inner: Extra, +} + +#[pymethods] +impl PyExtra { + #[new] + pub fn new() -> Self { + PyExtra { + inner: Extra::default(), + } + } + + #[getter] + pub fn recipe_maintainers(&self) -> PyResult> { + Python::attach(|py| { + let list = PyList::empty(py); + for dep in &self.inner.recipe_maintainers { + list.append(PyItemString { inner: dep.clone() })?; + } + Ok(list.unbind()) + }) + } +} + +impl From for PyExtra { + fn from(extra: Extra) -> Self { + PyExtra { inner: extra } + } +} + +impl Deref for PyExtra { + type Target = Extra; + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl Display for PyExtra { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{{ {} }}", self.inner) + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/requirements.rs b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/requirements.rs new file mode 100644 index 0000000000..b346052904 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/recipe_stage0/requirements.rs @@ -0,0 +1,327 @@ +use pyo3::{pyclass, pymethods}; +use rattler_conda_types::MatchSpec; +use recipe_stage0::matchspec::{PackageDependency, SerializableMatchSpec, SourceMatchSpec}; +use recipe_stage0::requirements::{PackageSpecDependencies, Selector}; +use std::collections::HashMap; +use std::fmt::Display; + +#[pyclass] +#[derive(Clone, Default)] +pub struct PyPackageSpecDependencies { + pub(crate) inner: PackageSpecDependencies, +} + +#[pymethods] +impl PyPackageSpecDependencies { + #[new] + pub fn new() -> Self { + PyPackageSpecDependencies { + inner: PackageSpecDependencies::default(), + } + } + + #[getter] + pub fn build(&self) -> HashMap { + self.inner + .build + .iter() + .map(|(name, dep)| { + ( + name.as_normalized().to_string(), + PyPackageDependency { inner: dep.clone() }, + ) + }) + .collect() + } + + #[getter] + pub fn host(&self) -> HashMap { + self.inner + .host + .iter() + .map(|(name, dep)| { + ( + name.as_normalized().to_string(), + PyPackageDependency { inner: dep.clone() }, + ) + }) + .collect() + } + + #[getter] + pub fn run(&self) -> HashMap { + self.inner + .run + .iter() + .map(|(name, dep)| { + ( + name.as_normalized().to_string(), + PyPackageDependency { inner: dep.clone() }, + ) + }) + .collect() + } + + #[getter] + pub fn run_constraints(&self) -> HashMap { + self.inner + .run_constraints + .iter() + .map(|(name, dep)| { + ( + name.as_normalized().to_string(), + PyPackageDependency { inner: dep.clone() }, + ) + }) + .collect() + } +} + +#[pyclass(str)] +#[derive(Clone)] +pub struct PyPackageDependency { + pub(crate) inner: PackageDependency, +} + +#[pymethods] +impl PyPackageDependency { + #[new] + pub fn new(matchspec: String) -> pyo3::PyResult { + let spec = matchspec.parse::().map_err(|e| { + pyo3::exceptions::PyValueError::new_err(format!("Invalid matchspec: {e}")) + })?; + Ok(PyPackageDependency { inner: spec }) + } + + #[staticmethod] + pub fn source(source_matchspec: PySourceMatchSpec) -> Self { + PyPackageDependency { + inner: PackageDependency::Source(source_matchspec.inner), + } + } + + pub fn is_binary(&self) -> bool { + matches!(self.inner, PackageDependency::Binary(_)) + } + + pub fn is_source(&self) -> bool { + matches!(self.inner, PackageDependency::Source(_)) + } + + pub fn get_binary(&self) -> Option { + match &self.inner { + PackageDependency::Binary(spec) => Some(spec.to_string()), + _ => None, + } + } + + pub fn get_source(&self) -> Option { + match &self.inner { + PackageDependency::Source(spec) => Some(PySourceMatchSpec { + inner: spec.clone(), + }), + _ => None, + } + } + + pub fn package_name(&self) -> String { + self.inner.package_name().as_normalized().to_string() + } +} + +impl Display for PyPackageDependency { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } +} + +impl From for PyPackageDependency { + fn from(dep: PackageDependency) -> Self { + PyPackageDependency { inner: dep } + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PySourceMatchSpec { + pub(crate) inner: SourceMatchSpec, +} + +#[pymethods] +impl PySourceMatchSpec { + #[new] + pub fn new(spec: String, location: String) -> pyo3::PyResult { + let matchspec = spec.parse::().map_err(|e| { + pyo3::exceptions::PyValueError::new_err(format!("Invalid matchspec: {e}")) + })?; + let url = location + .parse() + .map_err(|e| pyo3::exceptions::PyValueError::new_err(format!("Invalid URL: {e}")))?; + + Ok(PySourceMatchSpec { + inner: SourceMatchSpec { + spec: matchspec, + location: url, + }, + }) + } + + #[getter] + pub fn spec(&self) -> String { + self.inner.spec.to_string() + } + + #[getter] + pub fn location(&self) -> String { + self.inner.location.to_string() + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PySerializableMatchSpec { + pub(crate) inner: SerializableMatchSpec, +} + +#[pymethods] +impl PySerializableMatchSpec { + #[new] + pub fn new(spec: String) -> pyo3::PyResult { + let matchspec = spec.parse::().map_err(|e| { + pyo3::exceptions::PyValueError::new_err(format!("Invalid matchspec: {e}")) + })?; + Ok(PySerializableMatchSpec { + inner: SerializableMatchSpec::from(matchspec), + }) + } + + #[getter] + pub fn spec(&self) -> String { + self.inner.0.to_string() + } +} + +#[pyclass] +#[derive(Clone)] +pub struct PySelector { + pub(crate) inner: Selector, +} + +#[pymethods] +impl PySelector { + #[staticmethod] + pub fn unix() -> Self { + PySelector { + inner: Selector::Unix, + } + } + + #[staticmethod] + pub fn linux() -> Self { + PySelector { + inner: Selector::Linux, + } + } + + #[staticmethod] + pub fn win() -> Self { + PySelector { + inner: Selector::Win, + } + } + + #[staticmethod] + pub fn macos() -> Self { + PySelector { + inner: Selector::MacOs, + } + } + + #[staticmethod] + pub fn platform(platform: String) -> Self { + PySelector { + inner: Selector::Platform(platform), + } + } + + pub fn is_unix(&self) -> bool { + matches!(self.inner, Selector::Unix) + } + + pub fn is_linux(&self) -> bool { + matches!(self.inner, Selector::Linux) + } + + pub fn is_win(&self) -> bool { + matches!(self.inner, Selector::Win) + } + + pub fn is_macos(&self) -> bool { + matches!(self.inner, Selector::MacOs) + } + + pub fn is_platform(&self) -> bool { + matches!(self.inner, Selector::Platform(_)) + } + + pub fn get_platform(&self) -> Option { + match &self.inner { + Selector::Platform(p) => Some(p.clone()), + _ => None, + } + } +} + +impl From> for PyPackageSpecDependencies { + fn from(deps: PackageSpecDependencies) -> Self { + PyPackageSpecDependencies { inner: deps } + } +} + +impl From for PackageSpecDependencies { + fn from(py_deps: PyPackageSpecDependencies) -> Self { + py_deps.inner + } +} + +impl From for PackageDependency { + fn from(py_dep: PyPackageDependency) -> Self { + py_dep.inner + } +} + +impl From for PySourceMatchSpec { + fn from(spec: SourceMatchSpec) -> Self { + PySourceMatchSpec { inner: spec } + } +} + +impl From for SourceMatchSpec { + fn from(py_spec: PySourceMatchSpec) -> Self { + py_spec.inner + } +} + +impl From for PySerializableMatchSpec { + fn from(spec: SerializableMatchSpec) -> Self { + PySerializableMatchSpec { inner: spec } + } +} + +impl From for SerializableMatchSpec { + fn from(py_spec: PySerializableMatchSpec) -> Self { + py_spec.inner + } +} + +impl From for PySelector { + fn from(selector: Selector) -> Self { + PySelector { inner: selector } + } +} + +impl From for Selector { + fn from(py_selector: PySelector) -> Self { + py_selector.inner + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/config.rs b/pixi-build-backends/py-pixi-build-backend/src/types/config.rs new file mode 100644 index 0000000000..43bf73ee2b --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/config.rs @@ -0,0 +1,67 @@ +use std::path::{Path, PathBuf}; + +use pixi_build_backend::generated_recipe::BackendConfig; +use pyo3::{Py, PyAny, Python, pyclass, pymethods}; +use pythonize::pythonize; +use serde::Deserialize; +use serde::Deserializer; + +#[pyclass] +#[derive(Clone, Debug)] +pub struct PyBackendConfig { + pub(crate) model: Py, + pub(crate) debug_dir: Option, +} + +impl<'de> Deserialize<'de> for PyBackendConfig { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + struct TempData(serde_json::Value); + + let mut data = TempData::deserialize(deserializer)?.0; + + Python::attach(|py| { + let model = pythonize(py, &data).map_err(serde::de::Error::custom)?; + + // Support both debug_dir and debug-dir + let debug_dir: Option = data + .as_object_mut() + .and_then(|obj| obj.get("debug-dir").or_else(|| obj.get("debug_dir"))) + .and_then(|v| v.as_str().map(PathBuf::from)); + + Ok(PyBackendConfig { + model: model.unbind(), + debug_dir, + }) + }) + } +} + +#[pymethods] +impl PyBackendConfig { + #[new] + fn new(debug_dir: Option, model: Py) -> Self { + PyBackendConfig { debug_dir, model } + } + + fn debug_dir(&self) -> Option<&Path> { + BackendConfig::debug_dir(self) + } +} + +impl BackendConfig for PyBackendConfig { + fn debug_dir(&self) -> Option<&Path> { + self.debug_dir.as_deref() + } + + fn merge_with_target_config(&self, target_config: &Self) -> miette::Result { + if target_config.debug_dir.is_some() { + miette::bail!("`debug_dir` cannot have a target specific value"); + } + + Ok(self.clone()) + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/generated_recipe.rs b/pixi-build-backends/py-pixi-build-backend/src/types/generated_recipe.rs new file mode 100644 index 0000000000..3f00ff6ea0 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/generated_recipe.rs @@ -0,0 +1,311 @@ +use std::collections::{BTreeMap, BTreeSet, HashSet}; +use std::path::{Path, PathBuf}; + +use crate::{ + create_py_wrap, + error::pretty_print_error, + recipe_stage0::recipe::PyIntermediateRecipe, + types::metadata_provider::get_input_globs_from_provider, + types::{PyBackendConfig, PyMetadataProvider, PyPlatform, PyProjectModel, PyPythonParams}, +}; +use miette::IntoDiagnostic; +use pixi_build_backend::generated_recipe::{ + DefaultMetadataProvider, GenerateRecipe, GeneratedRecipe, PythonParams, +}; +use pixi_build_backend::{NormalizedKey, Variable}; +use pixi_build_types::ProjectModel; +use pyo3::{ + Py, PyAny, PyErr, PyResult, Python, + exceptions::PyRuntimeError, + pyclass, pymethods, + types::{PyAnyMethods, PyList, PyString}, +}; +use rattler_conda_types::{ChannelUrl, Platform}; +use recipe_stage0::recipe::IntermediateRecipe; + +create_py_wrap!(PyVecString, Vec, |v: &Vec, + f: &mut std::fmt::Formatter< + '_, +>| { + write!(f, "[{}]", v.join(", ")) +}); + +#[pyclass(get_all, set_all)] +#[derive(Clone)] +pub struct PyGeneratedRecipe { + pub(crate) recipe: Py, + pub(crate) metadata_input_globs: Py, + pub(crate) build_input_globs: Py, +} + +#[pymethods] +impl PyGeneratedRecipe { + #[new] + pub fn new(py: Python) -> PyResult { + Ok(PyGeneratedRecipe { + recipe: Py::new(py, PyIntermediateRecipe::new(py)?)?, + metadata_input_globs: Py::new(py, PyVecString::default())?, + build_input_globs: Py::new(py, PyVecString::default())?, + }) + } + + #[staticmethod] + pub fn from_model(py: Python, model: PyProjectModel) -> PyResult { + let generated_recipe = + GeneratedRecipe::from_model(model.inner.clone(), &mut DefaultMetadataProvider) + .map_err(|e| PyErr::new::(pretty_print_error(&e)))?; + + let py_recipe = Py::new( + py, + PyIntermediateRecipe::from_intermediate_recipe(generated_recipe.recipe, py), + )?; + let py_metadata_globs = Py::new( + py, + PyVecString::from( + generated_recipe + .metadata_input_globs + .into_iter() + .collect::>(), + ), + )?; + let py_build_globs = Py::new( + py, + PyVecString::from( + generated_recipe + .build_input_globs + .into_iter() + .collect::>(), + ), + )?; + + Ok(PyGeneratedRecipe { + recipe: py_recipe, + metadata_input_globs: py_metadata_globs, + build_input_globs: py_build_globs, + }) + } + + #[staticmethod] + pub fn from_model_with_provider( + py: Python, + model: PyProjectModel, + metadata_provider: Py, + ) -> PyResult { + let mut provider = PyMetadataProvider::new(metadata_provider.clone()); + let generated_recipe = GeneratedRecipe::from_model(model.inner.clone(), &mut provider) + .map_err(|e| PyErr::new::(pretty_print_error(&e)))?; + + // Get additional input globs from the metadata provider if available + let mut metadata_input_globs = generated_recipe.metadata_input_globs; + let provider_globs = get_input_globs_from_provider(&metadata_provider); + metadata_input_globs.extend(provider_globs); + + let py_recipe = Py::new( + py, + PyIntermediateRecipe::from_intermediate_recipe(generated_recipe.recipe, py), + )?; + let py_metadata_globs = Py::new( + py, + PyVecString::from(metadata_input_globs.into_iter().collect::>()), + )?; + let py_build_globs = Py::new( + py, + PyVecString::from( + generated_recipe + .build_input_globs + .into_iter() + .collect::>(), + ), + )?; + + Ok(PyGeneratedRecipe { + recipe: py_recipe, + metadata_input_globs: py_metadata_globs, + build_input_globs: py_build_globs, + }) + } +} + +impl PyGeneratedRecipe { + pub fn to_generated_recipe(&self, py: Python) -> GeneratedRecipe { + let recipe: IntermediateRecipe = self.recipe.borrow(py).to_intermediate_recipe(py); + let metadata_input_globs: BTreeSet = + (*self.metadata_input_globs.borrow(py).clone()) + .clone() + .into_iter() + .collect(); + let build_input_globs: BTreeSet = (*self.build_input_globs.borrow(py).clone()) + .clone() + .into_iter() + .collect(); + + GeneratedRecipe { + recipe, + metadata_input_globs, + build_input_globs, + } + } +} + +/// Trait part +#[pyclass] +#[derive(Clone)] +pub struct PyGenerateRecipe { + model: Py, +} + +#[pymethods] +impl PyGenerateRecipe { + #[new] + pub fn new(model: Py) -> Self { + PyGenerateRecipe { model } + } +} + +#[async_trait::async_trait] +impl GenerateRecipe for PyGenerateRecipe { + type Config = PyBackendConfig; + + async fn generate_recipe( + &self, + model: &ProjectModel, + config: &Self::Config, + manifest_root: PathBuf, + host_platform: Platform, + python_params: Option, + _variants: &HashSet, + channels: Vec, + _cache_dir: Option, + ) -> miette::Result { + let recipe: GeneratedRecipe = Python::attach(|py| { + let manifest_str = manifest_root.to_string_lossy().to_string(); + + // we don't pass the wrapper but the python inner model directly + let py_object = config.model.clone(); + + // For other types, we try to wrap them into the Python class + // So user can use the Python API + let project_model_class = py + .import("pixi_build_backend.types.project_model") + .into_diagnostic()? + .getattr("ProjectModel") + .into_diagnostic()?; + + let project_model = project_model_class + .call_method1("_from_py", (PyProjectModel::from(model),)) + .into_diagnostic()?; + + let platform_model_class = py + .import("pixi_build_backend.types.platform") + .into_diagnostic()? + .getattr("Platform") + .into_diagnostic()?; + + let platform_model = platform_model_class + .call_method1("_from_py", (PyPlatform::from(host_platform),)) + .into_diagnostic()?; + + let python_params_class = py + .import("pixi_build_backend.types.python_params") + .into_diagnostic()? + .getattr("PythonParams") + .into_diagnostic()?; + let python_params_model = python_params_class + .call_method1( + "_from_py", + (PyPythonParams::from(python_params.unwrap_or_default()),), + ) + .into_diagnostic()?; + + // Convert channels to Python list of strings + let channels_list = + PyList::new(py, channels.iter().map(|c| c.to_string())).into_diagnostic()?; + + let generated_recipe_py = self + .model + .bind(py) + .call_method( + "generate_recipe", + ( + project_model, + py_object, + PyString::new(py, manifest_str.as_str()), + platform_model, + python_params_model, + channels_list, + ), + None, + ) + .into_diagnostic()?; + + // To expose a nice API for the user, we extract the PyGeneratedRecipe + // calling private _into_py method + let generated_recipe: PyGeneratedRecipe = generated_recipe_py + .call_method0("_into_py") + .into_diagnostic()? + .extract::() + .into_diagnostic()?; + + Ok::<_, miette::Report>(generated_recipe.to_generated_recipe(py)) + })?; + + Ok(recipe) + } + + /// Returns a list of globs that should be used to find the input files + /// for the build process. + /// For example, this could be a list of source files or configuration files + /// used by Cmake. + fn extract_input_globs_from_build( + &self, + config: &Self::Config, + workdir: impl AsRef, + editable: bool, + ) -> miette::Result> { + Python::attach(|py| { + let workdir = workdir.as_ref(); + + // we don't pass the wrapper but the python inner model directly + let py_object = config.model.clone(); + + let input_globs = self + .model + .bind(py) + .call_method( + "extract_input_globs_from_build", + (py_object, workdir, editable), + None, + ) + .into_diagnostic()? + .extract::>() + .into_diagnostic()? + .into_iter() + .collect::>(); + Ok::<_, miette::Report>(input_globs) + }) + } + + fn default_variants( + &self, + host_platform: Platform, + ) -> miette::Result>> { + Python::attach(|py| { + let variants_dict = self + .model + .bind(py) + .call_method("default_variants", (PyPlatform::from(host_platform),), None) + .into_diagnostic()? + .extract::>>() + .into_diagnostic()?; + + let mut variants = BTreeMap::new(); + for (key, values) in variants_dict { + variants.insert( + NormalizedKey::from(key), + values.into_iter().map(Variable::from).collect(), + ); + } + Ok::<_, miette::Report>(variants) + }) + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/metadata_provider.rs b/pixi-build-backends/py-pixi-build-backend/src/types/metadata_provider.rs new file mode 100644 index 0000000000..df9dd4fbd3 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/metadata_provider.rs @@ -0,0 +1,182 @@ +use std::collections::BTreeSet; + +use miette::Diagnostic; +use pixi_build_backend::generated_recipe::MetadataProvider; +use pyo3::{Py, PyAny, PyErr, Python, pyclass, pymethods}; +use rattler_conda_types::{ParseVersionError, Version}; +use std::str::FromStr; +use thiserror::Error; + +/// Error type for Python metadata provider operations +#[derive(Debug, Error, Diagnostic)] +pub enum PyMetadataProviderError { + #[error("Python metadata provider error: {0}")] + Python(String), + #[error("Failed to parse version: {0}")] + ParseVersion(#[from] ParseVersionError), +} + +impl From for PyMetadataProviderError { + fn from(err: PyErr) -> Self { + PyMetadataProviderError::Python(err.to_string()) + } +} + +/// A Rust wrapper around a Python object that implements the MetadataProvider protocol +#[pyclass] +#[derive(Clone)] +pub struct PyMetadataProvider { + inner: Py, +} + +#[pymethods] +impl PyMetadataProvider { + #[new] + pub fn new(provider: Py) -> Self { + Self { inner: provider } + } +} + +impl MetadataProvider for PyMetadataProvider { + type Error = PyMetadataProviderError; + + fn name(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "name")?; + + if result.is_none(py) { + Ok(None) + } else { + let name: String = result.extract(py)?; + Ok(Some(name)) + } + }) + } + + fn version(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "version")?; + + if result.is_none(py) { + Ok(None) + } else { + let version_str: String = result.extract(py)?; + let version = Version::from_str(&version_str)?; + Ok(Some(version)) + } + }) + } + + fn homepage(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "homepage")?; + + if result.is_none(py) { + Ok(None) + } else { + let homepage: String = result.extract(py)?; + Ok(Some(homepage)) + } + }) + } + + fn license(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "license")?; + + if result.is_none(py) { + Ok(None) + } else { + let license: String = result.extract(py)?; + Ok(Some(license)) + } + }) + } + + fn license_files(&mut self) -> Result>, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "license_files")?; + + if result.is_none(py) { + Ok(None) + } else { + let license_file: String = result.extract(py)?; + Ok(Some(vec![license_file])) + } + }) + } + + fn summary(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "summary")?; + + if result.is_none(py) { + Ok(None) + } else { + let summary: String = result.extract(py)?; + Ok(Some(summary)) + } + }) + } + + fn description(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "description")?; + + if result.is_none(py) { + Ok(None) + } else { + let description: String = result.extract(py)?; + Ok(Some(description)) + } + }) + } + + fn documentation(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "documentation")?; + + if result.is_none(py) { + Ok(None) + } else { + let documentation: String = result.extract(py)?; + Ok(Some(documentation)) + } + }) + } + + fn repository(&mut self) -> Result, Self::Error> { + Python::attach(|py| { + let result = self.inner.call_method0(py, "repository")?; + + if result.is_none(py) { + Ok(None) + } else { + let repository: String = result.extract(py)?; + Ok(Some(repository)) + } + }) + } +} + +/// Helper function to get input globs from a Python metadata provider +/// if it supports the input_globs method (optional) +pub fn get_input_globs_from_provider(provider: &Py) -> BTreeSet { + Python::attach(|py| { + // Try to call input_globs method if it exists + match provider.call_method0(py, "input_globs") { + Ok(result) => { + // Try to extract as a list of strings + if let Ok(globs_list) = result.extract::>(py) { + globs_list.into_iter().collect() + } else { + BTreeSet::new() + } + } + Err(_) => { + // Method doesn't exist or failed, return empty set + BTreeSet::new() + } + } + }) +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/mod.rs b/pixi-build-backends/py-pixi-build-backend/src/types/mod.rs new file mode 100644 index 0000000000..5bac033c00 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/mod.rs @@ -0,0 +1,14 @@ +mod config; +mod generated_recipe; +mod metadata_provider; +mod platform; +mod project_model; +mod python_params; + +pub use generated_recipe::{PyGenerateRecipe, PyGeneratedRecipe, PyVecString}; +pub use metadata_provider::PyMetadataProvider; +pub use platform::PyPlatform; +pub use project_model::PyProjectModel; + +pub use config::PyBackendConfig; +pub use python_params::PyPythonParams; diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/platform.rs b/pixi-build-backends/py-pixi-build-backend/src/types/platform.rs new file mode 100644 index 0000000000..a4d8d809c9 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/platform.rs @@ -0,0 +1,74 @@ +use std::fmt::Display; + +use pyo3::prelude::*; +use rattler_conda_types::Platform; + +#[pyclass(str)] +#[derive(Clone)] +pub struct PyPlatform { + pub(crate) inner: Platform, +} + +#[pymethods] +impl PyPlatform { + #[new] + pub fn new(platform_str: &str) -> PyResult { + let platform = platform_str.parse::().map_err(|e| { + pyo3::exceptions::PyValueError::new_err(format!("Invalid platform: {e}")) + })?; + Ok(PyPlatform { inner: platform }) + } + + #[staticmethod] + pub fn current() -> Self { + Platform::current().into() + } + + #[getter] + pub fn name(&self) -> String { + self.inner.to_string() + } + + #[getter] + pub fn is_windows(&self) -> bool { + self.inner.is_windows() + } + + #[getter] + pub fn is_linux(&self) -> bool { + self.inner.is_linux() + } + + #[getter] + pub fn is_osx(&self) -> bool { + self.inner.is_osx() + } + + #[getter] + pub fn is_unix(&self) -> bool { + self.inner.is_unix() + } + + #[getter] + pub fn only_platform(&self) -> Option<&str> { + self.inner.only_platform() + } +} + +impl Display for PyPlatform { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.inner) + } +} + +impl From for PyPlatform { + fn from(platform: Platform) -> Self { + PyPlatform { inner: platform } + } +} + +impl From for Platform { + fn from(py_platform: PyPlatform) -> Self { + py_platform.inner + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs b/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs new file mode 100644 index 0000000000..5ea9f00845 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs @@ -0,0 +1,147 @@ +use std::{fs, str::FromStr}; + +use pixi_build_types::ProjectModel; +use pyo3::{exceptions::PyValueError, prelude::*}; +use pythonize::depythonize; +use rattler_conda_types::Version; +use serde_json::from_str; + +#[pyclass] +#[derive(Clone)] +pub struct PyProjectModel { + pub(crate) inner: ProjectModel, +} + +#[pymethods] +impl PyProjectModel { + #[new] + #[pyo3(signature = (name, version=None))] + pub fn new(name: Option, version: Option) -> Self { + PyProjectModel { + inner: ProjectModel { + name, + version: version.map(|v| { + v.parse() + .unwrap_or_else(|_| Version::from_str(&v).expect("Invalid version")) + }), + targets: None, + description: None, + authors: None, + license: None, + license_file: None, + readme: None, + homepage: None, + repository: None, + documentation: None, + build_number: None, + build_string: None, + }, + } + } + + #[staticmethod] + pub fn from_json(json: &str) -> PyResult { + let project: ProjectModel = from_str(json).map_err(|err| { + PyErr::new::(format!("Failed to parse ProjectModel from JSON: {err}")) + })?; + + Ok(PyProjectModel { inner: project }) + } + + #[staticmethod] + pub fn from_dict(value: &Bound) -> PyResult { + let project: ProjectModel = depythonize(value)?; + Ok(PyProjectModel { inner: project }) + } + + #[staticmethod] + pub fn from_json_file(path: &str) -> PyResult { + let content = fs::read_to_string(path).map_err(|err| { + PyErr::new::(format!( + "Failed to read ProjectModel JSON file '{path}': {err}" + )) + })?; + + Self::from_json(&content) + } + + #[getter] + pub fn name(&self) -> Option<&String> { + self.inner.name.as_ref() + } + + #[getter] + pub fn version(&self) -> Option { + self.inner.version.as_ref().map(|v| v.to_string()) + } + + #[getter] + pub fn description(&self) -> Option { + self.inner.description.clone() + } + + #[getter] + pub fn authors(&self) -> Option> { + self.inner.authors.clone() + } + + #[getter] + pub fn license(&self) -> Option { + self.inner.license.clone() + } + + #[getter] + pub fn license_file(&self) -> Option { + self.inner + .license_file + .as_ref() + .map(|p| p.to_string_lossy().to_string()) + } + + #[getter] + pub fn readme(&self) -> Option { + self.inner + .readme + .as_ref() + .map(|p| p.to_string_lossy().to_string()) + } + + #[getter] + pub fn homepage(&self) -> Option { + self.inner.homepage.as_ref().map(|u| u.to_string()) + } + + #[getter] + pub fn repository(&self) -> Option { + self.inner.repository.as_ref().map(|u| u.to_string()) + } + + #[getter] + pub fn documentation(&self) -> Option { + self.inner.documentation.as_ref().map(|u| u.to_string()) + } + + pub fn _debug_str(&self) -> String { + format!("{:?}", self.inner) + } +} + +impl From for PyProjectModel { + fn from(model: ProjectModel) -> Self { + PyProjectModel { inner: model } + } +} + +impl From<&ProjectModel> for PyProjectModel { + fn from(model: &ProjectModel) -> Self { + PyProjectModel { + inner: model.clone(), + } + } +} + +impl From for ProjectModel { + fn from(py_model: PyProjectModel) -> Self { + py_model.inner + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/python_params.rs b/pixi-build-backends/py-pixi-build-backend/src/types/python_params.rs new file mode 100644 index 0000000000..fd60b9cf80 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/src/types/python_params.rs @@ -0,0 +1,51 @@ +use pixi_build_backend::generated_recipe::PythonParams; +use pyo3::prelude::*; + +#[pyclass] +#[derive(Clone)] +pub struct PyPythonParams { + pub(crate) inner: PythonParams, +} + +impl AsRef for PyPythonParams { + fn as_ref(&self) -> &PythonParams { + &self.inner + } +} + +#[pymethods] +impl PyPythonParams { + #[new] + #[pyo3(signature = (editable = false))] + pub fn new(editable: bool) -> Self { + PyPythonParams { + inner: PythonParams { editable }, + } + } + + #[getter] + pub fn editable(&self) -> bool { + self.inner.editable + } + + #[setter] + pub fn set_editable(&mut self, editable: bool) { + self.inner.editable = editable; + } + + pub fn __repr__(&self) -> String { + format!("PyPythonParams(editable={})", self.inner.editable) + } +} + +impl From for PyPythonParams { + fn from(params: PythonParams) -> Self { + PyPythonParams { inner: params } + } +} + +impl From for PythonParams { + fn from(py_params: PyPythonParams) -> Self { + py_params.inner + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/tests/__init__.py b/pixi-build-backends/py-pixi-build-backend/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pixi-build-backends/py-pixi-build-backend/tests/conftest.py b/pixi-build-backends/py-pixi-build-backend/tests/conftest.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pixi-build-backends/py-pixi-build-backend/tests/data/boltons_recipe.yaml b/pixi-build-backends/py-pixi-build-backend/tests/data/boltons_recipe.yaml new file mode 100644 index 0000000000..1022f9958d --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/data/boltons_recipe.yaml @@ -0,0 +1,30 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json + +context: + version: "23.0.0" + +package: + name: boltons-with-extra + version: ${{ version }} + +source: + - url: https://github.com/mahmoud/boltons/archive/refs/tags/${{ version }}.tar.gz + sha256: 9b2998cd9525ed472079c7dd90fbd216a887202e8729d5969d4f33878f0ff668 + +build: + noarch: python + script: + content: + - python -m pip install . --no-deps -vv + +requirements: + host: + - python + - pip + - setuptools + run: + - pip + +about: + license: BSD-3-Clause + license_file: LICENSE diff --git a/pixi-build-backends/py-pixi-build-backend/tests/data/project_model_example.json b/pixi-build-backends/py-pixi-build-backend/tests/data/project_model_example.json new file mode 100644 index 0000000000..5f2c1a2ec4 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/data/project_model_example.json @@ -0,0 +1,38 @@ +{ + "name": "minimal-package", + "version": "1.0.0", + "description": null, + "authors": null, + "license": null, + "license_file": null, + "readme": null, + "homepage": null, + "repository": null, + "documentation": null, + "targets": { + "defaultTarget": { + "hostDependencies": {}, + "buildDependencies": {}, + "runDependencies": { + "python": { + "binary": { + "version": ">=3.8" + } + } + } + }, + "targets": { + "Linux": { + "hostDependencies": { + "rich": { + "binary": { + "version": ">=10.0" + } + } + }, + "buildDependencies": {}, + "runDependencies": {} + } + } + } +} diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/__init__.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_generated_recipe.ambr b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_generated_recipe.ambr new file mode 100644 index 0000000000..3d73c63f4c --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_generated_recipe.ambr @@ -0,0 +1,32 @@ +# serializer version: 1 +# name: test_generated_recipe_from_model + ''' + context: {} + package: + name: test_project + version: 1.0.0 + source: [] + build: + number: null + script: + content: '' + env: {} + secrets: [] + requirements: + build: [] + host: [] + run: [] + run_constraints: [] + tests: [] + about: + homepage: null + license: null + license_file: null + summary: null + description: null + documentation: null + repository: null + extra: null + + ''' +# --- diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_intermediate_recipe.ambr b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_intermediate_recipe.ambr new file mode 100644 index 0000000000..dcb0c93286 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_intermediate_recipe.ambr @@ -0,0 +1,43 @@ +# serializer version: 1 +# name: test_from_yaml + ''' + context: + version: 23.0.0 + package: + name: boltons-with-extra + version: ${{ version }} + source: + - url: https://github.com/mahmoud/boltons/archive/refs/tags/${{ version }}.tar.gz + sha256: 9b2998cd9525ed472079c7dd90fbd216a887202e8729d5969d4f33878f0ff668 + build: + number: null + script: + content: python -m pip install . --no-deps -vv + env: {} + secrets: [] + noarch: python + requirements: + build: [] + host: + - python + - pip + - setuptools + run: + - pip + run_constraints: [] + tests: [] + about: + homepage: null + license: BSD-3-Clause + license_file: LICENSE + summary: null + description: null + documentation: null + repository: null + extra: null + + ''' +# --- +# name: test_intermediate_str + '{ context: {version: 23.0.0, }, package: boltons-with-extra-${{ version }}, source: [url: https://github.com/mahmoud/boltons/archive/refs/tags/${{ version }}.tar.gz, sha256: 9b2998cd9525ed472079c7dd90fbd216a887202e8729d5969d4f33878f0ff668, ], build: { number: None, script: { content: python -m pip install . --no-deps -vv, env: {}, secrets: [] }, noarch: python, python: }, requirements: { build: [] }{ host: [python, pip, setuptools, ] }{ run: [pip, ] }{ run_constraints: [] }, tests: [], about: { About { homepage: , license: BSD-3-Clause, license_file: LICENSE, summary: , description: , documentation: , repository: } }, extra: None }' +# --- diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_project_model.ambr b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_project_model.ambr new file mode 100644 index 0000000000..0c99797b87 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/__snapshots__/test_project_model.ambr @@ -0,0 +1,13 @@ +# serializer version: 1 +# name: test_project_model_initialization + 'ProjectModel { name: Some("test_project"), build_string: None, build_number: None, version: Some(Version { version: [[0], [1], [0], [0]], local: [] }), description: None, authors: None, license: None, license_file: None, readme: None, homepage: None, repository: None, documentation: None, targets: None }' +# --- +# name: test_project_model_initialization_from_dict + 'ProjectModel { name: Some("test_project"), build_string: None, build_number: None, version: Some(Version { version: [[0], [1], [0], [0]], local: [] }), description: None, authors: None, license: None, license_file: None, readme: None, homepage: None, repository: None, documentation: None, targets: None }' +# --- +# name: test_project_model_initialization_from_json + 'ProjectModel { name: Some("test_project"), build_string: None, build_number: None, version: Some(Version { version: [[0], [1], [0], [0]], local: [] }), description: None, authors: None, license: None, license_file: None, readme: None, homepage: None, repository: None, documentation: None, targets: None }' +# --- +# name: test_project_model_initialization_from_json_file + 'ProjectModel { name: Some("minimal-package"), build_string: None, build_number: None, version: Some(Version { version: [[0], [1], [0], [0]], local: [] }), description: None, authors: None, license: None, license_file: None, readme: None, homepage: None, repository: None, documentation: None, targets: Some(Targets { default_target: Some(Target { host_dependencies: Some({}), build_dependencies: Some({}), run_dependencies: Some({"python": Binary(NamelessMatchSpecV1 { version: Range(GreaterEquals, Version { version: [[0], [3], [8]], local: [] }) })}) }), targets: Some({Platform("Linux"): Target { host_dependencies: Some({"rich": Binary(NamelessMatchSpecV1 { version: Range(GreaterEquals, Version { version: [[0], [10], [0]], local: [] }) })}), build_dependencies: Some({}), run_dependencies: Some({}) }}) }) }' +# --- diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/test_conditional.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_conditional.py new file mode 100644 index 0000000000..e51ced9cd8 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_conditional.py @@ -0,0 +1,44 @@ +from pixi_build_backend.types.conditional import ConditionalString, ListOrItemString + + +def test_conditional_creation() -> None: + """ + Test creation of a conditional package dependency. + And validating that it can act as a List. + + """ + condition = "os == 'linux'" + then = ListOrItemString(["package1"]) + else_ = ListOrItemString(["package3"]) + + conditional_dep = ConditionalString(condition, then, else_) + + assert conditional_dep.condition == condition + + # Test that then_value contains the expected initial content + assert len(conditional_dep.then_value) == 1 + assert conditional_dep.then_value[0] == "package1" + + # Test extending the then_value list + result = conditional_dep.then_value.extend(["package2", "package3"]) + assert result is None # extend() returns None + assert len(conditional_dep.then_value) == 3 + assert conditional_dep.then_value[1] == "package2" + assert conditional_dep.then_value[2] == "package3" + + # Test item assignment + conditional_dep.then_value[0] = "package001" + assert conditional_dep.then_value[0] == "package001" + + # Test item deletion + del conditional_dep.then_value[1] # Remove "package2" + assert len(conditional_dep.then_value) == 2 + assert conditional_dep.then_value[0] == "package001" + assert conditional_dep.then_value[1] == "package3" + + # Test final state matches expected + expected_then = ListOrItemString(["package001", "package3"]) + assert conditional_dep.then_value == expected_then + + # Test else_value is accessible and equals initial value + assert conditional_dep.else_value == else_ diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/test_generated_recipe.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_generated_recipe.py new file mode 100644 index 0000000000..9e4fa7e037 --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_generated_recipe.py @@ -0,0 +1,79 @@ +from typing import Any + +from pixi_build_backend.types.conditional import ConditionalPackageDependency, ListOrItemPackageDependency +from pixi_build_backend.types.generated_recipe import GeneratedRecipe +from pixi_build_backend.types.item import ItemPackageDependency +from pixi_build_backend.types.project_model import ProjectModel +from pixi_build_backend.types.intermediate_recipe import IntermediateRecipe + + +def test_generated_recipe_from_model(snapshot: Any) -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel(name="test_project", version="1.0.0") + + generated_recipe = GeneratedRecipe.from_model(model) + + # Verify that the recipe is of the correct type + assert isinstance(generated_recipe.recipe, IntermediateRecipe) + + assert snapshot == generated_recipe.recipe.to_yaml() + + +def test_setting_package_name_from_generated_recipe() -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel(name="test_project", version="1.0.0") + + generated_recipe = GeneratedRecipe.from_model(model) + + # Test that we can access the package name + original_name = str(generated_recipe.recipe.package.name) + assert isinstance(original_name, str) + assert len(original_name) > 0 + + +def test_package_dependency_modification() -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel(name="test_project", version="1.0.0") + + generated_recipe = GeneratedRecipe.from_model(model) + + generated_recipe.recipe.requirements.build.append(ItemPackageDependency("test_package")) + generated_recipe.recipe.requirements.build.append(ItemPackageDependency("test_package")) + + assert len(generated_recipe.recipe.requirements.build) == 2 + + +def test_conditional_item() -> None: + """Test setting of conditional item.""" + + conditional = ConditionalPackageDependency( + "os == 'linux'", ListOrItemPackageDependency(["package1"]), ListOrItemPackageDependency(["package3"]) + ) + item = ItemPackageDependency.new_from_conditional(conditional) + + if item.conditional is not None: + item.conditional.condition = "foo-bar" + + # this is a known issue with the current implementation + if item.conditional is not None: + assert item.conditional.condition == "os == 'linux'" + + +def test_generated_recipe_setting_version() -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel(name="test_project", version="1.0.0") + + generated_recipe = GeneratedRecipe.from_model(model) + + # Test that the version can be accessed as a string + version_str = str(generated_recipe.recipe.package.version) + assert isinstance(version_str, str) + assert len(version_str) > 0 + + # Test getting concrete version + concrete = generated_recipe.recipe.package.version.get_concrete() + assert concrete is not None + + # Verify concrete version is a valid string + assert isinstance(concrete, str) + assert len(concrete) > 0 diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/test_intermediate_recipe.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_intermediate_recipe.py new file mode 100644 index 0000000000..7cbae535fe --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_intermediate_recipe.py @@ -0,0 +1,56 @@ +from pathlib import Path +from typing import Any +from pixi_build_backend.types.intermediate_recipe import IntermediateRecipe, Python +from pixi_build_backend.types.item import ItemPackageDependency + + +def test_from_yaml(snapshot: Any) -> None: + yaml_file = Path(__file__).parent.parent / "data" / "boltons_recipe.yaml" + yaml_content = yaml_file.read_text() + + recipe = IntermediateRecipe.from_yaml(yaml_content) + + assert snapshot == recipe.to_yaml() + + +def test_nested_setters() -> None: + yaml_file = Path(__file__).parent.parent / "data" / "boltons_recipe.yaml" + yaml_content = yaml_file.read_text() + + recipe = IntermediateRecipe.from_yaml(yaml_content) + # Test that we can access the package name + original_name = str(recipe.package.name) + assert isinstance(original_name, str) + assert len(original_name) > 0 + + +def test_intermediate_str(snapshot: Any) -> None: + yaml_file = Path(__file__).parent.parent / "data" / "boltons_recipe.yaml" + yaml_content = yaml_file.read_text() + + recipe = IntermediateRecipe.from_yaml(yaml_content) + + assert str(recipe) == snapshot + + +def test_we_can_create_python() -> None: + py = Python(["entry-point=module:function"]) + + assert py.entry_points == ["entry-point = module:function"] + + +def test_package_types() -> None: + package = ItemPackageDependency("test") + assert package.concrete is not None + assert str(package.concrete.package_name) == "test" + + +def test_package_types_conditional() -> None: + package = ItemPackageDependency("test") + assert package.concrete is not None + assert str(package.concrete.package_name) == "test" + + package = ItemPackageDependency("${{ compiler('c') }}") + + assert package.concrete is None + assert package.template diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/test_platform.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_platform.py new file mode 100644 index 0000000000..b6326da57d --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_platform.py @@ -0,0 +1,11 @@ +"""Unit tests for platform.py module.""" + +from pixi_build_backend.types.platform import Platform + + +def test_current_class_method() -> None: + """Test creation of Platform from string and its underlying magic methods.""" + result = Platform("linux-64") + + assert str(result) == "linux-64" + assert result.is_linux diff --git a/pixi-build-backends/py-pixi-build-backend/tests/unit/test_project_model.py b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_project_model.py new file mode 100644 index 0000000000..16da66427f --- /dev/null +++ b/pixi-build-backends/py-pixi-build-backend/tests/unit/test_project_model.py @@ -0,0 +1,33 @@ +"""Unit tests for project_model.py module.""" + +from typing import Any +from pathlib import Path +import json +from pixi_build_backend.types.project_model import ProjectModel + + +def test_project_model_initialization(snapshot: Any) -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel(name="test_project", version="1.0.0") + + assert model._debug_str() == snapshot + + +def test_project_model_initialization_from_json(snapshot: Any) -> None: + """Test initialization of ProjectModel.""" + model = ProjectModel.from_json(json.dumps({"name": "test_project", "version": "1.0.0"})) + + assert model._debug_str() == snapshot + + +def test_project_model_initialization_from_dict(snapshot: Any) -> None: + """Test initialization of ProjectModel from a Python mapping.""" + model = ProjectModel.from_dict({"name": "test_project", "version": "1.0.0"}) + + assert model._debug_str() == snapshot + + +def test_project_model_initialization_from_json_file(snapshot: Any) -> None: + json_file = Path(__file__).parent.parent / "data" / "project_model_example.json" + model = ProjectModel.from_json_file(json_file) + assert model._debug_str() == snapshot diff --git a/pixi-build-backends/recipe/pixi-build-api-version/pixi.toml b/pixi-build-backends/recipe/pixi-build-api-version/pixi.toml new file mode 100644 index 0000000000..0c3f434569 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-api-version/pixi.toml @@ -0,0 +1,5 @@ +[package] +name = "pixi-build-api-version" + +[package.build] +backend = { name = "pixi-build-rattler-build", version = "*" } diff --git a/pixi-build-backends/recipe/pixi-build-api-version/recipe.yaml b/pixi-build-backends/recipe/pixi-build-api-version/recipe.yaml new file mode 100644 index 0000000000..c1dfccac91 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-api-version/recipe.yaml @@ -0,0 +1,27 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-api-version + version: "4" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + filter: + - LICENSE + +build: + noarch: generic + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: The protocol version for pixi build backends. + description: | + This package is used to define the API version of the protocol used by pixi build backends. + license: BSD-3-Clause + license_file: + - LICENSE + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-cmake/recipe.yaml b/pixi-build-backends/recipe/pixi-build-cmake/recipe.yaml new file mode 100644 index 0000000000..1418f55b41 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-cmake/recipe.yaml @@ -0,0 +1,65 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-cmake + version: "${{ env.get('PIXI_BUILD_CMAKE_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +build: + script: + env: + CARGO_PROFILE_RELEASE_STRIP: symbols + CARGO_PROFILE_RELEASE_LTO: fat + content: + - if: osx and x86_64 + then: + # use the default linker for osx-64 as we are hitting a bug with the conda-forge linker + # https://github.com/rust-lang/rust/issues/140686 + - unset CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER + + - if: unix + then: + - export OPENSSL_DIR="$PREFIX" + - cargo auditable install --locked --no-track --bins --root ${{ PREFIX }} --path crates/${{name}} + - cargo-bundle-licenses --format yaml --output ./THIRDPARTY.yml + files: + - bin/${{ name }} + - bin/${{ name }}.exe + +requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - cargo-bundle-licenses + - cargo-auditable + host: + - pkg-config + - libzlib + - liblzma + - if: unix + then: openssl + run: + - pixi-build-api-version >=4,<5 + +tests: + - script: ${{ name }} --help + - package_contents: + bin: + - ${{ name }} + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: A pixi build backend to build CMake based packages. + description: | + This package provides a build backend for pixi that allows building packages using CMake. + license: BSD-3-Clause + license_file: + - LICENSE + - THIRDPARTY.yml + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-mojo/recipe.yaml b/pixi-build-backends/recipe/pixi-build-mojo/recipe.yaml new file mode 100644 index 0000000000..cd8ff4a396 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-mojo/recipe.yaml @@ -0,0 +1,65 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-mojo + version: "${{ env.get('PIXI_BUILD_MOJO_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +build: + script: + env: + CARGO_PROFILE_RELEASE_STRIP: symbols + CARGO_PROFILE_RELEASE_LTO: fat + content: + - if: osx and x86_64 + then: + # use the default linker for osx-64 as we are hitting a bug with the conda-forge linker + # https://github.com/rust-lang/rust/issues/140686 + - unset CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER + + - if: unix + then: + - export OPENSSL_DIR="$PREFIX" + - cargo auditable install --locked --no-track --bins --root ${{ PREFIX }} --path crates/${{name}} + - cargo-bundle-licenses --format yaml --output ./THIRDPARTY.yml + files: + - bin/${{ name }} + - bin/${{ name }}.exe + +requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - cargo-bundle-licenses + - cargo-auditable + host: + - pkg-config + - libzlib + - liblzma + - if: unix + then: openssl + run: + - pixi-build-api-version >=4,<5 + +tests: + - script: ${{ name }} --help + - package_contents: + bin: + - ${{ name }} + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: A pixi build backend to build Mojo packages. + description: | + This package provides a build backend for pixi that allows building packages using Mojo. + license: BSD-3-Clause + license_file: + - LICENSE + - THIRDPARTY.yml + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-python/recipe.yaml b/pixi-build-backends/recipe/pixi-build-python/recipe.yaml new file mode 100644 index 0000000000..51a72a8ffa --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-python/recipe.yaml @@ -0,0 +1,65 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-python + version: "${{ env.get('PIXI_BUILD_PYTHON_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +build: + script: + env: + CARGO_PROFILE_RELEASE_STRIP: symbols + CARGO_PROFILE_RELEASE_LTO: fat + content: + - if: osx and x86_64 + then: + # use the default linker for osx-64 as we are hitting a bug with the conda-forge linker + # https://github.com/rust-lang/rust/issues/140686 + - unset CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER + + - if: unix + then: + - export OPENSSL_DIR="$PREFIX" + - cargo auditable install --locked --no-track --bins --root ${{ PREFIX }} --path crates/${{name}} + - cargo-bundle-licenses --format yaml --output ./THIRDPARTY.yml + files: + - bin/${{ name }} + - bin/${{ name }}.exe + +requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - cargo-bundle-licenses + - cargo-auditable + host: + - pkg-config + - libzlib + - liblzma + - if: unix + then: openssl + run: + - pixi-build-api-version >=4,<5 + +tests: + - script: ${{ name }} --help + - package_contents: + bin: + - ${{ name }} + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: A pixi build backend to build Python packages. + description: | + This package provides a build backend for pixi that allows building Python packages. + license: BSD-3-Clause + license_file: + - LICENSE + - THIRDPARTY.yml + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-rattler-build/recipe.yaml b/pixi-build-backends/recipe/pixi-build-rattler-build/recipe.yaml new file mode 100644 index 0000000000..056afc3be6 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-rattler-build/recipe.yaml @@ -0,0 +1,65 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-rattler-build + version: "${{ env.get('PIXI_BUILD_RATTLER_BUILD_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +build: + script: + env: + CARGO_PROFILE_RELEASE_STRIP: symbols + CARGO_PROFILE_RELEASE_LTO: fat + content: + - if: osx and x86_64 + then: + # use the default linker for osx-64 as we are hitting a bug with the conda-forge linker + # https://github.com/rust-lang/rust/issues/140686 + - unset CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER + + - if: unix + then: + - export OPENSSL_DIR="$PREFIX" + - cargo auditable install --locked --no-track --bins --root ${{ PREFIX }} --path crates/${{name}} + - cargo-bundle-licenses --format yaml --output ./THIRDPARTY.yml + files: + - bin/${{ name }} + - bin/${{ name }}.exe + +requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - cargo-bundle-licenses + - cargo-auditable + host: + - pkg-config + - libzlib + - liblzma + - if: unix + then: openssl + run: + - pixi-build-api-version >=4,<5 + +tests: + - script: ${{ name }} --help + - package_contents: + bin: + - ${{ name }} + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: A pixi build backend to build recipe.yaml files. + description: | + This package provides a build backend for pixi that allows building recipe.yaml files. + license: BSD-3-Clause + license_file: + - LICENSE + - THIRDPARTY.yml + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml b/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml new file mode 100644 index 0000000000..27cc059b18 --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml @@ -0,0 +1,47 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-ros + version: "${{ env.get('PIXI_BUILD_ROS_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../../backends/pixi-build-ros + +requirements: + host: + - python ${{ python_min }}.* + - hatchling + - pip + run: + - python >=${{ python_min }} + - rosdistro + - catkin_pkg + - pydantic + - pyyaml + - py-rattler + - typing-extensions + - py-pixi-build-backend >=0.4.1 + +build: + number: 0 + script: + - pip install . -vv --no-build-isolation + noarch: python + python: + entry_points: + - pixi-build-ros = pixi_build_ros.main:main + +tests: + - script: ${{ name }} --help + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: ROS build backend for Pixi + description: | + This package provides a ROS build backend for Pixi, allowing the integration of ROS packages into the Pixi build system. + license: BSD-3-Clause + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/pixi-build-rust/recipe.yaml b/pixi-build-backends/recipe/pixi-build-rust/recipe.yaml new file mode 100644 index 0000000000..8e150c126d --- /dev/null +++ b/pixi-build-backends/recipe/pixi-build-rust/recipe.yaml @@ -0,0 +1,65 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-rust + version: "${{ env.get('PIXI_BUILD_RUST_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +build: + script: + env: + CARGO_PROFILE_RELEASE_STRIP: symbols + CARGO_PROFILE_RELEASE_LTO: fat + content: + - if: osx and x86_64 + then: + # use the default linker for osx-64 as we are hitting a bug with the conda-forge linker + # https://github.com/rust-lang/rust/issues/140686 + - unset CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER + + - if: unix + then: + - export OPENSSL_DIR="$PREFIX" + - cargo auditable install --locked --no-track --bins --root ${{ PREFIX }} --path crates/${{name}} + - cargo-bundle-licenses --format yaml --output ./THIRDPARTY.yml + files: + - bin/${{ name }} + - bin/${{ name }}.exe + +requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - cargo-bundle-licenses + - cargo-auditable + host: + - pkg-config + - libzlib + - liblzma + - if: unix + then: openssl + run: + - pixi-build-api-version >=4,<5 + +tests: + - script: ${{ name }} --help + - package_contents: + bin: + - ${{ name }} + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: A pixi build backend to build Rust packages. + description: | + This package provides a build backend for pixi that allows building Rust packages. + license: BSD-3-Clause + license_file: + - LICENSE + - THIRDPARTY.yml + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/py-pixi-build-backend/recipe.yaml b/pixi-build-backends/recipe/py-pixi-build-backend/recipe.yaml new file mode 100644 index 0000000000..008e92a552 --- /dev/null +++ b/pixi-build-backends/recipe/py-pixi-build-backend/recipe.yaml @@ -0,0 +1,57 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: py-pixi-build-backend + version: "${{ env.get('PY_PIXI_BUILD_BACKEND_VERSION', default='0.1.0dev') }}" + +package: + name: ${{ name }} + version: ${{ version }} + +source: + path: ../.. + +requirements: + build: + - if: build_platform != target_platform + then: + - python ${{ python_min }}.* + - cross-python_${{ target_platform }} ${{ python_min }}.* + - maturin >=1.2.2,<2 + - ${{ compiler('rust') }} + host: + - python ${{ python_min }}.* + - python-abi3 + - maturin >=1.2.2,<2 + - pip + + run: + - python >=${{ python_min }} + - pixi-build-api-version >=4,<5 + ignore_run_exports: + from_package: + - cross-python_${{ target_platform }} + +build: + script: + - cd py-pixi-build-backend + - pip install . -vv --no-build-isolation + python: + version_independent: true + +tests: + - python: + python_version: ${{ python_min }}.* + pip_check: false + imports: + - pixi_build_backend + +about: + homepage: https://github.com/prefix-dev/pixi-build-backends + summary: Python bindings for pixi-build-backends + description: | + This package provides Python bindings for pixi-build-backends, enabling + Python applications to use the pixi build system programmatically. + license: BSD-3-Clause + license_file: LICENSE + documentation: https://prefix-dev.github.io/pixi-build-backends + repository: https://github.com/prefix-dev/pixi-build-backends diff --git a/pixi-build-backends/recipe/testsuite-backends/recipe.yaml b/pixi-build-backends/recipe/testsuite-backends/recipe.yaml new file mode 100644 index 0000000000..669ed0f356 --- /dev/null +++ b/pixi-build-backends/recipe/testsuite-backends/recipe.yaml @@ -0,0 +1,207 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json +context: + name: pixi-build-backends + version: 0.0.0 + +recipe: + name: ${{ name }} + version: ${{ version }} + +cache: + # source: + # path: ../.. + requirements: + build: + - ${{ compiler("rust") }} + - ${{ stdlib("c") }} + - python + host: + - liblzma + + build: + script: + - if: win + then: set "CARGO_TARGET_DIR=%RECIPE_DIR%\..\..\target/channel-build-cache" + else: export CARGO_TARGET_DIR=${RECIPE_DIR}/../../target/channel-build-cache + - if: win + then: if not exist "%CARGO_TARGET_DIR%" mkdir "%CARGO_TARGET_DIR%" + else: mkdir -p $CARGO_TARGET_DIR + - if: win + then: set "CARGO_HOME=%RECIPE_DIR%\..\..\target/channel-build-cache-home" + else: export CARGO_HOME=$(realpath ${RECIPE_DIR}/../../target/channel-build-cache-home) + - if: win + then: cd "%RECIPE_DIR%\..\.." + else: cd $RECIPE_DIR/../.. + - cargo build --profile ci --locked --bins + - python scripts/copy-backends.py + +outputs: + - package: + name: pixi-build-api-version + version: 4 + + build: + script: + + - package: + name: pixi-build-cmake + + build: + files: + - bin/pixi-build-cmake + - bin/pixi-build-cmake.exe + + requirements: + run: + - pixi-build-api-version >=4,<5 + + tests: + - script: + - pixi-build-cmake --help + + - package: + name: pixi-build-mojo + + build: + files: + - bin/pixi-build-mojo + - bin/pixi-build-mojo.exe + + requirements: + run: + - pixi-build-api-version >=4,<5 + + tests: + - script: + - pixi-build-mojo --help + + - package: + name: pixi-build-python + + build: + files: + - bin/pixi-build-python + - bin/pixi-build-python.exe + + requirements: + run: + - pixi-build-api-version >=4,<5 + + tests: + - script: + - pixi-build-python --help + + - package: + name: pixi-build-rattler-build + + build: + files: + - bin/pixi-build-rattler-build + - bin/pixi-build-rattler-build.exe + + requirements: + run: + - pixi-build-api-version >=4,<5 + + tests: + - script: + - pixi-build-rattler-build --help + + - package: + name: pixi-build-rust + + build: + files: + - bin/pixi-build-rust + - bin/pixi-build-rust.exe + + requirements: + run: + - pixi-build-api-version >=4,<5 + + tests: + - script: + - pixi-build-rust --help + + - package: + name: pixi-build-ros + + requirements: + host: + - python ${{ python_min }}.* + - hatchling + - pip + run: + - python >=${{ python_min }} + - rosdistro + - catkin_pkg + - pydantic + - pyyaml + - py-rattler + - typing-extensions + - py-pixi-build-backend + build: + script: + - if: win + then: cd "%RECIPE_DIR%\..\.." + else: cd $RECIPE_DIR/../.. + - pip install backends/pixi-build-ros -vv --no-build-isolation + noarch: python + python: + entry_points: + - pixi-build-ros = pixi_build_ros.main:main + files: + exclude: + - python-scripts/* + - bin/* + tests: + - script: pixi-build-ros --help + + - package: + name: py-pixi-build-backend + + requirements: + build: + - if: build_platform != target_platform + then: + - python ${{ python_min }}.* + - cross-python_${{ target_platform }} + - maturin >=1.2.2,<2 + - ${{ compiler('rust') }} + - ${{ stdlib('c') }} + host: + - python ${{ python_min }}.* + - python-abi3 + - maturin >=1.2.2,<2 + - pip + run: + - python >=${{ python_min }} + - pixi-build-api-version >=4,<5 + ignore_run_exports: + from_package: + - cross-python_${{ target_platform }} + + build: + script: + - if: win + then: set "CARGO_TARGET_DIR=%RECIPE_DIR%\..\..\target/channel-build-cache" + else: export CARGO_TARGET_DIR=${RECIPE_DIR}/../../target/channel-build-cache + - if: win + then: set "CARGO_HOME=%RECIPE_DIR%\..\..\target/channel-build-cache-home" + else: export CARGO_HOME=$(realpath ${RECIPE_DIR}/../../target/channel-build-cache-home) + - if: win + then: cd "%RECIPE_DIR%\..\..\py-pixi-build-backend" + else: cd $RECIPE_DIR/../../py-pixi-build-backend + - pip install . -vv --no-build-isolation --config-settings=build-args=--profile=ci --config-settings=build-args=--locked + files: + exclude: + - python-scripts/* + - bin/* + + python: + version_independent: true + + tests: + - python: + imports: + - pixi_build_backend diff --git a/pixi-build-backends/recipe/variants.yaml b/pixi-build-backends/recipe/variants.yaml new file mode 100644 index 0000000000..5810b47396 --- /dev/null +++ b/pixi-build-backends/recipe/variants.yaml @@ -0,0 +1,52 @@ +# This is a semi distilled variant config from conda-forge. +# +# It adds sysroot (2.34) for linux, macosx_deployment_target for osx +# and uses vs2022 for windows. +# +c_stdlib: + - if: linux + then: sysroot + - if: osx + then: macosx_deployment_target + - if: win + then: vs +c_stdlib_version: + - if: linux + then: 2.34 + - if: osx and x86_64 + then: 10.13 + - if: osx and arm64 + then: 11.0 +c_compiler: + - if: linux + then: gcc + - if: osx + then: clang + - if: win + then: vs2022 +c_compiler_version: + - if: linux + then: 14 + - if: osx + then: 19 +cxx_compiler: + - if: linux + then: gxx + - if: osx + then: clangxx + - if: win + then: vs2022 +cxx_compiler_version: + - if: linux + then: 14 + - if: osx + then: 19 + +python: + - 3.13 +python_min: + - 3.10 + +# Pin the compiler used +rust_compiler_version: + - 1.90.0 diff --git a/pixi.toml b/pixi.toml index c3c8ff4fc7..19719cebeb 100644 --- a/pixi.toml +++ b/pixi.toml @@ -98,6 +98,13 @@ test-specific-test-debug = { cmd = "pytest --pixi-build=debug -k '{{ test_substr update-test-channel = { cmd = "python update-channels.py {{ channel }}", args = [ "channel", ], cwd = "tests/data/channels" } +# Run pixi-build integration tests (requires backends channel to be built) +test-pixi-build = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ + "build-release", +], description = "Run pixi-build integration tests" } +test-pixi-build-debug = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ + "build-debug", +], description = "Run pixi-build integration tests with debug build" } [feature.dev.dependencies] # Needed for the citation diff --git a/tests/data/channels/channels/target_specific_channel_1/.condapackageignore b/tests/data/channels/channels/target_specific_channel_1/.condapackageignore new file mode 100644 index 0000000000..72e8ffc0db --- /dev/null +++ b/tests/data/channels/channels/target_specific_channel_1/.condapackageignore @@ -0,0 +1 @@ +* diff --git a/tests/data/channels/channels/target_specific_channel_1/linux-64/package-unix-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/target_specific_channel_1/linux-64/package-unix-0.1.0-hb0f4dca_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..54e26156c232c35b4737f9906d5b025dc2f49c8d GIT binary patch literal 1203 zcmWIWW@gc40D;BXIx(jiQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfJfe0|5zKH+py5D0x&?{J*@@|?x}|xU z6}kp`hI$6N8A%3dCMn5@@dkP&iA8!<#U&t%^Pm>PXpODoL$cSF?sflgu6TK`fZy!h&rPDue_l3q=UjSX&r~P#%jVCF zC%#hn{`RxPHIH{^u6X>jl2jI4>wfIy-xCMxuN?31byFzl>geqVdChnJso9bYrQUejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{L(I+Gcdz7frbP1=oTaXznZ zR_Ge&8R{A6W*DR-n;V!K#vACBBo^sa6_nC=23H0b21B+@CoU>v-gvJrck4#52-o?l`6)cpR(Rw+-CJLk(!XU z%%#`mrbKmVHmJ`P-f?}#fnye~UwDi69ayxM+4A&-o~|pKigS0*E-`s&S6n~cFg3uQMh1FOii|HPqUkA+V%2z`gcuv zEv4Uox!0ys`?Y4;`ujXvm>D;RWUnpV>;Bux%9-IsZQpX zkAI%&Q99xGx5^DiPtKkB=*jxYyef;no^UI&FY2*>B`xo!P|(%U+Y!buKIJ|8gO`(E zNk})WaNfi2Sn0WZ1@j(We(rUB&HR#+wL0hAZR<_X`MF=q>4H|*hffB*W-RJ6b{g?= za5I18@&=~UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{L(I+Gcdz7frbP1=oTaXznZ zR_Ge&8R{A6W|$eIn3|^;#~bLCBo^sa6_xeHV|l$B&-a za`T82gENB@L!(ZSiHFp;-<|Dd-$YsuZN8^2*{rHHDZ29gd^yQv1}4L-`#;%y4#Y*h z+{(UmS`ya-&*v=fOw~3R`U%z^o}<4ZvGLEZ@kdBFw+(VXze5!limA1*SuVpdE#cp^6zFT zFIPX`T=O?=!Q9P^n?thKmhN@`aIScHuYlj|-Oo*;&3|4tb?01qV$W13^UKFS&-5sr z@cUckhNCCv&V2M_{bXL1MPE<271GL-})rYps3l({I`uLaI0(}pjO?;`K!+S(q zhmm0d7h6f==1?F0WEEKkr;5TOSvU9fBs{b~@R99-yZ=JA2kLa8K`erq5ZyTRjD|2S7RaP1+o4;9 eo)ZvOsRL6vW%(k&o0Sb@9y1WC0Zl7q2JrxEfxC$S literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/target_specific_channel_1/osx-arm64/repodata.json b/tests/data/channels/channels/target_specific_channel_1/osx-arm64/repodata.json new file mode 100644 index 0000000000..78a1cbcd77 --- /dev/null +++ b/tests/data/channels/channels/target_specific_channel_1/osx-arm64/repodata.json @@ -0,0 +1 @@ +{"info":{"subdir":"osx-arm64"},"packages":{},"packages.conda":{"package-unix-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"3f9ca67b29f4179aa347b30fad6b9b26","name":"package-unix","platform":"osx","sha256":"5ba2a8515ccaca4592a34fd5b1d74f046ba072d173938969867ad054d256982c","size":1201,"subdir":"osx-arm64","timestamp":1768224548088,"version":"0.1.0"}},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/channels/target_specific_channel_1/rattler-build-log.txt b/tests/data/channels/channels/target_specific_channel_1/rattler-build-log.txt new file mode 100644 index 0000000000..8b4e17c75a --- /dev/null +++ b/tests/data/channels/channels/target_specific_channel_1/rattler-build-log.txt @@ -0,0 +1,4 @@ +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-windows_1768224547/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-windows_1768224547","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-windows_1768224547/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-windows_1768224547/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/target_specific_channel_1.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224547/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224547","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224547/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_pla","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224547/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/target_specific_channel_1.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_pla","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/target_specific_channel_1.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_pla","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/bld/rattler-build_package-unix_1768224548/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/target_specific_channel_1.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/target_specific_channel_1/build_cache"} diff --git a/tests/data/channels/channels/target_specific_channel_1/win-64/package-windows-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/target_specific_channel_1/win-64/package-windows-0.1.0-h9490d1a_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..523247427cd078f438985cd5085d1e2068a036ac GIT binary patch literal 1219 zcmWIWW@gc40D;BXIx(jiQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfJl$<&8q9DVpy5D0x&?{J*@@|?y5*U9 zDf#8ax(0fNdIq`~mL`@4DTayh26`olMS4}mB_O-=pmxJ(jjj5B6ByW4nHdhb2#PmE zvNIg6m?;}ABJtvnj?-DMNy=IQv259CQ(arG?oscznWg+qCiUXZH{WZI{9pEN$qZrc zJzRh9zkBE{&OB%1gl&@)oW!^k6bw!HpWd`rQCKO`pt!)Z=0Sd({)a@VMsJZVx{2c;{}(scAm>%(svGRL(c9 z-L>Cd@9t)%mlad4T|K>H^;OFs2IpLU|2N=Ls!3na^G>n$goTGfLC2Y1k5%mAQ(p5Q zxa@w#(2OCF{eu*X>*T&bb_Z!G@sL<{UZWQwQkuJUrS2d5)ZJXVX$iv{?}kOYBR5>z z=(KXZ0e?7qVz@$lA}2$`k^~36g0`-&25FZV<2dyC6?At@6V$1Z(<^LLFl&{1z $PREFIX/bin/package + - echo "echo unix" >> $PREFIX/bin/package + - chmod +x $PREFIX/bin/package + + - package: + name: package-windows + version: 0.1.0 + + build: + skip: not win + script: + - mkdir -p $PREFIX/bin + - echo "@echo off" > $PREFIX/bin/package.bat + - echo "echo windows" >> $PREFIX/bin/package.bat diff --git a/tests/data/pixi-build/build-variant-conda-config-python/corp-pinning/conda_build_config.yaml b/tests/data/pixi-build/build-variant-conda-config-python/corp-pinning/conda_build_config.yaml new file mode 100644 index 0000000000..417ae3602b --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-python/corp-pinning/conda_build_config.yaml @@ -0,0 +1,4 @@ +package3: + - 0.1.0 # [unix] + - 0.2.0 + - 0.3.0 diff --git a/tests/data/pixi-build/build-variant-conda-config-python/pixi.toml b/tests/data/pixi-build/build-variant-conda-config-python/pixi.toml new file mode 100644 index 0000000000..279d6a6103 --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-python/pixi.toml @@ -0,0 +1,32 @@ +[workspace] +build-variants-files = ["./corp-pinning/conda_build_config.yaml"] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-conda-config-python" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-conda-config-python = { path = "." } + +[package] +name = "variant-conda-config-python" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "*" +package3 = "*" +python = "*" + +[package.build.config] +noarch = false diff --git a/tests/data/pixi-build/build-variant-conda-config-python/pyproject.toml b/tests/data/pixi-build/build-variant-conda-config-python/pyproject.toml new file mode 100644 index 0000000000..fc0070ccf0 --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-python/pyproject.toml @@ -0,0 +1,12 @@ +[project] +description = "Variant conda config test package built with pixi-build-python." +name = "variant-conda-config-python" +requires-python = ">=3.11" +version = "1.0.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.hatch.build.targets.wheel] +packages = ["variant_conda_config_python"] diff --git a/tests/data/pixi-build/build-variant-conda-config-python/src/variant_conda_config_python/__init__.py b/tests/data/pixi-build/build-variant-conda-config-python/src/variant_conda_config_python/__init__.py new file mode 100644 index 0000000000..a4f6306bd7 --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-python/src/variant_conda_config_python/__init__.py @@ -0,0 +1,3 @@ +def current_variant() -> str: + """Return a marker string used by the variant conda config python test package.""" + return "variants from conda config python" diff --git a/tests/data/pixi-build/build-variant-conda-config-rattler-build/corp-pinning/conda_build_config.yaml b/tests/data/pixi-build/build-variant-conda-config-rattler-build/corp-pinning/conda_build_config.yaml new file mode 100644 index 0000000000..417ae3602b --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-rattler-build/corp-pinning/conda_build_config.yaml @@ -0,0 +1,4 @@ +package3: + - 0.1.0 # [unix] + - 0.2.0 + - 0.3.0 diff --git a/tests/data/pixi-build/build-variant-conda-config-rattler-build/pixi.toml b/tests/data/pixi-build/build-variant-conda-config-rattler-build/pixi.toml new file mode 100644 index 0000000000..e1077212fa --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-rattler-build/pixi.toml @@ -0,0 +1,24 @@ +[workspace] +build-variants-files = ["./corp-pinning/conda_build_config.yaml"] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-conda-config" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-conda-config = { path = "." } + +[package] +name = "variant-conda-config" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/build-variant-conda-config-rattler-build/recipe.yaml b/tests/data/pixi-build/build-variant-conda-config-rattler-build/recipe.yaml new file mode 100644 index 0000000000..587bcc7b6e --- /dev/null +++ b/tests/data/pixi-build/build-variant-conda-config-rattler-build/recipe.yaml @@ -0,0 +1,21 @@ +package: + name: variant-conda-config + version: 1.0.0 + +requirements: + host: + - package3 + +build: + number: 0 + script: + - if: win + then: + - if not exist "%PREFIX%" mkdir "%PREFIX%" + - echo @echo off > %PREFIX%\\bin\\variant-conda-config.bat + - echo echo variants from conda_build_config >> %PREFIX%\\bin\\variant-conda-config.bat + else: + - mkdir -p $PREFIX/bin + - echo "#!/usr/bin/env bash" > $PREFIX/bin/variant-conda-config + - echo "echo variants from conda_build_config" >> $PREFIX/bin/variant-conda-config + - chmod +x $PREFIX/bin/variant-conda-config diff --git a/tests/data/pixi-build/build-variant-files-python/corp-pinning/config.yaml b/tests/data/pixi-build/build-variant-files-python/corp-pinning/config.yaml new file mode 100644 index 0000000000..8a5acef1a3 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-python/corp-pinning/config.yaml @@ -0,0 +1,6 @@ +package3: + - if: unix + then: + - 0.1.0 + - 0.2.0 + - 0.3.0 diff --git a/tests/data/pixi-build/build-variant-files-python/pixi.toml b/tests/data/pixi-build/build-variant-files-python/pixi.toml new file mode 100644 index 0000000000..3162c77167 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-python/pixi.toml @@ -0,0 +1,32 @@ +[workspace] +build-variants-files = ["./corp-pinning/config.yaml"] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-files-python" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-files-python = { path = "." } + +[package] +name = "variant-files-python" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "*" +package3 = "*" +python = "*" + +[package.build.config] +noarch = false diff --git a/tests/data/pixi-build/build-variant-files-python/pyproject.toml b/tests/data/pixi-build/build-variant-files-python/pyproject.toml new file mode 100644 index 0000000000..740d30a3b5 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-python/pyproject.toml @@ -0,0 +1,12 @@ +[project] +description = "Variant files test package built with pixi-build-python." +name = "variant-files-python" +requires-python = ">=3.11" +version = "1.0.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.hatch.build.targets.wheel] +packages = ["variant_files_python"] diff --git a/tests/data/pixi-build/build-variant-files-python/src/variant_files_python/__init__.py b/tests/data/pixi-build/build-variant-files-python/src/variant_files_python/__init__.py new file mode 100644 index 0000000000..7ba2f15121 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-python/src/variant_files_python/__init__.py @@ -0,0 +1,3 @@ +def describe() -> str: + """Return a short description used by the variant files python test package.""" + return "variants from files python" diff --git a/tests/data/pixi-build/build-variant-files-rattler-build/corp-pinning/config.yaml b/tests/data/pixi-build/build-variant-files-rattler-build/corp-pinning/config.yaml new file mode 100644 index 0000000000..8a5acef1a3 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-rattler-build/corp-pinning/config.yaml @@ -0,0 +1,6 @@ +package3: + - if: unix + then: + - 0.1.0 + - 0.2.0 + - 0.3.0 diff --git a/tests/data/pixi-build/build-variant-files-rattler-build/pixi.toml b/tests/data/pixi-build/build-variant-files-rattler-build/pixi.toml new file mode 100644 index 0000000000..9f8c1303ed --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-rattler-build/pixi.toml @@ -0,0 +1,24 @@ +[workspace] +build-variants-files = ["./corp-pinning/config.yaml"] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-files" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-files = { path = "." } + +[package] +name = "variant-files" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/build-variant-files-rattler-build/recipe.yaml b/tests/data/pixi-build/build-variant-files-rattler-build/recipe.yaml new file mode 100644 index 0000000000..573a250ca6 --- /dev/null +++ b/tests/data/pixi-build/build-variant-files-rattler-build/recipe.yaml @@ -0,0 +1,21 @@ +package: + name: variant-files + version: 1.0.0 + +requirements: + host: + - package3 + +build: + number: 0 + script: + - if: win + then: + - if not exist "%PREFIX%" mkdir "%PREFIX%" + - echo @echo off > %PREFIX%\\bin\\variant-files.bat + - echo echo variants from file >> %PREFIX%\\bin\\variant-files.bat + else: + - mkdir -p $PREFIX/bin + - echo "#!/usr/bin/env bash" > $PREFIX/bin/variant-files + - echo "echo variants from file" >> $PREFIX/bin/variant-files + - chmod +x $PREFIX/bin/variant-files diff --git a/tests/data/pixi-build/build-variant-manifest-python/pixi.toml b/tests/data/pixi-build/build-variant-manifest-python/pixi.toml new file mode 100644 index 0000000000..02be42097e --- /dev/null +++ b/tests/data/pixi-build/build-variant-manifest-python/pixi.toml @@ -0,0 +1,32 @@ +[workspace] +build-variants = { package3 = ["0.3.0", "0.2.0"] } +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-manifest-python" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-manifest-python = { path = "." } + +[package] +name = "variant-manifest-python" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "*" +package3 = "*" +python = "*" + +[package.build.config] +noarch = false diff --git a/tests/data/pixi-build/build-variant-manifest-python/pyproject.toml b/tests/data/pixi-build/build-variant-manifest-python/pyproject.toml new file mode 100644 index 0000000000..c491a950d9 --- /dev/null +++ b/tests/data/pixi-build/build-variant-manifest-python/pyproject.toml @@ -0,0 +1,15 @@ +[project] +description = "Variant manifest test package built with pixi-build-python." +name = "variant-manifest-python" +requires-python = ">=3.11" +version = "1.0.0" + +[project.scripts] +variant-manifest-python = "variant_manifest_python:main" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.hatch.build.targets.wheel] +packages = ["variant_manifest_python"] diff --git a/tests/data/pixi-build/build-variant-manifest-python/src/variant_manifest_python/__init__.py b/tests/data/pixi-build/build-variant-manifest-python/src/variant_manifest_python/__init__.py new file mode 100644 index 0000000000..00dfd13820 --- /dev/null +++ b/tests/data/pixi-build/build-variant-manifest-python/src/variant_manifest_python/__init__.py @@ -0,0 +1,3 @@ +def main() -> None: + """Entry point used by the variant manifest python test package.""" + print("variants from manifest python") diff --git a/tests/data/pixi-build/build-variant-manifest-rattler-build/pixi.toml b/tests/data/pixi-build/build-variant-manifest-rattler-build/pixi.toml new file mode 100644 index 0000000000..fb10cc363a --- /dev/null +++ b/tests/data/pixi-build/build-variant-manifest-rattler-build/pixi.toml @@ -0,0 +1,24 @@ +[workspace] +build-variants = { package3 = ["0.3.0", "0.2.0"] } +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "variant-manifest" +platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +variant-manifest = { path = "." } + +[package] +name = "variant-manifest" +version = "1.0.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/build-variant-manifest-rattler-build/recipe.yaml b/tests/data/pixi-build/build-variant-manifest-rattler-build/recipe.yaml new file mode 100644 index 0000000000..570df664bb --- /dev/null +++ b/tests/data/pixi-build/build-variant-manifest-rattler-build/recipe.yaml @@ -0,0 +1,21 @@ +package: + name: variant-manifest + version: 1.0.0 + +requirements: + host: + - package3 + +build: + number: 0 + script: + - if: win + then: + - if not exist "%PREFIX%" mkdir "%PREFIX%" + - echo @echo off > %PREFIX%\\bin\\variant-manifest.bat + - echo echo variants from manifest >> %PREFIX%\\bin\\variant-manifest.bat + else: + - mkdir -p $PREFIX/bin + - echo "#!/usr/bin/env bash" > $PREFIX/bin/variant-manifest + - echo "echo variants from manifest" >> $PREFIX/bin/variant-manifest + - chmod +x $PREFIX/bin/variant-manifest diff --git a/tests/data/pixi-build/cpp-with-git-source/.gitignore b/tests/data/pixi-build/cpp-with-git-source/.gitignore new file mode 100644 index 0000000000..a2a707b6f0 --- /dev/null +++ b/tests/data/pixi-build/cpp-with-git-source/.gitignore @@ -0,0 +1,5 @@ +# pixi environments +.pixi + +# The build directory +.build diff --git a/tests/data/pixi-build/cpp-with-git-source/README.md b/tests/data/pixi-build/cpp-with-git-source/README.md new file mode 100644 index 0000000000..b14cc1dc9b --- /dev/null +++ b/tests/data/pixi-build/cpp-with-git-source/README.md @@ -0,0 +1,14 @@ +# Simple C++ SDL Example with specified source path + +This is a simple pixi demo that showcases how to use C++ and SDL with specified source path. + +## How to use? + +Make sure you have `pixi` available in your terminal. +Navigate to this directory and run: + +```shell + +# Start the build executable +pixi run start +``` diff --git a/tests/data/pixi-build/cpp-with-git-source/pixi.lock b/tests/data/pixi-build/cpp-with-git-source/pixi.lock new file mode 100644 index 0000000000..c15e88dbac --- /dev/null +++ b/tests/data/pixi-build/cpp-with-git-source/pixi.lock @@ -0,0 +1,1291 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.9-h085a93f_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.22-h68140b3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - conda: . + subdir: linux-64 + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.0-h7cafd41_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.29-h2287256_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.46-ha3e7e28_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.56-h53ec75d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.22-hc0b302d_0.conda + - conda: . + subdir: osx-64 + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.22-he22eeb8_0.conda + - conda: . + subdir: osx-arm64 + win-64: + - conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.29-h1839187_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.56-h5112557_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.22-h5112557_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: . + build: h9352c13_0 +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 + md5: 791365c5f65975051e4e017b5da3abf5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-2.0-or-later + license_family: GPL + size: 68072 + timestamp: 1756738968573 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 260341 + timestamp: 1757437258798 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + sha256: 8f50b58efb29c710f3cecf2027a8d7325ba769ab10c746eff75cea3ac050b10c + md5: 97c4b3bd8a90722104798175a1bdddbf + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 132607 + timestamp: 1757437730085 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 125061 + timestamp: 1757437486465 +- conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 437860 + timestamp: 1747855126005 +- conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + sha256: 1106cf25c1b64e58f599e0bce9dd0b77b744146d324539fe715596f179dc37b7 + md5: ed5f537f1cefb3a15bcce7cb02d3c149 + depends: + - libcxx >=18 + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 398137 + timestamp: 1747855120103 +- conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + sha256: 2ef01ab52dedb477cb7291994ad556279b37c8ad457521e75c47cad20248ea30 + md5: 80c663e4f6b0fd8d6723ff7d68f09429 + depends: + - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + - libexpat >=2.7.0,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 384376 + timestamp: 1747855177419 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + sha256: cbfa8c80771d1842c2687f6016c5e200b52d4ca8f2cc119f6377f64f899ba4ff + md5: c42356557d7f2e37676e121515417e3b + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.25.1 h3f43e3d_1 + - libasprintf 0.25.1 h3f43e3d_1 + - libasprintf-devel 0.25.1 h3f43e3d_1 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libgettextpo-devel 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + - libstdcxx >=14 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 541357 + timestamp: 1753343006214 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + sha256: c792729288bdd94f21f25f80802d4c66957b4e00a57f7cb20513f07aadfaff06 + md5: a59c05d22bdcbb4e984bf0c021a2a02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 3644103 + timestamp: 1753342966311 +- conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + sha256: cb728a2a95557bb6a5184be2b8be83a6f2083000d0c7eff4ad5bbe5792133541 + md5: 3b0d184bc9404516d418d4509e418bdc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.1-or-later + size: 53582 + timestamp: 1753342901341 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + sha256: 2fc95060efc3d76547b7872875af0b7212d4b1407165be11c5f830aeeb57fc3a + md5: fd9cf4a11d07f0ef3e44fc061611b1ed + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.25.1 h3f43e3d_1 + - libgcc >=14 + license: LGPL-2.1-or-later + size: 34734 + timestamp: 1753342921605 +- conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + sha256: a946b61be1af15ff08c7722e9bac0fab446d8b9896c9f0f35657dfcf887fda8a + md5: 0f7f0c878c8dceb3b9ec67f5c06d6057 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 121852 + timestamp: 1744577167992 +- conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda + sha256: c3feab716740baa6193a1bc5c948c47c913e28f6e52d418bb67123cb92b9761e + md5: 34cd9d03a8f27081a556cb397a19f6cd + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 572006 + timestamp: 1758698149906 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda + sha256: 3de00998c8271f599d6ed9aea60dc0b3e5b1b7ff9f26f8eac95f86f135aa9beb + md5: edfa256c5391f789384e470ce5c9f340 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568154 + timestamp: 1758698306949 +- conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + size: 310785 + timestamp: 1757212153962 +- conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 72450 + timestamp: 1752719744781 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 264fbfba7fb20acf3b29cde153e345ce + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.1.0 h767d61c_5 + - libgcc-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824191 + timestamp: 1757042543820 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: 069afdf8ea72504e48d23ae1171d951c + depends: + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29187 + timestamp: 1757042549554 +- conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + sha256: dc9c7d7a6c0e6639deee6fde2efdc7e119e7739a6b229fa5f9049a449bae6109 + md5: 8504a291085c9fb809b66cabd5834307 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.55,<2.0a0 + license: LGPL-2.1-or-later + size: 590353 + timestamp: 1747060639058 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + sha256: 50a9e9815cf3f5bce1b8c5161c0899cc5b6c6052d6d73a4c27f749119e607100 + md5: 2f4de899028319b27eb7a4023be5dfd2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 188293 + timestamp: 1753342911214 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + sha256: c7ea10326fd450a2a21955987db09dde78c99956a91f6f05386756a7bfe7cc04 + md5: 3f7a43b3160ec0345c9535a9f0d7908e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 37407 + timestamp: 1753342931100 +- conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + sha256: 33336bd55981be938f4823db74291e1323454491623de0be61ecbe6cf3a4619c + md5: b8e4c93f4ab70c3b6f6499299627dbdc + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3978602 + timestamp: 1757403291664 +- conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.0-h7cafd41_0.conda + sha256: 0950997e833d3f6a91200c92a1d602e14728916f95cdcbcdb69b12c462206d5e + md5: 39fb5e0b9b76a73e18581b3839a3af3d + depends: + - __osx >=10.13 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3722414 + timestamp: 1757404071834 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + sha256: 92d17f998e14218810493c9190c8721bf7f7f006bfc5c00dbba1cede83c02f1a + md5: 9e065148e6013b7d7cae64ed01ab7081 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3701880 + timestamp: 1757404501093 +- conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d + md5: dcd5ff1940cd38f6df777cac86819d60 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447215 + timestamp: 1757042483384 +- conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + sha256: 697334de4786a1067ea86853e520c64dd72b11a05137f5b318d8a444007b5e60 + md5: 2bd47db5807daade8500ed7ca4c512a4 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 312184 + timestamp: 1745575272035 +- conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + size: 790176 + timestamp: 1754908768807 +- conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 + md5: 210a85a1119f97ea7887188d176db135 + depends: + - __osx >=10.13 + license: LGPL-2.1-only + size: 737846 + timestamp: 1754908900138 +- conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 750379 + timestamp: 1754909073836 +- conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + sha256: 8c352744517bc62d24539d1ecc813b9fdc8a785c780197c5f0b84ec5b0dfe122 + md5: a8e54eefc65645193c46e8b180f62d22 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 96909 + timestamp: 1753343977382 +- conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 90957 + timestamp: 1751558394144 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 + md5: 68e52064ed3897463c0e958ab5c8f91b + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 218500 + timestamp: 1745825989535 +- conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + sha256: 786d43678d6d1dc5f88a6bad2d02830cfd5a0184e84a8caa45694049f0e3ea5f + md5: b64523fb87ac6f87f0790f324ad43046 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 312472 + timestamp: 1744330953241 +- conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 28424 + timestamp: 1749901812541 +- conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 4e02a49aaa9d5190cb630fa43528fbe6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3896432 + timestamp: 1757042571458 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 8bba50c7f4679f08c861b597ad2bda6b + depends: + - libstdcxx 15.1.0 h8f9b012_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29233 + timestamp: 1757042603319 +- conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + sha256: 6b063df2d13dc9cedeae7b1591b1917ced7f4e1b04f7246e66cc7fb0088dea07 + md5: b6d222422c17dc11123e63fae4ad4178 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + - libgcrypt-lib >=1.11.1,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: LGPL-2.1-or-later + size: 492733 + timestamp: 1757520335407 +- conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.9-h085a93f_0.conda + sha256: 1c8f0b02c400617a9f2ea8429c604b28e25a10f51b3c8d73ce127b4e7b462297 + md5: 973f365f19c1d702bda523658a77de26 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + size: 144265 + timestamp: 1757520342166 +- conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a + md5: e179a69edd30d75c0144d7a380b88f28 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 75995 + timestamp: 1757032240102 +- conda: https://prefix.dev/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda + sha256: 880b1f76b24814c9f07b33402e82fa66d5ae14738a35a943c21c4434eef2403d + md5: f0531fc1ebc0902555670e9cb0127758 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 127967 + timestamp: 1756125594973 +- conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + sha256: 89c84f5b26028a9d0f5c4014330703e7dff73ba0c98f90103e9cef6b43a5323c + md5: d17e3fb595a9f24fa9e149239a33475d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libudev1 >=257.4 + license: LGPL-2.1-or-later + size: 89551 + timestamp: 1748856210075 +- conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.29-h2287256_0.conda + sha256: b46c1c71d8be2d19615a10eaa997b3547848d1aee25a7e9486ad1ca8d61626a7 + md5: e5d5fd6235a259665d7652093dc7d6f1 + depends: + - __osx >=10.13 + license: LGPL-2.1-or-later + size: 85523 + timestamp: 1748856209535 +- conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + sha256: 5eee9a2bf359e474d4548874bcfc8d29ebad0d9ba015314439c256904e40aaad + md5: f6654e9e96e9d973981b3b2f898a5bfa + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + size: 83849 + timestamp: 1748856224950 +- conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.29-h1839187_0.conda + sha256: 9837f8e8de20b6c9c033561cd33b4554cd551b217e3b8d2862b353ed2c23d8b8 + md5: a656b2c367405cd24988cf67ff2675aa + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: LGPL-2.1-or-later + size: 118204 + timestamp: 1748856290542 +- conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + sha256: ca494c99c7e5ecc1b4cd2f72b5584cef3d4ce631d23511184411abcbb90a21a5 + md5: b4ecbefe517ed0157c37f8182768271c + depends: + - libogg + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 285894 + timestamp: 1753879378005 +- conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + sha256: 2febd0cdea153a97737df3cfb900c312b012c0af3cc5a62f2968bd398d25b6b6 + md5: 9abb1e8cbc0039155a8ed2aa149b1067 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 800138 + timestamp: 1757977095650 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + sha256: 4310577d7eea817d35a1c05e1e54575b06ce085d73e6dd59aa38523adf50168f + md5: 8337b675e0cad517fbcb3daf7588087a + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.0 ha9997c6_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 45363 + timestamp: 1758640621036 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + sha256: 5420ea77505a8d5ca7b5351ddb2da7e8a178052fccf8fca00189af7877608e89 + md5: b24dd2bd61cd8e4f8a13ee2a945a723c + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.0 + license: MIT + license_family: MIT + size: 556276 + timestamp: 1758640612398 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1209177 + timestamp: 1756742976157 +- conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.46-ha3e7e28_0.conda + sha256: cb262b7f369431d1086445ddd1f21d40003bb03229dfc1d687e3a808de2663a6 + md5: 3b504da3a4f6d8b2b1f969686a0bf0c0 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1097626 + timestamp: 1756743061564 +- conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + sha256: 5bf2eeaa57aab6e8e95bea6bd6bb2a739f52eb10572d8ed259d25864d3528240 + md5: 0e6e82c3cc3835f4692022e9b9cd5df8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 835080 + timestamp: 1756743041908 +- conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + sha256: 8a6729861c9813a756b0438c30bd271722fb3f239ded3afc3bf1cb03327a640e + md5: b6f21b1c925ee2f3f7fc37798c5988db + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.16.2,<2.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.7 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_2 + license: LGPL-2.1-or-later + license_family: LGPL + size: 761857 + timestamp: 1757472971364 +- conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + sha256: 987ad072939fdd51c92ea8d3544b286bb240aefda329f9b03a51d9b7e777f9de + md5: cdd138897d94dc07d99afe7113a07bec + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgl >=1.7.0,<2.0a0 + - sdl3 >=3.2.22,<4.0a0 + - libegl >=1.7.0,<2.0a0 + license: Zlib + size: 589145 + timestamp: 1757842881 +- conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.56-h53ec75d_0.conda + sha256: 3f64f2cabdfe2f4ed8df6adf26a86bd9db07380cb8fa28d18a80040cc8b8b7d9 + md5: 0a8a18995e507da927d1f8c4b7f15ca8 + depends: + - __osx >=10.13 + - libcxx >=19 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 740066 + timestamp: 1757842955775 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + sha256: 704c5cae4bc839a18c70cbf3387d7789f1902828c79c6ddabcd34daf594f4103 + md5: 092c5b693dc6adf5f409d12f33295a2a + depends: + - libcxx >=19 + - __osx >=11.0 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 542508 + timestamp: 1757842919681 +- conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.56-h5112557_0.conda + sha256: d17da21386bdbf32bce5daba5142916feb95eed63ef92b285808c765705bbfd2 + md5: 4cffbfebb6614a1bff3fc666527c25c7 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 572101 + timestamp: 1757842925694 +- conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.22-h68140b3_0.conda + sha256: 789ae811b7b93b01c2300461345027fd1a19a7a404e1b8729f58fbe81a82b3bc + md5: ebfddf2601e082193bb550924bbb9744 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - xorg-libxfixes >=6.0.1,<7.0a0 + - dbus >=1.16.2,<2.0a0 + - libegl >=1.7.0,<2.0a0 + - libudev1 >=257.7 + - libdrm >=2.4.125,<2.5.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - libxkbcommon >=1.11.0,<2.0a0 + - libusb >=1.0.29,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + - libunwind >=1.8.2,<1.9.0a0 + - wayland >=1.24.0,<2.0a0 + - liburing >=2.12,<2.13.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: Zlib + size: 1936633 + timestamp: 1756780211365 +- conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.22-hc0b302d_0.conda + sha256: bc4b35801d55600deba29da19b8d1707db23d165b06fe900ff0ba07d628161e2 + md5: dcaf060cee2fb96259b989c44505d4bf + depends: + - libcxx >=19 + - __osx >=10.13 + - libusb >=1.0.29,<2.0a0 + - dbus >=1.16.2,<2.0a0 + license: Zlib + size: 1548166 + timestamp: 1756780255681 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.22-he22eeb8_0.conda + sha256: f4bebfe966e4df667887b06bea6539f2fde23bf3a89649f5b57b53716f1cc2d5 + md5: cd2b01e16daf07b77c3754bfdeb8095d + depends: + - __osx >=11.0 + - libcxx >=19 + - libusb >=1.0.29,<2.0a0 + - dbus >=1.16.2,<2.0a0 + license: Zlib + size: 1416196 + timestamp: 1756780255242 +- conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.22-h5112557_0.conda + sha256: 01d040f2ebe976a0b9cafc13e8b6fd2cf297afbcdec462a5e254cc8c261f70c5 + md5: ce2d3317d46b92ea361dd9178bc7df91 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libusb >=1.0.29,<2.0a0 + license: Zlib + size: 1521753 + timestamp: 1756780243694 +- conda: . + name: sdl_example + version: 0.1.0 + build: h9352c13_0 + subdir: win-64 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - libstdcxx >=15 + - libgcc >=15 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-64 + depends: + - libcxx >=21 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - libcxx >=21 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 +- conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + sha256: ba673427dcd480cfa9bbc262fd04a9b1ad2ed59a159bd8f7e750d4c52282f34c + md5: 0f2ca7906bf166247d1d760c3422cb8a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 330474 + timestamp: 1751817998141 +- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + sha256: a5d4af601f71805ec67403406e147c48d6bad7aaeae92b0622b7e2396842d3fe + md5: 397a013c2dc5145a70737871aaa87e98 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 392406 + timestamp: 1749375847832 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 835896 + timestamp: 1741901112627 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + size: 32533 + timestamp: 1730908305254 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 19575 + timestamp: 1727794961233 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + size: 14412 + timestamp: 1727899730073 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 diff --git a/tests/data/pixi-build/cpp-with-git-source/pixi.toml b/tests/data/pixi-build/cpp-with-git-source/pixi.toml new file mode 100644 index 0000000000..2ed93a0959 --- /dev/null +++ b/tests/data/pixi-build/cpp-with-git-source/pixi.toml @@ -0,0 +1,39 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] +preview = ["pixi-build"] + +[dependencies] +# Define a dependency on ourselves. This will invoke the build backend to build +# the C++ code and install the executable in an environment ready to be used. +sdl_example = { path = "." } + +[tasks.start] +cmd = "sdl_example" +description = "A tasks to run the executable that is build by the package section." + +[tasks] +test = "sdl_example -h" + +[package] +authors = ["Bas Zalmstra "] +description = "Showcases how to create a simple C++ executable with Pixi" +name = "sdl_example" +version = "0.1.0" + +[package.build.source] +branch = "main" +git = "https://github.com/prefix-dev/pixi-build-testsuite.git" +subdirectory = "tests/data/pixi_build/cpp-with-path-to-source/project" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.host-dependencies] +# This ensures that SDL2 is available at build time. +sdl2 = ">=2.26.5,<3.0" diff --git a/tests/data/pixi-build/cpp-with-path-to-source/.gitignore b/tests/data/pixi-build/cpp-with-path-to-source/.gitignore new file mode 100644 index 0000000000..a2a707b6f0 --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/.gitignore @@ -0,0 +1,5 @@ +# pixi environments +.pixi + +# The build directory +.build diff --git a/tests/data/pixi-build/cpp-with-path-to-source/README.md b/tests/data/pixi-build/cpp-with-path-to-source/README.md new file mode 100644 index 0000000000..b14cc1dc9b --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/README.md @@ -0,0 +1,14 @@ +# Simple C++ SDL Example with specified source path + +This is a simple pixi demo that showcases how to use C++ and SDL with specified source path. + +## How to use? + +Make sure you have `pixi` available in your terminal. +Navigate to this directory and run: + +```shell + +# Start the build executable +pixi run start +``` diff --git a/tests/data/pixi-build/cpp-with-path-to-source/pixi.lock b/tests/data/pixi-build/cpp-with-path-to-source/pixi.lock new file mode 100644 index 0000000000..52e8710e4a --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/pixi.lock @@ -0,0 +1,1234 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-0.24.1-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.24.1-h8e693c7_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.24.1-h8e693c7_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.84.2-h3618099_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.4-hbe16f8c_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.28-h73b1eb8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.10.0-h65c71a3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.54-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.14-he3e324a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - conda: . + subdir: linux-64 + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-20.1.5-hf95d169_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libglib-2.84.2-h3139dbc_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.24.1-h27064b9_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.28-he3325bb_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.45-hf733adb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.54-h92383a6_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.14-h41f5390_0.conda + - conda: . + subdir: osx-64 + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-20.1.5-ha82da77_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.84.2-hbec27ea_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.24.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.28-h48c0fde_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.45-ha881caa_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.54-ha1acc90_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.14-hf196eef_0.conda + - conda: . + subdir: osx-arm64 + win-64: + - conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.28-h1839187_1.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.54-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.14-ha4196fd_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_26.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda + - conda: . + build: h9352c13_0 +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + md5: d9c69a24ad678ffce24c6543a0176b00 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 71042 + timestamp: 1660065501192 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 437860 + timestamp: 1747855126005 +- conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + sha256: 1106cf25c1b64e58f599e0bce9dd0b77b744146d324539fe715596f179dc37b7 + md5: ed5f537f1cefb3a15bcce7cb02d3c149 + depends: + - libcxx >=18 + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 398137 + timestamp: 1747855120103 +- conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + sha256: 2ef01ab52dedb477cb7291994ad556279b37c8ad457521e75c47cad20248ea30 + md5: 80c663e4f6b0fd8d6723ff7d68f09429 + depends: + - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + - libexpat >=2.7.0,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 384376 + timestamp: 1747855177419 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-0.24.1-h5888daf_0.conda + sha256: 88db27c666e1f8515174bf622a3e2ad983c94d69e3a23925089e476b9b06ad00 + md5: c63e7590d4d6f4c85721040ed8b12888 + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.24.1 h5888daf_0 + - libasprintf 0.24.1 h8e693c7_0 + - libasprintf-devel 0.24.1 h8e693c7_0 + - libgcc >=13 + - libgettextpo 0.24.1 h5888daf_0 + - libgettextpo-devel 0.24.1 h5888daf_0 + - libstdcxx >=13 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 511988 + timestamp: 1746228987123 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda + sha256: 3ba33868630b903e3cda7a9176363cdf02710fb8f961efed5f8200c4d53fb4e3 + md5: d54305672f0361c2f3886750e7165b5f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + size: 3129801 + timestamp: 1746228937647 +- conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.24.1-h8e693c7_0.conda + sha256: e30733a729eb6efd9cb316db0202897c882d46f6c20a0e647b4de8ec921b7218 + md5: 57566a81dd1e5aa3d98ac7582e8bfe03 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-or-later + size: 53115 + timestamp: 1746228856865 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.24.1-h8e693c7_0.conda + sha256: ccbfc465456133042eea3e8d69bae009893f57a47a786f772c0af382bda7ad99 + md5: 8f66ed2e34507b7ae44afa31c3e4ec79 + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.24.1 h8e693c7_0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 34680 + timestamp: 1746228884730 +- conda: https://prefix.dev/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda + sha256: 9c84448305e7c9cc44ccec7757cf5afcb5a021f4579aa750a1fa6ea398783950 + md5: c44c16d6976d2aebbd65894d7741e67e + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 120375 + timestamp: 1741176638215 +- conda: https://prefix.dev/conda-forge/osx-64/libcxx-20.1.5-hf95d169_0.conda + sha256: 9003bd12988a54713602999999737590f3b023b0cadb2b316cd3ac256d6740d6 + md5: 9dde68cee0a231b19e189954ac29027b + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 562408 + timestamp: 1747262455533 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-20.1.5-ha82da77_0.conda + sha256: 2765b6e23da91807ce2ed44587fbaadd5ba933b0269810b3c22462f9582aedd3 + md5: 4ef1bdb94d42055f511bb358f2048c58 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568010 + timestamp: 1747262879889 +- conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + sha256: f0d5ffbdf3903a7840184d14c14154b503e1a96767c328f61d99ad24b6963e52 + md5: 8bc89311041d7fcb510238cf0848ccae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + size: 242533 + timestamp: 1733424409299 +- conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda + sha256: 33ab03438aee65d6aa667cf7d90c91e5e7d734c19a67aa4c7040742c0a13d505 + md5: db0bfbe7dd197b68ad5f30333bae6ce0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 74427 + timestamp: 1743431794976 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda + sha256: 976f2e23ad2bb2b8e92c99bfa2ead3ad557b17a129b170f7e2dfcf233193dd7e + md5: 026d0a1056ba2a3dbbea6d4b08188676 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 71894 + timestamp: 1743431912423 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda + sha256: ee550e44765a7bbcb2a0216c063dcd53ac914a7be5386dd0554bd06e6be61840 + md5: 6934bbb74380e045741eb8637641a65b + depends: + - __osx >=11.0 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 65714 + timestamp: 1743431789879 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda + sha256: 0024f9ab34c09629621aefd8603ef77bf9d708129b0dd79029e502c39ffc2195 + md5: ea8ac52380885ed41c1baa8f1d6d2b93 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_2 + - libgomp 15.1.0 h767d61c_2 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 829108 + timestamp: 1746642191935 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda + sha256: 0ab5421a89f090f3aa33841036bb3af4ed85e1f91315b528a9d75fab9aad51ae + md5: ddca86c7040dd0e73b2b69bd7833d225 + depends: + - libgcc 15.1.0 h767d61c_2 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 34586 + timestamp: 1746642200749 +- conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + sha256: dc9c7d7a6c0e6639deee6fde2efdc7e119e7739a6b229fa5f9049a449bae6109 + md5: 8504a291085c9fb809b66cabd5834307 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.55,<2.0a0 + license: LGPL-2.1-or-later + size: 590353 + timestamp: 1747060639058 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda + sha256: 104f2341546e295d1136ab3010e81391bd3fd5be0f095db59266e8eba2082d37 + md5: 2ee6d71b72f75d50581f2f68e965efdb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + size: 171165 + timestamp: 1746228870846 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda + sha256: a9a0cba030778eb2944a1f235dba51e503b66f8be0ce6f55f745173a515c3644 + md5: 8f04c7aae6a46503bc36d1ed5abc8c7c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgettextpo 0.24.1 h5888daf_0 + license: GPL-3.0-or-later + license_family: GPL + size: 37234 + timestamp: 1746228897993 +- conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.84.2-h3618099_0.conda + sha256: a6b5cf4d443044bc9a0293dd12ca2015f0ebe5edfdc9c4abdde0b9947f9eb7bd + md5: 072ab14a02164b7c0c089055368ff776 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.45,<10.46.0a0 + constrains: + - glib 2.84.2 *_0 + license: LGPL-2.1-or-later + size: 3955066 + timestamp: 1747836671118 +- conda: https://prefix.dev/conda-forge/osx-64/libglib-2.84.2-h3139dbc_0.conda + sha256: 4445ab5b45bfeeb087ef3fd4f94c90f41261b5638916c58928600c1fc1f4f6ab + md5: eeb11015e8b75f8af67014faea18f305 + depends: + - __osx >=10.13 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.24.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.45,<10.46.0a0 + constrains: + - glib 2.84.2 *_0 + license: LGPL-2.1-or-later + size: 3727403 + timestamp: 1747836941924 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.84.2-hbec27ea_0.conda + sha256: 5fcc5e948706cc64e45e2454267f664ed5a1e84f15345aae04a41d852a879c0e + md5: 7bbb8961dca1b4b9f2b01b6e722111a7 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.24.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.45,<10.46.0a0 + constrains: + - glib 2.84.2 *_0 + license: LGPL-2.1-or-later + size: 3666180 + timestamp: 1747837044507 +- conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda + sha256: 05fff3dc7e80579bc28de13b511baec281c4343d703c406aefd54389959154fb + md5: fbe7d535ff9d3a168c148e07358cd5b1 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 452635 + timestamp: 1746642113092 +- conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + sha256: 697334de4786a1067ea86853e520c64dd72b11a05137f5b318d8a444007b5e60 + md5: 2bd47db5807daade8500ed7ca4c512a4 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 312184 + timestamp: 1745575272035 +- conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + sha256: c2a9c65a245c7bcb8c17c94dd716dad2d42b7c98e0c17cc5553a5c60242c4dda + md5: 6283140d7b2b55b6b095af939b71b13f + depends: + - __osx >=10.13 + license: LGPL-2.1-only + size: 669052 + timestamp: 1740128415026 +- conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 681804 + timestamp: 1740128227484 +- conda: https://prefix.dev/conda-forge/osx-64/libintl-0.24.1-h27064b9_0.conda + sha256: f0a759b35784d5a31aeaf519f8f24019415321e62e52579a3ec854a413a1509d + md5: b3f498d87404090f731cb6a474045150 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 97229 + timestamp: 1746229336518 +- conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.24.1-h493aca8_0.conda + sha256: fb6d211d9e75e6becfbf339d255ea01f7bd3a61fe6237b3dad740de1b74b3b81 + md5: 0dca9914f2722b773c863508723dfe6e + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 90547 + timestamp: 1746229257769 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda + sha256: eeff241bddc8f1b87567dd6507c9f441f7f472c27f0860a07628260c000ef27c + md5: a76fd702c93cd2dfd89eff30a5fd45a8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + - xz ==5.8.1=*_1 + license: 0BSD + size: 112845 + timestamp: 1746531470399 +- conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 + md5: 68e52064ed3897463c0e958ab5c8f91b + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 218500 + timestamp: 1745825989535 +- conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + sha256: 786d43678d6d1dc5f88a6bad2d02830cfd5a0184e84a8caa45694049f0e3ea5f + md5: b64523fb87ac6f87f0790f324ad43046 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 312472 + timestamp: 1744330953241 +- conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + sha256: c0a30ac74eba66ea76a4f0a39acc7833f5ed783a632ca3bb6665b2d81aabd2fb + md5: 48f4330bfcd959c3cfb704d424903c82 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 28361 + timestamp: 1707101388552 +- conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda + sha256: 6ae3d153e78f6069d503d9309f2cac6de5b93d067fc6433160a4c05226a5dad4 + md5: 1cb1c67961f6dd257eae9e9691b341aa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_2 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3902355 + timestamp: 1746642227493 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda + sha256: 11bea86e11de7d6bce87589197a383344df3fa0a3552dab7e931785ff1159a5b + md5: 9d2072af184b5caa29492bf2344597bb + depends: + - libstdcxx 15.1.0 h8f9b012_2 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 34647 + timestamp: 1746642266826 +- conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda + sha256: 5aa2ba63747ad3b6e717f025c9d2ab4bb32c0d366e1ef81669ffa73b1d9af4a2 + md5: 04bcf3055e51f8dde6fab9672fb9fca0 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.75,<2.76.0a0 + - libgcc >=13 + - libgcrypt-lib >=1.11.0,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: LGPL-2.1-or-later + size: 488733 + timestamp: 1741629468703 +- conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.4-hbe16f8c_1.conda + sha256: 56e55a7e7380a980b418c282cb0240b3ac55ab9308800823ff031a9529e2f013 + md5: d6716795cd81476ac2f5465f1b1cde75 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.75,<2.76.0a0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 144039 + timestamp: 1741629479455 +- conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + sha256: f2ac872920833960e514ce9efd8f7c08ce66dd870738d73839d1bce1ac497de6 + md5: a730b2badd586580c5752cc73842e068 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: MIT + license_family: MIT + size: 75491 + timestamp: 1638450786937 +- conda: https://prefix.dev/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + sha256: bfa34a5a929d792dfcfbbe2d9ee21bd870d73d646512e21c871dab0b80194468 + md5: ecd409e7bfcf4ee73f74d7a2cc91a4c3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 121336 + timestamp: 1738604403935 +- conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.28-h73b1eb8_1.conda + sha256: 73442e137742c46ca5d518c6efab10788ac7499f1f58dcb869476b1f3bf69423 + md5: 45d8148c26a2a4e176bb92be19245e29 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libudev1 >=257.4 + license: LGPL-2.1-or-later + size: 89531 + timestamp: 1747423117965 +- conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.28-he3325bb_1.conda + sha256: db7ce11c0b8fe0e56b1061d0505fc3e6364f83269031fc1d5a26903f3ded3154 + md5: fd0aedcfcee22ffd9a56979a020210c1 + depends: + - __osx >=10.13 + license: LGPL-2.1-or-later + size: 85423 + timestamp: 1747423098216 +- conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.28-h48c0fde_1.conda + sha256: 9920d358e874aca8adeffe453a45ee9caca13e39fae1e9e56bd8620c489e6d90 + md5: d088291a858c85eb41904dbdb0c690f6 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + size: 83797 + timestamp: 1747423116157 +- conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.28-h1839187_1.conda + sha256: 0a8f1cd097e2889c67b07364b501a189999e226874c85aeb79551f78b9fc9f0a + md5: e9616dda79de6913bc8b1065642af0a4 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: LGPL-2.1-or-later + size: 118172 + timestamp: 1747423176764 +- conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 + md5: 309dec04b70a3cc0f1e84a4013683bc0 + depends: + - libgcc-ng >=9.3.0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 286280 + timestamp: 1610609811627 +- conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.10.0-h65c71a3_0.conda + sha256: a8043a46157511b3ceb6573a99952b5c0232313283f2d6a066cec7c8dcaed7d0 + md5: fedf6bfe5d21d21d2b1785ec00a8889a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.8,<2.14.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 707156 + timestamp: 1747911059945 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda + sha256: b0b3a96791fa8bb4ec030295e8c8bf2d3278f33c0f9ad540e73b5e538e6268e7 + md5: 14dbe05b929e329dbaa6f2d0aa19466d + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 690864 + timestamp: 1746634244154 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda + sha256: 27c4014f616326240dcce17b5f3baca3953b6bc5f245ceb49c3fa1e6320571eb + md5: b90bece58b4c2bf25969b70f3be42d25 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1197308 + timestamp: 1745955064657 +- conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.45-hf733adb_0.conda + sha256: 5b2c93ee8714c17682cd926127f1e712efef00441a79732635a80b24f5adc212 + md5: d9f1976154f2f45588251dcfc48bcdda + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1086588 + timestamp: 1745955211398 +- conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.45-ha881caa_0.conda + sha256: e9ecb706b58b5a2047c077b3a1470e8554f3aad02e9c3c00cfa35d537420fea3 + md5: a52385b93558d8e6bbaeec5d61a21cd7 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 837826 + timestamp: 1745955207242 +- conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda + sha256: d2377bb571932f2373f593b7b2fc3b9728dc6ae5b993b1b65d7f2c8bb39a0b49 + md5: 66b1fa9608d8836e25f9919159adc9c6 + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.13.6,<2.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.4 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_1 + license: LGPL-2.1-or-later + license_family: LGPL + size: 764231 + timestamp: 1742507189208 +- conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.54-h3f2d84a_0.conda + sha256: 7cd82ca1d1989de6ac28e72ba0bfaae1c055278f931b0c7ef51bb1abba3ddd2f + md5: 91f8537d64c4d52cbbb2910e8bd61bd2 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - sdl3 >=3.2.10,<4.0a0 + - libgl >=1.7.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 + license: Zlib + size: 587053 + timestamp: 1745799881584 +- conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.54-h92383a6_0.conda + sha256: 99b750dbdd6137cf7131813cfc23a30e4fee5aed76cf44482ecf197e47f71246 + md5: 20cba443d3a3b5da52bd8ba52a7c3bda + depends: + - libcxx >=18 + - __osx >=10.13 + - sdl3 >=3.2.10,<4.0a0 + license: Zlib + size: 739288 + timestamp: 1745799864136 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.54-ha1acc90_0.conda + sha256: ba0ba41b3f7404ddc5421885ad9efe346c4bdc2ec88bc43edd271d9f25f6f0e4 + md5: 71364ba4c5f333860c4431cb46cb9b6c + depends: + - libcxx >=18 + - __osx >=11.0 + - sdl3 >=3.2.10,<4.0a0 + license: Zlib + size: 546209 + timestamp: 1745799899902 +- conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.54-he0c23c2_0.conda + sha256: 477781545f317cd9f0a35cc39e22976ee374f9c98b5cbb083812f6d33cf47c08 + md5: b1a715daa818f0ffcd23bb02b7fcf861 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - sdl3 >=3.2.10,<4.0a0 + license: Zlib + size: 572859 + timestamp: 1745799945033 +- conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.14-he3e324a_0.conda + sha256: b55edbcbcbfc7cff671ef15b6a663b91cb2ca59ab285c283d02f29c51de59e9e + md5: a750ab1e94750185033ea96eadfc925d + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - dbus >=1.13.6,<2.0a0 + - libxkbcommon >=1.9.2,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - libudev1 >=257.4 + - libunwind >=1.6.2,<1.7.0a0 + - wayland >=1.23.1,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - libusb >=1.0.28,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - libdrm >=2.4.124,<2.5.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + - liburing >=2.9,<2.10.0a0 + - libegl >=1.7.0,<2.0a0 + license: Zlib + size: 1939690 + timestamp: 1747327532502 +- conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.14-h41f5390_0.conda + sha256: ed8869e83f75a8a30e67127090c862e1d2ef6a5b6c564c655c4c2e17d2762a81 + md5: 901ecbf5c66aab7d50be60cd50637662 + depends: + - __osx >=10.13 + - libcxx >=18 + - dbus >=1.13.6,<2.0a0 + - libusb >=1.0.28,<2.0a0 + license: Zlib + size: 1544212 + timestamp: 1747327519406 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.14-hf196eef_0.conda + sha256: 78e38ff41903cd8b51b40aab9eba5510390cbc43c74542bd90dc9bb6a9c7a4f6 + md5: 8c8d340805dc11372bb0a3003acadb9c + depends: + - __osx >=11.0 + - libcxx >=18 + - libusb >=1.0.28,<2.0a0 + - dbus >=1.13.6,<2.0a0 + license: Zlib + size: 1416508 + timestamp: 1747327539070 +- conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.14-ha4196fd_0.conda + sha256: c256ec7c8d42368471ea8f0451530323d8f530d080b01db960e393835f4fe7f1 + md5: a0e12c03ae92981b28f89935bd24a409 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - libusb >=1.0.28,<2.0a0 + license: Zlib + size: 1509307 + timestamp: 1747327590623 +- conda: . + name: sdl_example + version: 0.1.0 + build: h9352c13_0 + subdir: win-64 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - sdl2 >=2.32.54,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - libstdcxx >=15 + - libgcc >=15 + - sdl2 >=2.32.54,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-64 + depends: + - libcxx >=20 + - sdl2 >=2.32.54,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - libcxx >=20 + - sdl2 >=2.32.54,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_26.conda + sha256: 7a685b5c37e9713fa314a0d26b8b1d7a2e6de5ab758698199b5d5b6dba2e3ce1 + md5: d3f0381e38093bde620a8d85f266ae55 + depends: + - vc14_runtime >=14.42.34433 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 17893 + timestamp: 1743195261486 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda + sha256: 30dcb71bb166e351aadbdc18f1718757c32cdaa0e1e5d9368469ee44f6bf4709 + md5: 91651a36d31aa20c7ba36299fb7068f4 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.42.34438.* *_26 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 750733 + timestamp: 1743195092905 +- conda: https://prefix.dev/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda + sha256: 73d809ec8056c2f08e077f9d779d7f4e4c2b625881cad6af303c33dc1562ea01 + md5: a37843723437ba75f42c9270ffe800b1 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 321099 + timestamp: 1745806602179 +- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda + sha256: 83ad2be5eb1d359b4cd7d7a93a6b25cdbfdce9d27b37508e2a4efe90d3a4ed80 + md5: 7c91bfc90672888259675ad2ad28af9c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 392870 + timestamp: 1745806998840 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 835896 + timestamp: 1741901112627 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + size: 32533 + timestamp: 1730908305254 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 19575 + timestamp: 1727794961233 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + size: 14412 + timestamp: 1727899730073 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 diff --git a/tests/data/pixi-build/cpp-with-path-to-source/pixi.toml b/tests/data/pixi-build/cpp-with-path-to-source/pixi.toml new file mode 100644 index 0000000000..a6fbac863b --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/pixi.toml @@ -0,0 +1,37 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] +preview = ["pixi-build"] + +[dependencies] +# Define a dependency on ourselves. This will invoke the build backend to build +# the C++ code and install the executable in an environment ready to be used. +sdl_example = { path = "." } + +[tasks.start] +cmd = "sdl_example" +description = "A tasks to run the executable that is build by the package section." + +[tasks] +test = "sdl_example -h" + +[package] +authors = ["Bas Zalmstra "] +description = "Showcases how to create a simple C++ executable with Pixi" +name = "sdl_example" +version = "0.1.0" + +[package.build] +source.path = "project" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.host-dependencies] +# This ensures that SDL2 is available at build time. +sdl2 = ">=2.26.5,<3.0" diff --git a/tests/data/pixi-build/cpp-with-path-to-source/project/CMakeLists.txt b/tests/data/pixi-build/cpp-with-path-to-source/project/CMakeLists.txt new file mode 100644 index 0000000000..d6eb0ba8f1 --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/project/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.7) +project(sdl_example) + +find_package(SDL2 REQUIRED) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +add_executable(${PROJECT_NAME} src/main.cc) + +if (MSVC) + set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +target_link_libraries( + ${PROJECT_NAME} PRIVATE + SDL2::SDL2 + SDL2::SDL2main +) + +include(GNUInstallDirs) +install( + TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${BINDIR} +) diff --git a/tests/data/pixi-build/cpp-with-path-to-source/project/src/main.cc b/tests/data/pixi-build/cpp-with-path-to-source/project/src/main.cc new file mode 100644 index 0000000000..00ee708f35 --- /dev/null +++ b/tests/data/pixi-build/cpp-with-path-to-source/project/src/main.cc @@ -0,0 +1,94 @@ +#include +#include + +int main( int argc, char* args[] ) { + if (argc > 1 && std::string(args[1]) == "-h") { + std::cout << "Usage: sdl-example [options]\n" + << "A simple SDL example that creates a window and draws a square that follows the mouse cursor.\n" + << "Options:\n" + << " -h Show this help message\n"; + return 0; + } + + // Initialize SDL + if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) + { + std::cout << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl; + return 1; + } + + // Create window + SDL_Window *window = SDL_CreateWindow("Basic Pixi SDL project", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + 800, 600, + SDL_WINDOW_SHOWN); + if(window == nullptr) { + std::cout << "Failed to create SDL window (error" << SDL_GetError() << ")" << std::endl; + SDL_Quit(); + return 1; + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if(renderer == nullptr) { + std::cout << "Failed to create SDL renderer (error" << SDL_GetError() << ")" << std::endl; + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + // Declare rect of square + SDL_Rect squareRect; + + // Square dimensions: Half of the min(SCREEN_WIDTH, SCREEN_HEIGHT) + squareRect.w = 300; + squareRect.h = 300; + + // Event loop exit flag + bool quit = false; + + // Event loop + while(!quit) + { + SDL_Event e; + + // Wait indefinitely for the next available event + SDL_WaitEvent(&e); + + // User requests quit + if(e.type == SDL_QUIT) + { + quit = true; + } + + // Get mouse position + int mouseX, mouseY; + SDL_GetMouseState(&mouseX, &mouseY); + + // Update square position to follow the mouse cursor + squareRect.x = mouseX - squareRect.w / 2; + squareRect.y = mouseY - squareRect.h / 2; + + + // Initialize renderer color white for the background + SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); + + // Clear screen + SDL_RenderClear(renderer); + + // Set renderer color red to draw the square + SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); + + // Draw a rectangle + SDL_RenderFillRect(renderer, &squareRect); + + // Update screen + SDL_RenderPresent(renderer); + } + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/tests/data/pixi-build/editable-pyproject/.gitignore b/tests/data/pixi-build/editable-pyproject/.gitignore new file mode 100644 index 0000000000..e1dac73381 --- /dev/null +++ b/tests/data/pixi-build/editable-pyproject/.gitignore @@ -0,0 +1,2 @@ +.pixi +#*.egg-info diff --git a/tests/data/pixi-build/editable-pyproject/pixi.lock b/tests/data/pixi-build/editable-pyproject/pixi.lock new file mode 100644 index 0000000000..5270f046c5 --- /dev/null +++ b/tests/data/pixi-build/editable-pyproject/pixi.lock @@ -0,0 +1,779 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: . +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 + license: ISC + size: 159003 + timestamp: 1725018903918 +- conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae + md5: b7e5424e7f06547a903d28e4651dbb21 + license: ISC + size: 158665 + timestamp: 1725019059295 +- conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 + md5: 40dec13fd8348dbe303e57be74bd3d35 + license: ISC + size: 158482 + timestamp: 1725019034582 +- conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 + md5: 4c4fd67c18619be5aa65dc5b6c72e490 + license: ISC + size: 158773 + timestamp: 1725019107649 +- conda: . + name: editable-pyproject + version: 0.1.0 + build: pyh4616a5c_0 + subdir: noarch + depends: + - python + - python * + input: + hash: 0e5b879b8be1bd55540bc912ca881382625113b8fca75bf88b2e3a9a1093b4d3 + globs: + - pyproject.toml +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + size: 669211 + timestamp: 1729655358674 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + sha256: d10f43d0c5df6c8cf55259bce0fe14d2377eed625956cddce06f58827d288c59 + md5: 20307f4049a735a78a29073be1be2626 + depends: + - __osx >=10.13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 70758 + timestamp: 1730967204736 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: eb383771c680aa792feb529eaf9df82f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 139068 + timestamp: 1730967442102 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 58292 + timestamp: 1636488182923 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + md5: ccb34fb14960ad8b125962d3d79b31a9 + license: MIT + license_family: MIT + size: 51348 + timestamp: 1636488394370 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 848745 + timestamp: 1729027721139 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54142 + timestamp: 1729027726517 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 460992 + timestamp: 1729027639220 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: 0BSD + size: 111132 + timestamp: 1733407410083 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + sha256: c70639ff3cb034a8e31cb081c907879b6a639bb12b0e090069a68eb69125b10e + md5: f9e9205fed9c664421c1c09f0b90ce6d + depends: + - __osx >=10.13 + license: 0BSD + size: 103745 + timestamp: 1733407504892 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + license: 0BSD + size: 99129 + timestamp: 1733407496073 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + sha256: 24d04bd55adfa44c421c99ce169df38cb1ad2bba5f43151bc847fc802496a1fa + md5: 015b9c0bd1eef60729ab577a38aaf0b5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + size: 104332 + timestamp: 1733407872569 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070 + md5: aeb98fdeb2e8f25d43ef71fbacbeec80 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 89991 + timestamp: 1723817448345 +- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + sha256: 791be3d30d8e37ec49bcc23eb8f1e1415d911a7c023fa93685f2ea485179e258 + md5: ed625b2e59dff82859c23dd24774156b + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 76561 + timestamp: 1723817691512 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + sha256: f7917de9117d3a5fe12a39e185c7ce424f8d5010a6f97b4333e8a1dcb2889d16 + md5: 7476305c35dd9acef48da8f754eedb40 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 69263 + timestamp: 1723817629767 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 873551 + timestamp: 1733761824646 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + sha256: 4d5e188d921f93c97ce172fc8c4341e8171670ec98d76f9961f65f6306fcda77 + md5: 44d9799fda97eb34f6d88ac1e3eb0ea6 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 923167 + timestamp: 1733761860127 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 850553 + timestamp: 1733762057506 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + sha256: ecfc0182c3b2e63c870581be1fa0e4dbdfec70d2011cb4f5bde416ece26c41df + md5: ff00095330e0d35a16bd3bdbd1a2d3e7 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 891292 + timestamp: 1733762116902 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + size: 889086 + timestamp: 1724658547447 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af + md5: e102bbf8a6ceeaf429deab8032fc8977 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822066 + timestamp: 1724658603042 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 802321 + timestamp: 1724658775723 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 + md5: 23cc74f77eb99315c0360ec3533147a9 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + size: 2947466 + timestamp: 1731377666602 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + sha256: ba7e068ed469d6625e32ae60e6ad893e655b6695280dadf7e065ed0b6f3b885c + md5: ec99d2ce0b3033a75cbad01bbc7c5b71 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2590683 + timestamp: 1731378034404 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + sha256: bd1d58ced46e75efa3b842c61642fd12272c69e9fe4d7261078bc082153a1d53 + md5: df307bbc703324722df0293c9ca2e418 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2935176 + timestamp: 1731377561525 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + sha256: e03045a0837e01ff5c75e9273a572553e7522290799807f918c917a9826a6484 + md5: d0d805d9b5524a14efb51b3bff965e83 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + size: 8491156 + timestamp: 1731379715927 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + build_number: 102 + sha256: b10f25c5edc203d15b3f54861bec4868b8200ebc16c8cbc82202e4c8da2b183e + md5: 6e7535f1d1faf524e9210d2689b3149b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33263183 + timestamp: 1733436074842 +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + build_number: 102 + sha256: 8f424519d207379f0410d2783b257426f6d362edbc0b6c6b2a5ed61ff87821f9 + md5: bacdbf2fd86557ad1fb862cb2d30d821 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 14067313 + timestamp: 1733434634823 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + build_number: 102 + sha256: 0379adf6bb35ca47036860983701e8f6fae89c028d422f2b9439f3110893bc24 + md5: 8c65c1dfc98312ef8666dbb7c7fc47ca + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12905237 + timestamp: 1733433280639 +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + build_number: 102 + sha256: ee41eda85ebc3a257a3b21a76d255d986b08a285d891e418cbfb70113ee14684 + md5: 70568ba8bbd5f0c7b830e690775eb8b7 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + size: 16753813 + timestamp: 1733433028707 +- conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 438225b241c5f9bddae6f0178a97f5870a89ecf927dfca54753e689907331442 + md5: 381bbd2a92c863f640a55b6ff3c35161 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6217 + timestamp: 1723823393322 +- conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 075ad768648e88b78d2a94099563b43d3082e7c35979f457164f26d1079b7b5c + md5: 927a2186f1f997ac018d67c4eece90a6 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6291 + timestamp: 1723823083064 +- conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 4437198eae80310f40b23ae2f8a9e0a7e5c2b9ae411a8621eb03d87273666199 + md5: b8e82d0a5c1664638f87f63cc5d241fb + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6322 + timestamp: 1723823058879 +- conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 0c12cc1b84962444002c699ed21e815fb9f686f950d734332a1b74d07db97756 + md5: 44b4fe6f22b57103afb2299935c8b68e + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6716 + timestamp: 1723823166911 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 281456 + timestamp: 1679532220005 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 255870 + timestamp: 1679532707590 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3270220 + timestamp: 1699202389792 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + size: 122354 + timestamp: 1728047496079 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + sha256: 986ddaf8feec2904eac9535a7ddb7acda1a1dfb9482088fdb8129f1595181663 + md5: 7c10ec3158d1eb4ddff7007c9101adb0 + depends: + - vc14_runtime >=14.38.33135 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 17479 + timestamp: 1731710827215 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + sha256: c483b090c4251a260aba6ff3e83a307bcfb5fb24ad7ced872ab5d02971bd3a49 + md5: 32b37d0cfa80da34548501cdc913a832 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.42.34433.* *_23 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 754247 + timestamp: 1731710681163 +- conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 + md5: 5c176975ca2b8366abad3c97b3cd1e83 + depends: + - vc14_runtime >=14.42.34433 + license: BSD-3-Clause + license_family: BSD + size: 17572 + timestamp: 1731710685291 diff --git a/tests/data/pixi-build/editable-pyproject/pyproject.toml b/tests/data/pixi-build/editable-pyproject/pyproject.toml new file mode 100644 index 0000000000..4727ce104a --- /dev/null +++ b/tests/data/pixi-build/editable-pyproject/pyproject.toml @@ -0,0 +1,52 @@ +[project] +dependencies = [] +name = "editable-pyproject" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] +preview = ["pixi-build"] + +[tool.pixi.package.host-dependencies] +# To be able to install this pyproject we need to install the dependencies of +# the python build-system defined above. Note that different from the +# pyproject build-system this refers to a conda package instead of a pypi +# package. +hatchling = "==1.26.3" + +# The build section defines the build system that will be used to turn +# the source code of this package into a conda package. Similarly to the above +# [build-system] section this section instructs pixi which build backend to +# use. The build.backend is an executable that is installed and invoked by +# pixi with the sole purpose to build the package. +[tool.pixi.package.build.backend] +# The name of the build backend to use. This name refers both to the name of +# the package that provides the build backend and the name of the executable +# inside the package that is invoked. +name = "pixi-build-python" +version = "*" +# These are the conda channels that are used to resolve the dependencies of the +# build backend package. +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[tool.pixi.dependencies] +editable-pyproject = { path = "." } + +[tool.pixi.tasks] +check-editable = "python -c 'import editable_pyproject; editable_pyproject.check_editable()'" + +# This section marks the project as a pixi package. +# +# Normally a number of fields would be set here, like the name, version, etc. +# However, since all these fields are already defined in the [project] section +# at the top of this file they are not required. +[tool.pixi.package] diff --git a/tests/data/pixi-build/editable-pyproject/src/editable_pyproject/__init__.py b/tests/data/pixi-build/editable-pyproject/src/editable_pyproject/__init__.py new file mode 100644 index 0000000000..9e8f428a71 --- /dev/null +++ b/tests/data/pixi-build/editable-pyproject/src/editable_pyproject/__init__.py @@ -0,0 +1,23 @@ +__version__ = "1.0.0" + +import sys +from pathlib import Path +import site + + +def is_editable() -> bool: + package_name = "editable_pyproject" + for site_package in site.getsitepackages(): + egg_link_path = Path(site_package).joinpath(f"_{package_name}.pth") + if egg_link_path.is_file(): + return True + return False + + +def check_editable() -> None: + if is_editable(): + print("The package is installed as editable.") + sys.exit(0) + else: + print("The package is not installed as editable.") + sys.exit(1) diff --git a/tests/data/pixi-build/env-config-cmake-test/CMakeLists.txt b/tests/data/pixi-build/env-config-cmake-test/CMakeLists.txt new file mode 100644 index 0000000000..e3eabc6f6c --- /dev/null +++ b/tests/data/pixi-build/env-config-cmake-test/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.20) +project(env-test-cmake-app) + +# Print environment variables during build +message(STATUS "CUSTOM_BUILD_VAR=$ENV{CUSTOM_BUILD_VAR}") +message(STATUS "PIXI_TEST_ENV=$ENV{PIXI_TEST_ENV}") +message(STATUS "BUILD_MESSAGE=$ENV{BUILD_MESSAGE}") + +# Minimal install target +install(CODE "message(\"Install completed\")") \ No newline at end of file diff --git a/tests/data/pixi-build/env-config-cmake-test/pixi.toml b/tests/data/pixi-build/env-config-cmake-test/pixi.toml new file mode 100644 index 0000000000..d684711eb8 --- /dev/null +++ b/tests/data/pixi-build/env-config-cmake-test/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +env-test-cmake-app = { path = "." } + +[package] +name = "env-test-cmake-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.build.config] +env = { CUSTOM_BUILD_VAR = "test_value", PIXI_TEST_ENV = "pixi_cmake_test", BUILD_MESSAGE = "hello_from_env" } diff --git a/tests/data/pixi-build/env-config-invalid-test/CMakeLists.txt b/tests/data/pixi-build/env-config-invalid-test/CMakeLists.txt new file mode 100644 index 0000000000..20f5337c6c --- /dev/null +++ b/tests/data/pixi-build/env-config-invalid-test/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.20) +project(env-invalid-test-cmake-app) + +# Minimal install target +install(CODE "message(\"Install completed\")") \ No newline at end of file diff --git a/tests/data/pixi-build/env-config-invalid-test/pixi.toml b/tests/data/pixi-build/env-config-invalid-test/pixi.toml new file mode 100644 index 0000000000..7713e20bf7 --- /dev/null +++ b/tests/data/pixi-build/env-config-invalid-test/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +env-invalid-test-cmake-app = { path = "." } + +[package] +name = "env-invalid-test-cmake-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.build.config] +invalid_config_key = "this_should_fail" diff --git a/tests/data/pixi-build/env-config-target-cmake-test/CMakeLists.txt b/tests/data/pixi-build/env-config-target-cmake-test/CMakeLists.txt new file mode 100644 index 0000000000..58d206114e --- /dev/null +++ b/tests/data/pixi-build/env-config-target-cmake-test/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.20) +project(env-target-test-cmake-app) + +# Print environment variables during build +message(STATUS "GLOBAL_ENV_VAR=$ENV{GLOBAL_ENV_VAR}") +message(STATUS "UNIX_SPECIFIC_VAR=$ENV{UNIX_SPECIFIC_VAR}") +message(STATUS "WIN_SPECIFIC_VAR=$ENV{WIN_SPECIFIC_VAR}") +message(STATUS "PLATFORM_TYPE=$ENV{PLATFORM_TYPE}") + +# Minimal install target +install(CODE "message(\"Install completed\")") \ No newline at end of file diff --git a/tests/data/pixi-build/env-config-target-cmake-test/pixi.toml b/tests/data/pixi-build/env-config-target-cmake-test/pixi.toml new file mode 100644 index 0000000000..2848eb5e52 --- /dev/null +++ b/tests/data/pixi-build/env-config-target-cmake-test/pixi.toml @@ -0,0 +1,28 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +env-target-test-cmake-app = { path = "." } + +[package] +name = "env-target-test-cmake-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.build.config] +env = { GLOBAL_ENV_VAR = "global_value" } + +[package.build.target.unix.config] +env = { UNIX_SPECIFIC_VAR = "unix_value", PLATFORM_TYPE = "unix" } + +[package.build.target.win-64.config] +env = { WIN_SPECIFIC_VAR = "windows_value", PLATFORM_TYPE = "win-64" } diff --git a/tests/data/pixi-build/env-config-target-invalid-test/CMakeLists.txt b/tests/data/pixi-build/env-config-target-invalid-test/CMakeLists.txt new file mode 100644 index 0000000000..9749291130 --- /dev/null +++ b/tests/data/pixi-build/env-config-target-invalid-test/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.20) +project(env-target-invalid-test-cmake-app) + +# Minimal install target +install(CODE "message(\"Install completed\")") \ No newline at end of file diff --git a/tests/data/pixi-build/env-config-target-invalid-test/pixi.toml b/tests/data/pixi-build/env-config-target-invalid-test/pixi.toml new file mode 100644 index 0000000000..476ff350f8 --- /dev/null +++ b/tests/data/pixi-build/env-config-target-invalid-test/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +env-target-invalid-test-cmake-app = { path = "." } + +[package] +name = "env-target-invalid-test-cmake-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.build.target.unix.config] +invalid_target_config_key = "this_should_also_fail" diff --git a/tests/data/pixi-build/log-example/failing/pixi.lock b/tests/data/pixi-build/log-example/failing/pixi.lock new file mode 100644 index 0000000000..6e70994d82 --- /dev/null +++ b/tests/data/pixi-build/log-example/failing/pixi.lock @@ -0,0 +1,55 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: . + build: hb0f4dca_0 + osx-64: + - conda: . + build: h0dc7051_0 + osx-arm64: + - conda: . + build: h60d57d3_0 + win-64: + - conda: . + build: h9490d1a_0 +packages: +- conda: . + name: simple-app + version: 0.1.0 + build: h0dc7051_0 + subdir: osx-64 + input: + hash: 8d1d52341921800e7ab8a779709ab7deec64a6281480dfda121b9e6aaea71c4d + globs: + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: h60d57d3_0 + subdir: osx-arm64 + input: + hash: 8d1d52341921800e7ab8a779709ab7deec64a6281480dfda121b9e6aaea71c4d + globs: + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: h9490d1a_0 + subdir: win-64 + input: + hash: 8d1d52341921800e7ab8a779709ab7deec64a6281480dfda121b9e6aaea71c4d + globs: + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: hb0f4dca_0 + subdir: linux-64 + input: + hash: 8d1d52341921800e7ab8a779709ab7deec64a6281480dfda121b9e6aaea71c4d + globs: + - variants.yaml diff --git a/tests/data/pixi-build/log-example/failing/pixi.toml b/tests/data/pixi-build/log-example/failing/pixi.toml new file mode 100644 index 0000000000..90a23016cd --- /dev/null +++ b/tests/data/pixi-build/log-example/failing/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/log-example/failing/recipe.yaml b/tests/data/pixi-build/log-example/failing/recipe.yaml new file mode 100644 index 0000000000..2c502023ff --- /dev/null +++ b/tests/data/pixi-build/log-example/failing/recipe.yaml @@ -0,0 +1,13 @@ +package: + name: simple-app + version: 0.1.0 + +build: + number: 0 + script: + - echo Building package simple-app + - if: win + then: + - exit /b 1 + else: + - exit 1 diff --git a/tests/data/pixi-build/log-example/working/pixi.lock b/tests/data/pixi-build/log-example/working/pixi.lock new file mode 100644 index 0000000000..61f4bda976 --- /dev/null +++ b/tests/data/pixi-build/log-example/working/pixi.lock @@ -0,0 +1,59 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: . + build: hb0f4dca_0 + osx-64: + - conda: . + build: h0dc7051_0 + osx-arm64: + - conda: . + build: h60d57d3_0 + win-64: + - conda: . + build: h9490d1a_0 +packages: +- conda: . + name: simple-app + version: 0.1.0 + build: h0dc7051_0 + subdir: osx-64 + input: + hash: 18bb1687ed91f73a966ea7214c5497f76de790fc22b918b35057fb0020124871 + globs: + - recipe.yaml + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: h60d57d3_0 + subdir: osx-arm64 + input: + hash: 18bb1687ed91f73a966ea7214c5497f76de790fc22b918b35057fb0020124871 + globs: + - recipe.yaml + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: h9490d1a_0 + subdir: win-64 + input: + hash: 18bb1687ed91f73a966ea7214c5497f76de790fc22b918b35057fb0020124871 + globs: + - recipe.yaml + - variants.yaml +- conda: . + name: simple-app + version: 0.1.0 + build: hb0f4dca_0 + subdir: linux-64 + input: + hash: 18bb1687ed91f73a966ea7214c5497f76de790fc22b918b35057fb0020124871 + globs: + - recipe.yaml + - variants.yaml diff --git a/tests/data/pixi-build/log-example/working/pixi.toml b/tests/data/pixi-build/log-example/working/pixi.toml new file mode 100644 index 0000000000..c3b7315934 --- /dev/null +++ b/tests/data/pixi-build/log-example/working/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "0.3.*" diff --git a/tests/data/pixi-build/log-example/working/recipe.yaml b/tests/data/pixi-build/log-example/working/recipe.yaml new file mode 100644 index 0000000000..14c80a31bf --- /dev/null +++ b/tests/data/pixi-build/log-example/working/recipe.yaml @@ -0,0 +1,8 @@ +package: + name: simple-app + version: 0.1.0 + +build: + number: 0 + script: + - echo Building package simple-app diff --git a/tests/data/pixi-build/manifests/workspace_git.toml b/tests/data/pixi-build/manifests/workspace_git.toml new file mode 100644 index 0000000000..7e50fc5747 --- /dev/null +++ b/tests/data/pixi-build/manifests/workspace_git.toml @@ -0,0 +1,9 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +name = "test-example" +platforms = ["CURRENT_PLATFORM"] +preview = ["pixi-build"] + + +[dependencies] +rich_example = { "git" = "file:///" } diff --git a/tests/data/pixi-build/maturin/Cargo.lock b/tests/data/pixi-build/maturin/Cargo.lock new file mode 100644 index 0000000000..1a274a2008 --- /dev/null +++ b/tests/data/pixi-build/maturin/Cargo.lock @@ -0,0 +1,164 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "fast_math" +version = "0.1.0" +dependencies = [ + "pyo3", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a" +dependencies = [ + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" diff --git a/tests/data/pixi-build/maturin/Cargo.toml b/tests/data/pixi-build/maturin/Cargo.toml new file mode 100644 index 0000000000..03c674848f --- /dev/null +++ b/tests/data/pixi-build/maturin/Cargo.toml @@ -0,0 +1,11 @@ +[package] +edition = "2024" +name = "fast_math" +version = "0.1.0" + +[lib] +crate-type = ["cdylib"] +name = "fast_math" + +[dependencies] +pyo3 = "0.25.0" diff --git a/tests/data/pixi-build/maturin/fast_math/__main__.py b/tests/data/pixi-build/maturin/fast_math/__main__.py new file mode 100644 index 0000000000..077229a6fd --- /dev/null +++ b/tests/data/pixi-build/maturin/fast_math/__main__.py @@ -0,0 +1,9 @@ +from .fast_math import sum_as_string # type: ignore + + +def main() -> None: + print(f"3 + 5 = {sum_as_string(3, 5)}") + + +if __name__ == "__main__": + main() diff --git a/tests/data/pixi-build/maturin/pixi.toml b/tests/data/pixi-build/maturin/pixi.toml new file mode 100644 index 0000000000..cbd28fefec --- /dev/null +++ b/tests/data/pixi-build/maturin/pixi.toml @@ -0,0 +1,30 @@ +[workspace] +authors = ["Julian Hofer "] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["linux-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] + +[tasks] +start = 'python -m fast_math' + +[dependencies] +fast_math = { path = "." } +python = "*" + +[package] +name = "fast_math" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.build.config] +compilers = ["rust"] + +[package.host-dependencies] +maturin = "*" diff --git a/tests/data/pixi-build/maturin/pyproject.toml b/tests/data/pixi-build/maturin/pyproject.toml new file mode 100644 index 0000000000..95bc5a4ddd --- /dev/null +++ b/tests/data/pixi-build/maturin/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +build-backend = "maturin" +requires = ["maturin>=1.9,<2.0"] + +[project] +classifiers = [ + "Programming Language :: Rust", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", +] +dynamic = ["version"] +name = "fast_math" +requires-python = ">=3.8" + +[tool.maturin] +features = ["pyo3/extension-module"] diff --git a/tests/data/pixi-build/maturin/src/lib.rs b/tests/data/pixi-build/maturin/src/lib.rs new file mode 100644 index 0000000000..9a1bda0378 --- /dev/null +++ b/tests/data/pixi-build/maturin/src/lib.rs @@ -0,0 +1,14 @@ +use pyo3::prelude::*; + +/// Formats the sum of two numbers as string. +#[pyfunction] +fn sum_as_string(a: usize, b: usize) -> PyResult { + Ok((a + b).to_string()) +} + +/// A Python module implemented in Rust. +#[pymodule] +fn fast_math(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; + Ok(()) +} diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/CMakeLists.txt b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/CMakeLists.txt new file mode 100644 index 0000000000..4a67c7da23 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.20) +project(simple-app) + +# Set C++ standard +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Create executable from main.cpp +add_executable(${PROJECT_NAME} src/main.cpp) + +# Install the executable +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin +) diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/pixi.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/pixi.toml new file mode 100644 index 0000000000..02dd1d3efb --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/src/main.cpp b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/src/main.cpp new file mode 100644 index 0000000000..f93a4bbc45 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-cmake/src/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + std::cout << "Build backend works" << std::endl; + return 0; +} diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.lock b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.lock new file mode 100644 index 0000000000..dbe93a0de0 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.lock @@ -0,0 +1,776 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: . +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + size: 154489 + timestamp: 1754210967212 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + size: 154402 + timestamp: 1754210968730 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 676044 + timestamp: 1752032747103 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 72450 + timestamp: 1752719744781 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 141322 + timestamp: 1752719767870 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 44978 + timestamp: 1743435053850 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824153 + timestamp: 1753903866511 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29249 + timestamp: 1753903872571 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447289 + timestamp: 1753903801049 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104826 + timestamp: 1749230155443 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 91183 + timestamp: 1748393666725 +- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e + md5: 18b81186a6adb43f000ad19ed7b70381 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 77667 + timestamp: 1748393757154 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 932581 + timestamp: 1753948484112 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + sha256: 466366b094c3eb4b1d77320530cbf5400e7a10ab33e4824c200147488eebf7a6 + md5: 156bfb239b6a67ab4a01110e6718cbc4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 980121 + timestamp: 1753948554003 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 902645 + timestamp: 1753948599139 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1288499 + timestamp: 1753948889360 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822259 + timestamp: 1738196181298 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e + md5: ffffb341206dd0dab0c36053c048d621 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3128847 + timestamp: 1754465526100 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + sha256: 8be57a11019666aa481122c54e29afd604405b481330f37f918e9fbcd145ef89 + md5: 22f5d63e672b7ba467969e9f8b740ecd + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2743708 + timestamp: 1754466962243 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 + md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3074848 + timestamp: 1754465710470 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9275175 + timestamp: 1754467904482 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + build_number: 102 + sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 + md5: 89e07d92cf50743886f41638d58c4328 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33273132 + timestamp: 1750064035176 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + build_number: 102 + sha256: 8b2f14010eb0baf04ed1eb3908c9e184cd14512c4d64c43f313251b90e75b345 + md5: afa9492a7d31f6f7189ca8f08aceadac + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 13955531 + timestamp: 1750063132430 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + build_number: 102 + sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 + md5: a9a4658f751155c819d6cd4c47f0a4d2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + size: 16825621 + timestamp: 1750062318985 + python_site_packages_path: Lib/site-packages +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 7002 + timestamp: 1752805902938 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 256712 + timestamp: 1740379577668 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: . + name: simple-app + version: 0.1.0 + build: pyh4616a5c_0 + subdir: noarch + depends: + - python + - python * + input: + hash: 54927b0b01b4d99eefbceaeadb52d1996cca9986b3240e16543cf61501d4a3d3 + globs: + - pyproject.toml +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + sha256: b24468006a96b71a5f4372205ea7ec4b399b0f2a543541e86f883de54cd623fc + md5: 9864891a6946c2fe037c02fca7392ab4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3259809 + timestamp: 1748387843735 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3466348 + timestamp: 1748388121356 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.toml new file mode 100644 index 0000000000..36c2e1986a --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pixi.toml @@ -0,0 +1,25 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] +preview = ["pixi-build"] + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "==1.26.3" diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pyproject.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pyproject.toml new file mode 100644 index 0000000000..329e1bff17 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/pyproject.toml @@ -0,0 +1,10 @@ +[project] +dependencies = ["rich"] +name = "simple-app" +requires-python = ">= 3.11" +scripts = { simple-app = "simple_app:main" } +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/simple_app/__init__.py b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/simple_app/__init__.py new file mode 100644 index 0000000000..8dc224f95f --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-python/simple_app/__init__.py @@ -0,0 +1,2 @@ +def main() -> None: + print("Build backend works") diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/pixi.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/pixi.toml new file mode 100644 index 0000000000..90a23016cd --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/pixi.toml @@ -0,0 +1,22 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/recipe.yaml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/recipe.yaml new file mode 100644 index 0000000000..266db2c80d --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rattler-build/recipe.yaml @@ -0,0 +1,21 @@ +package: + name: simple-app + version: 0.1.0 + +source: + path: . + use_gitignore: true + +build: + number: 0 + script: + - if: win + then: + - mkdir -p %PREFIX%\bin + - echo @echo off > %PREFIX%\bin\simple-app.bat + - echo echo Build backend works >> %PREFIX%\bin\simple-app.bat + else: + - mkdir -p $PREFIX/bin + - echo "#!/usr/bin/env bash" > $PREFIX/bin/simple-app + - echo "echo Build backend works" >> $PREFIX/bin/simple-app + - chmod +x $PREFIX/bin/simple-app diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.toml new file mode 100644 index 0000000000..82f4895b74 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +edition = "2024" +name = "simple-app" +version = "0.1.0" + +[dependencies] diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/pixi.toml b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/pixi.toml new file mode 100644 index 0000000000..1e18851fb0 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/pixi.toml @@ -0,0 +1,25 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +name = "pixi-build-rust" +platforms = ["linux-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[dependencies] +simple-app = { path = "." } + +[tasks] +start = "simple-app" + +[package] +authors = ["Julian Hofer "] +name = "simple-app" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rust" +version = "*" diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/src/main.rs b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/src/main.rs new file mode 100644 index 0000000000..7a0f597346 --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Build backend works"); +} diff --git a/tests/data/pixi-build/multi-output/recipe/pixi.toml b/tests/data/pixi-build/multi-output/recipe/pixi.toml index ecdad24ef1..796501b118 100644 --- a/tests/data/pixi-build/multi-output/recipe/pixi.toml +++ b/tests/data/pixi-build/multi-output/recipe/pixi.toml @@ -2,5 +2,10 @@ name = "multi-output" version = "0.1.0" -[package.build] -backend = { name = "pixi-build-rattler-build", version = "*" } +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/name-and-version-less-package/Cargo.toml b/tests/data/pixi-build/name-and-version-less-package/Cargo.toml new file mode 100644 index 0000000000..cf7137315d --- /dev/null +++ b/tests/data/pixi-build/name-and-version-less-package/Cargo.toml @@ -0,0 +1,4 @@ +[package] +description = "rust app description" +name = "rust-app" +version = "1.2.3" diff --git a/tests/data/pixi-build/name-and-version-less-package/pixi.lock b/tests/data/pixi-build/name-and-version-less-package/pixi.lock new file mode 100644 index 0000000000..a9ca89fbba --- /dev/null +++ b/tests/data/pixi-build/name-and-version-less-package/pixi.lock @@ -0,0 +1,7 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: {} +packages: [] diff --git a/tests/data/pixi-build/name-and-version-less-package/pixi.toml b/tests/data/pixi-build/name-and-version-less-package/pixi.toml new file mode 100644 index 0000000000..a2bf070b7f --- /dev/null +++ b/tests/data/pixi-build/name-and-version-less-package/pixi.toml @@ -0,0 +1,15 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] +preview = ["pixi-build"] + +# [dependencies] +# rust-app = { path = "." } + +# [package.build.backend] +# channels = [ +# "https://prefix.dev/pixi-build-backends", +# "https://prefix.dev/conda-forge", +# ] +# name = "pixi-build-rust" +# version = "*" diff --git a/tests/data/pixi-build/python-builddir/pixi.lock b/tests/data/pixi-build/python-builddir/pixi.lock new file mode 100644 index 0000000000..72ed379be1 --- /dev/null +++ b/tests/data/pixi-build/python-builddir/pixi.lock @@ -0,0 +1,778 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: . + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: . +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + size: 154489 + timestamp: 1754210967212 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + size: 154402 + timestamp: 1754210968730 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 676044 + timestamp: 1752032747103 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 72450 + timestamp: 1752719744781 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 141322 + timestamp: 1752719767870 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 44978 + timestamp: 1743435053850 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824153 + timestamp: 1753903866511 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29249 + timestamp: 1753903872571 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447289 + timestamp: 1753903801049 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104826 + timestamp: 1749230155443 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 91183 + timestamp: 1748393666725 +- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e + md5: 18b81186a6adb43f000ad19ed7b70381 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 77667 + timestamp: 1748393757154 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 932581 + timestamp: 1753948484112 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + sha256: 466366b094c3eb4b1d77320530cbf5400e7a10ab33e4824c200147488eebf7a6 + md5: 156bfb239b6a67ab4a01110e6718cbc4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 980121 + timestamp: 1753948554003 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 902645 + timestamp: 1753948599139 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1288499 + timestamp: 1753948889360 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822259 + timestamp: 1738196181298 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e + md5: ffffb341206dd0dab0c36053c048d621 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3128847 + timestamp: 1754465526100 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + sha256: 8be57a11019666aa481122c54e29afd604405b481330f37f918e9fbcd145ef89 + md5: 22f5d63e672b7ba467969e9f8b740ecd + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2743708 + timestamp: 1754466962243 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 + md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3074848 + timestamp: 1754465710470 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9275175 + timestamp: 1754467904482 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + build_number: 102 + sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 + md5: 89e07d92cf50743886f41638d58c4328 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33273132 + timestamp: 1750064035176 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + build_number: 102 + sha256: 8b2f14010eb0baf04ed1eb3908c9e184cd14512c4d64c43f313251b90e75b345 + md5: afa9492a7d31f6f7189ca8f08aceadac + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 13955531 + timestamp: 1750063132430 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + build_number: 102 + sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 + md5: a9a4658f751155c819d6cd4c47f0a4d2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + size: 16825621 + timestamp: 1750062318985 + python_site_packages_path: Lib/site-packages +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 7002 + timestamp: 1752805902938 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 256712 + timestamp: 1740379577668 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: . + name: simple-meson-app + version: 0.1.0 + build: pyh4616a5c_0 + subdir: noarch + depends: + - python >=3.11 + - python * + input: + hash: f90a173287bac45449954c16d194fafa3683099b9ee990e724fcf17a8b1465ad + globs: + - pyproject.toml +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + sha256: b24468006a96b71a5f4372205ea7ec4b399b0f2a543541e86f883de54cd623fc + md5: 9864891a6946c2fe037c02fca7392ab4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3259809 + timestamp: 1748387843735 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3466348 + timestamp: 1748388121356 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 diff --git a/tests/data/pixi-build/python-builddir/pixi.toml b/tests/data/pixi-build/python-builddir/pixi.toml new file mode 100644 index 0000000000..a4e28a990a --- /dev/null +++ b/tests/data/pixi-build/python-builddir/pixi.toml @@ -0,0 +1,31 @@ +[workspace] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "python-builddir" +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[dependencies] +simple-meson-app = { path = "." } + +[package] +name = "simple-meson-app" +version = "0.1.0" + +[package.build.backend] +name = "pixi-build-python" +version = "*" + +[package.build] +source.path = "src" + +[package.build.config] +extra-args = ["-Cbuilddir=mybuilddir"] + +[package.host-dependencies] +meson-python = "*" +python = "*" +uv = "*" diff --git a/tests/data/pixi-build/python-builddir/src/meson.build b/tests/data/pixi-build/python-builddir/src/meson.build new file mode 100644 index 0000000000..fab814ba84 --- /dev/null +++ b/tests/data/pixi-build/python-builddir/src/meson.build @@ -0,0 +1,3 @@ +project('simple_meson_app') +py = import('python').find_installation(pure: false) +subdir('simple_meson_app') diff --git a/tests/data/pixi-build/python-builddir/src/pyproject.toml b/tests/data/pixi-build/python-builddir/src/pyproject.toml new file mode 100644 index 0000000000..6ae508b64c --- /dev/null +++ b/tests/data/pixi-build/python-builddir/src/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "simple-meson-app" +requires-python = ">= 3.11" +scripts = { simple-meson-app = "simple_meson_app:main" } +version = "0.1.0" + +[build-system] +build-backend = "mesonpy" +requires = ["meson-python"] diff --git a/tests/data/pixi-build/python-builddir/src/simple_meson_app/__init__.py b/tests/data/pixi-build/python-builddir/src/simple_meson_app/__init__.py new file mode 100644 index 0000000000..8dc224f95f --- /dev/null +++ b/tests/data/pixi-build/python-builddir/src/simple_meson_app/__init__.py @@ -0,0 +1,2 @@ +def main() -> None: + print("Build backend works") diff --git a/tests/data/pixi-build/python-builddir/src/simple_meson_app/meson.build b/tests/data/pixi-build/python-builddir/src/simple_meson_app/meson.build new file mode 100644 index 0000000000..4df2672d97 --- /dev/null +++ b/tests/data/pixi-build/python-builddir/src/simple_meson_app/meson.build @@ -0,0 +1 @@ +py.install_sources('__init__.py') diff --git a/tests/data/pixi-build/rattler-build-backend/array-api-extra/pixi.toml b/tests/data/pixi-build/rattler-build-backend/array-api-extra/pixi.toml new file mode 100644 index 0000000000..405389a261 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/array-api-extra/pixi.toml @@ -0,0 +1,21 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +name = "array-api-extra-build" +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[dependencies] +array-api-extra = { path = "." } + +[package] +name = "array-api-extra" +version = "0.8.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/rattler-build-backend/array-api-extra/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/array-api-extra/recipe.yaml new file mode 100644 index 0000000000..4af8fc8d3c --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/array-api-extra/recipe.yaml @@ -0,0 +1,29 @@ +context: + name: array-api-extra + version: "0.8.0" + python_min: "3.10" + +package: + name: ${{ name|lower }} + version: ${{ version }} + +source: + url: https://pypi.org/packages/source/${{ name[0] }}/${{ name }}/array_api_extra-${{ version }}.tar.gz + sha256: 1358c2111768317acf7ae5e397d04ed321ccc1f0c1d7a42347b0fba69f0bdf4e + +build: + noarch: python + script: ${{ PYTHON }} -m pip install . -vv --no-deps --no-build-isolation + +requirements: + host: + - python ${{ python_min }}.* + - hatchling + - pip + run: + - python >=${{ python_min }} + - array-api-compat + +about: + license: MIT + license_file: LICENSE diff --git a/tests/data/pixi-build/rattler-build-backend/smokey/pixi.toml b/tests/data/pixi-build/rattler-build-backend/smokey/pixi.toml new file mode 100644 index 0000000000..3fd509c1fc --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/smokey/pixi.toml @@ -0,0 +1,24 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +description = "Add a short description here" +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +smokey = { path = "." } + +[package] +name = "smokey" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" + +# dep for default target +[package.host-dependencies] +hatchling = "*" diff --git a/tests/data/pixi-build/rattler-build-backend/smokey/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/smokey/recipe.yaml new file mode 100644 index 0000000000..1a9c558947 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/smokey/recipe.yaml @@ -0,0 +1,5 @@ +# this is just a empty recipe for smoke tests + +package: + name: smokey + version: 1.2.3 diff --git a/tests/data/pixi-build/rattler-build-backend/smokey2/pixi.toml b/tests/data/pixi-build/rattler-build-backend/smokey2/pixi.toml new file mode 100644 index 0000000000..e97f037845 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/smokey2/pixi.toml @@ -0,0 +1,24 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +description = "Add a short description here" +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] + +[dependencies] +smokey2 = { path = "." } + +[package] +name = "smokey2" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" + +# No deps for default target, but dep for linux64 target +[package.target.linux-64.host-dependencies] +hatchling = "*" diff --git a/tests/data/pixi-build/rattler-build-backend/smokey2/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/smokey2/recipe.yaml new file mode 100644 index 0000000000..d3082a2fa4 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/smokey2/recipe.yaml @@ -0,0 +1,5 @@ +# this is just a empty recipe for smoke tests + +package: + name: smokey2 + version: 1.2.3 diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/a/pixi.toml b/tests/data/pixi-build/rattler-build-backend/source-dependency/a/pixi.toml new file mode 100644 index 0000000000..2e4581fb62 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/a/pixi.toml @@ -0,0 +1,6 @@ +[package] +name = "a" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-rattler-build", version = "0.3.*" } diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/a/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/source-dependency/a/recipe.yaml new file mode 100644 index 0000000000..7c024c6cb9 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/a/recipe.yaml @@ -0,0 +1,13 @@ +package: + name: a + version: 0.1.0 + +build: + script: + - if: win + then: + - if not exist "%PREFIX%" mkdir "%PREFIX%" + - echo hello from package a! > "%PREFIX%\hi" + else: + - mkdir -p $PREFIX + - echo "hello from package a!" > $PREFIX/hi diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/b/pixi.toml b/tests/data/pixi-build/rattler-build-backend/source-dependency/b/pixi.toml new file mode 100644 index 0000000000..4dcc6423c2 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/b/pixi.toml @@ -0,0 +1,9 @@ +[package] +name = "b" +version = "0.1.0" + +[package.build] +backend = { name = "pixi-build-rattler-build", version = "0.3.*" } + +[package.build-dependencies] +a = { path = "../a" } diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/b/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/source-dependency/b/recipe.yaml new file mode 100644 index 0000000000..5b30b8b08f --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/b/recipe.yaml @@ -0,0 +1,19 @@ +package: + name: b + version: 0.1.0 + +build: + script: + - if: win + then: + - type "%BUILD_PREFIX%\hi" + - if not exist "%PREFIX%" mkdir "%PREFIX%" + - copy "%BUILD_PREFIX%\hi" "%PREFIX%\hi-from-a" + else: + - cat $BUILD_PREFIX/hi + - mkdir -p $PREFIX + - cp $BUILD_PREFIX/hi $PREFIX/hi-from-a + +requirements: + build: + - a diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/c/recipe.yaml b/tests/data/pixi-build/rattler-build-backend/source-dependency/c/recipe.yaml new file mode 100644 index 0000000000..f9cbb9e41b --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/c/recipe.yaml @@ -0,0 +1,3 @@ +package: + name: c + version: 0.1.0 diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.lock b/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.lock new file mode 100644 index 0000000000..cc69880df9 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.lock @@ -0,0 +1,59 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: b + build: hb0f4dca_0 + osx-64: + - conda: b + build: h0dc7051_0 + osx-arm64: + - conda: b + build: h60d57d3_0 + win-64: + - conda: b + build: h9490d1a_0 +packages: +- conda: b + name: b + version: 0.1.0 + build: h0dc7051_0 + subdir: osx-64 + input: + hash: e3e74ce916ac3407b3a9a8cad528143408be3c026d0a63d0cd16153fb71b7823 + globs: + - recipe.yaml + - variants.yaml +- conda: b + name: b + version: 0.1.0 + build: h60d57d3_0 + subdir: osx-arm64 + input: + hash: e3e74ce916ac3407b3a9a8cad528143408be3c026d0a63d0cd16153fb71b7823 + globs: + - recipe.yaml + - variants.yaml +- conda: b + name: b + version: 0.1.0 + build: h9490d1a_0 + subdir: win-64 + input: + hash: e3e74ce916ac3407b3a9a8cad528143408be3c026d0a63d0cd16153fb71b7823 + globs: + - recipe.yaml + - variants.yaml +- conda: b + name: b + version: 0.1.0 + build: hb0f4dca_0 + subdir: linux-64 + input: + hash: e3e74ce916ac3407b3a9a8cad528143408be3c026d0a63d0cd16153fb71b7823 + globs: + - recipe.yaml + - variants.yaml diff --git a/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.toml b/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.toml new file mode 100644 index 0000000000..047c780f13 --- /dev/null +++ b/tests/data/pixi-build/rattler-build-backend/source-dependency/pixi.toml @@ -0,0 +1,10 @@ +[workspace] +authors = ["remimimimimi "] +channels = ["conda-forge"] +name = "project" +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[dependencies] +b = { path = "b" } diff --git a/tests/data/pixi-build/recursive_source_build_dep/.gitattributes b/tests/data/pixi-build/recursive_source_build_dep/.gitattributes new file mode 100644 index 0000000000..887a2c18f0 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/tests/data/pixi-build/recursive_source_build_dep/.gitignore b/tests/data/pixi-build/recursive_source_build_dep/.gitignore new file mode 100644 index 0000000000..740bb7d1ae --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/.gitignore @@ -0,0 +1,4 @@ + +# pixi environments +.pixi +*.egg-info diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_a/CMakeLists.txt b/tests/data/pixi-build/recursive_source_build_dep/package_a/CMakeLists.txt new file mode 100644 index 0000000000..27528c05fc --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_a/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.16) +project(package-a VERSION 0.1.0) + +# Create an executable from a single source file +add_executable(${PROJECT_NAME} src/main.cpp) + +# Set C++ standard +set_target_properties(${PROJECT_NAME} PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON +) + +# Find and link against package_b library +find_package(package-b REQUIRED) +target_link_libraries(${PROJECT_NAME} package-b) + +# Install the executable +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin +) diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_a/pixi.toml b/tests/data/pixi-build/recursive_source_build_dep/package_a/pixi.toml new file mode 100644 index 0000000000..03d3b97c84 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_a/pixi.toml @@ -0,0 +1,19 @@ +[package] +name = "package_a" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.host-dependencies] +package_b = { path = "../package_b" } + + +# For that use case we should actually use run-exports +[package.run-dependencies] +package_b = { path = "../package_b" } diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_a/src/main.cpp b/tests/data/pixi-build/recursive_source_build_dep/package_a/src/main.cpp new file mode 100644 index 0000000000..68db9844fd --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_a/src/main.cpp @@ -0,0 +1,15 @@ +#include +#include + +int main() { + std::cout << "Package A application starting..." << std::endl; + + // Use the add function from package_b + int a = 5; + int b = 3; + int result = package_b::add(a, b); + std::cout << a << " + " << b << " = " << result << std::endl; + std::cout << "Package A application finished!" << std::endl; + + return 0; +} diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_b/CMakeLists.txt b/tests/data/pixi-build/recursive_source_build_dep/package_b/CMakeLists.txt new file mode 100644 index 0000000000..01f9f341c5 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_b/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.16) +project(package-b VERSION 0.1.0) +include(GNUInstallDirs) + +# Create a shared library from a single source file +add_library(${PROJECT_NAME} SHARED src/package_b.cpp) + +# Set up include directories +target_include_directories(${PROJECT_NAME} PUBLIC + $ + $ +) + +# Set library properties +set_target_properties(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION 0 + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + PUBLIC_HEADER src/package_b.h +) + +# Define the build macro for your export/import logic +target_compile_definitions(${PROJECT_NAME} PRIVATE BUILDING_DLL) + +# Set visibility for GCC/Clang (recommended for performance) +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + target_compile_options(${PROJECT_NAME} PRIVATE -fvisibility=hidden) +endif() + +# Install the library +install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) + +install(EXPORT ${PROJECT_NAME}Targets + FILE ${PROJECT_NAME}Config.cmake + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME} +) diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_b/pixi.toml b/tests/data/pixi-build/recursive_source_build_dep/package_b/pixi.toml new file mode 100644 index 0000000000..b08916b63a --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_b/pixi.toml @@ -0,0 +1,11 @@ +[package] +name = "package_b" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.cpp b/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.cpp new file mode 100644 index 0000000000..88bcfc419a --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.cpp @@ -0,0 +1,10 @@ +#include "package_b.h" +#include + +namespace package_b { + +int add(int a, int b) { + return a + b; +} + +} // namespace package_b diff --git a/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.h b/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.h new file mode 100644 index 0000000000..8acf65e913 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/package_b/src/package_b.h @@ -0,0 +1,21 @@ +#ifndef PACKAGE_B_H +#define PACKAGE_B_H + +#ifdef _WIN32 + #ifdef BUILDING_DLL + #define API_EXPORT __declspec(dllexport) + #else + #define API_EXPORT __declspec(dllimport) + #endif +#else + #define API_EXPORT __attribute__((visibility("default"))) +#endif + +namespace package_b { + +// Simple function to add two integers +API_EXPORT int add(int a, int b); + +} // namespace package_b + +#endif // PACKAGE_B_H diff --git a/tests/data/pixi-build/recursive_source_build_dep/pixi.toml b/tests/data/pixi-build/recursive_source_build_dep/pixi.toml new file mode 100644 index 0000000000..8a14da27a7 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_build_dep/pixi.toml @@ -0,0 +1,13 @@ +[workspace] +authors = ["Julian Hofer "] +channels = ["https://prefix.dev/conda-forge"] +name = "recursive-source-build-dep" +platforms = ["linux-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[tasks] +start = "package-a" + +[dependencies] +package_a = { path = "package_a" } diff --git a/tests/data/pixi-build/recursive_source_run_dep/.gitattributes b/tests/data/pixi-build/recursive_source_run_dep/.gitattributes new file mode 100644 index 0000000000..887a2c18f0 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/tests/data/pixi-build/recursive_source_run_dep/.gitignore b/tests/data/pixi-build/recursive_source_run_dep/.gitignore new file mode 100644 index 0000000000..740bb7d1ae --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/.gitignore @@ -0,0 +1,4 @@ + +# pixi environments +.pixi +*.egg-info diff --git a/tests/data/pixi-build/recursive_source_run_dep/package_a/pixi.toml b/tests/data/pixi-build/recursive_source_run_dep/package_a/pixi.toml new file mode 100644 index 0000000000..0c395da69a --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/package_a/pixi.toml @@ -0,0 +1,17 @@ +[package] +name = "package_a" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "*" + +[package.run-dependencies] +package_b = { path = "../package_b" } diff --git a/tests/data/pixi-build/recursive_source_run_dep/package_a/pyproject.toml b/tests/data/pixi-build/recursive_source_run_dep/package_a/pyproject.toml new file mode 100644 index 0000000000..9fbce2a03c --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/package_a/pyproject.toml @@ -0,0 +1,13 @@ +[project] +authors = [{ name = "Julian Hofer", email = "julianhofer@gnome.org" }] +dependencies = [] +name = "package_a" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[project.scripts] +package-a = "package_a:main" diff --git a/tests/data/pixi-build/recursive_source_run_dep/package_a/src/package_a/__init__.py b/tests/data/pixi-build/recursive_source_run_dep/package_a/src/package_a/__init__.py new file mode 100644 index 0000000000..b7e0fc0b81 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/package_a/src/package_a/__init__.py @@ -0,0 +1,6 @@ +import subprocess + + +def main() -> None: + print("Pixi Build is number 1") + subprocess.run("package-b", check=True, shell=True) diff --git a/tests/data/pixi-build/recursive_source_run_dep/package_b/pixi.toml b/tests/data/pixi-build/recursive_source_run_dep/package_b/pixi.toml new file mode 100644 index 0000000000..a0c28b287b --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/package_b/pixi.toml @@ -0,0 +1,11 @@ +[package] +name = "package-b" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-rattler-build" +version = "*" diff --git a/tests/data/pixi-build/recursive_source_run_dep/package_b/recipe.yaml b/tests/data/pixi-build/recursive_source_run_dep/package_b/recipe.yaml new file mode 100644 index 0000000000..4ad4c0e961 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/package_b/recipe.yaml @@ -0,0 +1,17 @@ +package: + name: package_b + version: 0.1.0 + +build: + number: 0 + script: + - if: win + then: + - mkdir %PREFIX%\bin + - echo @echo off > %PREFIX%\bin\package-b.bat + - echo echo hello from package-b >> %PREFIX%\bin\package-b.bat + else: + - mkdir -p $PREFIX/bin + - echo "#!/usr/bin/env bash" > $PREFIX/bin/package-b + - echo "echo hello from package-b" >> $PREFIX/bin/package-b + - chmod +x $PREFIX/bin/package-b diff --git a/tests/data/pixi-build/recursive_source_run_dep/pixi.lock b/tests/data/pixi-build/recursive_source_run_dep/pixi.lock new file mode 100644 index 0000000000..2383387a0a --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/pixi.lock @@ -0,0 +1,668 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: package_a + - conda: package_b + build: hb0f4dca_0 + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: package_a + - conda: package_b + build: h60d57d3_0 + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: package_a + - conda: package_b + build: h9490d1a_0 +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + size: 154489 + timestamp: 1754210967212 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + size: 154402 + timestamp: 1754210968730 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 676044 + timestamp: 1752032747103 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 141322 + timestamp: 1752719767870 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 44978 + timestamp: 1743435053850 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824153 + timestamp: 1753903866511 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29249 + timestamp: 1753903872571 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447289 + timestamp: 1753903801049 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 91183 + timestamp: 1748393666725 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 932581 + timestamp: 1753948484112 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 902645 + timestamp: 1753948599139 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1288499 + timestamp: 1753948889360 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e + md5: ffffb341206dd0dab0c36053c048d621 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3128847 + timestamp: 1754465526100 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 + md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3074848 + timestamp: 1754465710470 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9275175 + timestamp: 1754467904482 +- conda: package_a + name: package_a + version: 0.1.0 + build: pyh4616a5c_0 + subdir: noarch + depends: + - package_b + - python + - python * + input: + hash: 79e0338812fd1e39475c0e314ed3a5b99c758af3c2d5d2957832ca795afc41f2 + globs: + - pyproject.toml + sources: + package_b: + path: ../package_b +- conda: package_b + name: package_b + version: 0.1.0 + build: h60d57d3_0 + subdir: osx-arm64 + input: + hash: 73d5da015a64ec1a51bd4a37a422d1dbbbded5af703a129fac11329c619d81a1 + globs: + - variants.yaml +- conda: package_b + name: package_b + version: 0.1.0 + build: h9490d1a_0 + subdir: win-64 + input: + hash: 73d5da015a64ec1a51bd4a37a422d1dbbbded5af703a129fac11329c619d81a1 + globs: + - variants.yaml +- conda: package_b + name: package_b + version: 0.1.0 + build: hb0f4dca_0 + subdir: linux-64 + input: + hash: 73d5da015a64ec1a51bd4a37a422d1dbbbded5af703a129fac11329c619d81a1 + globs: + - variants.yaml +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + build_number: 102 + sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 + md5: 89e07d92cf50743886f41638d58c4328 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33273132 + timestamp: 1750064035176 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + build_number: 102 + sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 + md5: a9a4658f751155c819d6cd4c47f0a4d2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + size: 16825621 + timestamp: 1750062318985 + python_site_packages_path: Lib/site-packages +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 7002 + timestamp: 1752805902938 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3466348 + timestamp: 1748388121356 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 diff --git a/tests/data/pixi-build/recursive_source_run_dep/pixi.toml b/tests/data/pixi-build/recursive_source_run_dep/pixi.toml new file mode 100644 index 0000000000..743f634306 --- /dev/null +++ b/tests/data/pixi-build/recursive_source_run_dep/pixi.toml @@ -0,0 +1,12 @@ +[workspace] +authors = ["Julian Hofer "] +channels = ["https://prefix.dev/conda-forge"] +name = "recursive-source-run-dep" +platforms = ["linux-64", "osx-arm64", "win-64"] +preview = ["pixi-build"] +version = "0.1.0" + +[tasks] + +[dependencies] +package_a = { path = "package_a" } diff --git a/tests/data/pixi-build/rich_example/.gitignore b/tests/data/pixi-build/rich_example/.gitignore new file mode 100644 index 0000000000..740bb7d1ae --- /dev/null +++ b/tests/data/pixi-build/rich_example/.gitignore @@ -0,0 +1,4 @@ + +# pixi environments +.pixi +*.egg-info diff --git a/tests/data/pixi-build/rich_example/pixi.lock b/tests/data/pixi-build/rich_example/pixi.lock new file mode 100644 index 0000000000..8915214fc5 --- /dev/null +++ b/tests/data/pixi-build/rich_example/pixi.lock @@ -0,0 +1,847 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: . + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: . +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + sha256: 1afd7274cbc9a334d6d0bc62fa760acc7afdaceb0b91a8df370ec01fd75dc7dd + md5: 720523eb0d6a9b0f6120c16b2aa4e7de + license: ISC + size: 157088 + timestamp: 1734208393264 +- conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + sha256: ddaafdcd1b8ace6ffeea22b6824ca9db8a64cf0a2652a11d7554ece54935fa06 + md5: b7b887091c99ed2e74845e75e9128410 + license: ISC + size: 156925 + timestamp: 1734208413176 +- conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + sha256: 256be633fd0882ccc1a7a32bc278547e1703f85082c0789a87a603ee3ab8fb82 + md5: 7cb381a6783d91902638e4ed1ebd478e + license: ISC + size: 157091 + timestamp: 1734208344343 +- conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + sha256: 424d82db36cd26234bc4772426170efd60e888c2aed0099a257a95e131683a5e + md5: cb2eaeb88549ddb27af533eccf9a45c1 + license: ISC + size: 157422 + timestamp: 1734208404685 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + size: 669211 + timestamp: 1729655358674 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + sha256: d10f43d0c5df6c8cf55259bce0fe14d2377eed625956cddce06f58827d288c59 + md5: 20307f4049a735a78a29073be1be2626 + depends: + - __osx >=10.13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 70758 + timestamp: 1730967204736 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: eb383771c680aa792feb529eaf9df82f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + size: 139068 + timestamp: 1730967442102 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 58292 + timestamp: 1636488182923 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + md5: ccb34fb14960ad8b125962d3d79b31a9 + license: MIT + license_family: MIT + size: 51348 + timestamp: 1636488394370 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 848745 + timestamp: 1729027721139 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54142 + timestamp: 1729027726517 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 460992 + timestamp: 1729027639220 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: 0BSD + size: 111132 + timestamp: 1733407410083 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + sha256: c70639ff3cb034a8e31cb081c907879b6a639bb12b0e090069a68eb69125b10e + md5: f9e9205fed9c664421c1c09f0b90ce6d + depends: + - __osx >=10.13 + license: 0BSD + size: 103745 + timestamp: 1733407504892 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + license: 0BSD + size: 99129 + timestamp: 1733407496073 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + sha256: 24d04bd55adfa44c421c99ce169df38cb1ad2bba5f43151bc847fc802496a1fa + md5: 015b9c0bd1eef60729ab577a38aaf0b5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + size: 104332 + timestamp: 1733407872569 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070 + md5: aeb98fdeb2e8f25d43ef71fbacbeec80 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 89991 + timestamp: 1723817448345 +- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + sha256: 791be3d30d8e37ec49bcc23eb8f1e1415d911a7c023fa93685f2ea485179e258 + md5: ed625b2e59dff82859c23dd24774156b + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 76561 + timestamp: 1723817691512 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + sha256: f7917de9117d3a5fe12a39e185c7ce424f8d5010a6f97b4333e8a1dcb2889d16 + md5: 7476305c35dd9acef48da8f754eedb40 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 69263 + timestamp: 1723817629767 +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 873551 + timestamp: 1733761824646 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + sha256: 4d5e188d921f93c97ce172fc8c4341e8171670ec98d76f9961f65f6306fcda77 + md5: 44d9799fda97eb34f6d88ac1e3eb0ea6 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 923167 + timestamp: 1733761860127 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 850553 + timestamp: 1733762057506 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + sha256: ecfc0182c3b2e63c870581be1fa0e4dbdfec70d2011cb4f5bde416ece26c41df + md5: ff00095330e0d35a16bd3bdbd1a2d3e7 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 891292 + timestamp: 1733762116902 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + size: 889086 + timestamp: 1724658547447 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af + md5: e102bbf8a6ceeaf429deab8032fc8977 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822066 + timestamp: 1724658603042 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 802321 + timestamp: 1724658775723 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 + md5: 23cc74f77eb99315c0360ec3533147a9 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + size: 2947466 + timestamp: 1731377666602 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + sha256: ba7e068ed469d6625e32ae60e6ad893e655b6695280dadf7e065ed0b6f3b885c + md5: ec99d2ce0b3033a75cbad01bbc7c5b71 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2590683 + timestamp: 1731378034404 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + sha256: bd1d58ced46e75efa3b842c61642fd12272c69e9fe4d7261078bc082153a1d53 + md5: df307bbc703324722df0293c9ca2e418 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2935176 + timestamp: 1731377561525 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + sha256: e03045a0837e01ff5c75e9273a572553e7522290799807f918c917a9826a6484 + md5: d0d805d9b5524a14efb51b3bff965e83 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + size: 8491156 + timestamp: 1731379715927 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d + md5: b38dc0206e2a530e5c2cf11dc086b31a + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 876700 + timestamp: 1733221731178 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + build_number: 102 + sha256: b10f25c5edc203d15b3f54861bec4868b8200ebc16c8cbc82202e4c8da2b183e + md5: 6e7535f1d1faf524e9210d2689b3149b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33263183 + timestamp: 1733436074842 +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + build_number: 102 + sha256: 8f424519d207379f0410d2783b257426f6d362edbc0b6c6b2a5ed61ff87821f9 + md5: bacdbf2fd86557ad1fb862cb2d30d821 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 14067313 + timestamp: 1733434634823 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + build_number: 102 + sha256: 0379adf6bb35ca47036860983701e8f6fae89c028d422f2b9439f3110893bc24 + md5: 8c65c1dfc98312ef8666dbb7c7fc47ca + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12905237 + timestamp: 1733433280639 +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + build_number: 102 + sha256: ee41eda85ebc3a257a3b21a76d255d986b08a285d891e418cbfb70113ee14684 + md5: 70568ba8bbd5f0c7b830e690775eb8b7 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + size: 16753813 + timestamp: 1733433028707 +- conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 438225b241c5f9bddae6f0178a97f5870a89ecf927dfca54753e689907331442 + md5: 381bbd2a92c863f640a55b6ff3c35161 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6217 + timestamp: 1723823393322 +- conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 075ad768648e88b78d2a94099563b43d3082e7c35979f457164f26d1079b7b5c + md5: 927a2186f1f997ac018d67c4eece90a6 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6291 + timestamp: 1723823083064 +- conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 4437198eae80310f40b23ae2f8a9e0a7e5c2b9ae411a8621eb03d87273666199 + md5: b8e82d0a5c1664638f87f63cc5d241fb + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6322 + timestamp: 1723823058879 +- conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 0c12cc1b84962444002c699ed21e815fb9f686f950d734332a1b74d07db97756 + md5: 44b4fe6f22b57103afb2299935c8b68e + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6716 + timestamp: 1723823166911 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 281456 + timestamp: 1679532220005 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 255870 + timestamp: 1679532707590 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 185646 + timestamp: 1733342347277 +- conda: . + name: rich_example + version: 0.1.0 + build: pyhbf21a9e_0 + subdir: noarch + depends: + - rich >=13.9.4,<14 + - python + input: + hash: 72ab1ea37b84d61120fa373ce9d96514f27c9ca85525452dbe3acf600ef66c2d + globs: [] +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3270220 + timestamp: 1699202389792 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + size: 122354 + timestamp: 1728047496079 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + sha256: 986ddaf8feec2904eac9535a7ddb7acda1a1dfb9482088fdb8129f1595181663 + md5: 7c10ec3158d1eb4ddff7007c9101adb0 + depends: + - vc14_runtime >=14.38.33135 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 17479 + timestamp: 1731710827215 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + sha256: c483b090c4251a260aba6ff3e83a307bcfb5fb24ad7ced872ab5d02971bd3a49 + md5: 32b37d0cfa80da34548501cdc913a832 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.42.34433.* *_23 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 754247 + timestamp: 1731710681163 +- conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 + md5: 5c176975ca2b8366abad3c97b3cd1e83 + depends: + - vc14_runtime >=14.42.34433 + license: BSD-3-Clause + license_family: BSD + size: 17572 + timestamp: 1731710685291 diff --git a/tests/data/pixi-build/rich_example/pixi.toml b/tests/data/pixi-build/rich_example/pixi.toml new file mode 100644 index 0000000000..dee6f0c0b8 --- /dev/null +++ b/tests/data/pixi-build/rich_example/pixi.toml @@ -0,0 +1,28 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] +preview = ["pixi-build"] + +[dependencies] +rich_example = { path = "." } + +[tasks] +start = "rich-example-main" + +[package] +name = "rich_example" +version = "0.1.0" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "==1.26.3" + +[package.run-dependencies] +rich = ">=13.9.4,<14" diff --git a/tests/data/pixi-build/rich_example/pyproject.toml b/tests/data/pixi-build/rich_example/pyproject.toml new file mode 100644 index 0000000000..41043f0555 --- /dev/null +++ b/tests/data/pixi-build/rich_example/pyproject.toml @@ -0,0 +1,10 @@ +[project] +dependencies = ["rich"] +name = "rich_example" +requires-python = ">= 3.11" +scripts = { rich-example-main = "rich_example:main" } +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] diff --git a/tests/data/pixi-build/rich_example/src/rich_example/__init__.py b/tests/data/pixi-build/rich_example/src/rich_example/__init__.py new file mode 100644 index 0000000000..ad6a4375ca --- /dev/null +++ b/tests/data/pixi-build/rich_example/src/rich_example/__init__.py @@ -0,0 +1,30 @@ +from dataclasses import dataclass, fields +from rich.console import Console +from rich.table import Table + + +@dataclass +class Person: + name: str + age: int + city: str + + +def main() -> None: + console = Console() + + people = [ + Person("John Doe", 30, "New York"), + Person("Jane Smith", 25, "Los Angeles"), + Person("Tim de Jager", 35, "Utrecht"), + ] + + table = Table() + + for column in fields(Person): + table.add_column(column.name) + + for person in people: + table.add_row(person.name, str(person.age), person.city) + + console.print(table) diff --git a/tests/data/pixi-build/ros-workspace/pixi.lock b/tests/data/pixi-build/ros-workspace/pixi.lock new file mode 100644 index 0000000000..b3878b0ba9 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/pixi.lock @@ -0,0 +1,23210 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/pixi-build-backends/ + - url: https://prefix.dev/conda-forge/ + - url: https://prefix.dev/robostack-humble/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cmake-4.1.2-hc85cc9f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/fmt-11.2.0-h07f6e7f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/foonathan-memory-0.7.3-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/glib-2.86.0-he175458_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/glib-tools-2.86.0-hf516916_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gmock-1.17.0-ha770c72_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.1.0-h15599e2_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libacl-2.3.2-h0f662aa_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-37_h4a7cf45_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-37_h0358290_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.3-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.3-default_h746c552_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-37_h47877c9_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.3-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpq-18.0-h3675c94_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.12.2-hca5e8e5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/nspr-4.37-h29cc59b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/nss-3.117-h445c969_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.14-hfe2f287_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://prefix.dev/conda-forge/linux-64/qt-main-5.15.15-h3c3fd16_6.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-action-msgs-1.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-core-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-python-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-ros-0.10.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-test-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-version-1.3.12-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-index-cpp-1.4.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-index-python-1.4.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-package-0.14.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-builtin-interfaces-1.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-cyclonedds-0.10.5-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-domain-coordinator-0.10.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastcdr-1.0.24-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastrtps-2.6.10-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-geometry-msgs-4.9.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-gmock-vendor-1.10.9006-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-gtest-vendor-1.10.9006-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-posh-2.0.5-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-libstatistics-collector-1.3.4-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-libyaml-vendor-1.2.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-python-cmake-module-0.10.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-5.3.9-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-action-5.3.9-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-interfaces-1.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-logging-interface-2.3.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h11365e7_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rclcpp-16.0.13-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rclcpp-action-16.0.13-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcpputils-2.4.5-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcutils-5.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-6.1.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-connextdds-0.11.3-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-dds-common-1.6.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-implementation-2.8.4-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ros-workspace-1.0.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosgraph-msgs-1.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-adapter-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-cli-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-cmake-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-c-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hbc2a38a_14.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-py-0.14.4-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-parser-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hbc2a38a_14.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rpyutils-0.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-spdlog-vendor-1.3.1-np126py311h11365e7_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-statistics-msgs-1.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-std-msgs-4.9.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-std-srvs-4.9.0-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-tracetools-4.1.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-turtlesim-1.4.2-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hbc2a38a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-64/ros2-distro-mutex-0.7.0-humble_13.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/spdlog-1.15.3-h6dc744f_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - conda: src/navigator + subdir: linux-64 + - conda: src/navigator_py + subdir: linux-64 + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cmake-4.1.2-hc9d863e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6c5dea3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/dbus-1.16.2-heda779d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fmt-11.2.0-h97e1849_0.conda + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/foonathan-memory-0.7.3-h5ad3122_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gettext-0.25.1-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gettext-tools-0.25.1-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/glib-2.86.0-h9414720_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/glib-tools-2.86.0-hc87f4d4_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gmock-1.17.0-h8af1aa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gst-plugins-base-1.24.11-h83ffb7f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gstreamer-1.24.11-h17c303d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/harfbuzz-12.1.0-he4899c9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libacl-2.3.2-h883460d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libasprintf-devel-0.25.1-h5e0f5ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libblas-3.9.0-37_haddc8a3_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcap-2.76-h5706e9e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcblas-3.9.0-37_hd72aa62_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.3-default_he95a3c9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang13-21.1.3-default_h94a09a5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcups-2.3.3-h5cdc715_5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.16.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcrypt-lib-1.11.1-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgettextpo-0.25.1-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgettextpo-devel-0.25.1-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.0-h7cdfd2c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgpg-error-1.55-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libjpeg-turbo-3.1.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblapack-3.9.0-37_h88aeb00_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.3-hfd2ba90_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/libogg-1.3.5-h86ecc28_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libopus-1.5.2-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libpciaccess-0.18-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libpng-1.6.50-h1abf092_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libpq-18.0-hb4b1422_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsystemd0-257.9-hd926fa8_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libvorbis-1.3.7-h7ac5ae9_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxkbcommon-1.12.2-h3c6a4c8_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/nspr-4.37-h3ad9384_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/nss-3.117-h544fa81_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openldap-2.6.10-h30c48ee_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.46-h15761aa_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pulseaudio-client-17.0-h77cf2aa_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.11.14-hcfbf8c2_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/qt-main-5.15.15-h2f19be9_6.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-action-msgs-1.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-core-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-python-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-ros-0.10.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-test-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-version-1.3.12-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-index-cpp-1.4.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-index-python-1.4.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-package-0.14.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-builtin-interfaces-1.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-cyclonedds-0.10.5-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-domain-coordinator-0.10.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastcdr-1.0.24-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastrtps-2.6.10-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-geometry-msgs-4.9.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-gmock-vendor-1.10.9006-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-gtest-vendor-1.10.9006-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-posh-2.0.5-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-libstatistics-collector-1.3.4-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-libyaml-vendor-1.2.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-python-cmake-module-0.10.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-5.3.9-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-action-5.3.9-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-interfaces-1.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-logging-interface-2.3.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h5f8052a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rclcpp-16.0.13-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rclcpp-action-16.0.13-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcpputils-2.4.5-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcutils-5.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-6.1.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-connextdds-0.11.3-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-dds-common-1.6.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-implementation-2.8.4-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ros-workspace-1.0.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosgraph-msgs-1.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-adapter-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-cli-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-cmake-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-c-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hbdd918e_14.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-py-0.14.4-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-parser-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hbdd918e_14.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rpyutils-0.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-spdlog-vendor-1.3.1-np126py311h5f8052a_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-statistics-msgs-1.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-std-msgs-4.9.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-std-srvs-4.9.0-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-tracetools-4.1.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-turtlesim-1.4.2-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hbdd918e_13.conda + - conda: https://prefix.dev/robostack-humble/linux-aarch64/ros2-distro-mutex-0.7.0-humble_13.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/spdlog-1.15.3-h881af89_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tinyxml2-11.0.0-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-0.4.1-hca56bd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-image-0.4.0-h5c728e9_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-keysyms-0.4.1-h5c728e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-renderutil-0.3.10-h5c728e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-wm-0.4.2-h5c728e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xkeyboard-config-2.46-he30d5cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libx11-1.8.12-hca56bd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxdamage-1.1.6-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxshmfence-1.3.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-cpp-0.8.0-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda + - conda: src/navigator + subdir: linux-aarch64 + - conda: src/navigator_py + subdir: linux-aarch64 + osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cmake-4.1.2-h54ad630_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-11.2.0-h440487c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/foonathan-memory-0.7.3-h286801f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/glib-2.86.0-h52a91e1_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/glib-tools-2.86.0-hb9d6e3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmock-1.17.0-hce30654_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gst-plugins-base-1.24.11-h3c5c1d0_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gstreamer-1.24.11-hfe24232_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gtest-1.17.0-ha393de7_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-37_h51639a9_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-37_hb0561ab_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_15.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.3-default_h6e8f826_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.16.0-hdece5d2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.3-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-devel-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.9.0-37_hd9741b5_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_10.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.3-h8e0c9ce_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libopus-1.5.2-h48c0fde_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libpq-18.0-h31f7a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.3-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/nspr-4.37-h31e89c2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/nss-3.117-h1c710a3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.14-hec0b533_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/qt-main-5.15.15-h9b65787_6.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-action-msgs-1.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-core-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gmock-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gtest-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-libraries-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-pytest-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-python-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-ros-0.10.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-test-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-version-1.3.12-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-index-cpp-1.4.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-index-python-1.4.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-package-0.14.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-builtin-interfaces-1.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-cyclonedds-0.10.5-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-domain-coordinator-0.10.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastcdr-1.0.24-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastrtps-2.6.10-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-geometry-msgs-4.9.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-gmock-vendor-1.10.9006-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-gtest-vendor-1.10.9006-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-binding-c-2.0.5-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-hoofs-2.0.5-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-posh-2.0.5-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-libstatistics-collector-1.3.4-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-libyaml-vendor-1.2.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-python-cmake-module-0.10.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-5.3.9-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-action-5.3.9-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-interfaces-1.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-logging-interface-2.3.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h6932ae0_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rclcpp-16.0.13-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rclcpp-action-16.0.13-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcpputils-2.4.5-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcutils-5.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-6.1.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-connextdds-0.11.3-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-connextdds-common-0.11.3-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-dds-common-1.6.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-implementation-2.8.4-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ros-workspace-1.0.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosgraph-msgs-1.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-adapter-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-cli-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-cmake-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-default-runtime-1.2.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-c-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311h2a51a2c_14.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-py-0.14.4-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-parser-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-runtime-c-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311h2a51a2c_14.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rpyutils-0.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-spdlog-vendor-1.3.1-np126py311h6932ae0_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-statistics-msgs-1.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-std-msgs-4.9.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-std-srvs-4.9.0-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-tracetools-4.1.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-turtlesim-1.4.2-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-unique-identifier-msgs-2.2.1-np126py311h2a51a2c_13.conda + - conda: https://prefix.dev/robostack-humble/osx-arm64/ros2-distro-mutex-0.7.0-humble_13.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/spdlog-1.15.3-h217a1f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tinyxml2-11.0.0-ha1acc90_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libx11-1.8.12-h6a5fb8c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxext-1.3.6-hd74edd7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - conda: src/navigator + subdir: osx-arm64 + - conda: src/navigator_py + subdir: osx-arm64 + win-64: + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cmake-4.1.2-hdcbee5b_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fmt-11.2.0-h1d4551f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/foonathan-memory-0.7.3-he0c23c2_1.conda + - conda: https://prefix.dev/conda-forge/win-64/glib-2.86.0-ha3795fc_0.conda + - conda: https://prefix.dev/conda-forge/win-64/glib-tools-2.86.0-he647baa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/gmock-1.17.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/gst-plugins-base-1.24.11-h3fe0a9e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/gstreamer-1.24.11-h233a61a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/gtest-1.17.0-hc790b64_1.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/libclang13-21.1.3-default_ha2db4b5_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libcurl-8.16.0-h43ecb02_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.0-h5f26cbf_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-devel-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libogg-1.3.5-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-21.1.3-hfa2b4ca_0.conda + - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://prefix.dev/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.4-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.11.14-h30ce641_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://prefix.dev/conda-forge/win-64/qt-main-5.15.15-hb098fff_6.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-action-msgs-1.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-core-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-python-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-ros-0.10.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-test-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-version-1.3.12-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-index-cpp-1.4.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-index-python-1.4.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-package-0.14.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-builtin-interfaces-1.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-cyclonedds-0.10.5-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-domain-coordinator-0.10.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastcdr-1.0.24-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastrtps-2.6.10-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-geometry-msgs-4.9.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-gmock-vendor-1.10.9006-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-gtest-vendor-1.10.9006-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-posh-2.0.5-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-libstatistics-collector-1.3.4-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-libyaml-vendor-1.2.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-python-cmake-module-0.10.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-5.3.9-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-action-5.3.9-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-interfaces-1.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-logging-interface-2.3.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311hc120487_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rclcpp-16.0.13-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rclcpp-action-16.0.13-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcpputils-2.4.5-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcutils-5.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-6.1.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-connextdds-0.11.3-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-dds-common-1.6.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-implementation-2.8.4-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ros-workspace-1.0.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosgraph-msgs-1.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-adapter-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-cli-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-cmake-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-c-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hd5de103_14.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-py-0.14.4-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-parser-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hd5de103_14.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rpyutils-0.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-spdlog-vendor-1.3.1-np126py311hc120487_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-statistics-msgs-1.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-std-msgs-4.9.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-std-srvs-4.9.0-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-tracetools-4.1.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-turtlesim-1.4.2-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hd5de103_13.conda + - conda: https://prefix.dev/robostack-humble/win-64/ros2-distro-mutex-0.7.0-humble_13.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/win-64/spdlog-1.15.3-h430ee68_1.conda + - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tinyxml2-11.0.0-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + - conda: src/navigator + build: h9352c13_0 + - conda: src/navigator_py + build: h9352c13_0 + distro-less: + channels: + - url: https://prefix.dev/robostack-jazzy/ + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cmake-4.1.2-hc85cc9f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-builtins-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-comprehensions-3.17.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/fmt-11.2.0-h07f6e7f_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/foonathan-memory-0.7.3-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gmock-1.17.0-ha770c72_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libacl-2.3.2-h0f662aa_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-37_h4a7cf45_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-37_h0358290_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-37_h47877c9_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/lttng-ust-2.13.9-hf5eda4c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hfe2f287_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-action-msgs-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cpplint-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-flake8-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-index-python-1.8.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-lint-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-package-0.16.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-pep257-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-cyclonedds-0.10.5-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-domain-coordinator-0.12.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastcdr-2.2.5-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastrtps-2.14.5-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-python-cmake-module-0.11.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-9.2.7-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-action-9.2.7-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312he340118_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rclpy-7.1.5-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcpputils-2.11.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcutils-6.7.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-7.3.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-2.15.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ros-workspace-1.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-cli-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-parser-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rpyutils-0.4.2-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-service-msgs-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-spdlog-vendor-1.6.1-np126py312he340118_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-tracetools-8.2.4-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h3bd2861_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-64/ros2-distro-mutex-0.11.0-jazzy_10.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/spdlog-1.15.3-h6dc744f_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/uncrustify-0.81.0-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - conda: src/distro_less_package + subdir: linux-64 + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cmake-4.1.2-hc9d863e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cppcheck-2.18.3-py312h5677ec4_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-builtins-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-comprehensions-3.17.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fmt-11.2.0-h97e1849_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/foonathan-memory-0.7.3-h5ad3122_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gmock-1.17.0-h8af1aa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libacl-2.3.2-h883460d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libblas-3.9.0-37_haddc8a3_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcblas-3.9.0-37_hd72aa62_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.16.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.0-h7cdfd2c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblapack-3.9.0-37_h88aeb00_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liburcu-0.14.0-h0a1ffab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/lttng-ust-2.13.9-h8d236e2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre-8.45-h01db608_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.46-h15761aa_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.12.12-hcfbf8c2_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-action-msgs-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cpplint-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-flake8-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-index-python-1.8.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-lint-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-package-0.16.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-pep257-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-cyclonedds-0.10.5-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-domain-coordinator-0.12.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastcdr-2.2.5-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastrtps-2.14.5-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-python-cmake-module-0.11.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-9.2.7-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-action-9.2.7-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312hbd405f3_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rclpy-7.1.5-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcpputils-2.11.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcutils-6.7.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-7.3.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-2.15.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ros-workspace-1.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-cli-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-parser-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rpyutils-0.4.2-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-service-msgs-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-spdlog-vendor-1.6.1-np126py312hbd405f3_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-tracetools-8.2.4-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h01c0cb9_10.conda + - conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros2-distro-mutex-0.11.0-jazzy_10.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/spdlog-1.15.3-h881af89_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tinyxml2-11.0.0-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/uncrustify-0.81.0-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-cpp-0.8.0-h5ad3122_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda + - conda: src/distro_less_package + subdir: linux-aarch64 + osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cmake-4.1.2-h54ad630_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cppcheck-2.18.3-py312h78464cb_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-builtins-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-comprehensions-3.17.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-11.2.0-h440487c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/foonathan-memory-0.7.3-h286801f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmock-1.17.0-hce30654_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gtest-1.17.0-ha393de7_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-37_h51639a9_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-37_hb0561ab_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.16.0-hdece5d2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.3-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.9.0-37_hd9741b5_openblas.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.3-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre-8.45-hbdafb3b_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-hec0b533_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py312h5748b74_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-action-msgs-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cpplint-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-flake8-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-index-python-1.8.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-lint-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-package-0.16.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-pep257-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-cyclonedds-0.10.5-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-domain-coordinator-0.12.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastcdr-2.2.5-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastrtps-2.14.5-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-python-cmake-module-0.11.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-9.2.7-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-action-9.2.7-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312h55ce18a_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rclpy-7.1.5-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcpputils-2.11.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcutils-6.7.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-7.3.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-implementation-2.15.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ros-workspace-1.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-cli-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-parser-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rpyutils-0.4.2-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-service-msgs-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-spdlog-vendor-1.6.1-np126py312h55ce18a_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-tracetools-8.2.4-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h9e87179_10.conda + - conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros2-distro-mutex-0.11.0-jazzy_10.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/spdlog-1.15.3-h217a1f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tinyxml2-11.0.0-ha1acc90_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/uncrustify-0.81.0-h286801f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - conda: src/distro_less_package + subdir: osx-arm64 + win-64: + - conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cmake-4.1.2-hdcbee5b_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/cppcheck-2.18.3-py312h9df87ca_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-builtins-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-comprehensions-3.17.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/fmt-11.2.0-h1d4551f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/foonathan-memory-0.7.3-he0c23c2_1.conda + - conda: https://prefix.dev/conda-forge/win-64/gmock-1.17.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/gtest-1.17.0-hc790b64_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/libcurl-8.16.0-h43ecb02_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.0-h5f26cbf_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-21.1.3-hfa2b4ca_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://prefix.dev/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.4-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre-8.45-h0e60522_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.12.12-h30ce641_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_0.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-action-msgs-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cpplint-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-flake8-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-index-python-1.8.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-lint-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-package-0.16.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-pep257-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-cyclonedds-0.10.5-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-domain-coordinator-0.12.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastcdr-2.2.5-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastrtps-2.14.5-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-python-cmake-module-0.11.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-9.2.7-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-action-9.2.7-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312ha1e63b2_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rclpy-7.1.5-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcpputils-2.11.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcutils-6.7.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-7.3.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-implementation-2.15.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ros-workspace-1.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-cli-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-parser-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rpyutils-0.4.2-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-service-msgs-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-spdlog-vendor-1.6.1-np126py312ha1e63b2_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-tracetools-8.2.4-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h4d29ed4_10.conda + - conda: https://prefix.dev/robostack-jazzy/win-64/ros2-distro-mutex-0.11.0-jazzy_10.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/spdlog-1.15.3-h430ee68_1.conda + - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tinyxml2-11.0.0-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/uncrustify-0.81.0-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_32.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + - conda: src/distro_less_package + build: h9352c13_0 +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://prefix.dev/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + sha256: b9214bc17e89bf2b691fad50d952b7f029f6148f4ac4fe7c60c08f093efdf745 + md5: 76df83c2a9035c54df5d04ff81bcc02d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + license_family: GPL + size: 566531 + timestamp: 1744668655747 +- conda: https://prefix.dev/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda + sha256: 0aa836f6dd9132f243436898ed8024f408910f65220bafbfc95f71ab829bb395 + md5: a696b24c1b473ecc4774bcb5a6ac6337 + depends: + - libgcc >=13 + license: LGPL-2.1-or-later + license_family: GPL + size: 595290 + timestamp: 1744668754404 +- conda: https://prefix.dev/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + sha256: a2a1879c53b7a8438c898d20fa5f6274e4b1c30161f93b7818236e9df6adffde + md5: 8f37c8fb7116a18da04e52fa9e2c8df9 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + size: 42386 + timestamp: 1760975036972 +- conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 + md5: 791365c5f65975051e4e017b5da3abf5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-2.0-or-later + license_family: GPL + size: 68072 + timestamp: 1756738968573 +- conda: https://prefix.dev/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + sha256: 2c793b48e835a8fac93f1664c706442972a0206963bf8ca202e83f7f4d29a7d7 + md5: 1ef6c06fec1b6f5ee99ffe2152e53568 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 74992 + timestamp: 1660065534958 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 260341 + timestamp: 1757437258798 +- conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01 + md5: 2921ac0b541bf37c69e66bd6d9a43bca + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 192536 + timestamp: 1757437302703 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 125061 + timestamp: 1757437486465 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + size: 55977 + timestamp: 1757437738856 +- conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 206884 + timestamp: 1744127994291 +- conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + sha256: ccae98c665d86723993d4cb0b456bd23804af5b0645052c09a31c9634eebc8df + md5: 5deaa903d46d62a1f8077ad359c3062e + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 215950 + timestamp: 1744127972012 +- conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b + md5: f8cd1beb98240c7edb1a95883360ccfa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 179696 + timestamp: 1744128058734 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + sha256: bfb7f9f242f441fdcd80f1199edd2ecf09acea0f2bcef6f07d7cbb1a8131a345 + md5: e54200a1cd1fe33d61c9df8d3b00b743 + depends: + - __win + license: ISC + size: 156354 + timestamp: 1759649104842 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 + md5: f9e5fbc24009179e8b0409624691758a + depends: + - __unix + license: ISC + size: 155907 + timestamp: 1759649036195 +- conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 + md5: 09262e66b19567aff4f592fb53b28760 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + size: 978114 + timestamp: 1741554591855 +- conda: https://prefix.dev/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda + sha256: 37cfff940d2d02259afdab75eb2dbac42cf830adadee78d3733d160a1de2cc66 + md5: cd55953a67ec727db5dc32b167201aa6 + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + size: 966667 + timestamp: 1741554768968 +- conda: https://prefix.dev/conda-forge/noarch/catkin_pkg-1.1.0-pyhd8ed1ab_0.conda + sha256: fe602164dc1920551e1452543e22338d55d8a879959f12598c9674cf295c6341 + md5: 3e500faf80e42f26d422d849877d48c4 + depends: + - docutils + - packaging + - pyparsing >=1.5.7 + - python >=3.10 + - python-dateutil + - setuptools + license: BSD-3-Clause + license_family: BSD + size: 54106 + timestamp: 1757558592553 +- conda: https://prefix.dev/conda-forge/linux-64/cmake-4.1.2-hc85cc9f_0.conda + sha256: 2176c4bce9f602cee0efbae86283a1a75733921ecc0916c8d2f49df2aee1a0f0 + md5: 3d5d0a07f07ba1fc43f52b5e33e3cd7c + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 21290609 + timestamp: 1759261133874 +- conda: https://prefix.dev/conda-forge/linux-aarch64/cmake-4.1.2-hc9d863e_0.conda + sha256: 7b55dfccde7fa4a16572648302330f073b124312228cabade745ff455ebcfe64 + md5: 92b5d21ff60ab639abdb13e195a99ba7 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 20534912 + timestamp: 1759261475840 +- conda: https://prefix.dev/conda-forge/osx-arm64/cmake-4.1.2-h54ad630_0.conda + sha256: 717322060752f6c0eefe475ea4fb0b52597db5a87a20dcd573121df414f8fbef + md5: 1c3ef82a4e1549022f2f3db6880d7712 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=19 + - libexpat >=2.7.1,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 16935599 + timestamp: 1759263309414 +- conda: https://prefix.dev/conda-forge/win-64/cmake-4.1.2-hdcbee5b_0.conda + sha256: 2f0e2132c65b627c07c6d97eec8664c3849222dda89e871072df346ef4df205b + md5: b01b4bc10b2a81c40d239e2ffe8ad987 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libexpat >=2.7.1,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 14963641 + timestamp: 1759261950341 +- conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://prefix.dev/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda + sha256: f4321bdeddc9178f006a8cc3dedeaf32ab7e4c3be843845fbf594bc07999d2d6 + md5: ab786ccd5cc6a08c0ebd5f6154c9dfcd + depends: + - pygments + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - tinyxml2 >=11.0.0,<11.1.0a0 + - pcre >=8.45,<9.0a0 + - python_abi 3.12.* *_cp312 + license: GPL-3.0-or-later + license_family: GPL + size: 3065679 + timestamp: 1757440259649 +- conda: https://prefix.dev/conda-forge/linux-aarch64/cppcheck-2.18.3-py312h5677ec4_1.conda + sha256: 6540f7d961f6703bab10319cf556db180d00c309575fc64436c7316b3f019682 + md5: 6f4302389e8a90b3ca9b1a3c55a80c4a + depends: + - pygments + - python + - libstdcxx >=14 + - libgcc >=14 + - python 3.12.* *_cpython + - pcre >=8.45,<9.0a0 + - python_abi 3.12.* *_cp312 + - tinyxml2 >=11.0.0,<11.1.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 2923791 + timestamp: 1757440286496 +- conda: https://prefix.dev/conda-forge/osx-arm64/cppcheck-2.18.3-py312h78464cb_1.conda + sha256: d9bddc609d5e1fcd008f4c223993d0808b7303f47b40ff7fbf2f009274e5d1fa + md5: cd337ed914e1b957694970e0166ad94c + depends: + - pygments + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + - pcre >=8.45,<9.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 2585517 + timestamp: 1757440416798 +- conda: https://prefix.dev/conda-forge/win-64/cppcheck-2.18.3-py312h9df87ca_1.conda + sha256: 624de1decfb6ffca2d70daaadb54032eac0c2264b9bfc79d6e457d3662e21672 + md5: 7d3da908b2abf5be1c7e5a3eed56aa0a + depends: + - pygments + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - pcre >=8.45,<9.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 2396902 + timestamp: 1757440273834 +- conda: https://prefix.dev/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f + md5: cae723309a49399d2949362f4ab5c9e4 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libntlm >=1.8,<2.0a0 + - libstdcxx >=13 + - libxcrypt >=4.4.36 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + size: 209774 + timestamp: 1750239039316 +- conda: https://prefix.dev/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6c5dea3_0.conda + sha256: 87b603b76b05e9be749a2616582bfb907e06e7851285bdd78f9ddaaa732d7bc7 + md5: b6d06b46e791add99cc39fbbc34530d5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libntlm + - libstdcxx >=13 + - libxcrypt >=4.4.36 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + size: 227295 + timestamp: 1750239141751 +- conda: https://prefix.dev/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda + sha256: 7de03254fa5421e7ec2347c830a59530fb5356022ee0dc26ec1cef0be1de0911 + md5: 2867ea6551e97e53a81787fd967162b1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libntlm >=1.8,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + size: 193732 + timestamp: 1750239236574 +- conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 437860 + timestamp: 1747855126005 +- conda: https://prefix.dev/conda-forge/linux-aarch64/dbus-1.16.2-heda779d_0.conda + sha256: 5c9166bbbe1ea7d0685a1549aad4ea887b1eb3a07e752389f86b185ef8eac99a + md5: 9203b74bb1f3fa0d6f308094b3b44c1e + depends: + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libglib >=2.84.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 469781 + timestamp: 1747855172617 +- conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + md5: ba6a7a1c262587d333761b0cda2bbd28 + depends: + - python >=3.10 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + size: 437394 + timestamp: 1758409808966 +- conda: https://prefix.dev/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2 + sha256: 75e04755df8d8db7a7711dddaf68963c11258b755c9c24565bfefa493ee383e3 + md5: e4be10fd1a907b223da5be93f06709d2 + depends: + - python + license: LGPL-2.1 + license_family: GPL + size: 40210 + timestamp: 1586444722817 +- conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + size: 21284 + timestamp: 1746947398083 +- conda: https://prefix.dev/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda + sha256: a32e511ea71a9667666935fd9f497f00bcc6ed0099ef04b9416ac24606854d58 + md5: 04a55140685296b25b79ad942264c0ef + depends: + - mccabe >=0.7.0,<0.8.0 + - pycodestyle >=2.14.0,<2.15.0 + - pyflakes >=3.4.0,<3.5.0 + - python >=3.9 + license: MIT + license_family: MIT + size: 111916 + timestamp: 1750968083921 +- conda: https://prefix.dev/conda-forge/noarch/flake8-builtins-3.0.0-pyhd8ed1ab_0.conda + sha256: b8522466bee2e362aa046712b12a06e79381b996e91888e05abadde4e24aef99 + md5: c1112609cc3e996cde98219180a789f4 + depends: + - flake8 + - python >=3.9 + license: GPL-2.0-only + license_family: GPL2 + size: 18158 + timestamp: 1755540142244 +- conda: https://prefix.dev/conda-forge/noarch/flake8-comprehensions-3.17.0-pyhd8ed1ab_0.conda + sha256: a0427b75e67d6f2f41f7645b850ac028876bee3a11d8fbaa18d88fd61b467a94 + md5: 9f5bd5fb0aa24273e9cce97830629e20 + depends: + - flake8 >=3.0,!=3.2.0 + - python >=3.10 + license: MIT + license_family: MIT + size: 14049 + timestamp: 1757526877129 +- conda: https://prefix.dev/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda + sha256: e0757805056f7ad3c7172ca4eaf79c9db4a7d23b858aa8fdcdfbd25f8ad7254d + md5: d66b253112adf72dc5edeabe41b88dce + depends: + - flake8 >=3 + - pydocstyle >=2.1 + - python >=3.7 + license: MIT + license_family: MIT + size: 10395 + timestamp: 1675285794906 +- conda: https://prefix.dev/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda + sha256: 046902c4b7b07877e68c5dd638f92ece9416fe1b10153dd7d617b91c4f18946c + md5: f4b095568df0c12ab60f8519cb203317 + depends: + - flake8 + - pycodestyle + - python >=3.9 + - setuptools + license: LGPL-3.0-only + license_family: LGPL + size: 21041 + timestamp: 1750969641622 +- conda: https://prefix.dev/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda + sha256: 72129d47a933843df04e98f9afb27b3c2345d89f6c4b6637ea9cd1846960ad67 + md5: adde488e6dff56bffd2e5f428ae8cded + depends: + - flake8 + - python >=3.9 + license: MIT + license_family: MIT + size: 14776 + timestamp: 1735335323771 +- conda: https://prefix.dev/conda-forge/linux-64/fmt-11.2.0-h07f6e7f_0.conda + sha256: e0f53b7801d0bcb5d61a1ddcb873479bfe8365e56fd3722a232fbcc372a9ac52 + md5: 0c2f855a88fab6afa92a7aa41217dc8e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 192721 + timestamp: 1751277120358 +- conda: https://prefix.dev/conda-forge/linux-aarch64/fmt-11.2.0-h97e1849_0.conda + sha256: c5b9a5caeb37216aa97aa1ef6f742a5ad17264838ca3b485db5a37e16c6f1373 + md5: 3fc63892ea4acd46f652f8cf489007f9 + depends: + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 189924 + timestamp: 1751277118345 +- conda: https://prefix.dev/conda-forge/osx-arm64/fmt-11.2.0-h440487c_0.conda + sha256: 1449ec46468860f6fb77edba87797ce22d4f6bfe8d5587c46fd5374c4f7383ee + md5: 24109723ac700cce5ff96ea3e63a83a3 + depends: + - __osx >=11.0 + - libcxx >=18 + license: MIT + license_family: MIT + size: 177090 + timestamp: 1751277262419 +- conda: https://prefix.dev/conda-forge/win-64/fmt-11.2.0-h1d4551f_0.conda + sha256: 890f2789e55b509ff1f14592a5b20a0d0ec19f6da463eff96e378a5d70f882da + md5: 15b63c3fb5b7d67b1cb63553a33e6090 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 185995 + timestamp: 1751277236879 +- conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + size: 397370 + timestamp: 1566932522327 +- conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + size: 96530 + timestamp: 1620479909603 +- conda: https://prefix.dev/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + size: 700814 + timestamp: 1620479612257 +- conda: https://prefix.dev/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + size: 1620504 + timestamp: 1727511233259 +- conda: https://prefix.dev/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 265599 + timestamp: 1730283881107 +- conda: https://prefix.dev/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda + sha256: fe023bb8917c8a3138af86ef537b70c8c5d60c44f93946a87d1e8bb1a6634b55 + md5: 112b71b6af28b47c624bcbeefeea685b + depends: + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 277832 + timestamp: 1730284967179 +- conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + size: 3667 + timestamp: 1566974674465 +- conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + size: 4102 + timestamp: 1566932280397 +- conda: https://prefix.dev/conda-forge/linux-64/foonathan-memory-0.7.3-h5888daf_1.conda + sha256: 28d9fce64ee8b5e94350feb0829e054811678f9638039f78ddff8a8615c1b693 + md5: 2a3316f47d7827afde5381ecd43b5e85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Zlib + size: 227132 + timestamp: 1746246721660 +- conda: https://prefix.dev/conda-forge/linux-aarch64/foonathan-memory-0.7.3-h5ad3122_1.conda + sha256: eb4ba5713109333869069346f8a68ee5472d33fbfef19765608ac56e56ad11be + md5: f56a1c764fb72416280f786c80122dbd + depends: + - libgcc >=13 + - libstdcxx >=13 + license: Zlib + size: 225684 + timestamp: 1746248561179 +- conda: https://prefix.dev/conda-forge/osx-arm64/foonathan-memory-0.7.3-h286801f_1.conda + sha256: 5ca6622f451ffcbad4c248e5aa897364ee144f727317de53205f79598ae31e30 + md5: 5edb851ff08d42a33875ad9aa54a6b40 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Zlib + size: 196029 + timestamp: 1746246781766 +- conda: https://prefix.dev/conda-forge/win-64/foonathan-memory-0.7.3-he0c23c2_1.conda + sha256: 38ebb703238d97b79b5d3c609e0ac2ded8f2afe25dbf968e443c3441de11148a + md5: f5fbab94ec67dde1fbb7c7cc04d6d134 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Zlib + size: 250652 + timestamp: 1746247124703 +- conda: https://prefix.dev/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e + md5: 4afc585cd97ba8a23809406cd8a9eda8 + depends: + - libfreetype 2.14.1 ha770c72_0 + - libfreetype6 2.14.1 h73754d4_0 + license: GPL-2.0-only OR FTL + size: 173114 + timestamp: 1757945422243 +- conda: https://prefix.dev/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda + sha256: 9f8de35e95ce301cecfe01bc9d539c7cc045146ffba55efe9733ff77ad1cfb21 + md5: 0c8f36ebd3678eed1685f0fc93fc2175 + depends: + - libfreetype 2.14.1 h8af1aa0_0 + - libfreetype6 2.14.1 hdae7a39_0 + license: GPL-2.0-only OR FTL + size: 173174 + timestamp: 1757945489158 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + sha256: cbfa8c80771d1842c2687f6016c5e200b52d4ca8f2cc119f6377f64f899ba4ff + md5: c42356557d7f2e37676e121515417e3b + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.25.1 h3f43e3d_1 + - libasprintf 0.25.1 h3f43e3d_1 + - libasprintf-devel 0.25.1 h3f43e3d_1 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libgettextpo-devel 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + - libstdcxx >=14 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 541357 + timestamp: 1753343006214 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gettext-0.25.1-h5ad3122_0.conda + sha256: 510e7eba15e6ba71cd5a2ae403128d56b3bb990878c8110f3abc652f823b4af8 + md5: 1e99d353785a5302bce1a5a86d249b2b + depends: + - gettext-tools 0.25.1 h5ad3122_0 + - libasprintf 0.25.1 h5e0f5ae_0 + - libasprintf-devel 0.25.1 h5e0f5ae_0 + - libgcc >=13 + - libgettextpo 0.25.1 h5ad3122_0 + - libgettextpo-devel 0.25.1 h5ad3122_0 + - libstdcxx >=13 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 534760 + timestamp: 1751557634743 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + sha256: c792729288bdd94f21f25f80802d4c66957b4e00a57f7cb20513f07aadfaff06 + md5: a59c05d22bdcbb4e984bf0c021a2a02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 3644103 + timestamp: 1753342966311 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gettext-tools-0.25.1-h5ad3122_0.conda + sha256: 7b03cc531c9c2d567eb81dffe9f5688c83fbcdfa4882eec3a2045ec43218806f + md5: 4215d91c0eaae5274a36a3f211898c91 + depends: + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + size: 3999301 + timestamp: 1751557600737 +- conda: https://prefix.dev/conda-forge/linux-64/glib-2.86.0-he175458_0.conda + sha256: 3846e03ce529d9d8655651ad765b92cbb7baef4f2345e4df28b2af6133343a58 + md5: 1891353ef1a104cff6d51de55a60c9c0 + depends: + - glib-tools 2.86.0 hf516916_0 + - libffi >=3.4.6,<3.5.0a0 + - libglib 2.86.0 h1fed272_0 + - packaging + - python * + license: LGPL-2.1-or-later + size: 611178 + timestamp: 1757403380893 +- conda: https://prefix.dev/conda-forge/linux-aarch64/glib-2.86.0-h9414720_0.conda + sha256: 06b49163e0cb9446c7c40299db824e50f4ca0c562ef0cd8a8871713cb60a33cc + md5: 18a0f501a62ffa12b5dd3d4028cb48dd + depends: + - glib-tools 2.86.0 hc87f4d4_0 + - libffi >=3.4.6,<3.5.0a0 + - libglib 2.86.0 h7cdfd2c_0 + - packaging + - python * + license: LGPL-2.1-or-later + size: 623316 + timestamp: 1757403337755 +- conda: https://prefix.dev/conda-forge/osx-arm64/glib-2.86.0-h52a91e1_0.conda + sha256: 1ada580e01bb4856b9253ff5015d44f37d1ae409b49c80e417f93c1a55811f5b + md5: 17e72f45cbcd8b35b73b8897019ad09f + depends: + - glib-tools 2.86.0 hb9d6e3a_0 + - libffi >=3.4.6,<3.5.0a0 + - libglib 2.86.0 h1bb475b_0 + - libintl >=0.25.1,<1.0a0 + - libintl-devel + - packaging + - python * + license: LGPL-2.1-or-later + size: 593230 + timestamp: 1757404693476 +- conda: https://prefix.dev/conda-forge/win-64/glib-2.86.0-ha3795fc_0.conda + sha256: 1bcdda751e155953ac41ec5c9360e71ce77f6a0c8e17fc207b67596a523cb535 + md5: cb21534c2d2cc2edc10dade1f32d9f81 + depends: + - glib-tools 2.86.0 he647baa_0 + - libffi >=3.4.6,<3.5.0a0 + - libglib 2.86.0 h5f26cbf_0 + - libintl >=0.22.5,<1.0a0 + - libintl-devel + - packaging + - python * + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-or-later + size: 579367 + timestamp: 1757403914175 +- conda: https://prefix.dev/conda-forge/linux-64/glib-tools-2.86.0-hf516916_0.conda + sha256: b77316bd5c8680bde4e5a7ab7013c8f0f10c1702cc6c3b0fd0fac3923a31fec3 + md5: 1a8e49615381c381659de1bc6a3bf9ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libglib 2.86.0 h1fed272_0 + license: LGPL-2.1-or-later + size: 117284 + timestamp: 1757403341964 +- conda: https://prefix.dev/conda-forge/linux-aarch64/glib-tools-2.86.0-hc87f4d4_0.conda + sha256: e5970e3dccdb0ae95b8dfff3f6b6c5f542b45eb51959658db37ef5cb8ed6c8c2 + md5: 2e792d667df13158c9a35c366c46057c + depends: + - libgcc >=14 + - libglib 2.86.0 h7cdfd2c_0 + license: LGPL-2.1-or-later + size: 127330 + timestamp: 1757403314321 +- conda: https://prefix.dev/conda-forge/osx-arm64/glib-tools-2.86.0-hb9d6e3a_0.conda + sha256: 8d47509530193c3f29272fc7eb45ae0517537ae5a0d0628d9c7ecc0adc79ee05 + md5: 4b9d5cb3c1b584392b97be75d0a7d709 + depends: + - __osx >=11.0 + - libglib 2.86.0 h1bb475b_0 + - libintl >=0.25.1,<1.0a0 + license: LGPL-2.1-or-later + size: 102231 + timestamp: 1757404604900 +- conda: https://prefix.dev/conda-forge/win-64/glib-tools-2.86.0-he647baa_0.conda + sha256: 564898a0d9c3670ce0a698f19072e1c8f248a6a17edba7f7366ebac1f85d9304 + md5: 58a39cd69f220f2dab4ed15276621d8d + depends: + - libglib 2.86.0 h5f26cbf_0 + - libintl >=0.22.5,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-or-later + size: 98188 + timestamp: 1757403854799 +- conda: https://prefix.dev/conda-forge/linux-64/gmock-1.17.0-ha770c72_1.conda + sha256: 80ca13dc518962fcd86856586cb5fb612fe69914234eab322f9dee25f628090f + md5: 33e7a8280999b958df24a95f0cb86b1a + depends: + - gtest 1.17.0 h84d6215_1 + license: BSD-3-Clause + license_family: BSD + size: 7578 + timestamp: 1748320126956 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gmock-1.17.0-h8af1aa0_1.conda + sha256: 514dc47c5e0808b3478be5a23be9437b88856b5ce76cf864c81a51e212fe2d33 + md5: a5c91c7d57692b282c9fccef97394057 + depends: + - gtest 1.17.0 h17cf362_1 + license: BSD-3-Clause + license_family: BSD + size: 7659 + timestamp: 1748320119582 +- conda: https://prefix.dev/conda-forge/osx-arm64/gmock-1.17.0-hce30654_1.conda + sha256: 8ffcdb59c4087268163eac6ba76eaaec8f953c569eb0b2de96d2094391104db7 + md5: 032a8260ea052e9ed5b3cffbb6ec0831 + depends: + - gtest 1.17.0 ha393de7_1 + license: BSD-3-Clause + license_family: BSD + size: 7681 + timestamp: 1748320227048 +- conda: https://prefix.dev/conda-forge/win-64/gmock-1.17.0-h57928b3_1.conda + sha256: 833b2320a8f9e2742114342070634e002ca2b094d8cadcfe03a6e8339938df26 + md5: 6c8e74d3fd2b75971e931b3b8e37b4cb + depends: + - gtest 1.17.0 hc790b64_1 + license: BSD-3-Clause + license_family: BSD + size: 8054 + timestamp: 1748320557126 +- conda: https://prefix.dev/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c + md5: 2cd94587f3a401ae05e03a6caf09539d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + size: 99596 + timestamp: 1755102025473 +- conda: https://prefix.dev/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda + sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 + md5: 4aa540e9541cc9d6581ab23ff2043f13 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + size: 102400 + timestamp: 1755102000043 +- conda: https://prefix.dev/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda + sha256: a497d2ba34fdfa4bead423cba5261b7e619df3ac491fb0b6231d91da45bd05fc + md5: d8d8894f8ced2c9be76dc9ad1ae531ce + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - gstreamer 1.24.11 hc37bda9_0 + - libdrm >=2.4.124,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.84.1,<3.0a0 + - libogg >=1.3.5,<1.4.0a0 + - libopus >=1.5.2,<2.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libvorbis >=1.3.7,<1.4.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxau >=1.0.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + - xorg-libxshmfence >=1.3.3,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2859572 + timestamp: 1745093626455 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gst-plugins-base-1.24.11-h83ffb7f_0.conda + sha256: a13e1059f23497243100b5786e5a7ffac2182885dd56bd7813f518faff959b26 + md5: 2328f6ad67fc8d33402091e3d770ca73 + depends: + - alsa-lib >=1.2.14,<1.3.0a0 + - gstreamer 1.24.11 h17c303d_0 + - libdrm >=2.4.124,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.84.1,<3.0a0 + - libogg >=1.3.5,<1.4.0a0 + - libopus >=1.5.2,<2.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libvorbis >=1.3.7,<1.4.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxau >=1.0.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + - xorg-libxshmfence >=1.3.3,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2806661 + timestamp: 1745097877029 +- conda: https://prefix.dev/conda-forge/osx-arm64/gst-plugins-base-1.24.11-h3c5c1d0_0.conda + sha256: dcf14207de4d203189d2b470a011bde9d1d213f5024113ecd417ceaa71997f49 + md5: b3b603ab8143ee78e2b327397e91c928 + depends: + - __osx >=11.0 + - gstreamer 1.24.11 hfe24232_0 + - libcxx >=18 + - libglib >=2.84.0,<3.0a0 + - libintl >=0.23.1,<1.0a0 + - libogg >=1.3.5,<1.4.0a0 + - libopus >=1.5.2,<2.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 1998255 + timestamp: 1745094132475 +- conda: https://prefix.dev/conda-forge/win-64/gst-plugins-base-1.24.11-h3fe0a9e_0.conda + sha256: 74112d7bb1dc0a652326cff5223927f344df40f1610dbad77af58126c02ee989 + md5: da29d9c5bce532d29b35867f037f0722 + depends: + - gstreamer 1.24.11 h233a61a_0 + - libglib >=2.84.1,<3.0a0 + - libintl >=0.22.5,<1.0a0 + - libogg >=1.3.5,<1.4.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 4222881 + timestamp: 1745093856231 +- conda: https://prefix.dev/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda + sha256: 6e93b99d77ac7f7b3eb29c1911a0a463072a40748b96dbe37c18b2c0a90b34de + md5: 056d86cacf2b48c79c6a562a2486eb8c + depends: + - __glibc >=2.17,<3.0.a0 + - glib >=2.84.1,<3.0a0 + - libgcc >=13 + - libglib >=2.84.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2021832 + timestamp: 1745093493354 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gstreamer-1.24.11-h17c303d_0.conda + sha256: 49a399a7c6e2f3d4ad6338fed8d5f3548baa6edeeaec716cca3505f84f3473fb + md5: 8cc29506178d015d91d8b28725f0bd0c + depends: + - glib >=2.84.1,<3.0a0 + - libgcc >=13 + - libglib >=2.84.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2032739 + timestamp: 1745095972722 +- conda: https://prefix.dev/conda-forge/osx-arm64/gstreamer-1.24.11-hfe24232_0.conda + sha256: 1a67175216abf57fd3b3b4b10308551bb2bde1227b0a3a79b4c526c9c911db4c + md5: 75376f1f20ba28dfa1f737e5bb19cbad + depends: + - __osx >=11.0 + - glib >=2.84.0,<3.0a0 + - libcxx >=18 + - libglib >=2.84.0,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.23.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 1357920 + timestamp: 1745093829693 +- conda: https://prefix.dev/conda-forge/win-64/gstreamer-1.24.11-h233a61a_0.conda + sha256: 727b10b5bdebf52cf9899211d1f74cb09d6bec3afb7e2b313b14ac9465e64d39 + md5: 879e92327aea553145c760e5939f1493 + depends: + - glib >=2.84.1,<3.0a0 + - libglib >=2.84.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 3099976 + timestamp: 1745093701747 +- conda: https://prefix.dev/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda + sha256: 1f738280f245863c5ac78bcc04bb57266357acda45661c4aa25823030c6fb5db + md5: 55e29b72a71339bc651f9975492db71f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - gmock 1.17.0 + license: BSD-3-Clause + license_family: BSD + size: 416610 + timestamp: 1748320117187 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda + sha256: 9f48b9cd4393fb033882cd456fb3310d42fc853885c6c263db66c06769903061 + md5: a058f4fa55dea20cdc8a7664c8537b6a + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - gmock 1.17.0 + license: BSD-3-Clause + license_family: BSD + size: 409213 + timestamp: 1748320114722 +- conda: https://prefix.dev/conda-forge/osx-arm64/gtest-1.17.0-ha393de7_1.conda + sha256: 441fb779db5f14eff8997ddde88c90c30ab64ea8bd4c219b76724e4d3d736c76 + md5: f277a9eb8063fe7c4e33d91b8296fb0c + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - gmock 1.17.0 + license: BSD-3-Clause + license_family: BSD + size: 378391 + timestamp: 1748320218212 +- conda: https://prefix.dev/conda-forge/win-64/gtest-1.17.0-hc790b64_1.conda + sha256: 6738f3af9fe0cff9b8bd54eab34544e0334f2932c4314e1cb1b322ba7a5f26b7 + md5: 0314c047c9d7ffc19cfd13457d82e254 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - gmock 1.17.0 + license: BSD-3-Clause + license_family: BSD + size: 497237 + timestamp: 1748320535941 +- conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.1.0-h15599e2_0.conda + sha256: df2a964f5b7dd652b59da018f1d2d9ae402b815c4e5d849384344df358d2a565 + md5: 7704b1edaa8316b8792424f254c1f586 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 2058414 + timestamp: 1759365674184 +- conda: https://prefix.dev/conda-forge/linux-aarch64/harfbuzz-12.1.0-he4899c9_0.conda + sha256: d74fcf825808c28fb9b11bf4cea7bb1ad9ac98e5fc105b1c7030d242eb18d251 + md5: 299479902c52a79fab9be65fe0225dee + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 2452805 + timestamp: 1759370489731 +- conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12282786 + timestamp: 1720853454991 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + sha256: 1d04369a1860a1e9e371b9fc82dd0092b616adcf057d6c88371856669280e920 + md5: 8579b6bb8d18be7c0b27fb08adeeeb40 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 14544252 + timestamp: 1720853966338 +- conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + depends: + - python >=3.9 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + size: 34641 + timestamp: 1747934053147 +- conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 33781 + timestamp: 1736252433366 +- conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + size: 13387 + timestamp: 1760831448842 +- conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 134088 + timestamp: 1754905959823 +- conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 + md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 + depends: + - libgcc >=13 + license: LGPL-2.1-or-later + size: 129048 + timestamp: 1754906002667 +- conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://prefix.dev/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 + md5: 31aec030344e962fbd7dbbbbd68e60a9 + depends: + - openssl >=3.3.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 712034 + timestamp: 1719463874284 +- conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://prefix.dev/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 + sha256: 2502904a42df6d94bd743f7b73915415391dd6d31d5f50cb57c0a54a108e7b0a + md5: ab05bcf82d8509b4243f07e93bada144 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 604863 + timestamp: 1664997611416 +- conda: https://prefix.dev/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda + sha256: 7f1ad9630a87005a90099ad3ff883ac7a3fe5e85b9eb232d1f8ad0a670059cca + md5: 222dd97cb2d5da1638de5077da60712f + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 86134 + timestamp: 1725742423890 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda + sha256: 707dfb8d55d7a5c6f95c772d778ef07a7ca85417d9971796f7d3daad0b615de8 + md5: 14bae321b8127b63cba276bd53fac237 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 747158 + timestamp: 1758810907507 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-h9df1782_2.conda + sha256: 6edaaad2b275ac7a230b73488723ffe0a3d49345682fd032b5c6f872411a3343 + md5: c82b1aeb48ef8d5432cbc592716464ba + constrains: + - binutils_impl_linux-aarch64 2.44 + license: GPL-3.0-only + license_family: GPL + size: 787844 + timestamp: 1758810889587 +- conda: https://prefix.dev/conda-forge/linux-64/libacl-2.3.2-h0f662aa_0.conda + sha256: 1b704cf161c6f84658a7ac534555ef365ec982f23576b1c4ae4cac4baeb61685 + md5: ef8039969013acacf5b741092aef2ee7 + depends: + - attr >=2.5.1,<2.6.0a0 + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 110600 + timestamp: 1706132570609 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libacl-2.3.2-h883460d_0.conda + sha256: 6d24a61f466f50dcab30f16663f5064cb1e0837a64103c21b0e14f265c29e31a + md5: b1d08a80bfea3391c32fb429d3dc02f3 + depends: + - attr >=2.5.1,<2.6.0a0 + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 115093 + timestamp: 1706132568525 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + sha256: cb728a2a95557bb6a5184be2b8be83a6f2083000d0c7eff4ad5bbe5792133541 + md5: 3b0d184bc9404516d418d4509e418bdc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.1-or-later + size: 53582 + timestamp: 1753342901341 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda + sha256: 146be90c237cf3d8399e44afe5f5d21ef9a15a7983ccea90e72d4ae0362f9b28 + md5: 1c5813f6be57f087b6659593248daf00 + depends: + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-or-later + size: 53434 + timestamp: 1751557548397 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + sha256: 2fc95060efc3d76547b7872875af0b7212d4b1407165be11c5f830aeeb57fc3a + md5: fd9cf4a11d07f0ef3e44fc061611b1ed + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.25.1 h3f43e3d_1 + - libgcc >=14 + license: LGPL-2.1-or-later + size: 34734 + timestamp: 1753342921605 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libasprintf-devel-0.25.1-h5e0f5ae_0.conda + sha256: cc2bb8ca349ba4dd4af7971a3dba006bc8643353acd9757b4d645a817ec0f899 + md5: 5df92d925fba917586f3ca31c96d8e6d + depends: + - libasprintf 0.25.1 h5e0f5ae_0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 34824 + timestamp: 1751557562978 +- conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-37_h4a7cf45_openblas.conda + build_number: 37 + sha256: b8872684dc3a68273de2afda2a4a1c79ffa3aab45fcfc4f9b3621bd1cc1adbcc + md5: 8bc098f29d8a7e3517bac5b25aab39b1 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - blas 2.137 openblas + - liblapacke 3.9.0 37*_openblas + - liblapack 3.9.0 37*_openblas + - mkl <2025 + - libcblas 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17477 + timestamp: 1760212730445 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libblas-3.9.0-37_haddc8a3_openblas.conda + build_number: 37 + sha256: c53e454aee352782eb998e49e946f31007e3f5c50f86195b759a48790d533a33 + md5: e35f9af379bf1079f68a2c9932884e6c + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.9.0 37*_openblas + - liblapacke 3.9.0 37*_openblas + - libcblas 3.9.0 37*_openblas + - blas 2.137 openblas + - mkl <2025 + license: BSD-3-Clause + license_family: BSD + size: 17533 + timestamp: 1760212907958 +- conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-37_h51639a9_openblas.conda + build_number: 37 + sha256: 544f935351201a4bea7e1dae0b240ce619febf56655724c64481ec694293bc64 + md5: 675aec03581d97a77f7bb47e99fed4b4 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapacke 3.9.0 37*_openblas + - blas 2.137 openblas + - mkl <2025 + - liblapack 3.9.0 37*_openblas + - libcblas 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17647 + timestamp: 1760213578751 +- conda: https://prefix.dev/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + build_number: 35 + sha256: 4180e7ab27ed03ddf01d7e599002fcba1b32dcb68214ee25da823bac371ed362 + md5: 45d98af023f8b4a7640b1f713ce6b602 + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 66044 + timestamp: 1757003486248 +- conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + sha256: a946b61be1af15ff08c7722e9bac0fab446d8b9896c9f0f35657dfcf887fda8a + md5: 0f7f0c878c8dceb3b9ec67f5c06d6057 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 121852 + timestamp: 1744577167992 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libcap-2.76-h5706e9e_0.conda + sha256: 909a467436e714f1fb4daca150654dc71f6e06b371f467088d98608850f4822e + md5: dc0fbf47fc1f3217e87e77c0b0d28a77 + depends: + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 109349 + timestamp: 1744578610610 +- conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-37_h0358290_openblas.conda + build_number: 37 + sha256: 8e5a6014424cc11389ebf3febedad937aa4a00e48464831ae4dec69f3c46c4ab + md5: 3794858d4d6910a7fc3c181519e0b77a + depends: + - libblas 3.9.0 37_h4a7cf45_openblas + constrains: + - blas 2.137 openblas + - liblapacke 3.9.0 37*_openblas + - liblapack 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17474 + timestamp: 1760212737633 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libcblas-3.9.0-37_hd72aa62_openblas.conda + build_number: 37 + sha256: 9533dbc9db0f02031c4f1f05dfb3eb70a2dae3c5fea2c32a3f181705d283e0c7 + md5: dbe7f1b380cb12fd3463f4593da682dc + depends: + - libblas 3.9.0 37_haddc8a3_openblas + constrains: + - liblapack 3.9.0 37*_openblas + - blas 2.137 openblas + - liblapacke 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17493 + timestamp: 1760212915318 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-37_hb0561ab_openblas.conda + build_number: 37 + sha256: 911a01cac0c76d52628fdfe2aecfa010b4145af630ec23fe3fefa7a4c8050a57 + md5: 33ab91e02a34879065d03bb010eb6bf1 + depends: + - libblas 3.9.0 37_h51639a9_openblas + constrains: + - liblapacke 3.9.0 37*_openblas + - blas 2.137 openblas + - liblapack 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17639 + timestamp: 1760213591611 +- conda: https://prefix.dev/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + build_number: 35 + sha256: 88939f6c1b5da75bd26ce663aa437e1224b26ee0dab5e60cecc77600975f397e + md5: 9639091d266e92438582d0cc4cfc8350 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 66398 + timestamp: 1757003514529 +- conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_15.conda + sha256: 88646de816c02d4b4ae4c357e6714e2b600e4893b882b2ccc74f4798db590af5 + md5: 782b06c663896f1c3060134fb55ea150 + depends: + - __osx >=11.0 + - libcxx >=18.1.8 + - libllvm18 >=18.1.8,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 13334764 + timestamp: 1757423065039 +- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.3-default_h99862b1_0.conda + sha256: a882d8aed8625a3cdf9d4062a437f17aa5628cc3b3d8984a5b2ba79abe4a9404 + md5: 351153facc71be73b27482c6ec2204b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm21 >=21.1.3,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 21041961 + timestamp: 1760315552873 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.3-default_he95a3c9_0.conda + sha256: 7a6056654ad1cbcaa4084fa58d273bfe3a1b670c68752db6846d5d1c1c347a5f + md5: 7c1bcba61145cf51bc31ffcbe99b2981 + depends: + - libgcc >=14 + - libllvm21 >=21.1.3,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 20647010 + timestamp: 1760316841699 +- conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.3-default_h746c552_0.conda + sha256: 45a8dbd9a7a4eed4da300e692a6f87d39aecd105eec15977cf6cc78091b48be7 + md5: 8e9dbb05e5f7105e265d5775d44e6160 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm21 >=21.1.3,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 12341791 + timestamp: 1760315971541 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libclang13-21.1.3-default_h94a09a5_0.conda + sha256: bb67ea9925c5dc165727e199206bdb8e22aee8330eb30fa0ba1c427bc2d2d999 + md5: 8e5be92a0c8fa084592869652a1409f8 + depends: + - libgcc >=14 + - libllvm21 >=21.1.3,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 12119193 + timestamp: 1760317258293 +- conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.3-default_h6e8f826_0.conda + sha256: cb7a1bf0d6d75355dd467530a458572a9dc0d2a3d2a5df006a50f1c2e748e232 + md5: e5a21174a49e7c14172e4ce2158a36ee + depends: + - __osx >=11.0 + - libcxx >=21.1.3 + - libllvm21 >=21.1.3,<21.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 8513604 + timestamp: 1760315178467 +- conda: https://prefix.dev/conda-forge/win-64/libclang13-21.1.3-default_ha2db4b5_0.conda + sha256: c064459f902a352d58e1fcd1d2c875ddb0b5d3cefb0f1667ab477b79c9e7c1bd + md5: 1396d41a9c6faeed8c45697e4c256c4e + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 29000153 + timestamp: 1760322300109 +- conda: https://prefix.dev/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 + md5: d4a250da4737ee127fb1fa6452a9002e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + size: 4523621 + timestamp: 1749905341688 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libcups-2.3.3-h5cdc715_5.conda + sha256: f3282d27be35e5d29b5b798e5136427ec798916ee6374499be7b7682c8582b72 + md5: ac0333d338076ef19170938bbaf97582 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + size: 4550533 + timestamp: 1749906839681 +- conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + md5: a401aa9329350320c7d3809a7a5a1640 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 459851 + timestamp: 1760977209182 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.16.0-h7bfdcfb_0.conda + sha256: c7cd6a332e0d977426bb6ff459679c77b3083ec87c0563606bf9948c698e3ed4 + md5: 9fd6981bce6a080b6be4e131619ec936 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 479220 + timestamp: 1760977235361 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.16.0-hdece5d2_0.conda + sha256: f20ce8db8c62f1cdf4d7a9f92cabcc730b1212a7165f4b085e45941cc747edac + md5: 0537c38a90d179dcb3e46727ccc5bcc1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 394279 + timestamp: 1760977967042 +- conda: https://prefix.dev/conda-forge/win-64/libcurl-8.16.0-h43ecb02_0.conda + sha256: 863284424dc6f64ee4a619cfb2490b85c7d51729fbf029603b30e2682532a9a6 + md5: e9d8964076d40f974bd85d5588394b3f + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + size: 373553 + timestamp: 1760977441687 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.3-hf598326_0.conda + sha256: b9bad452e3e1d0cc597d907681461341209cb7576178d5c1933026a650b381d1 + md5: e976227574dfcd0048324576adf8d60d + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568715 + timestamp: 1760166479630 +- conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + size: 310785 + timestamp: 1757212153962 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda + sha256: 4e6cdb5dd37db794b88bec714b4418a0435b04d14e9f7afc8cc32f2a3ced12f2 + md5: 2079727b538f6dd16f3fa579d4c3c53f + depends: + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + size: 344548 + timestamp: 1757212128414 +- conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda + sha256: 8962abf38a58c235611ce356b9899f6caeb0352a8bce631b0bcc59352fda455e + md5: cf105bce884e4ef8c8ccdca9fe6695e7 + depends: + - libglvnd 1.7.0 hd24410f_2 + license: LicenseRef-libglvnd + size: 53551 + timestamp: 1731330990477 +- conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 115123 + timestamp: 1702146237623 +- conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://prefix.dev/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 438992 + timestamp: 1685726046519 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda + sha256: 378cabff44ea83ce4d9f9c59f47faa8d822561d39166608b3e65d1e06c927415 + md5: f75d19f3755461db2eb69401f5514f4c + depends: + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74309 + timestamp: 1752719762749 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 141322 + timestamp: 1752719767870 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda + sha256: 608b8c8b0315423e524b48733d91edd43f95cb3354a765322ac306a858c2cd2e + md5: 15a131f30cae36e9a655ca81fee9a285 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 55847 + timestamp: 1743434586764 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 44978 + timestamp: 1743435053850 +- conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda + sha256: b54935360349d3418b0663d787f20b3cba0b7ce3fcdf3ba5e7ef02b884759049 + md5: 520b12eab32a92e19b1f239ac545ec03 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 371550 + timestamp: 1687765491794 +- conda: https://prefix.dev/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec + md5: f4084e4e6577797150f9b04a4560ceb0 + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + size: 7664 + timestamp: 1757945417134 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda + sha256: 342c07e4be3d09d04b531c889182a11a488e7e9ba4b75f642040e4681c1e9b98 + md5: 1e61fb236ccd3d6ccaf9e91cb2d7e12d + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + size: 7753 + timestamp: 1757945484817 +- conda: https://prefix.dev/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + sha256: 4a7af818a3179fafb6c91111752954e29d3a2a950259c14a2fc7ba40a8b03652 + md5: 8e7251989bca326a28f4a5ffbd74557a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + size: 386739 + timestamp: 1757945416744 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda + sha256: cedc83d9733363aca353872c3bfed2e188aa7caf57b57842ba0c6d2765652b7c + md5: 9c2f56b6e011c6d8010ff43b796aab2f + depends: + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + size: 423210 + timestamp: 1757945484108 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + md5: c0374badb3a5d4b1372db28d19462c53 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 h767d61c_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 822552 + timestamp: 1759968052178 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda + sha256: 616f5960930ad45b48c57f49c3adddefd9423674b331887ef0e69437798c214b + md5: afa05d91f8d57dd30985827a09c21464 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 he277a41_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 510719 + timestamp: 1759967448307 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad + md5: 280ea6eee9e2ddefde25ff799c4f0363 + depends: + - libgcc 15.2.0 h767d61c_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29313 + timestamp: 1759968065504 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda + sha256: 7d98979b2b5698330007b0146b8b4b95b3790378de12129ce13c9fc88c1ef45a + md5: a5ce1f0a32f02c75c11580c5b2f9258a + depends: + - libgcc 15.2.0 he277a41_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29261 + timestamp: 1759967452303 +- conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + sha256: dc9c7d7a6c0e6639deee6fde2efdc7e119e7739a6b229fa5f9049a449bae6109 + md5: 8504a291085c9fb809b66cabd5834307 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.55,<2.0a0 + license: LGPL-2.1-or-later + size: 590353 + timestamp: 1747060639058 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcrypt-lib-1.11.1-h86ecc28_0.conda + sha256: 5c572886ae3bf8f55fbc8f18275317679b559a9dd00cf1f128d24057dc6de70e + md5: 50df370cbbbcfb4aa67556879e6643a1 + depends: + - libgcc >=13 + - libgpg-error >=1.55,<2.0a0 + license: LGPL-2.1-or-later + size: 652592 + timestamp: 1747060671875 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + sha256: 50a9e9815cf3f5bce1b8c5161c0899cc5b6c6052d6d73a4c27f749119e607100 + md5: 2f4de899028319b27eb7a4023be5dfd2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 188293 + timestamp: 1753342911214 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgettextpo-0.25.1-h5ad3122_0.conda + sha256: c8e5590166f4931a3ab01e444632f326e1bb00058c98078eb46b6e8968f1b1e9 + md5: ad7b109fbbff1407b1a7eeaa60d7086a + depends: + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + size: 225352 + timestamp: 1751557555903 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + sha256: c7ea10326fd450a2a21955987db09dde78c99956a91f6f05386756a7bfe7cc04 + md5: 3f7a43b3160ec0345c9535a9f0d7908e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 37407 + timestamp: 1753342931100 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgettextpo-devel-0.25.1-h5ad3122_0.conda + sha256: a26e1982d062daba5bdd3a90a2ef77b323803d21d27cf4e941135f07037d6649 + md5: 0d9d56bac6e4249da2bede0588ae1c1b + depends: + - libgcc >=13 + - libgettextpo 0.25.1 h5ad3122_0 + license: GPL-3.0-or-later + license_family: GPL + size: 37460 + timestamp: 1751557569909 +- conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + sha256: 9ca24328e31c8ef44a77f53104773b9fe50ea8533f4c74baa8489a12de916f02 + md5: 8621a450add4e231f676646880703f49 + depends: + - libgfortran5 15.2.0 hcd61629_7 + constrains: + - libgfortran-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29275 + timestamp: 1759968110483 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda + sha256: 78d958444dd41c4b590f030950a29b4278922147f36c2221c84175eedcbc13f1 + md5: ffe6ad135bd85bb594a6da1d78768f7c + depends: + - libgfortran5 15.2.0 h87db57e_7 + constrains: + - libgfortran-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29294 + timestamp: 1759967474985 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + sha256: e9a5d1208b9dc0b576b35a484d527d9b746c4e65620e0d77c44636033b2245f0 + md5: f699348e3f4f924728e33551b1920f79 + depends: + - libgfortran5 15.2.0 h742603c_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 134016 + timestamp: 1759712902814 +- conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + sha256: e93ceda56498d98c9f94fedec3e2d00f717cbedfc97c49be0e5a5828802f2d34 + md5: f116940d825ffc9104400f0d7f1a4551 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1572758 + timestamp: 1759968082504 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda + sha256: ae9a8290a7ff0fa28f540208906896460c62dcfbfa31ff9b8c2b398b5bbd34b1 + md5: dd7233e2874ea59e92f7d24d26bb341b + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1145738 + timestamp: 1759967460371 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + sha256: 18808697013a625ca876eeee3d86ee5b656f17c391eca4a4bc70867717cc5246 + md5: afccf412b03ce2f309f875ff88419173 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 764028 + timestamp: 1759712189275 +- conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda + sha256: 3e954380f16255d1c8ae5da3bd3044d3576a0e1ac2e3c3ff2fe8f2f1ad2e467a + md5: 0d00176464ebb25af83d40736a2cd3bb + depends: + - libglvnd 1.7.0 hd24410f_2 + - libglx 1.7.0 hd24410f_2 + license: LicenseRef-libglvnd + size: 145442 + timestamp: 1731331005019 +- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + sha256: 33336bd55981be938f4823db74291e1323454491623de0be61ecbe6cf3a4619c + md5: b8e4c93f4ab70c3b6f6499299627dbdc + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3978602 + timestamp: 1757403291664 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.0-h7cdfd2c_0.conda + sha256: c5e9508a9904d01b7f22e14caec099e9ac8d19834f48bd39cd5fca651a8cd542 + md5: 015bb144ea0e07dc75c33f37e1bd718c + depends: + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 4087725 + timestamp: 1757403280137 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + sha256: 92d17f998e14218810493c9190c8721bf7f7f006bfc5c00dbba1cede83c02f1a + md5: 9e065148e6013b7d7cae64ed01ab7081 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3701880 + timestamp: 1757404501093 +- conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.0-h5f26cbf_0.conda + sha256: 02c2dcf1818d2614ad4472b196a2a7bb06490cd32fd0f43a30997097afca3a12 + md5: 30a7c2c9d7ba29bb1354cd68fcca9cda + depends: + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3794081 + timestamp: 1757403780432 +- conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda + sha256: 57ec3898a923d4bcc064669e90e8abfc4d1d945a13639470ba5f3748bd3090da + md5: 9e115653741810778c9a915a2f8439e7 + license: LicenseRef-libglvnd + size: 152135 + timestamp: 1731330986070 +- conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda + sha256: 6591af640cb05a399fab47646025f8b1e1a06a0d4bbb4d2e320d6629b47a1c61 + md5: 1d4269e233636148696a67e2d30dad2a + depends: + - libglvnd 1.7.0 hd24410f_2 + - xorg-libx11 >=1.8.9,<2.0a0 + license: LicenseRef-libglvnd + size: 77736 + timestamp: 1731330998960 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + md5: f7b4d76975aac7e5d9e6ad13845f92fe + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447919 + timestamp: 1759967942498 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + sha256: 0a024f1e4796f5d90fb8e8555691dad1b3bdfc6ac3c2cd14d876e30f805fcac7 + md5: 34cef4753287c36441f907d5fdd78d42 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 450308 + timestamp: 1759967379407 +- conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + sha256: 697334de4786a1067ea86853e520c64dd72b11a05137f5b318d8a444007b5e60 + md5: 2bd47db5807daade8500ed7ca4c512a4 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 312184 + timestamp: 1745575272035 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgpg-error-1.55-h5ad3122_0.conda + sha256: a744c0a137a084af7cee4a33de9bffb988182b5be4edb8a45d51d2a1efd3724c + md5: 39f742598d0f18c8e1cb01712bc03ee8 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + license: LGPL-2.1-only + size: 327973 + timestamp: 1745575312848 +- conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 + md5: b0cac6e5b06ca5eeb14b4f7cf908619f + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 2414731 + timestamp: 1757624335056 +- conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda + sha256: 2fb437b82912c74b4869b66c601d52c77bb3ee8cb4812eab346d379f1c823225 + md5: e6298294e7612eccf57376a0683ddc80 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 >=2.13.8,<2.14.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 2412139 + timestamp: 1752762145331 +- conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + size: 790176 + timestamp: 1754908768807 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 + md5: 5a86bf847b9b926f3a4f203339748d78 + depends: + - libgcc >=14 + license: LGPL-2.1-only + size: 791226 + timestamp: 1754910975665 +- conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 750379 + timestamp: 1754909073836 +- conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + size: 696926 + timestamp: 1754909290005 +- conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 90957 + timestamp: 1751558394144 +- conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + sha256: c7e4600f28bcada8ea81456a6530c2329312519efcf0c886030ada38976b0511 + md5: 2cf0cf76cc15d360dfa2f17fd6cf9772 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + size: 95568 + timestamp: 1723629479451 +- conda: https://prefix.dev/conda-forge/osx-arm64/libintl-devel-0.25.1-h493aca8_0.conda + sha256: 5a446cb0501d87e0816da0bce524c60a053a4cf23c94dfd3e2b32a8499009e36 + md5: 5f9888e1cdbbbef52c8cf8b567393535 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - libintl 0.25.1 h493aca8_0 + license: LGPL-2.1-or-later + size: 40340 + timestamp: 1751558481257 +- conda: https://prefix.dev/conda-forge/win-64/libintl-devel-0.22.5-h5728263_3.conda + sha256: be1f3c48bc750bca7e68955d57180dfd826d6f9fa7eb32994f6cb61b813f9a6a + md5: 7537784e9e35399234d4007f45cdb744 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_3 + license: LGPL-2.1-or-later + size: 40746 + timestamp: 1723629745649 +- conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 + md5: 9fa334557db9f63da6c9285fd2a48638 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 628947 + timestamp: 1745268527144 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libjpeg-turbo-3.1.0-h86ecc28_0.conda + sha256: c7e4f017eeadcabb30e2a95dae95aad27271d633835e55e5dae23c932ae7efab + md5: a689388210d502364b79e8b19e7fa2cb + depends: + - libgcc >=13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 653054 + timestamp: 1745268199701 +- conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + sha256: 78df2574fa6aa5b6f5fc367c03192f8ddf8e27dc23641468d54e031ff560b9d4 + md5: 01caa4fbcaf0e6b08b3aef1151e91745 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 553624 + timestamp: 1745268405713 +- conda: https://prefix.dev/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda + sha256: e61b0adef3028b51251124e43eb6edf724c67c0f6736f1628b02511480ac354e + md5: 7c51d27540389de84852daa1cdb9c63c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 838154 + timestamp: 1745268437136 +- conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-37_h47877c9_openblas.conda + build_number: 37 + sha256: e37125ad315464a927578bf6ba3455a30a7f319d5e60e54ccc860ddd218d516d + md5: 8305e6a5ed432ad3e5a609e8024dbc17 + depends: + - libblas 3.9.0 37_h4a7cf45_openblas + constrains: + - blas 2.137 openblas + - liblapacke 3.9.0 37*_openblas + - libcblas 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17470 + timestamp: 1760212744703 +- conda: https://prefix.dev/conda-forge/linux-aarch64/liblapack-3.9.0-37_h88aeb00_openblas.conda + build_number: 37 + sha256: 6830a8675454e2e27f90754a632b69f97634276a94986ef777a0c2e31626af0d + md5: 8cda18154b6b1698b9bc5edb95f42339 + depends: + - libblas 3.9.0 37_haddc8a3_openblas + constrains: + - libcblas 3.9.0 37*_openblas + - blas 2.137 openblas + - liblapacke 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17503 + timestamp: 1760212922775 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.9.0-37_hd9741b5_openblas.conda + build_number: 37 + sha256: 61a3f8928431f74c359669ea68b5abedbbd46efb06f15de1e5c7e5d40f545263 + md5: 53335fc42466f597d0bc6d66a9ed4468 + depends: + - libblas 3.9.0 37_h51639a9_openblas + constrains: + - liblapacke 3.9.0 37*_openblas + - blas 2.137 openblas + - libcblas 3.9.0 37*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17633 + timestamp: 1760213604248 +- conda: https://prefix.dev/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + build_number: 35 + sha256: 56e0992fb58eed8f0d5fa165b8621fa150b84aa9af1467ea0a7a9bb7e2fced4f + md5: 0c6ed9d722cecda18f50f17fb3c30002 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 78485 + timestamp: 1757003541803 +- conda: https://prefix.dev/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_10.conda + sha256: 2de525b426da3c9e8a07b3506dc377564589d2d5c17a5ca1661657905360ddb6 + md5: df8e3f7dd302c42baccfc1c637bc5ce7 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 25883667 + timestamp: 1757359756811 +- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.3-hf7376ad_0.conda + sha256: ce6272d24fec46c0cd29755daeb468cc99eb655079a40494acb29ed3fd8138ca + md5: 5728d01354f55d4f7e6f5e3073919a32 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 44332491 + timestamp: 1759919364078 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.3-hfd2ba90_0.conda + sha256: d60a2d0e1b24bcff10257a7e66e320c16b550369dd2ce6af5a867bcaa9fd946b + md5: 1076420495f878a7fb0e93628030636f + depends: + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 43133086 + timestamp: 1759915878496 +- conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.3-h8e0c9ce_0.conda + sha256: 0169c2efa33aa17bc9082126b17b9f4f81ed048d47b2af45d508d5258b2c5859 + md5: 2f7fc390634d8d06b266993f029727f0 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 29406113 + timestamp: 1759915388804 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + sha256: 498ea4b29155df69d7f20990a7028d75d91dbea24d04b2eb8a3d6ef328806849 + md5: 7d362346a479256857ab338588190da0 + depends: + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 125103 + timestamp: 1749232230009 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 666600 + timestamp: 1756834976695 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + sha256: b03f406fd5c3f865a5e08c89b625245a9c4e026438fd1a445e45e6a0d69c2749 + md5: 981082c1cc262f514a5a2cf37cab9b81 + depends: + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 728661 + timestamp: 1756835019535 +- conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d + md5: a4b4dd73c67df470d091312ab87bf6ae + depends: + - __osx >=11.0 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 575454 + timestamp: 1756835746393 +- conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + size: 33731 + timestamp: 1750274110928 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + sha256: c0dc4d84198e3eef1f37321299e48e2754ca83fd12e6284754e3cb231357c3a5 + md5: d5d58b2dc3e57073fe22303f5fed4db7 + depends: + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + size: 34831 + timestamp: 1750274211 +- conda: https://prefix.dev/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + sha256: 3b3f19ced060013c2dd99d9d46403be6d319d4601814c772a3472fe2955612b0 + md5: 7c7927b404672409d9917d49bff5f2d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 33418 + timestamp: 1734670021371 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2 + sha256: 0e303d7a8845391bd1634efb65dc9d9b82b5608ebeb32fb77a56d1ed696d2eee + md5: 835c7c4137821de5c309f4266a51ba89 + depends: + - libgcc-ng >=9.3.0 + license: LGPL-2.1-or-later + size: 39449 + timestamp: 1609781865660 +- conda: https://prefix.dev/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + sha256: ea8c680924d957e12270dca549620327d5e986f23c4bd5f45627167ca6ef7a3b + md5: c90c1d3bd778f5ec0d4bb4ef36cbd5b6 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + size: 31099 + timestamp: 1734670168822 +- conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 + md5: 68e52064ed3897463c0e958ab5c8f91b + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 218500 + timestamp: 1745825989535 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libogg-1.3.5-h86ecc28_1.conda + sha256: 2c1b7c59badc2fd6c19b6926eabfce906c996068d38c2972bd1cfbe943c07420 + md5: 319df383ae401c40970ee4e9bc836c7a + depends: + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 220653 + timestamp: 1745826021156 +- conda: https://prefix.dev/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + sha256: 28bd1fe20fe43da105da41b95ac201e95a1616126f287985df8e86ddebd1c3d8 + md5: 29b8b11f6d7e6bd0e76c029dcf9dd024 + depends: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 216719 + timestamp: 1745826006052 +- conda: https://prefix.dev/conda-forge/win-64/libogg-1.3.5-h2466b09_1.conda + sha256: c63e5fb169dbd192aacdcee6e37235407f106b8ca9c9036942a25e0366cbc73c + md5: b67ed8c9ca072695ff482e50d888a523 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + size: 35040 + timestamp: 1745826086628 +- conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + sha256: 1b51d1f96e751dc945cc06f79caa91833b0c3326efe24e9b506bd64ef49fc9b0 + md5: dfc5aae7b043d9f56ba99514d5e60625 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 5938936 + timestamp: 1755474342204 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_2.conda + sha256: 423cc9181b1518db5eb460d3055ac0ff5eb6d35f4f3d47688f914e88653230b3 + md5: e0aa272c985b320f56dd38c31eefde0e + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4961416 + timestamp: 1755472037732 +- conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_2.conda + sha256: ddd201896c3f2d9d1911e8fb1aa34bf876795376f0fa5779c79b8998692f6800 + md5: e9f522513b5bbc6381f124f46e78fe36 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4284271 + timestamp: 1760594266347 +- conda: https://prefix.dev/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead + md5: 7df50d44d4a14d6c31a2c54f2cd92157 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 50757 + timestamp: 1731330993524 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda + sha256: e359df399fb2f308774237384414e318fac8870c1bf6481bdc67ae16e0bd2a02 + md5: cf9d12bfab305e48d095a4c79002c922 + depends: + - libglvnd 1.7.0 hd24410f_2 + license: LicenseRef-libglvnd + size: 56355 + timestamp: 1731331001820 +- conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + sha256: 786d43678d6d1dc5f88a6bad2d02830cfd5a0184e84a8caa45694049f0e3ea5f + md5: b64523fb87ac6f87f0790f324ad43046 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 312472 + timestamp: 1744330953241 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libopus-1.5.2-h86ecc28_0.conda + sha256: c887543068308fb0fd50175183a3513f60cd8eb1defc23adc3c89769fde80d48 + md5: 44b2cfec6e1b94723a960f8a5e6206ae + depends: + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 357115 + timestamp: 1744331282621 +- conda: https://prefix.dev/conda-forge/osx-arm64/libopus-1.5.2-h48c0fde_0.conda + sha256: 3a01094a59dd59d7a5a1c8e838c2ef3fccf9e098af575c38c26fceb56c6bb917 + md5: 882feb9903f31dca2942796a360d1007 + depends: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 299498 + timestamp: 1744330988108 +- conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 28424 + timestamp: 1749901812541 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libpciaccess-0.18-h86ecc28_0.conda + sha256: 7641dfdfe9bda7069ae94379e9924892f0b6604c1a016a3f76b230433bb280f2 + md5: 5044e160c5306968d956c2a0a2a440d6 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 29512 + timestamp: 1749901899881 +- conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + sha256: e75a2723000ce3a4b9fd9b9b9ce77553556c93e475a4657db6ed01abc02ea347 + md5: 7af8e91b0deb5f8e25d1a595dea79614 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 317390 + timestamp: 1753879899951 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libpng-1.6.50-h1abf092_1.conda + sha256: e1effd7335ec101bb124f41a5f79fabb5e7b858eafe0f2db4401fb90c51505a7 + md5: ed42935ac048d73109163d653d9445a0 + depends: + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 339168 + timestamp: 1753879915462 +- conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + sha256: a2e0240fb0c79668047b528976872307ea80cb330baf8bf6624ac2c6443449df + md5: 4d0f5ce02033286551a32208a5519884 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 287056 + timestamp: 1753879907258 +- conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda + sha256: e84b041f91c94841cb9b97952ab7f058d001d4a15ed4ce226ec5fdb267cc0fa5 + md5: 3ae6e9f5c47c495ebeed95651518be61 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 382709 + timestamp: 1753879944850 +- conda: https://prefix.dev/conda-forge/linux-64/libpq-18.0-h3675c94_0.conda + sha256: 81d9ac5c23257745eb73b81103b3c42442ac13c5d38226916debbf55573540dd + md5: 064887eafa473cbfae9ee8bedd3b7432 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.3,<4.0a0 + license: PostgreSQL + size: 2849367 + timestamp: 1758820440469 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libpq-18.0-hb4b1422_0.conda + sha256: b91b43225e6bbfa0288e7a59fe62650a5f13c6cd6b22465a2fc437f35e9b2033 + md5: 28fe121d7e4afb00b9a49520db724306 + depends: + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.3,<4.0a0 + license: PostgreSQL + size: 2786895 + timestamp: 1758820487283 +- conda: https://prefix.dev/conda-forge/osx-arm64/libpq-18.0-h31f7a3a_0.conda + sha256: 901c070521c36015d340cf3ab3e7692b4113042d285231176e581109ddfb35c1 + md5: fb04371059694e02a7d0af1a21b2fae6 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.3,<4.0a0 + license: PostgreSQL + size: 2648192 + timestamp: 1758821565273 +- conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda + sha256: 8fcd5e45d6fb071e8baf492ebb8710203fd5eedf0cb791e007265db373c89942 + md5: ad8e62c0faec46b1442f960489c80b49 + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 396501 + timestamp: 1695747749825 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 932581 + timestamp: 1753948484112 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda + sha256: a361dc926f232e7f3aa664dbd821f12817601c07d2c8751a0668c2fb07d0e202 + md5: 0ad1b73a3df7e3376c14efe6dabe6987 + depends: + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 931661 + timestamp: 1753948557036 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 902645 + timestamp: 1753948599139 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1288499 + timestamp: 1753948889360 +- conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 304790 + timestamp: 1745608545575 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + sha256: 1e289bcce4ee6a5817a19c66e296f3c644dcfa6e562e5c1cba807270798814e7 + md5: eecc495bcfdd9da8058969656f916cc2 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 311396 + timestamp: 1745609845915 +- conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 279193 + timestamp: 1745608793272 +- conda: https://prefix.dev/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 + md5: 9dce2f112bfd3400f4f432b3d0ac07b2 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 292785 + timestamp: 1745608759342 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + md5: 5b767048b1b3ee9a954b06f4084f93dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 h767d61c_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3898269 + timestamp: 1759968103436 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda + sha256: 4c6d1a2ae58044112233a57103bbf06000bd4c2aad44a0fd3b464b05fa8df514 + md5: 6a2f0ee17851251a85fbebafbe707d2d + depends: + - libgcc 15.2.0 he277a41_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3831785 + timestamp: 1759967470295 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f + md5: f627678cf829bd70bccf141a19c3ad3e + depends: + - libstdcxx 15.2.0 h8f9b012_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29343 + timestamp: 1759968157195 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + sha256: 26fc1bdb39042f27302b363785fea6f6b9607f9c2f5eb949c6ae0bdbb8599574 + md5: 9e5deec886ad32f3c6791b3b75c78681 + depends: + - libstdcxx 15.2.0 h3f4de04_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29341 + timestamp: 1759967498023 +- conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + sha256: 6b063df2d13dc9cedeae7b1591b1917ced7f4e1b04f7246e66cc7fb0088dea07 + md5: b6d222422c17dc11123e63fae4ad4178 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + - libgcrypt-lib >=1.11.1,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: LGPL-2.1-or-later + size: 492733 + timestamp: 1757520335407 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsystemd0-257.9-hd926fa8_0.conda + sha256: 98ac09c139bbffbe4f6448924a8f3f1fca16f4ac8816b39d629a22f7fd66ad5f + md5: 6751bb1ae9b58008862a0c3a1340e17e + depends: + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + - libgcrypt-lib >=1.11.1,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: LGPL-2.1-or-later + size: 513685 + timestamp: 1757520434211 +- conda: https://prefix.dev/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda + sha256: 208ead1ed147f588c722ef9dec7656f538111b15fb85c04f645758fa4fa8e3c3 + md5: 0b2b4f99717fe8f82dc21a3b0c504923 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 176874 + timestamp: 1718888439831 +- conda: https://prefix.dev/conda-forge/linux-aarch64/liburcu-0.14.0-h0a1ffab_0.conda + sha256: 2f4ced78799e93470ac4db077ba9e0d3b715ba71a099f434e82b8873f1999ea1 + md5: 29830064c98f8dae8b72329c4f2cf0ed + depends: + - libgcc-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 197399 + timestamp: 1718888513454 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 37135 + timestamp: 1758626800002 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + sha256: 7aed28ac04e0298bf8f7ad44a23d6f8ee000aa0445807344b16fceedc67cce0f + md5: 3a68e44fdf2a2811672520fdd62996bd + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 39172 + timestamp: 1758626850999 +- conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b + md5: 0f03292cc56bf91a077a134ea8747118 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + size: 895108 + timestamp: 1753948278280 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + sha256: 7a0fb5638582efc887a18b7d270b0c4a6f6e681bf401cab25ebafa2482569e90 + md5: 8e62bf5af966325ee416f19c6f14ffa3 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + size: 629238 + timestamp: 1753948296190 +- conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 421195 + timestamp: 1753948426421 +- conda: https://prefix.dev/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + sha256: f03dc82e6fb1725788e73ae97f0cd3d820d5af0d351a274104a0767035444c59 + md5: 31e1545994c48efc3e6ea32ca02a8724 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 297087 + timestamp: 1753948490874 +- conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + sha256: ca494c99c7e5ecc1b4cd2f72b5584cef3d4ce631d23511184411abcbb90a21a5 + md5: b4ecbefe517ed0157c37f8182768271c + depends: + - libogg + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 285894 + timestamp: 1753879378005 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libvorbis-1.3.7-h7ac5ae9_2.conda + sha256: 066708ca7179a1c6e5639d015de7ed6e432b93ad50525843db67d57eb1ba1faf + md5: 9d099329070afe52d797462ca7bf35f3 + depends: + - libogg + - libstdcxx >=14 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 289391 + timestamp: 1753879417231 +- conda: https://prefix.dev/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + sha256: 95768e4eceaffb973081fd986d03da15d93aa10609ed202e6fd5ca1e490a3dce + md5: 719e7653178a09f5ca0aa05f349b41f7 + depends: + - libogg + - libcxx >=19 + - __osx >=11.0 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 259122 + timestamp: 1753879389702 +- conda: https://prefix.dev/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda + sha256: 429124709c73b2e8fae5570bdc6b42f5418a7551ba72e591bb960b752e87b365 + md5: 42a8a56c60882da5d451aa95b8455111 + depends: + - libogg + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 243401 + timestamp: 1753879416570 +- conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + size: 36621 + timestamp: 1759768399557 +- conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 397493 + timestamp: 1727280745441 +- conda: https://prefix.dev/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.12.2-hca5e8e5_0.conda + sha256: e11e8890a097c9e16a3fc40f2540d887ef2497e7f31f6e5a744aa951f82dbeea + md5: 3c3e5ccbb2d96ac75e1b8b028586db5c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 830418 + timestamp: 1760990182307 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxkbcommon-1.12.2-h3c6a4c8_0.conda + sha256: 704f3680df9b7e21cdfad1a87753ac3918745e158ed319575e3cb2af8e9ff72b + md5: 45dcd1b51960514f94a291808eac16fe + depends: + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 846320 + timestamp: 1760990353603 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + md5: e512be7dc1f84966d50959e900ca121f + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 ha9997c6_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 45283 + timestamp: 1761015644057 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + sha256: db0a568e0853ee38b7a4db1cb4ee76e57fe7c32ccb1d5b75f6618a1041d3c6e4 + md5: a0e7779b7625b88e37df9bd73f0638dc + depends: + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h8591a01_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 47192 + timestamp: 1761015739999 +- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + sha256: c409e384ddf5976a42959265100d6b2c652017d250171eb10bae47ef8166193f + md5: fb5ce61da27ee937751162f86beba6d1 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h0ff4647_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 40607 + timestamp: 1761016108361 +- conda: https://prefix.dev/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.conda + sha256: 32fa908bb2f2a6636dab0edaac1d4bf5ff62ad404a82d8bb16702bc5b8eb9114 + md5: aeb49dc1f5531de13d2c0d57ffa6d0c8 + depends: + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 1519401 + timestamp: 1754315497781 +- conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + sha256: fb51b91a01eac9ee5e26c67f4e081f09f970c18a3da5231b8172919a1e1b3b6b + md5: 87116b9de9c1825c3fd4ef92c984877b + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h06f855e_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 43042 + timestamp: 1761016261024 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + md5: e7733bc6785ec009e47a224a71917e84 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 556302 + timestamp: 1761015637262 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + sha256: 7a13450bce2eeba8f8fb691868b79bf0891377b707493a527bd930d64d9b98af + md5: e7177c6fbbf815da7b215b4cc3e70208 + depends: + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 597078 + timestamp: 1761015734476 +- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + sha256: ebe2dd9da94280ad43da936efa7127d329b559f510670772debc87602b49b06d + md5: 438c97d1e9648dd7342f86049dd44638 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 464952 + timestamp: 1761016087733 +- conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + sha256: 3f65ea0f04c7738116e74ca87d6e40f8ba55b3df31ef42b8cb4d78dd96645e90 + md5: 4a5ea6ec2055ab0dfd09fd0c498f834a + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 518616 + timestamp: 1761016240185 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.3-h4a912ad_0.conda + sha256: 9aeabb02db52ce9d055a5786d42440894f6eae9e74bbc0e08befb7926ccca98d + md5: 487d26872cd21fe3bfcb3d09e8d992cd + depends: + - __osx >=11.0 + constrains: + - openmp 21.1.3|21.1.3.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 285307 + timestamp: 1760282536594 +- conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-21.1.3-hfa2b4ca_0.conda + sha256: 54826ea90c80ca04640b0fc1a0b3aabfd0f4e60e03c270b2a919a3655f21bc78 + md5: b1dd38bdf96540a6dedf0d196108c9a1 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - intel-openmp <0.0a0 + - openmp 21.1.3|21.1.3.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 347945 + timestamp: 1760282911326 +- conda: https://prefix.dev/conda-forge/linux-64/lttng-ust-2.13.9-hf5eda4c_0.conda + sha256: 77ea6f9546bb8e4d6050b4ad8efb9bfb2177e9173a03b4d9eae6fd8ce1056431 + md5: bf1ee9cd230a64573a8b7745c6aaa593 + depends: + - liburcu + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - liburcu >=0.14.0,<0.15.0a0 + license: LGPL-2.1-only + size: 375355 + timestamp: 1745310024643 +- conda: https://prefix.dev/conda-forge/linux-aarch64/lttng-ust-2.13.9-h8d236e2_0.conda + sha256: ffa24c89600e0ef52085dea7d2393240f11006aa91384a29c040c7ee93c891f7 + md5: efd03c795cffa4374fed317f8bfae176 + depends: + - liburcu + - libgcc >=13 + - liburcu >=0.14.0,<0.15.0a0 + license: LGPL-2.1-only + size: 419653 + timestamp: 1745310243392 +- conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://prefix.dev/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 184953 + timestamp: 1733740984533 +- conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + sha256: 9b0037171dad0100f0296699a11ae7d355237b55f42f9094aebc0f41512d96a1 + md5: 827064ddfe0de2917fb29f1da4f8f533 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 12934 + timestamp: 1733216573915 +- conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + sha256: ce841e7c3898764154a9293c0f92283c1eb28cdacf7a164c94b632a6af675d91 + md5: 5cddc979c74b90cf5e5cda4f97d5d8bb + depends: + - llvm-openmp >=20.1.8 + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 103088799 + timestamp: 1753975600547 +- conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://prefix.dev/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda + sha256: d65d5a00278544639ba4f99887154be00a1f57afb0b34d80b08e5cba40a17072 + md5: cdf140c7690ab0132106d3bc48bce47d + depends: + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + size: 558708 + timestamp: 1730581372400 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://prefix.dev/conda-forge/linux-64/nspr-4.37-h29cc59b_0.conda + sha256: 472306630dcd49a221863b91bd89f5b8b81daf1b99adf1968c9f12021176d873 + md5: d73ccc379297a67ed921bd55b38a6c6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MPL-2.0 + license_family: MOZILLA + size: 230951 + timestamp: 1752841107697 +- conda: https://prefix.dev/conda-forge/linux-aarch64/nspr-4.37-h3ad9384_0.conda + sha256: 29431722d6715cfa9589583eca96d740d2fa3ca50d32593d9eafcd3eea3c9bb6 + md5: 81e99082a0d055a3888369dafdfa427c + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MPL-2.0 + license_family: MOZILLA + size: 236193 + timestamp: 1752842469552 +- conda: https://prefix.dev/conda-forge/osx-arm64/nspr-4.37-h31e89c2_0.conda + sha256: fe47c5d0542b6f928c31bf1c5251aa85aff9b50c48b56a4c7c6fce3afcd60e57 + md5: 1add5064a24aa483d1233c560ef8ee4a + depends: + - __osx >=11.0 + - libcxx >=19 + license: MPL-2.0 + license_family: MOZILLA + size: 201648 + timestamp: 1752841270904 +- conda: https://prefix.dev/conda-forge/linux-64/nss-3.117-h445c969_0.conda + sha256: 85f2d6d93199454818866b355834a8c5dc64a87e14da3b242208c9dc2156852a + md5: 970af0bfac9644ddbf7e91c1336b231b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 2045760 + timestamp: 1759509411326 +- conda: https://prefix.dev/conda-forge/linux-aarch64/nss-3.117-h544fa81_0.conda + sha256: af706f4b0e730070661e129090d4325caa47a36a51d8b45ccf87c7d104c8cac9 + md5: d64a3b42b230f874211256bf8cdc59c7 + depends: + - libgcc >=14 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 2049285 + timestamp: 1759512197014 +- conda: https://prefix.dev/conda-forge/osx-arm64/nss-3.117-h1c710a3_0.conda + sha256: 92ff13f63d4f93aba92f643198dca5fe3d53f7408579b06a5a31c6061239b50a + md5: 2b01bafeb5b2dc68d1b8d79f4f6e4e87 + depends: + - __osx >=11.0 + - libcxx >=19 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 1842099 + timestamp: 1759510175550 +- conda: https://prefix.dev/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + sha256: 3f4365e11b28e244c95ba8579942b0802761ba7bb31c026f50d1a9ea9c728149 + md5: a502d7aad449a1206efb366d6a12c52d + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 8065890 + timestamp: 1707225944355 +- conda: https://prefix.dev/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://prefix.dev/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda + sha256: 88800a1d9d11c2fccab09d40d36f7001616f5119eaf0ec86186562f33564e651 + md5: 3fd00dd400c8d3f9da12bf33061dd28d + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7234391 + timestamp: 1707225781489 +- conda: https://prefix.dev/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + sha256: 160a52a01fea44fe9753a2ed22cf13d7b55c8a89ea0b8738546fdbf4795d6514 + md5: 3160b93669a0def35a7a8158ebb33816 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6652352 + timestamp: 1707226297967 +- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://prefix.dev/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda + sha256: 14116e72107de3089cc58119a5ce5905c22abf9a715c9fe41f8ac14db0992326 + md5: 7b240edd44fd7a0991aa409b07cee776 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7104093 + timestamp: 1707226459646 +- conda: https://prefix.dev/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda + sha256: 73570817a5109d396b4ebbe5124a89525959269fd33fa33fd413700289fbe0ef + md5: f9ac74c3b07c396014434aca1e58d362 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6495445 + timestamp: 1707226412944 +- conda: https://prefix.dev/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 + md5: 2e5bf4f1da39c0b32778561c3c4e5878 + depends: + - __glibc >=2.17,<3.0.a0 + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + size: 780253 + timestamp: 1748010165522 +- conda: https://prefix.dev/conda-forge/linux-aarch64/openldap-2.6.10-h30c48ee_0.conda + sha256: 13c7ba058b6e151468111235218158083b9e867738e66a5afb96096c5c123348 + md5: 48f31a61be512ec1929f4b4a9cedf4bd + depends: + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + size: 902902 + timestamp: 1748010210718 +- conda: https://prefix.dev/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda + sha256: 08d859836b81296c16f74336c3a9a455b23d57ce1d7c2b0b3e1b7a07f984c677 + md5: 6fd5d73c63b5d37d9196efb4f044af76 + depends: + - __osx >=11.0 + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - openssl >=3.5.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + size: 843597 + timestamp: 1748010484231 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + sha256: e807f3bad09bdf4075dbb4168619e14b0c0360bacb2e12ef18641a834c8c5549 + md5: 14edad12b59ccbfa3910d42c72adc2a0 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3119624 + timestamp: 1759324353651 +- conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + sha256: a24b318733c98903e2689adc7ef73448e27cbb10806852032c023f0ea4446fc5 + md5: 9303e8887afe539f78517951ce25cd13 + depends: + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3644584 + timestamp: 1759326000128 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + sha256: f0512629f9589392c2fb9733d11e753d0eab8fc7602f96e4d7f3bd95c783eb07 + md5: 71118318f37f717eefe55841adb172fd + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3067808 + timestamp: 1759324763146 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.5.4-h725018a_0.conda + sha256: 5ddc1e39e2a8b72db2431620ad1124016f3df135f87ebde450d235c212a61994 + md5: f28ffa510fe055ab518cbd9d6ddfea23 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9218823 + timestamp: 1759326176247 +- conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + size: 62477 + timestamp: 1745345660407 +- conda: https://prefix.dev/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2 + sha256: 8f35c244b1631a4f31fb1d66ab6e1d9bfac0ca9b679deced1112c7225b3ad138 + md5: c05d1820a6d34ff07aaaab7a9b7eddaa + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 259377 + timestamp: 1623788789327 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pcre-8.45-h01db608_0.tar.bz2 + sha256: 7a6062de76f695f6d8f0ddda0ff171e4b47e2b863d6012def440c7703aea0069 + md5: 3963d9f84749d6cdba1f12c65967ccd1 + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 249883 + timestamp: 1623793306266 +- conda: https://prefix.dev/conda-forge/osx-arm64/pcre-8.45-hbdafb3b_0.tar.bz2 + sha256: f2e0c4ae3306f94851eea2318c6d26d24f8e191e329ddd256a612cd1184c5737 + md5: 500758f2515ae07c640d255c11afc19f + depends: + - libcxx >=11.1.0 + license: BSD-3-Clause + license_family: BSD + size: 235554 + timestamp: 1623788902053 +- conda: https://prefix.dev/conda-forge/win-64/pcre-8.45-h0e60522_0.tar.bz2 + sha256: 2ee62337b921b2d60a87aa9a91bf34bc855a0bbf6a5642ec66a7a175a772be6d + md5: 3cd3948bb5de74ebef93b6be6d8cf0d5 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: BSD-3-Clause + license_family: BSD + size: 530818 + timestamp: 1623789181657 +- conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1209177 + timestamp: 1756742976157 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.46-h15761aa_0.conda + sha256: 75800e60e0e44d957c691a964085f56c9ac37dcd75e6c6904809d7b68f39e4ea + md5: 5128cb5188b630a58387799ea1366e37 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1161914 + timestamp: 1756742893031 +- conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + sha256: 5bf2eeaa57aab6e8e95bea6bd6bb2a739f52eb10572d8ed259d25864d3528240 + md5: 0e6e82c3cc3835f4692022e9b9cd5df8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 835080 + timestamp: 1756743041908 +- conda: https://prefix.dev/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + sha256: 29c2ed44a8534d27faad96bdce16efe29c2788f556f4c5409d4ae8ae074681ec + md5: 889053e920d15353c2665fa6310d7a7a + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 1034703 + timestamp: 1756743085974 +- conda: https://prefix.dev/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + size: 450960 + timestamp: 1754665235234 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda + sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 + md5: 1587081d537bd4ae77d1c0635d465ba5 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + license: MIT + license_family: MIT + size: 357913 + timestamp: 1754665583353 +- conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + sha256: c9601efb1af5391317e04eca77c6fe4d716bf1ca1ad8da2a05d15cb7c28d7d4e + md5: 1bee70681f504ea424fb07cdb090c001 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 115175 + timestamp: 1720805894943 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + sha256: 6468cbfaf1d3140be46dd315ec383d373dbbafd770ce2efe77c3f0cdbc4576c1 + md5: 05eda637f6465f7e8c5ab7e341341ea9 + depends: + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 54834 + timestamp: 1720806008171 +- conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + sha256: d82f4655b2d67fe12eefe1a3eea4cd27d33fa41dbc5e9aeab5fd6d3d2c26f18a + md5: b4f41e19a8c20184eec3aaf0f0953293 + depends: + - __osx >=11.0 + - libglib >=2.80.3,<3.0a0 + - libiconv >=1.17,<2.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 49724 + timestamp: 1720806128118 +- conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + sha256: 86b0c40c8b569dbc164cb1de098ddabf4c240a5e8f38547aab00493891fa67f3 + md5: 122d6514d415fbe02c9b58aee9f6b53e + depends: + - libglib >=2.80.3,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-or-later + license_family: GPL + size: 36118 + timestamp: 1720806338740 +- conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 24246 + timestamp: 1747339794916 +- conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 8342 + timestamp: 1726803319942 +- conda: https://prefix.dev/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + sha256: 8a6729861c9813a756b0438c30bd271722fb3f239ded3afc3bf1cb03327a640e + md5: b6f21b1c925ee2f3f7fc37798c5988db + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.16.2,<2.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.7 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_2 + license: LGPL-2.1-or-later + license_family: LGPL + size: 761857 + timestamp: 1757472971364 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pulseaudio-client-17.0-h77cf2aa_2.conda + sha256: 588c9ba305e8ece39357b36174a371671916e878b98fdd7521296008a895adb1 + md5: 50f9b250973773b3a9888b57893cbdcd + depends: + - dbus >=1.16.2,<2.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.7 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_2 + license: LGPL-2.1-or-later + license_family: LGPL + size: 767096 + timestamp: 1757472924483 +- conda: https://prefix.dev/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + sha256: 1950f71ff44e64163e176b1ca34812afc1a104075c3190de50597e1623eb7d53 + md5: 85815c6a22905c080111ec8d56741454 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 35182 + timestamp: 1750616054854 +- conda: https://prefix.dev/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda + sha256: 83ab8434e3baf6a018914da4f1c2ae9023e23fb41e131b68b3e3f9ca41ecef61 + md5: a36aa6e0119331d3280f4bba043314c7 + depends: + - python >=3.9 + - snowballstemmer >=2.2.0 + - tomli >=1.2.3 + license: MIT + license_family: MIT + size: 40236 + timestamp: 1733261742916 +- conda: https://prefix.dev/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda + sha256: 4b6fb3f7697b4e591c06149671699777c71ca215e9ec16d5bd0767425e630d65 + md5: dba204e749e06890aeb3756ef2b1bf35 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 59592 + timestamp: 1750492011671 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 889287 + timestamp: 1750615908735 +- conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + sha256: 6814b61b94e95ffc45ec539a6424d8447895fef75b0fec7e1be31f5beee883fb + md5: 6c8979be6d7a17692793114fa26916e8 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 104044 + timestamp: 1758436411254 +- conda: https://prefix.dev/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + sha256: 41053d9893e379a3133bb9b557b98a3d2142fca474fb6b964ba5d97515f78e2d + md5: 1f987505580cb972cf28dc5f74a0f81b + depends: + - colorama >=0.4 + - exceptiongroup >=1 + - iniconfig >=1 + - packaging >=20 + - pluggy >=1.5,<2 + - pygments >=2.7.2 + - python >=3.10 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 276734 + timestamp: 1757011891753 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.11.14-hfe2f287_1_cpython.conda + build_number: 1 + sha256: 6515ef4018fda2826570f6f5c068e26dbd3e41a8b642f052c346812b3af28789 + md5: e87c753e04bffcda4cbfde7d052c1f7a + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 30812188 + timestamp: 1760365816536 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hfe2f287_0_cpython.conda + sha256: 5386d8c8230b6478ae165ff34f57d498891ac160e871629cbb4d4256e69cc542 + md5: ceada987beec823b3c702710ee073fba + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 31547362 + timestamp: 1760367376467 +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.11.14-hcfbf8c2_1_cpython.conda + build_number: 1 + sha256: bd68e22a2461c79cf287ae0f7bf6eeae10ebea12bf1115c4c4572627c8f12a2e + md5: 6190c58a8b68e9f18fb751f7702870c1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 15586884 + timestamp: 1760364354142 +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.12.12-hcfbf8c2_0_cpython.conda + sha256: 6379c2a66799ea2ba9cff5ecbfee3d3575a36367e6006d74b9e0805f8d9d5c6b + md5: 08c82423fa3c2153c34f54505a2897c9 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 13709866 + timestamp: 1760365731765 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.14-hec0b533_1_cpython.conda + build_number: 1 + sha256: f1fc90c0929f744d0db11d1247cd97632134494cea2a99fa24996ad928e904a8 + md5: 64d46fd57bf5b2793f75fceb6f3b6189 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 14794480 + timestamp: 1760366123572 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-hec0b533_0_cpython.conda + sha256: 63d5362621bbf3b0d90424f5fc36983d7be2434f6d0b2a8e431ac78a69a1c01d + md5: 5a732c06cbf90455a95dc6f6b1dd7061 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 12905286 + timestamp: 1760367318303 +- conda: https://prefix.dev/conda-forge/win-64/python-3.11.14-h30ce641_1_cpython.conda + build_number: 1 + sha256: a2e3daeccf06a6271d32d99e851a56fd938d913d2bc7a21eaa8f8219f20cd5a6 + md5: 0213e004a0cddcdc9618fa141294db39 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 18568514 + timestamp: 1760364337404 +- conda: https://prefix.dev/conda-forge/win-64/python-3.12.12-h30ce641_0_cpython.conda + sha256: 9e9d6fa3b4ef231fcabf00364319f4ffacb1fb683e6c61c2438bafe3c61a7e2e + md5: e672c6dc92e6f1fcac0f9fed61b2b922 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 15741664 + timestamp: 1760365715600 +- conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + size: 233310 + timestamp: 1751104122689 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda + build_number: 8 + sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 + md5: 8fcb6b0e2161850556231336dae58358 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 7003 + timestamp: 1752805919375 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + build_number: 8 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6958 + timestamp: 1752805918820 +- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda + sha256: 1b3dc4c25c83093fff08b86a3574bc6b94ba355c8eba1f35d805c5e256455fc7 + md5: fba10c2007c8b06f77c5a23ce3a635ad + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 204539 + timestamp: 1758892248166 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_0.conda + sha256: 5f6af64897b820011c424a4ee5fd018277b898ff5d81f8991118b3353bd10ee9 + md5: 428aed4a70236d95492c11da941fe1dc + depends: + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 197335 + timestamp: 1758891936824 +- conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py312h5748b74_0.conda + sha256: 690943c979a5bf014348933a68cd39e3bb9114d94371c4c5d846d2daaa82c7d9 + md5: 6a2d7f8a026223c2fa1027c96c615752 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 190579 + timestamp: 1758891996097 +- conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_0.conda + sha256: 54d04e61d17edffeba1e5cad45f10f272a016b6feec1fa8fa6af364d84a7b4fc + md5: 4a68f80fbf85499f093101cc17ffbab7 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 180635 + timestamp: 1758891847871 +- conda: https://prefix.dev/conda-forge/linux-64/qt-main-5.15.15-h3c3fd16_6.conda + sha256: 986dff37c0d4792f8e03f7313ffad28698fe80e9697f87cf54b895a456bd2e8a + md5: 5aab84b9d164509b5bbe3af660518606 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - gst-plugins-base >=1.24.11,<1.25.0a0 + - gstreamer >=1.24.11,<1.25.0a0 + - harfbuzz >=12.1.0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp21.1 >=21.1.3,<21.2.0a0 + - libclang13 >=21.1.3 + - libcups >=2.3.3,<2.4.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libllvm21 >=21.1.3,<21.2.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libpq >=18.0,<19.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxkbcommon >=1.12.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + - nss >=3.117,<4.0a0 + - openssl >=3.5.4,<4.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 5.15.15 + license: LGPL-3.0-only + license_family: LGPL + size: 52624585 + timestamp: 1760351016368 +- conda: https://prefix.dev/conda-forge/linux-aarch64/qt-main-5.15.15-h2f19be9_6.conda + sha256: a91610b6df6a4a3aadfe94356a217714841829ce71b965798ae219f5687ccf46 + md5: 27c3b4684b1fab3d79c9eb2d0268b449 + depends: + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - gst-plugins-base >=1.24.11,<1.25.0a0 + - gstreamer >=1.24.11,<1.25.0a0 + - harfbuzz >=12.1.0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp21.1 >=21.1.2,<21.2.0a0 + - libclang13 >=21.1.2 + - libcups >=2.3.3,<2.4.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libllvm21 >=21.1.2,<21.2.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libpq >=18.0,<19.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxkbcommon >=1.12.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + - nss >=3.117,<4.0a0 + - openssl >=3.5.4,<4.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 5.15.15 + license: LGPL-3.0-only + license_family: LGPL + size: 52013627 + timestamp: 1760203845477 +- conda: https://prefix.dev/conda-forge/osx-arm64/qt-main-5.15.15-h9b65787_6.conda + sha256: fc08534baa11c62f15e5c17d4572031786406b5c88c95d7f45832eccd7f28d4e + md5: 9f95e48a6f8e5d25969f42e79b09699a + depends: + - __osx >=11.0 + - gst-plugins-base >=1.24.11,<1.25.0a0 + - gstreamer >=1.24.11,<1.25.0a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp18.1 >=18.1.8,<18.2.0a0 + - libclang13 >=18.1.8 + - libcxx >=18 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libllvm18 >=18.1.8,<18.2.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libpq >=18.0,<19.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nspr >=4.37,<5.0a0 + - nss >=3.117,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 5.15.15 + license: LGPL-3.0-only + license_family: LGPL + size: 50274258 + timestamp: 1760356411596 +- conda: https://prefix.dev/conda-forge/win-64/qt-main-5.15.15-hb098fff_6.conda + sha256: 67d824d178229de4dae2e20815863e77512a2a6bf9ba4f32fef69763a56e3a4b + md5: 1152cdcffef46d1ae299a1a814527624 + depends: + - gst-plugins-base >=1.24.11,<1.25.0a0 + - gstreamer >=1.24.11,<1.25.0a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang13 >=21.1.3 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 5.15.15 + license: LGPL-3.0-only + license_family: LGPL + size: 59506014 + timestamp: 1760357612191 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://prefix.dev/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + sha256: d5c73079c1dd2c2a313c3bfd81c73dbd066b7eb08d213778c8bff520091ae894 + md5: c1c9b02933fdb2cfb791d936c20e887e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 193775 + timestamp: 1748644872902 +- conda: https://prefix.dev/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda + sha256: 0fe6f40213f2d8af4fcb7388eeb782a4e496c8bab32c189c3a34b37e8004e5a4 + md5: 745d02c0c22ea2f28fbda2cb5dbec189 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 207475 + timestamp: 1748644952027 +- conda: https://prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + sha256: f4957c05f4fbcd99577de8838ca4b5b1ae4b400a44be647a0159c14f85b9bfc0 + md5: 029e812c8ae4e0d4cf6ff4f7d8dc9366 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 185448 + timestamp: 1748645057503 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-action-msgs-1.2.1-np126py311hbc2a38a_13.conda + sha256: 21c3b06788cd8d7d6a8a4d66dc58131e486aae86f250d309ea69336fb4b1c450 + md5: f1fad637e992126ca6d4d6b4a2802f89 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-unique-identifier-msgs + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 114465 + timestamp: 1753311870223 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-action-msgs-1.2.1-np126py311hbdd918e_13.conda + sha256: ebd35ef6091a81ee14c9fad114e0cc35534cb8c19f352a6736ba520941ed196e + md5: 562b4ffa419d0aae6ab5ed1662aa5ffb + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-unique-identifier-msgs + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 119169 + timestamp: 1753312351735 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-action-msgs-1.2.1-np126py311h2a51a2c_13.conda + sha256: 0889e858d73619020bcba44cc1a870678dc20b8373b0c5818b6420d00555cf4c + md5: 56c700a20406c2574033a8ba625dce59 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-unique-identifier-msgs + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 107386 + timestamp: 1753311241104 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-action-msgs-1.2.1-np126py311hd5de103_13.conda + sha256: 36cffeac2bbc42ed9112db3527242364273a4185bf5f74e66e32b5fe07d7a7ab + md5: 6544237642cdd6be6af4596c331a176a + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-unique-identifier-msgs + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 119164 + timestamp: 1753323718948 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-1.3.12-np126py311hbc2a38a_13.conda + sha256: 4d6e11bc6d3f105a41def2d370bdc3f83721a8242cda74015d8dfdd4b687adbc + md5: 1649629c82db4f2fba285a7d833bcffc + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-definitions + - ros-humble-ament-cmake-export-dependencies + - ros-humble-ament-cmake-export-include-directories + - ros-humble-ament-cmake-export-interfaces + - ros-humble-ament-cmake-export-libraries + - ros-humble-ament-cmake-export-link-flags + - ros-humble-ament-cmake-export-targets + - ros-humble-ament-cmake-gen-version-h + - ros-humble-ament-cmake-libraries + - ros-humble-ament-cmake-python + - ros-humble-ament-cmake-target-dependencies + - ros-humble-ament-cmake-test + - ros-humble-ament-cmake-version + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 23210 + timestamp: 1753308348582 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-1.3.12-np126py311hbdd918e_13.conda + sha256: bccfdca99004dd2adabdcb246c902bd75c07150146f74b88423020ac0b32e043 + md5: 5b99aa73edb51c25e7b28957be22d162 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-definitions + - ros-humble-ament-cmake-export-dependencies + - ros-humble-ament-cmake-export-include-directories + - ros-humble-ament-cmake-export-interfaces + - ros-humble-ament-cmake-export-libraries + - ros-humble-ament-cmake-export-link-flags + - ros-humble-ament-cmake-export-targets + - ros-humble-ament-cmake-gen-version-h + - ros-humble-ament-cmake-libraries + - ros-humble-ament-cmake-python + - ros-humble-ament-cmake-target-dependencies + - ros-humble-ament-cmake-test + - ros-humble-ament-cmake-version + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22995 + timestamp: 1753308456229 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-1.3.12-np126py311h2a51a2c_13.conda + sha256: 4fd3da5acd60b8b803140786acac71b11734e7c68e498e81361da2c173c0da31 + md5: 8b53f88c38f35bef23cf2832f3d2c145 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-definitions + - ros-humble-ament-cmake-export-dependencies + - ros-humble-ament-cmake-export-include-directories + - ros-humble-ament-cmake-export-interfaces + - ros-humble-ament-cmake-export-libraries + - ros-humble-ament-cmake-export-link-flags + - ros-humble-ament-cmake-export-targets + - ros-humble-ament-cmake-gen-version-h + - ros-humble-ament-cmake-libraries + - ros-humble-ament-cmake-python + - ros-humble-ament-cmake-target-dependencies + - ros-humble-ament-cmake-test + - ros-humble-ament-cmake-version + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 23374 + timestamp: 1753308652441 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-1.3.12-np126py311hd5de103_13.conda + sha256: 199f7e125290e5580d54e4c65adf1e2cd9fe0b0e085e355597665f2254dd4de9 + md5: dd60cd540c7c5c193f70337335d2b1f7 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-definitions + - ros-humble-ament-cmake-export-dependencies + - ros-humble-ament-cmake-export-include-directories + - ros-humble-ament-cmake-export-interfaces + - ros-humble-ament-cmake-export-libraries + - ros-humble-ament-cmake-export-link-flags + - ros-humble-ament-cmake-export-targets + - ros-humble-ament-cmake-gen-version-h + - ros-humble-ament-cmake-libraries + - ros-humble-ament-cmake-python + - ros-humble-ament-cmake-target-dependencies + - ros-humble-ament-cmake-test + - ros-humble-ament-cmake-version + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 19988 + timestamp: 1753311884817 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-core-1.3.12-np126py311hbc2a38a_13.conda + sha256: fab93bf7eb9bc402772ccc6fdc2916da7ea230281bb89a358915beee71d8900d + md5: 5763c7ae02c1b0b502a4730545300ee5 + depends: + - catkin_pkg + - python + - ros-humble-ament-package + - ros2-distro-mutex 0.7.* humble_* + - cmake + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 44589 + timestamp: 1753307787788 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-core-1.3.12-np126py311hbdd918e_13.conda + sha256: a4ac4f0a0d9feb6fb52d3e04c93516dce42f970091cfbf6a31ddc05eba6f22e8 + md5: db4488b3571e3db69772aa37cc569eec + depends: + - catkin_pkg + - python + - ros-humble-ament-package + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 44445 + timestamp: 1753307965911 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-core-1.3.12-np126py311h2a51a2c_13.conda + sha256: 77e766efdd75303ca725f36652e5092a6f165e77c94fc28188d2c9562a4a2a8c + md5: 5bcf366df8252ea2690e1175fd1918fe + depends: + - catkin_pkg + - python + - ros-humble-ament-package + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 44794 + timestamp: 1753307871726 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-core-1.3.12-np126py311hd5de103_13.conda + sha256: 8d6d8e00f6d457db11ff48635dd72536862b39ced0026075acd75d61a946e89e + md5: 5e97d822162cb3ae2abf8f719c900e4f + depends: + - catkin_pkg + - python + - ros-humble-ament-package + - ros2-distro-mutex 0.7.* humble_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 41073 + timestamp: 1753308029869 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hbc2a38a_13.conda + sha256: c4c0cbc9db98cf3291c7f5ae023b8b4c43c0efb46e8a45397e72d7d358d9b79e + md5: ee0436ad07f83655ff1881ca16919301 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21897 + timestamp: 1753307891039 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hbdd918e_13.conda + sha256: 495ce5bed198696a29db6094042b1e419cc8375f7e0fe07c04c836ac92e28303 + md5: 09ec598201dd9efe9facf232c41ee462 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21741 + timestamp: 1753308071258 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311h2a51a2c_13.conda + sha256: dd4198a80ac4c20085ed398c6d25acdfb98e5ee89fbc99e2124660bc5ae55807 + md5: 6e43908c64af81707040aa51b3544d94 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22166 + timestamp: 1753308035981 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-definitions-1.3.12-np126py311hd5de103_13.conda + sha256: ba43badfc6e44bee0744d520a95eda6caa57ad8176adbead6a53841b6307d902 + md5: dbb3c7cd17a6f83773ad4b4104420ad9 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 18721 + timestamp: 1753308727006 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hbc2a38a_13.conda + sha256: cdf6b73df8b9557f8321c1158849d76f4656bbd262a282d737142423a308ac07 + md5: 7641228e57cc9a4f1c644da0764ba413 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23070 + timestamp: 1753307988740 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hbdd918e_13.conda + sha256: 89a915d502aff0c5d1e81ecdb983bd811bcdca4cc3aae7418bc30624ebef8801 + md5: 2e5d68f277aec93115719dc4812d610d + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22896 + timestamp: 1753308131118 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311h2a51a2c_13.conda + sha256: fdaa2f6ca73038736d0b5a41973dee842cefcef6f714606e1cec582a04b005b2 + md5: 28c64040d14174873306b8d61350442d + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 23356 + timestamp: 1753308205764 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-dependencies-1.3.12-np126py311hd5de103_13.conda + sha256: 68d9b4d2273df0f290afca16970ee578faca1de631181f8ea0ed23ed2dc5320b + md5: d7b89b404f686c1cc06c37c1933f9ec1 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 19938 + timestamp: 1753309426878 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hbc2a38a_13.conda + sha256: 872e8271e93d52edd325c8252b1980e5f0963cb885466473904e1a89d94e1bd1 + md5: 7ddd803dc20784605034c2bafe6c3c44 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22301 + timestamp: 1753307886996 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hbdd918e_13.conda + sha256: b2d0d91ad126e654486e62ce73079aacf55dfbc70c2176e157b0411f4bc9b1f5 + md5: 23b124251b4d80384c7ca556c9b3c9a3 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22159 + timestamp: 1753308066612 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311h2a51a2c_13.conda + sha256: 0ce61517a4b68e41abce271785db7d23e3a80cfda2c441d501820b7e2ea2527c + md5: aac6ff3077feeef672500fca4ef8975a + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22610 + timestamp: 1753308027659 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-include-directories-1.3.12-np126py311hd5de103_13.conda + sha256: 02ae68371d6028522229445bd21ddf1005ff2f4deb4e161c40ce0942aea58bc6 + md5: c1f27de4924b6469ef3b26ba6633970c + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 19107 + timestamp: 1753308694089 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hbc2a38a_13.conda + sha256: 6f73c54c521cb37f79bae5932228de0a50f836cb964181a2416c4217350980c6 + md5: 3e9677129b305246fac3015457c0a055 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22516 + timestamp: 1753308023722 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hbdd918e_13.conda + sha256: d1e31bb36f2051f75d315b7691fd7d3a46f0bd10784c7a7a9836b38f092816f9 + md5: eeeedf1396d3d228c2c1aee4d6881292 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 22374 + timestamp: 1753308163997 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311h2a51a2c_13.conda + sha256: f4742772737ba430db54bb5febb9a1b6e2c29a5e5d0dfa0fd7217c34e86ac72b + md5: 6a29ee631df16b590088aee67f28aa91 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 22800 + timestamp: 1753308244667 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-interfaces-1.3.12-np126py311hd5de103_13.conda + sha256: 30cd102b353337c2d79bd9757edeec2900c77a396f2c89d5b5305beb773ef688 + md5: 9fc8e557525825eb327390b4d239d110 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 19298 + timestamp: 1753309384173 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hbc2a38a_13.conda + sha256: 280c44edd7673c1181cc1b0c233cef721629235e79f1f015b6a6deb28597fd99 + md5: 7ff1c47e0fde601fb4c4fb1aa967a24e + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 23872 + timestamp: 1753307865993 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hbdd918e_13.conda + sha256: dff642f1af40f94a91b61718983e8e253fcaae0201f34f1ea3635f587d1bce7e + md5: 433b1b125798e6103a16c222d75d658b + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23704 + timestamp: 1753308041137 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311h2a51a2c_13.conda + sha256: 2d360731b01a2b58b2bae858fb39bc15578b807924d5f089a6d8fac209e43c3a + md5: 1a06570ee8756c0eccc5b9639f8e7367 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24137 + timestamp: 1753307981303 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-libraries-1.3.12-np126py311hd5de103_13.conda + sha256: 01ba01d5cf31c521d3b7c93b82ebfe434f12958082133a90bb4e83a44182e593 + md5: 5d2b3a4c6d7ebb67e80b965f0d483c2d + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 20646 + timestamp: 1753308567083 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hbc2a38a_13.conda + sha256: 250192f9b573ff677874f9bf446e60ca70ca323701059a4af9e0f0cc57c0e872 + md5: bbc7a0d2df5d9fd76f5f96bf8dab3b68 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 21848 + timestamp: 1753307882942 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hbdd918e_13.conda + sha256: 5a54e37d07fd0fcdae7f9e44ddeefbfb30dfe26261d72d28d911f8d24ac24085 + md5: 7df6f8181444e7373dbc66d875d3e1cd + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21719 + timestamp: 1753308061549 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311h2a51a2c_13.conda + sha256: 30eab5cfae91579dc2ff20b5a9f3181a61426eb865c63e396da95e5c5f36177c + md5: 247935bce1c2932d85d3f22d5fcda9c4 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 22126 + timestamp: 1753308018424 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-link-flags-1.3.12-np126py311hd5de103_13.conda + sha256: a0cd258a87606899e2bfc70e8f1dc22e748f9f66675209063b2de50588469693 + md5: 71d263803353d893c3c1b9c1bd09c653 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 18620 + timestamp: 1753308655671 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hbc2a38a_13.conda + sha256: 1f8e400eae1476d1a655b83ecbc7358bf1e34d3da8bdf8ebc9abf4dbd9069d99 + md5: 5faa8002bb3d3fed9c99778864f4b9f2 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 22647 + timestamp: 1753308019007 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hbdd918e_13.conda + sha256: 9b9778d4e4eb8628ceadbf771cfac3f71e9a4d13cda181c63e9052dd3173833b + md5: a3f008693a1cdcaea6c02552f27cb8fc + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 22469 + timestamp: 1753308160266 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311h2a51a2c_13.conda + sha256: ea4dc958f9c8ea2dc884ad7cf921081a71af74141a21c5218844208ed44e5073 + md5: fde004a87952115b936f9859c3dd5573 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22944 + timestamp: 1753308239314 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-export-targets-1.3.12-np126py311hd5de103_13.conda + sha256: 60712bd70edb94ce69348c4a1bbdb116af4350d7d340df21af78665961153cfd + md5: 3b165d8869d6a40c60ec71c859afad23 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-export-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 19428 + timestamp: 1753309340088 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hbc2a38a_13.conda + sha256: cfc258e03014b069cf64ca46e7a782654fa1a7293530df38fd17d008c96164be + md5: b40fb9ad16e8730abe431cd12cdbb75f + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24622 + timestamp: 1753308231944 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hbdd918e_13.conda + sha256: 8a1c82cddbbbf15647d6b1120fcd77c84020572fae177c406bf8a91d8ca55329 + md5: 9d4e61e74158bdcb5e96a58e070ca70e + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24447 + timestamp: 1753308354651 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311h2a51a2c_13.conda + sha256: 9e337d677d113ef70151fc50c84d95a0cbd346cef9808201fb0df3099150ccba + md5: 9282fe3b5ad644a164b0a522c98d95cd + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24905 + timestamp: 1753308544972 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gen-version-h-1.3.12-np126py311hd5de103_13.conda + sha256: b1a40ab847d751f38c444a9df0f7e380038dbe42982c686019d753cc442b906f + md5: 288d2758185d096704dfd75f6166fe9c + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21453 + timestamp: 1753310674710 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hbc2a38a_13.conda + sha256: 42ae5a29073840fd4ecb48c0f8f1c8cfbb702c4fa17197ab669f2cf973de0d38 + md5: 66ced229ef0fe5050d74a6f96b1a27a8 + depends: + - gmock + - python + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-test + - ros-humble-gmock-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24278 + timestamp: 1753308239287 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hbdd918e_13.conda + sha256: b42557194c510fbc39a9967572adeb4250bff7eea4e6f8864020a7aa0d7df872 + md5: 94941e0cd973a884d51581035b0c2111 + depends: + - gmock + - python + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-test + - ros-humble-gmock-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24070 + timestamp: 1753308362876 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gmock-1.3.12-np126py311h2a51a2c_13.conda + sha256: cfd4743b79f722a47aa22154fb864e2c327427eff8e5a95bb87fc3a6f4268661 + md5: cd7e2860928731b48477db9189815c1c + depends: + - gmock + - python + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-test + - ros-humble-gmock-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24485 + timestamp: 1753308555800 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gmock-1.3.12-np126py311hd5de103_13.conda + sha256: b018dc3aa2aecb1010dabf972097efeb8a2ece61ef1272ce167415c6622535cb + md5: f8f66e3a546d0bab3327e2431bd68e31 + depends: + - gmock + - python + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-test + - ros-humble-gmock-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 20986 + timestamp: 1753310787227 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hbc2a38a_13.conda + sha256: f6f1601109636593090677e4494e9d0accb61283c211790418db5b734675846c + md5: 11ee70956b0348b50f570945c80b1b03 + depends: + - gtest + - python + - ros-humble-ament-cmake-test + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - gtest >=1.17.0,<1.17.1.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24463 + timestamp: 1753308117873 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hbdd918e_13.conda + sha256: ddc66064fdbf38f75067d5f764ae96d37ee7ed532cb1c308d58426f2207a3213 + md5: c83cff8957336de829a0c4d1b0af10a1 + depends: + - gtest + - python + - ros-humble-ament-cmake-test + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - gtest >=1.17.0,<1.17.1.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24289 + timestamp: 1753308247128 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-gtest-1.3.12-np126py311h2a51a2c_13.conda + sha256: 8414f028348d1793af8d245e21b654aaa08036f4bea195a490ecbd82c12c5e73 + md5: 060def4787ccb0c86030f1f650cfda6d + depends: + - gtest + - python + - ros-humble-ament-cmake-test + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - gtest >=1.17.0,<1.17.1.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24744 + timestamp: 1753308382582 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-gtest-1.3.12-np126py311hd5de103_13.conda + sha256: d8e7408f3627348ec03d8e2fd6da4ce574d0312d0cac9babab7873e756f8cc3d + md5: 894f45a461ef772274ca24bda9009824 + depends: + - gtest + - python + - ros-humble-ament-cmake-test + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - gtest >=1.17.0,<1.17.1.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21204 + timestamp: 1753309928588 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hbc2a38a_13.conda + sha256: d8877e617988bdc248b5651330eaa8775d43fd71d4492edc5cebe9e31ef71826 + md5: 8ca2d3e9898dbefbaf66da268901f42d + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 21763 + timestamp: 1753307894188 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hbdd918e_13.conda + sha256: b218a2407b36d17482a5917de62bb7ba82d34dd01cf496b5c76cd3f89055800a + md5: 83b37591d7fcb90a3624a821055ecc87 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21635 + timestamp: 1753308073850 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311h2a51a2c_13.conda + sha256: 62163e5c0190590eca621309123623103f96fd9c79a03261c66acf3cd3a2649a + md5: d5d0201256507f6af9e37de564335ff6 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 22037 + timestamp: 1753308003837 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-include-directories-1.3.12-np126py311hd5de103_13.conda + sha256: 3b7faea541c543b5bbec07a662980286cb2c76b5e5b2889866104f6f9ed366cf + md5: 6cf19b3f74c08a3376debeee30af2d28 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 18605 + timestamp: 1753308519660 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hbc2a38a_13.conda + sha256: a92be34c0f93024848764df1083bf5dcadd4a6cabe13ad89f8b2d53ddd86cb9f + md5: b25c310d10af0f1dc778c294284233d2 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 21471 + timestamp: 1753307890281 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hbdd918e_13.conda + sha256: 535f72fc50b8a923ae3d212fc4d6c6ff3440b5ff2bd40d2b9a2a6b52e3b8a722 + md5: 9844c880ab861d164528dc551db4771e + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 21321 + timestamp: 1753308070125 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-libraries-1.3.12-np126py311h2a51a2c_13.conda + sha256: 5d520debcb590c84f7b53385748899ee474d2de8fb3c713b1d826a732ebad5b8 + md5: cc5bc033e3b933f1554171a8df86441e + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21745 + timestamp: 1753307994047 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-libraries-1.3.12-np126py311hd5de103_13.conda + sha256: 98e4c8123a8170fbdacb8b3c2df441e31b4d1f37cc515bfcd2ab3587c6f186a7 + md5: 1678ec1553b9139d4f755930656221fe + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 18214 + timestamp: 1753308478455 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hbc2a38a_13.conda + sha256: 1fa1429a4c42aeb0fef694e92b607bf4cf78ad03f112277226b971991ebfa0b9 + md5: 876e0a9d3af99e4ae0e579263bdc8e30 + depends: + - pytest + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-test + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24765 + timestamp: 1753308133244 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hbdd918e_13.conda + sha256: 02e49d808a3177578f667e26c8bc8c3e0586ec851a9da188e1a5c9d94eb12107 + md5: 1a96abde9a297690f3ef173440e22894 + depends: + - pytest + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-test + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24642 + timestamp: 1753308261896 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-pytest-1.3.12-np126py311h2a51a2c_13.conda + sha256: 3d091b83f69481c05bb28563170fc090bbdde6adf2f2475ca2f131f61b9ef07d + md5: 12895a75851aa581c98066678b19093c + depends: + - pytest + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-test + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24975 + timestamp: 1753308403553 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-pytest-1.3.12-np126py311hd5de103_13.conda + sha256: dfc7f70eec93d8067a54e30fd821ca68328a5bf5b3e9688de3e38e78472edcc8 + md5: 11629758eb914b64087e2d3b99650026 + depends: + - pytest + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-test + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21519 + timestamp: 1753310059601 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-python-1.3.12-np126py311hbc2a38a_13.conda + sha256: 3a16f43ef92450cb56611045f5f61a89f9fc4fdfd4b80eef5ee996d85275a7f6 + md5: 32b08b7d13b1dc3d9a0f879267a7b1dd + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 24071 + timestamp: 1753307879122 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-python-1.3.12-np126py311hbdd918e_13.conda + sha256: e8500c2cffe14433c885561ca39b50d00c351b3457e9cbd2a23b1df3daffc45f + md5: dfc07166e7c72587db34c89d5e4cdf20 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 23939 + timestamp: 1753308059170 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-python-1.3.12-np126py311h2a51a2c_13.conda + sha256: cfefedea7f76f8262a60b61505d3858b4ea988b3ac3650ab04fea4dd1c22f5af + md5: ee7e775d5283d5dc05612de4d4a5fcae + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 24349 + timestamp: 1753307975915 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-python-1.3.12-np126py311hd5de103_13.conda + sha256: f2f214e84c12a848b4a1a37d536c1eae7d39fd4715876cd484cd3a4f6b03e3e6 + md5: f2ab7d030f41f1ec6a898ddac1a60bb8 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20891 + timestamp: 1753308386191 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-ros-0.10.0-np126py311hbc2a38a_13.conda + sha256: fcdfb6c6574de1ea672548fcd65ddba07a59f958577786700c9d9fe0c40f8bbd + md5: 0b4106f6cc55892a8f22e67718fbbfee + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-cmake-gmock + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-pytest + - ros-humble-domain-coordinator + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30720 + timestamp: 1753309547004 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-ros-0.10.0-np126py311hbdd918e_13.conda + sha256: 08746b2c7749a020b9d4d804359b923a7763492a9f05712bfc67f9effe489454 + md5: 4cee143f4272155f8078cee800b8f66f + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-cmake-gmock + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-pytest + - ros-humble-domain-coordinator + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30556 + timestamp: 1753309424594 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-ros-0.10.0-np126py311h2a51a2c_13.conda + sha256: 25cc29853a4fbf65495a53eabf7b6dad09150441d5bd79f41a67f58f436e4a44 + md5: 696a7940d1ff70149279aa108cf05895 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-cmake-gmock + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-pytest + - ros-humble-domain-coordinator + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30864 + timestamp: 1753310206767 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-ros-0.10.0-np126py311hd5de103_13.conda + sha256: ceebda7322d57a9e073878fbfcd10ee393b7a2e635af755588cf2532b1704e68 + md5: 972022aa3c51ec45a85e946b3b3c9438 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-cmake-gmock + - ros-humble-ament-cmake-gtest + - ros-humble-ament-cmake-pytest + - ros-humble-domain-coordinator + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 27380 + timestamp: 1753317648004 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hbc2a38a_13.conda + sha256: 7b6165840464f4c9f4c8c39a7e7b45539064df8ac93741bf2b9bb238c98a2965 + md5: 5acf2594bde44ef6415d5dd531e076f0 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-include-directories + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 23489 + timestamp: 1753308014306 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hbdd918e_13.conda + sha256: 1738ef7a350a9c51172c06a0145fc98afba8336c7e9ebe0f832fd9fccfdc8a2b + md5: ab5ed13a1d1fce3d16c83512be7d59f7 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-include-directories + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 23343 + timestamp: 1753308156485 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311h2a51a2c_13.conda + sha256: 89d18f6c2447f3412ffe55defbee107e24201cd9682ff53557fb0c88a62b5aec + md5: 38198d759d4a72bb5342c73c8f16986a + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-include-directories + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 23730 + timestamp: 1753308233894 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-target-dependencies-1.3.12-np126py311hd5de103_13.conda + sha256: 08b3e7974491a3cb232e20fc159179ab0fd4a3492e47cdf427a5b855e15ed265 + md5: c1912a88fb3db58edfa6e5f234151712 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-cmake-include-directories + - ros-humble-ament-cmake-libraries + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 20300 + timestamp: 1753309296042 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-test-1.3.12-np126py311hbc2a38a_13.conda + sha256: 516da16d732c14ea6d2d3d21a0c56293add4aeeb25fc847dadaf87e02286f73f + md5: e7359c304fc5e96ab631d74d199c78d1 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 36052 + timestamp: 1753308004911 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-test-1.3.12-np126py311hbdd918e_13.conda + sha256: 52d9130db3b491d77ca7c8a961420d2c72ef9e595ed409fcc32331e0a33e6905 + md5: 537841be3ce2e19d858fa7cd1b1fb5d8 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 35915 + timestamp: 1753308149903 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-test-1.3.12-np126py311h2a51a2c_13.conda + sha256: 90d007071357211ebd790c9331313ee5e506f96c12a5fcb75f49a0410db889d5 + md5: b28acde249ba1eaf4fe41ca8f630bded + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 36340 + timestamp: 1753308223645 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-test-1.3.12-np126py311hd5de103_13.conda + sha256: da3dfa9234ab2791369e6a5c68d69c561c9724acdfa9c0c60725844b983bbabc + md5: cffaf502b573b1ee3b4737c134b6cdd5 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 32907 + timestamp: 1753309221361 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-cmake-version-1.3.12-np126py311hbc2a38a_13.conda + sha256: c5cd05ecb129b27b78c6c30763f1523f1a040490409ac9a679f039552ef78148 + md5: f3e5e3e3bbb2eda878b025ece3636988 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21637 + timestamp: 1753307878758 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-cmake-version-1.3.12-np126py311hbdd918e_13.conda + sha256: 8189fd9ba75e6b5f6070b5a32383f00471adc95c74f69388c9062b5a0bc646b2 + md5: 9d3aa6b4f1c42699217d2bdd804ef16a + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21491 + timestamp: 1753308055987 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-cmake-version-1.3.12-np126py311h2a51a2c_13.conda + sha256: 00a11735f07cc56142d37db1f9efbccba7072dd3ad4c9b63338eb5f21bc78e5f + md5: f2c358911853092638904798790844c2 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 21910 + timestamp: 1753308006733 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-cmake-version-1.3.12-np126py311hd5de103_13.conda + sha256: ab2fab22225d82d6c39f905c1ebc1632e5010e9835e7b25ecdc3cc9dfbc474ee + md5: 2f28c0751b928671fbbdaafc0f72b33c + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 18484 + timestamp: 1753308612176 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-index-cpp-1.4.0-np126py311hbc2a38a_13.conda + sha256: c0a5374508d1dc56228f22051f3865144bf08aaddd3d13835c0168e25cfd8df6 + md5: b36a77e2162d025a1ab5e3ba9ae66845 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 45335 + timestamp: 1753309795989 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-index-cpp-1.4.0-np126py311hbdd918e_13.conda + sha256: 0fd8a3107b13f85df8aab01e7a4f3a00a49c8cda1f72a6e9a6f29c6b3040a6d9 + md5: 16da241942ee781f4425f41bd0fe0c85 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 45033 + timestamp: 1753309579694 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-index-cpp-1.4.0-np126py311h2a51a2c_13.conda + sha256: 005adf55307cc8be825ace7a76d252393ad3399d5e7c009a23d3cc6928819e26 + md5: bac00a03565f93cf4b831d15a019767b + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 46051 + timestamp: 1753310268755 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-index-cpp-1.4.0-np126py311hd5de103_13.conda + sha256: 804012704f13c2ddd922f21def8215cd5f9880b4c277fdbeddf24ee387b0d869 + md5: 2dcb2bafe9826789b1fc99c17e0b06ba + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 49423 + timestamp: 1753318509344 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-index-python-1.4.0-np126py311hbc2a38a_13.conda + sha256: 7da6e6f9b1760ac32ef1cda1be24bbe5bd5d8612c9e65bd928c9041b8eba7b7c + md5: 16f29046f8e8bf37b93a61141270ee81 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 28584 + timestamp: 1753308368527 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-index-python-1.4.0-np126py311hbdd918e_13.conda + sha256: 50199c2bd094d22ddda3f88e8d647a37d58658e262179ee3eb30772c9d69dfc9 + md5: 5d18b824d5d2bdfc3334aef385f84623 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 28414 + timestamp: 1753308473822 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-index-python-1.4.0-np126py311h2a51a2c_13.conda + sha256: ff37c9cfb87f16661d66328e5eca73571e3d00ba7a1c04e1a31b5cb68565534b + md5: 6d65858035e7bd4ee2ccd9d224d6b4e5 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 28637 + timestamp: 1753308675116 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-index-python-1.4.0-np126py311hd5de103_13.conda + sha256: f7cea2e7a7c6a06ad5b3bf9fefd169491536543a22a1de1319633255ff7f8140 + md5: 854584aab7814f7fd0747a8f0ffd84ec + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 33261 + timestamp: 1753312076219 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ament-package-0.14.1-np126py311hbc2a38a_13.conda + sha256: e1c9e124e5a82fbf65d88855f8d1f15c9d0de480863d61a67bcb0b442dc2ad66 + md5: bd4682d4a375f354d691d65e79cb2995 + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.7.* humble_* + - setuptools + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 47535 + timestamp: 1753307768122 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ament-package-0.14.1-np126py311hbdd918e_13.conda + sha256: f7d3699db7a0b8c11031cdf410b1ed1e8e1860ee3f1a8c832438a4a0d9479bca + md5: 41de3f96a3620038b7f923e59d048a68 + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.7.* humble_* + - setuptools + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 47373 + timestamp: 1753307949222 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ament-package-0.14.1-np126py311h2a51a2c_13.conda + sha256: f9851a6757e3fdb6ea7b39215e3d4b73b9083b3077a00610f80086e1e22dc0e5 + md5: dac6839fa31f81d042e74bd038a64ecc + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.7.* humble_* + - setuptools + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 47709 + timestamp: 1753307859094 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ament-package-0.14.1-np126py311hd5de103_13.conda + sha256: 460329eaff66a308a34834591ce276291f9c13ab33bfb992fb06080bfee2f0bf + md5: f809718cbc0f2420465609c12317257e + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.7.* humble_* + - setuptools + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 39545 + timestamp: 1753307972060 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-builtin-interfaces-1.2.1-np126py311hbc2a38a_13.conda + sha256: f5ebc8075baaa6bf5e03425026d34d1b1be3d44a0731401bd51afa639ca66740 + md5: de5e2635e51811b0665d011c976ea7a2 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 74224 + timestamp: 1753310575729 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-builtin-interfaces-1.2.1-np126py311hbdd918e_13.conda + sha256: fa86376439fa69569d9eb77836eae05166885776f42cebcf2ce3cf541a5e185e + md5: 451019409c495cfe10b2236e1897a0f4 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 77949 + timestamp: 1753312285608 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-builtin-interfaces-1.2.1-np126py311h2a51a2c_13.conda + sha256: 4dfffd1a8cfaeaf9ca47cf64670119f5e6edf01b41ed57b7cd50b31e218e12f3 + md5: ca1ae998a6656b24c5635b3007c864df + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 70197 + timestamp: 1753311158592 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-builtin-interfaces-1.2.1-np126py311hd5de103_13.conda + sha256: 31e37c5add1fb81bde4ab1103dd6d59c217b9180429d21805022b452ae641a9a + md5: 82528b0ddefce8a2cbe6b85027d910d1 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 80157 + timestamp: 1753323072448 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-cyclonedds-0.10.5-np126py311hbc2a38a_13.conda + sha256: 13ab35228674132d0ecb601c25dc7e12731f4c851d2364267e7e45c89c8e8e94 + md5: c86ab3549fb7c876cfba9ca5380f9fe5 + depends: + - openssl + - python + - ros-humble-iceoryx-binding-c + - ros-humble-iceoryx-hoofs + - ros-humble-iceoryx-posh + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.1,<4.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 1194390 + timestamp: 1753308243703 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-cyclonedds-0.10.5-np126py311hbdd918e_13.conda + sha256: ae0dd0fdc594f8768e1c2a6c61c2d802cea724655638f01120eaad98d8d14aa5 + md5: edfaa353951f9619cd6ddaf16596c670 + depends: + - openssl + - python + - ros-humble-iceoryx-binding-c + - ros-humble-iceoryx-hoofs + - ros-humble-iceoryx-posh + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - openssl >=3.5.1,<4.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 1242057 + timestamp: 1753308367100 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-cyclonedds-0.10.5-np126py311h2a51a2c_13.conda + sha256: 586e7f8948073bdfea5e3f1d5fa4fb8f0f4f16e2a38c32ee093602cb08dbb4fb + md5: 125b444b345ed8b5b72e161feec90559 + depends: + - openssl + - python + - ros-humble-iceoryx-binding-c + - ros-humble-iceoryx-hoofs + - ros-humble-iceoryx-posh + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - openssl >=3.5.1,<4.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 1053739 + timestamp: 1753308561883 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-cyclonedds-0.10.5-np126py311hd5de103_13.conda + sha256: 8e3471137d6adb34c102441ee80a74d5e24705471d329b83c237867d6b27ad88 + md5: eb2993288c968a370cf8eff73f87329b + depends: + - openssl + - python + - ros-humble-iceoryx-binding-c + - ros-humble-iceoryx-hoofs + - ros-humble-iceoryx-posh + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: BSD-3-Clause + size: 1080300 + timestamp: 1753310855102 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-domain-coordinator-0.10.0-np126py311hbc2a38a_13.conda + sha256: 19055d6b7c212e1a85fbc55ea65a3c195b6f4901103aedf99fd6a1acf1151358 + md5: 8932d8b6155c236c96643efaaa84a64b + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 20553 + timestamp: 1753308334209 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-domain-coordinator-0.10.0-np126py311hbdd918e_13.conda + sha256: 0ba2ba26276465a70b0d59675fd81d43f73f6b6bf0d2250279258c4e56c7b2ef + md5: b5907d10693f93069a6b5b8e35b66cff + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20397 + timestamp: 1753308438235 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-domain-coordinator-0.10.0-np126py311h2a51a2c_13.conda + sha256: 35d5082c1597cb079be637eaa2311d57ceababc3da4bb05a257939acda1ba065 + md5: e7b5b8efb7c4f5dfab1475bee9459bbc + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 20680 + timestamp: 1753308639842 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-domain-coordinator-0.10.0-np126py311hd5de103_13.conda + sha256: c22c3921ace4a60d2ab2efa598c71625316b68cc9eb660a56bf29ec7d8e98917 + md5: f5fc0dee43393873f3d4d3c1a881a58c + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 17464 + timestamp: 1753312127526 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastcdr-1.0.24-np126py311hbc2a38a_13.conda + sha256: 2884bac4fe1ad38443470ad62119371f9d2c10a8937471de1d0303dedf90f4d5 + md5: e838ab8ea5d838183fc6e1313debc4e8 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 66441 + timestamp: 1753307873500 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastcdr-1.0.24-np126py311hbdd918e_13.conda + sha256: 2be3c46c7fafb746ea64a0a674e16342100c88bd8e77e011a22855938f9b4e05 + md5: b6c3f84ee4d0401ec5402f8c8301d2c7 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 63234 + timestamp: 1753308055528 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastcdr-1.0.24-np126py311h2a51a2c_13.conda + sha256: 24859b86f7fb26e3231413929d83d30ce7e4858dfa510ba282b18088a810bb69 + md5: 6240044cf822aadbb1e2498b07ba8c6d + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 57498 + timestamp: 1753308058181 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastcdr-1.0.24-np126py311hd5de103_13.conda + sha256: 948c23dc48dd99e944173e96b15918f62980716abcc414d45c597af10104d1df + md5: a39224903a76da3d3ddae7571b499923 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 76739 + timestamp: 1753308508705 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastrtps-2.6.10-np126py311hbc2a38a_13.conda + sha256: 56602df0fe33a5d51e93ea09449cc7c17cb2be54f1b33f6a88ec45cd34bb21d4 + md5: d87600fa1e95c5bc0398ea4b627feb8d + depends: + - openssl + - python + - ros-humble-fastcdr + - ros-humble-foonathan-memory-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - tinyxml2 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - openssl >=3.5.1,<4.0a0 + license: BSD-3-Clause + size: 3652097 + timestamp: 1753309543960 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastrtps-2.6.10-np126py311hbdd918e_13.conda + sha256: 17adfee95866219df214cbc23fb76f335ca62a4adf31fe8b55a05806f24f01dd + md5: b961528c44025befcf352d07057ade07 + depends: + - openssl + - python + - ros-humble-fastcdr + - ros-humble-foonathan-memory-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - tinyxml2 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - openssl >=3.5.1,<4.0a0 + - numpy >=1.26.4,<2.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + license: BSD-3-Clause + size: 3504530 + timestamp: 1753309398491 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastrtps-2.6.10-np126py311h2a51a2c_13.conda + sha256: 2ceb70cd206e812216f1e50208746c5c13a4ac8f9ec70ac3ea0862b19bba3c28 + md5: dcc71a57047a7f391cfdc11dd7208e44 + depends: + - openssl + - python + - ros-humble-fastcdr + - ros-humble-foonathan-memory-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - tinyxml2 + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - openssl >=3.5.1,<4.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 2598215 + timestamp: 1753310112593 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastrtps-2.6.10-np126py311hd5de103_13.conda + sha256: a09f749ffa93ff2223543092d8f5c2f67c9cc3d36aecefc693ca1fda42f1cf9a + md5: 8dd3a16363a63855a8b109e7478e54dd + depends: + - openssl + - python + - ros-humble-fastcdr + - ros-humble-foonathan-memory-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - tinyxml2 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - tinyxml2 >=11.0.0,<11.1.0a0 + - openssl >=3.5.1,<4.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 2805787 + timestamp: 1753317884716 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hbc2a38a_13.conda + sha256: 6a44efd57eb66b390f43c5f10472a297ba7d4efead8d63672963abee93092c89 + md5: 0ea2c70bb15ac15ca34f52ed64205915 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 26674 + timestamp: 1753309531630 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hbdd918e_13.conda + sha256: b4125901bd3242cf6814e86ee00426c4829208ca756853e8182faa4c565bacdd + md5: 1037e6e0f1392ab2de564e96248658b4 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 26580 + timestamp: 1753309383682 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311h2a51a2c_13.conda + sha256: 7007d048e71ca2a6309c744529a7bc16eecd96046ca1030dd9d3e0abe1f298a8 + md5: a0a85aa567a71cfbbbfb6f7b05bdec33 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 26804 + timestamp: 1753310096066 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-fastrtps-cmake-module-2.2.2-np126py311hd5de103_13.conda + sha256: 02c65336766634b364ef00a33112fafcc02b8fa337aa63087aa8cf0e225a28a4 + md5: 32c1d2488a1ebf97c021be21cfde0421 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23332 + timestamp: 1753317820679 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hbc2a38a_13.conda + sha256: a92ff1fc0e77fd1774a0eebb8a4b8a2ef4bc470a1cb930a80206d3f355f15bf6 + md5: 9971d1b14a4728a3e29aee5ce713732c + depends: + - foonathan-memory + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 19378 + timestamp: 1753309101789 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hbdd918e_13.conda + sha256: df70d730cd6bef9acc0ba0349e6629b6510c36b475915835508f481b63708307 + md5: 63cb215f2ac089c877c54726928f15b6 + depends: + - foonathan-memory + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libstdcxx >=13 + - libgcc >=13 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 19277 + timestamp: 1753309082086 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311h2a51a2c_13.conda + sha256: abf1815ab4b901aef0eeedd43b91cd915b7169cda04dba84c4662a1b33a362ef + md5: bc6455a42df88f62fb1b95aa9606d9f8 + depends: + - foonathan-memory + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 19507 + timestamp: 1753309718021 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-foonathan-memory-vendor-1.2.0-np126py311hd5de103_13.conda + sha256: 3f162f403113afa54214718618a28b28354064166f91af3dbf2b94485e043378 + md5: bfcd974cf05625ecce3fa3d41a732a62 + depends: + - foonathan-memory + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + license: BSD-3-Clause + size: 16712 + timestamp: 1753315711328 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-geometry-msgs-4.9.0-np126py311hbc2a38a_13.conda + sha256: 66aac3623a511209119c1632331f3055cd2b9c8dd612490d5151221a8e715105 + md5: 1dffeaa1fd651a86000aabac131b8b25 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 310994 + timestamp: 1753312092170 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-geometry-msgs-4.9.0-np126py311hbdd918e_13.conda + sha256: 04c8810122b5fc73873b59a411765f0663d1f35424ac3d677d3d1e917e8d8021 + md5: 352ab9280e0842c4946f7d9af4307847 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 318747 + timestamp: 1753312548157 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-geometry-msgs-4.9.0-np126py311h2a51a2c_13.conda + sha256: 6f913ed64d85cbaa2209496229201da1354908dcba593f873e12c196caef3262 + md5: b536f6bb35298207283ace3323255e54 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 275633 + timestamp: 1753311463894 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-geometry-msgs-4.9.0-np126py311hd5de103_13.conda + sha256: 15676d587583827aac5f36a7f3bda5f7cc7324fdfb83ff2c5922612936798e1d + md5: e41bdd25df43765145b9a720818d5a82 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 291672 + timestamp: 1753325310886 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-gmock-vendor-1.10.9006-np126py311hbc2a38a_13.conda + sha256: a203ca16a1f236265451d373c5f1c5e2731a263507d58c4b03b3e5c72b4d07db + md5: 0b255e45bea39b318451818a47d04f73 + depends: + - python + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 113577 + timestamp: 1753308001062 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-gmock-vendor-1.10.9006-np126py311hbdd918e_13.conda + sha256: 7b54fd7b62a6390d29c552e5944f42d0a555e9460abc469136c41b331a2e66a5 + md5: cf5d9c05b0237a9f27a1de20a410fe1e + depends: + - python + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 113399 + timestamp: 1753308151142 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-gmock-vendor-1.10.9006-np126py311h2a51a2c_13.conda + sha256: a8351f213b0edfa9c327addf500240d97c98ef990f7e7e78ca2744e735ce28d0 + md5: 3912e32c17a5d96036b186800780c514 + depends: + - python + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 113709 + timestamp: 1753308234184 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-gmock-vendor-1.10.9006-np126py311hd5de103_13.conda + sha256: 498d72419568c66d6ece3ae062270fc9e0b43435125d67b283ec214abd1a7f59 + md5: ad97cd17b2008d3f6c441d4024c630de + depends: + - python + - ros-humble-gtest-vendor + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 111574 + timestamp: 1753309472060 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-gtest-vendor-1.10.9006-np126py311hbc2a38a_13.conda + sha256: 6a069fe63a49fa5056ace74da96ba86779d60d0dd1879b1f17d1843010082792 + md5: aace104a62696fc0084b6dd0df74c91a + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 199953 + timestamp: 1753307886279 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-gtest-vendor-1.10.9006-np126py311hbdd918e_13.conda + sha256: 442a9d0dfb42ce213326d3120856b30cc9a8f98bffae846998bfca0e36914f2f + md5: dcdbf382ddbd1ec064efded0c228dffc + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 199747 + timestamp: 1753308066715 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-gtest-vendor-1.10.9006-np126py311h2a51a2c_13.conda + sha256: c91cd3a2faccbc0a978840e68c429512fba95a98e96f1340b2db519b8b2a6db0 + md5: f25a9a8f8efad58b6cfd591cd66f95a9 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 200053 + timestamp: 1753307986725 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-gtest-vendor-1.10.9006-np126py311hd5de103_13.conda + sha256: 49cf349d55028f4504317911f8ff2b60e4a7c56dc97093f046220a3d87dba143 + md5: 9bb13dd8c7aa3a7bb17291dc84c98322 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 198439 + timestamp: 1753308448430 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hbc2a38a_13.conda + sha256: f9b1d35c984cb911a4c5a4e01342d10eaa67a92ea8f1d0b17dd29be12791af69 + md5: 650ff6e0bf8e4a498da06f330431d500 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 90560 + timestamp: 1753308104072 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hbdd918e_13.conda + sha256: 87b2eca790d5b0469fff316552dc5154a32290f2b4f45973ef325c9360273459 + md5: e471a0b3cbb3b0c68cb1675c91664dd5 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 89865 + timestamp: 1753308229195 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-binding-c-2.0.5-np126py311h2a51a2c_13.conda + sha256: 97b991e652b6d4f07130c5cb804b13e914e4ad24583c4f4c6ef5a168fa27d139 + md5: 9d55ffe18149c4de386ae311b19b8b06 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 81438 + timestamp: 1753308362305 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-binding-c-2.0.5-np126py311hd5de103_13.conda + sha256: fc26d3c9428019598cc562249ecd2037b44539a7a591fbe9e850857fefdb9d6d + md5: c3a72c8411af79452559e2bb89a5215b + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 218308 + timestamp: 1753310097738 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hbc2a38a_13.conda + sha256: 7df5fae0de2293a476c8e774907fad267722d9bde5f8401226a2d1e50285e5e1 + md5: 2c64f7155687feb9e533e36f9b4e0233 + depends: + - libacl + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - libacl >=2.3.2,<2.4.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 260818 + timestamp: 1753307879646 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hbdd918e_13.conda + sha256: 195b3813e91a14b0cba3b6277e6e62aa296dad5b369a5bf5bd4315ff23ddddb0 + md5: 66c27fcf24eee6118a66744188bf95a5 + depends: + - libacl + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - libacl >=2.3.2,<2.4.0a0 + license: BSD-3-Clause + size: 263150 + timestamp: 1753308060501 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-hoofs-2.0.5-np126py311h2a51a2c_13.conda + sha256: 026871b4e52027069f79e1f21a46c7db362fa78d313adbbad94b892f3df70a8e + md5: ba3fd9b55e9719745218a044c00b8a73 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 257679 + timestamp: 1753308068075 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-hoofs-2.0.5-np126py311hd5de103_13.conda + sha256: a24825f5878d87147576618de3bddcbacb628afe2a68b56ec331ef64b365f657 + md5: 1a1a3f30eb1cb06674748e43bd3acf26 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 729897 + timestamp: 1753308539200 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-iceoryx-posh-2.0.5-np126py311hbc2a38a_13.conda + sha256: 23a7bcad9d8a0ff2d28f4bbdb3a732ff1cc9b99541ee514e654725654b519deb + md5: c56a792e181ffd5323244ca66b81184d + depends: + - python + - ros-humble-iceoryx-hoofs + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 566643 + timestamp: 1753308009144 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-iceoryx-posh-2.0.5-np126py311hbdd918e_13.conda + sha256: 4ad0ccdb9030c6cf94d07b3efa515dd302128e17824f8a3a283fa0043f387853 + md5: 2348ddaed8621133553dabde4cc8b171 + depends: + - python + - ros-humble-iceoryx-hoofs + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 571724 + timestamp: 1753308154921 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-iceoryx-posh-2.0.5-np126py311h2a51a2c_13.conda + sha256: fce179db780017179183a5ed7d29f2593926c73b2899ef1a85c67773ab003110 + md5: 613dd4df8f1ae885e662c43568285f0a + depends: + - python + - ros-humble-iceoryx-hoofs + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 433004 + timestamp: 1753308243943 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-iceoryx-posh-2.0.5-np126py311hd5de103_13.conda + sha256: e8785dd36d286f5d2714c87ca81d79e1147c3215a4f7844cc68264d5904336cb + md5: af0fd29c29ff6db3f453d14a0ef876d4 + depends: + - python + - ros-humble-iceoryx-hoofs + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 2163996 + timestamp: 1753309506390 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-libstatistics-collector-1.3.4-np126py311hbc2a38a_13.conda + sha256: 3215e434d022b67292fb023d421fa2983e7363adce1dc49f1db2f7329bf79a7d + md5: 77fb7bf4d9e1c617d09babdf43c3f1f3 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-rcl + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-statistics-msgs + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 54603 + timestamp: 1753312905199 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-libstatistics-collector-1.3.4-np126py311hbdd918e_13.conda + sha256: 0924187266263888d6d77ef258bd7aa7b127d24898f54fcf4f70790e734f9b48 + md5: 0338364c1ef3a7fa37ed19d5a5f01124 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-rcl + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-statistics-msgs + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 54152 + timestamp: 1753313183068 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-libstatistics-collector-1.3.4-np126py311h2a51a2c_13.conda + sha256: 54a21a38b40ab4c18f184a7113b42bbc1d6561e9aeb1af4a8f643d393dcf7355 + md5: 09df9d3c1a071fd4b49f039809b818fb + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-rcl + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-statistics-msgs + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 54483 + timestamp: 1753312731693 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-libstatistics-collector-1.3.4-np126py311hd5de103_13.conda + sha256: 17543c43fc68d2ee8c476db226d98a7c35ff2895b06765a78b050c82447ce496 + md5: 244f21f171d06349607842112ed772bc + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-rcl + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-statistics-msgs + - ros-humble-std-msgs + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 57589 + timestamp: 1753330454550 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-libyaml-vendor-1.2.2-np126py311hbc2a38a_13.conda + sha256: d88461e13f9002a4225bfb1264a36f7b9212407a1bde1bfe4459ad5e5ccfae50 + md5: f23b7cc9a2193f5b52bfc0b21367e5ce + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - yaml >=0.2.5,<0.3.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30222 + timestamp: 1753310112185 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-libyaml-vendor-1.2.2-np126py311hbdd918e_13.conda + sha256: 79c2466dc79ca9d820428a5e13d965c9e09d02b4f5cd636d30f9ad168175d3f8 + md5: ae901ae633eca4390a4b15f42e864293 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 30083 + timestamp: 1753311804958 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-libyaml-vendor-1.2.2-np126py311h2a51a2c_13.conda + sha256: cf9c9ec8e8f63afd009a2e68555cf0f837af2d99ac88a96ff231fb8eeca135d0 + md5: caceeed1606529206606506140ba8372 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 30329 + timestamp: 1753310658867 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-libyaml-vendor-1.2.2-np126py311hd5de103_13.conda + sha256: a3a7356462fdf0696cd23bd02ad4d242c9d4cae860dad4918c0475c1bf67a69b + md5: a06da76b19342726d0ad4baf04da03c0 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 26864 + timestamp: 1753320841580 +- conda: src/navigator + name: ros-humble-navigator + version: 0.0.0 + build: h9352c13_0 + subdir: win-64 + depends: + - ros-humble-rclcpp + - ros-humble-geometry-msgs + - ros-humble-turtlesim + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - vc >=14.1,<15 + - vc >=14.2,<15 + - vc14_runtime >=14.16.27033 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 7fd87dea074a2453e59f364849ff6b286a73212f4c4e507b975db38eb2e7ae73 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator + name: ros-humble-navigator + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - ros-humble-rclcpp + - ros-humble-geometry-msgs + - ros-humble-turtlesim + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 7fd87dea074a2453e59f364849ff6b286a73212f4c4e507b975db38eb2e7ae73 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator + name: ros-humble-navigator + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-aarch64 + depends: + - ros-humble-rclcpp + - ros-humble-geometry-msgs + - ros-humble-turtlesim + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 7fd87dea074a2453e59f364849ff6b286a73212f4c4e507b975db38eb2e7ae73 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator + name: ros-humble-navigator + version: 0.0.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - ros-humble-rclcpp + - ros-humble-geometry-msgs + - ros-humble-turtlesim + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libcxx >=21 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 7fd87dea074a2453e59f364849ff6b286a73212f4c4e507b975db38eb2e7ae73 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator_py + name: ros-humble-navigator-py + version: 0.0.0 + build: h9352c13_0 + subdir: win-64 + depends: + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - vc >=14.1,<15 + - vc >=14.2,<15 + - vc14_runtime >=14.16.27033 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: f80d98a0a3cae93b5bc8d2b2df7fbbbcd84ee55cc0c1687163349e6f4e42fc29 + globs: + - CMakeLists.txt + - hi + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator_py + name: ros-humble-navigator-py + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: f80d98a0a3cae93b5bc8d2b2df7fbbbcd84ee55cc0c1687163349e6f4e42fc29 + globs: + - CMakeLists.txt + - hi + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator_py + name: ros-humble-navigator-py + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-aarch64 + depends: + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: f80d98a0a3cae93b5bc8d2b2df7fbbbcd84ee55cc0c1687163349e6f4e42fc29 + globs: + - CMakeLists.txt + - hi + - package.xml + - setup.cfg + - setup.py +- conda: src/navigator_py + name: ros-humble-navigator-py + version: 0.0.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - ros2-distro-mutex + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - libcxx >=21 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: f80d98a0a3cae93b5bc8d2b2df7fbbbcd84ee55cc0c1687163349e6f4e42fc29 + globs: + - CMakeLists.txt + - hi + - package.xml + - setup.cfg + - setup.py +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-python-cmake-module-0.10.0-np126py311hbc2a38a_13.conda + sha256: 82183ca2a9bf24dab1889f2ca136bffc2463435c46c26548925ff1a1b3861d4a + md5: 4061bfeff2c08662e0f26000a9c56f65 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 27727 + timestamp: 1753309529232 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-python-cmake-module-0.10.0-np126py311hbdd918e_13.conda + sha256: ecfe8733144ff4bf815df4b832c712625ad9b576daa389eb97f44accd2307807 + md5: 71993a6f4b9fb891b28f7d6419397574 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 27593 + timestamp: 1753309386762 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-python-cmake-module-0.10.0-np126py311h2a51a2c_13.conda + sha256: 8af108ed36cba5dd88ca8905cacb58d67fe936456fb622ce9503a511170315ca + md5: c2c76b73ec5e30bc67ad4b3da5b5988a + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 27866 + timestamp: 1753310181276 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-python-cmake-module-0.10.0-np126py311hd5de103_13.conda + sha256: f2ce8f1c5867c19a1de7d249fd3b8f87f1db2e63be152da56bde6ad59ad7c329 + md5: 2ed431dded2a08a43f8071964a722aaa + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 24422 + timestamp: 1753317472308 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-5.3.9-np126py311hbc2a38a_13.conda + sha256: ec48fadd9812801265fab47865db3f9f63ed1669614be50cddd8ff4a1dd4830b + md5: a71af214c801802909a4af2c48b2c8f1 + depends: + - python + - ros-humble-rcl-interfaces + - ros-humble-rcl-logging-interface + - ros-humble-rcl-logging-spdlog + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-implementation + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 176139 + timestamp: 1753312600779 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-5.3.9-np126py311hbdd918e_13.conda + sha256: e57c4b342cd89890feb9a243bf01ad49b5076a77cf345607a8c925ffcceac63a + md5: 1f1221d2ce610a4573e26e6e964512ad + depends: + - python + - ros-humble-rcl-interfaces + - ros-humble-rcl-logging-interface + - ros-humble-rcl-logging-spdlog + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-implementation + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 179612 + timestamp: 1753312937826 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-5.3.9-np126py311h2a51a2c_13.conda + sha256: 9d34d7082cb4b0ff6b38b673ff4fee003b4e9f8810080c1fa711b8046b459936 + md5: 1528671e4471088d397f6d0bea6cf777 + depends: + - python + - ros-humble-rcl-interfaces + - ros-humble-rcl-logging-interface + - ros-humble-rcl-logging-spdlog + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-implementation + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 160619 + timestamp: 1753312401528 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-5.3.9-np126py311hd5de103_13.conda + sha256: 3e5b958c700e8d031b4b8033350cdbac633c17176f93037d80392e5f231a3fc8 + md5: 9ff8a1acad810a154fb68762ea715ba2 + depends: + - python + - ros-humble-rcl-interfaces + - ros-humble-rcl-logging-interface + - ros-humble-rcl-logging-spdlog + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-implementation + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 173366 + timestamp: 1753328900761 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-action-5.3.9-np126py311hbc2a38a_13.conda + sha256: 89fe80a8ee1ade928a7712263d84ad73b3ca373cbfd740c6f85bfcbff3e57c1b + md5: 29ad41e27718df471f0e58b7252f92bd + depends: + - python + - ros-humble-action-msgs + - ros-humble-rcl + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 74784 + timestamp: 1753312897992 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-action-5.3.9-np126py311hbdd918e_13.conda + sha256: c4116a50ba370fc7897d2d99b4b3a17501f0a35e1232664c9a202061e043c0b8 + md5: f1177a4c631c2af472b0d302bcf4de37 + depends: + - python + - ros-humble-action-msgs + - ros-humble-rcl + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 78003 + timestamp: 1753313175367 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-action-5.3.9-np126py311h2a51a2c_13.conda + sha256: c735dc774b1ccce827af5ac552880c68868dc2959d897d5caa13d6acbcd8eef2 + md5: dca98b7152bf672f7d98dbfd4fd4aa15 + depends: + - python + - ros-humble-action-msgs + - ros-humble-rcl + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 73216 + timestamp: 1753312721988 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-action-5.3.9-np126py311hd5de103_13.conda + sha256: ee4b1d50c860f8eaacca0e092a519909a60f955063e31d2131564e0b5dfc91e8 + md5: 3e74a7576218ff4693353cf1f4750757 + depends: + - python + - ros-humble-action-msgs + - ros-humble-rcl + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 79978 + timestamp: 1753330353128 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-interfaces-1.2.1-np126py311hbc2a38a_13.conda + sha256: 5c35bd127812982949bc175728ae854b02d5d88b618490cd4c49a7775428d604 + md5: 948f4ad973c3dbd634755c5fb38b1ea5 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 335237 + timestamp: 1753311949710 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-interfaces-1.2.1-np126py311hbdd918e_13.conda + sha256: 5b23794b40d7a98493f51a3b3e71d1ead41293cb0be430a2129b2b343c141ffd + md5: cd21ffba5a9c438310be2fdcb75c3605 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 339742 + timestamp: 1753312422428 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-interfaces-1.2.1-np126py311h2a51a2c_13.conda + sha256: 716d97b5e2f0d6af14da1118911ad4a17a81166da691167ab700ef084591f80b + md5: d748ace26bb4d5715072358924d3cb6d + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 280129 + timestamp: 1753311327277 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-interfaces-1.2.1-np126py311hd5de103_13.conda + sha256: 91e3a3b8e5125fbe93d1ed3b11968c0aabfa45738638942904ababc447f71424 + md5: ca443aca57d2a760490c1e8327d35b9b + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 293584 + timestamp: 1753324150773 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-logging-interface-2.3.1-np126py311hbc2a38a_13.conda + sha256: 9906776e2466f2d3544f7d54aafee81ef2108f97e5978e00a8aa39aabefc1151 + md5: 758ed3e070662712de0f7009f9152fe0 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 34985 + timestamp: 1753310081246 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-logging-interface-2.3.1-np126py311hbdd918e_13.conda + sha256: 5cd6c4a2df6770fb12f414c4b5b57e80288ecc4dc1fe6ea20956cfcbc4172c4e + md5: 4bc8006e096af9c18ab1e43022c74221 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 35190 + timestamp: 1753309862386 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-logging-interface-2.3.1-np126py311h2a51a2c_13.conda + sha256: a5965f362aa8292c142d80cc4dc16e08ba28b62173cf314ec8d3824345ae3c71 + md5: 9c8da46e43a3fb9c49f15aa297c0534f + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 34468 + timestamp: 1753310618732 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-logging-interface-2.3.1-np126py311hd5de103_13.conda + sha256: 0fe584e991a65d3b9079b1526e9130d735be15265116e3ab7938a9216f13e476 + md5: 69673f8fe1c5cd4295f84a4968625908 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 34689 + timestamp: 1753320909693 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h11365e7_13.conda + sha256: 68389479ac66668419a34c3880b4be0a0988e9040db5d8bc7295884b3e23a63e + md5: 2903cf0402e13981e8253df996b2f085 + depends: + - python + - ros-humble-rcl-logging-interface + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-spdlog-vendor + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - spdlog >=1.15.3,<1.16.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 42096 + timestamp: 1753310174125 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h5f8052a_13.conda + sha256: 61a86ca2e37f0821a5bf22cfeb9ba5e9e1a2d7cd22cbe38db8faa3dcbc82ac0a + md5: 29a893c6a5d5b8cd528dd1cfd1793242 + depends: + - python + - ros-humble-rcl-logging-interface + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-spdlog-vendor + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - spdlog >=1.15.3,<1.16.0a0 + license: BSD-3-Clause + size: 43168 + timestamp: 1753311870011 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311h6932ae0_13.conda + sha256: bdea417f3712e8d78fb8d9e83ac6593056c239c4254de0a85da1cbdc7b5826ad + md5: 496f5822f5ca3f1079b6a4510d0dee67 + depends: + - python + - ros-humble-rcl-logging-interface + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-spdlog-vendor + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - spdlog >=1.15.3,<1.16.0a0 + license: BSD-3-Clause + size: 39276 + timestamp: 1753310732116 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-logging-spdlog-2.3.1-np126py311hc120487_13.conda + sha256: 078fdb62c4f57ffe34a9dd9419e2be713f0ac3fcb7191e6e4654c08f65f2c39f + md5: d0b5d34c089633037b40dd8f34f83be3 + depends: + - python + - ros-humble-rcl-logging-interface + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-spdlog-vendor + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - spdlog >=1.15.3,<1.16.0a0 + license: BSD-3-Clause + size: 39002 + timestamp: 1753321462221 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hbc2a38a_13.conda + sha256: 3ae31e7758ebf046295d4bf46cce8d29fab93db1f36c93173b4c332c38cc0011 + md5: 80ecce29505f3a0c15e9e810202fcafc + depends: + - python + - ros-humble-libyaml-vendor + - ros-humble-rmw + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml >=0.2.5,<0.3.0a0 + - python_abi 3.11.* *_cp311 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + size: 51015 + timestamp: 1753310167467 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hbdd918e_13.conda + sha256: 22fd5ad832945296342b159978171158f009c1998f364d1eebb391602b7af0a9 + md5: 13578198046aa4561b1e49356b9762c7 + depends: + - python + - ros-humble-libyaml-vendor + - ros-humble-rmw + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 52156 + timestamp: 1753311863138 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311h2a51a2c_13.conda + sha256: 0b2d60e6e73d5c18aa5c438e20f8829bfab08fd6fe6fc50de671c36b5c18755c + md5: 2910e29c5e347098186b95536c20729a + depends: + - python + - ros-humble-libyaml-vendor + - ros-humble-rmw + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - libcxx >=18 + - __osx >=11.0 + - yaml >=0.2.5,<0.3.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 48577 + timestamp: 1753310720310 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcl-yaml-param-parser-5.3.9-np126py311hd5de103_13.conda + sha256: 85d4c32f9e52226fa752cdf146cacc9ecb2cf1654beaca1b95bfbb25992098f0 + md5: 256119470cd02d5929d5bd42c86deef9 + depends: + - python + - ros-humble-libyaml-vendor + - ros-humble-rmw + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - yaml + - yaml-cpp + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 51811 + timestamp: 1753321376262 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rclcpp-16.0.13-np126py311hbc2a38a_13.conda + sha256: 2839988694063391c24e6ac3d4aa2a8b26bc5fa1bf5f5a693ee6bb803b0292dd + md5: 860d1f1567685bc02e793c6053dd38cd + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-builtin-interfaces + - ros-humble-libstatistics-collector + - ros-humble-rcl + - ros-humble-rcl-interfaces + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosgraph-msgs + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-statistics-msgs + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 877794 + timestamp: 1753313037836 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rclcpp-16.0.13-np126py311hbdd918e_13.conda + sha256: 9644c68a8d1f17a5e25927a5b528ef5bffd01dad206a8d4785e962aa46cf041b + md5: 8bb329e9c4ec9a3b1e5a6f6de482c946 + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-builtin-interfaces + - ros-humble-libstatistics-collector + - ros-humble-rcl + - ros-humble-rcl-interfaces + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosgraph-msgs + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-statistics-msgs + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 850697 + timestamp: 1753313289431 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rclcpp-16.0.13-np126py311h2a51a2c_13.conda + sha256: 460c0b9caeef52a5fd805bac921f1d073cb21507e711ea3b54042090c9defa0f + md5: e1b4732346107feaa66bf026ed528051 + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-builtin-interfaces + - ros-humble-libstatistics-collector + - ros-humble-rcl + - ros-humble-rcl-interfaces + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosgraph-msgs + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-statistics-msgs + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 647593 + timestamp: 1753312847180 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rclcpp-16.0.13-np126py311hd5de103_13.conda + sha256: aa879880ab696995e848ef6cb7a112c3abf514c3761689777f5105bca2f07f44 + md5: 2d45fc89bdf5467b691662c84fea25d2 + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-builtin-interfaces + - ros-humble-libstatistics-collector + - ros-humble-rcl + - ros-humble-rcl-interfaces + - ros-humble-rcl-yaml-param-parser + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosgraph-msgs + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-statistics-msgs + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 587686 + timestamp: 1753330840560 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rclcpp-action-16.0.13-np126py311hbc2a38a_13.conda + sha256: 97445fa2022a84e86918f4295df2727861abeb21b529a01e27d7c35230116796 + md5: c3c1ed416292c7651c7ca045f965c0b4 + depends: + - python + - ros-humble-action-msgs + - ros-humble-ament-cmake + - ros-humble-rcl-action + - ros-humble-rclcpp + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 116171 + timestamp: 1753313185616 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rclcpp-action-16.0.13-np126py311hbdd918e_13.conda + sha256: 0b07a6277d281446b52ef42d27274e13f366e1b740282d1e95c569648b92dc6a + md5: ed607d8f9a0a4ccc5096d1f8a3ec9f27 + depends: + - python + - ros-humble-action-msgs + - ros-humble-ament-cmake + - ros-humble-rcl-action + - ros-humble-rclcpp + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 116244 + timestamp: 1753313428171 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rclcpp-action-16.0.13-np126py311h2a51a2c_13.conda + sha256: 67cc9989a70e9abb38e80efdd14beafc6ae2e99fd0bfef46630a4f63593c640b + md5: adf99ded6ccd314794db290e130a3556 + depends: + - python + - ros-humble-action-msgs + - ros-humble-ament-cmake + - ros-humble-rcl-action + - ros-humble-rclcpp + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 101181 + timestamp: 1753313286673 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rclcpp-action-16.0.13-np126py311hd5de103_13.conda + sha256: 52c12c1f1a985809bb58ed028ccfcbcdcd7eebcb06ae21c6c8a347976cc79cd4 + md5: 9b7d617efcbf88f7aa01fd63035af1ed + depends: + - python + - ros-humble-action-msgs + - ros-humble-ament-cmake + - ros-humble-rcl-action + - ros-humble-rclcpp + - ros-humble-rcpputils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 101594 + timestamp: 1753331618880 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcpputils-2.4.5-np126py311hbc2a38a_13.conda + sha256: 8bf4164e40f60d66f50ea03bb0a8f945bcc6f11b83f5d1afcac44c55e8c9a29f + md5: 86083e1abd190d37b0e90d62433175d3 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 79144 + timestamp: 1753310027795 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcpputils-2.4.5-np126py311hbdd918e_13.conda + sha256: 41f58bf2a62411a66e4861661571dc266d24becdb987dd97c739354179e641c6 + md5: dec38e17cc7685f4ea62af4eefd73165 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 79734 + timestamp: 1753309812372 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcpputils-2.4.5-np126py311h2a51a2c_13.conda + sha256: 371f4adce73df132dc4a5e8970b08f14932e5c2b21a32f888d638ad1cf8293c1 + md5: be031b7c4624af4db612902d4eb5a3c9 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 77506 + timestamp: 1753310556108 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcpputils-2.4.5-np126py311hd5de103_13.conda + sha256: bd98f41b51fb8dfe2ce09b01bd76fa4e00d0476097d4289bdc858ed1cf79d09d + md5: 61a0d289071a13c4eabc43d20203044e + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 85781 + timestamp: 1753319909035 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rcutils-5.1.6-np126py311hbc2a38a_13.conda + sha256: f76782bbb98634da2df968711dc887c71077b01eadc4a356d9b7e7759c2d6746 + md5: 5e2ad7993f6500a99bc7400a22d5351b + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 116997 + timestamp: 1753309923669 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rcutils-5.1.6-np126py311hbdd918e_13.conda + sha256: 2e09a8632056cfc151afe95ee90b19af1cdbc14285ae2d42aff735d9096063f1 + md5: 1d0f24f6b535a20ff569e9ca90bccb9c + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 120302 + timestamp: 1753309706612 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rcutils-5.1.6-np126py311h2a51a2c_13.conda + sha256: c43d0446191d0133e4df3d2d144d6ecba632217c04c0ef8b25f58ba78ead4516 + md5: 7f5f55167d346079355bf6870a3939cd + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 111037 + timestamp: 1753310419689 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rcutils-5.1.6-np126py311hd5de103_13.conda + sha256: 4ae7c6c7b95615fce6ba3e38bba25ce50d53d06878730f7a796bdc45ea14da27 + md5: 7f7bdac9548f9a1388b7f9d7d40d5509 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 122738 + timestamp: 1753319362169 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-6.1.2-np126py311hbc2a38a_13.conda + sha256: 4a520f33478d4a02dd5e5806a6d43d217db391bde5bdeab9083a7e1a3d22980c + md5: 3af9d608b90b0c525075a8d47e02ae85 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 91341 + timestamp: 1753310099315 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-6.1.2-np126py311hbdd918e_13.conda + sha256: ac6bce6d01a40b002d412678e737ca07a59fce509ae8fd50430eeda6800aaec0 + md5: 6fb7b0ce5b85339921d555efe20a7842 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 92490 + timestamp: 1753311789750 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-6.1.2-np126py311h2a51a2c_13.conda + sha256: c883d1a6958fd50b3af27ed9be31ebdb34dc0a510040b4a392b58bc2d90e5657 + md5: 1fc5641dd31531ee9636fb3a53f5aa5e + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 88495 + timestamp: 1753310640397 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-6.1.2-np126py311hd5de103_13.conda + sha256: ba14411a402b68e9bacc4307967e49a02b32deea36474b1cd6375694bb66b1cd + md5: 388627b5da544a429b781c7df595cfb8 + depends: + - python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 93014 + timestamp: 1753320643957 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-connextdds-0.11.3-np126py311hbc2a38a_13.conda + sha256: 7f24c31537ba467e69443c347e0a540935671170f5c7bd1e309c78cf7b4afed6 + md5: 236bed93c962e3d664f18f718e5c212b + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rmw-connextdds-common + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30341 + timestamp: 1753312074339 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-connextdds-0.11.3-np126py311hbdd918e_13.conda + sha256: 34d13f44c30cebabbc0eafe8199848d2c32bbb8a6078522c12a51257437f534b + md5: b740e33694203c247ffab18700cfce47 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rmw-connextdds-common + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30169 + timestamp: 1753312524916 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-connextdds-0.11.3-np126py311h2a51a2c_13.conda + sha256: c8c0ec39eb12630b7d2a9d8e8d9dbead7135368c237abeb5e3a237336654da26 + md5: 87d68774d71e13ca55acb779ec716f96 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rmw-connextdds-common + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30426 + timestamp: 1753311441526 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-connextdds-0.11.3-np126py311hd5de103_13.conda + sha256: 56cb159f2ec563c30fc75bfedf12a2a998b6a2fc1882888a540e85270eef54db + md5: 760150258fa6391cf20caa50df529d83 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rmw-connextdds-common + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 27018 + timestamp: 1753325094575 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hbc2a38a_13.conda + sha256: 37fb8ace38e57c03ea77494d7bf2487ea5dd73ebea180a837f38b02fca93ebee + md5: fb69ab40bd0d1350798b878a78aa643d + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-rti-connext-dds-cmake-module + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 52039 + timestamp: 1753311925472 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hbdd918e_13.conda + sha256: 04f0c2267ed5e06b27f75f90219f5dbc64f4ad60fcf6853d2cb7389f877f8928 + md5: 39b100682e43c6ba509c3d4d4fa25aab + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-rti-connext-dds-cmake-module + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 51847 + timestamp: 1753312401561 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-connextdds-common-0.11.3-np126py311h2a51a2c_13.conda + sha256: 38555f738a312f35ee989b2a8532537acd7cf4c65c6a5e18095ea8655c8c76da + md5: f2b06f1d73be218a8035d4d94c287546 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-rti-connext-dds-cmake-module + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 52072 + timestamp: 1753311299360 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-connextdds-common-0.11.3-np126py311hd5de103_13.conda + sha256: ad2cecd09775200e3946f34b3ba32b16885eceb04ab7c877d650a1778ed81359 + md5: 7c91da993bfb6b48ed768123e0bd4d20 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-rti-connext-dds-cmake-module + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 48568 + timestamp: 1753323994774 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hbc2a38a_13.conda + sha256: db072de767df4a5eab3909841adc8269b5ae62d03d5d33304b5b89cdfd563129 + md5: 0c7ce8203707a3ae2c048383c3149f91 + depends: + - python + - ros-humble-cyclonedds + - ros-humble-iceoryx-binding-c + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 253024 + timestamp: 1753311931661 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hbdd918e_13.conda + sha256: ace6df086ccd323a2cba0c3673d9d92648e65994d7c1c208f6c3216ee86f1519 + md5: 64e965f2607761652cce7342ea13507c + depends: + - python + - ros-humble-cyclonedds + - ros-humble-iceoryx-binding-c + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 254235 + timestamp: 1753312407084 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311h2a51a2c_13.conda + sha256: a695b3c4f58f99b0d4844bc37622288835a502183d86c8c9b155cde76499b27c + md5: 3b3a94c72e1a52adcc73ea265039669d + depends: + - python + - ros-humble-cyclonedds + - ros-humble-iceoryx-binding-c + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 183074 + timestamp: 1753311309113 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-cyclonedds-cpp-1.3.4-np126py311hd5de103_13.conda + sha256: 2c7804070a7dd9b1439a9afe778867c4d538e81544214b56e1bd70a47f1fd9f8 + md5: 44f8cf97a4c17122299ead107b66b534 + depends: + - python + - ros-humble-cyclonedds + - ros-humble-iceoryx-binding-c + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 175854 + timestamp: 1753324075661 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-dds-common-1.6.0-np126py311hbc2a38a_13.conda + sha256: 19911a549f96b21628ac0e0b623db8324efbb4b89457e96b19e67f0f699eb59c + md5: 90d4d80c925d32e3a6280b10e247ba2a + depends: + - python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 148791 + timestamp: 1753310585467 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-dds-common-1.6.0-np126py311hbdd918e_13.conda + sha256: fc9e9bfddaec11aaa812facc06ad18955409fbe682bd877ad28cb7a5bedb6eb8 + md5: b8ed0ee72554fdefe5f26e6072fd5bff + depends: + - python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 152464 + timestamp: 1753312294482 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-dds-common-1.6.0-np126py311h2a51a2c_13.conda + sha256: 4dab87597791768a2e9ce8c303280edeea365b7e8b25d0f15c0f62a8d63d4670 + md5: 2e250e11e360d966e13260f3a941c7c5 + depends: + - python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 135957 + timestamp: 1753311172231 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-dds-common-1.6.0-np126py311hd5de103_13.conda + sha256: 5c211de5b958de7bde5613fa189256341b8cd8754d9b9f686b1bae64f36dd026 + md5: e66fd584f3b8958e118a3f170b971c73 + depends: + - python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 150518 + timestamp: 1753323163199 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hbc2a38a_13.conda + sha256: 1b6dc05eba91783fecdbbcdb685a849579cad52542d0ff05de59aed88e105828 + md5: fb946901653a93735a6cbc0265240d92 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-cmake + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 141768 + timestamp: 1753312217506 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hbdd918e_13.conda + sha256: 7941758bc7da7f49152d182bf18eb6f2973fa4559dc7fa6d6d7bc97afb498efa + md5: 4b3f404ecb89145bf299a290b5779d20 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-cmake + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 140022 + timestamp: 1753312639708 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311h2a51a2c_13.conda + sha256: b7f675dc82e874736c292fc0f0dac686be6dcf2ff000b192b8e33a3e342446bd + md5: 7da9f978e000b72a5d37038cdeaef3c4 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-cmake + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 113525 + timestamp: 1753311751836 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-cpp-6.2.7-np126py311hd5de103_13.conda + sha256: 299d30573b56aab42153efc1bd617d9096e3d62734d711bb10ff3c6a7e3872e4 + md5: 96d188a7f78b34f47a4218bdf216da32 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-cmake + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 140432 + timestamp: 1753326397239 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hbc2a38a_13.conda + sha256: efde44592faf7de42a0661fc2f53e03c3b2693ed4d198c8e86dce3454375504d + md5: 72134d164121c146bf035b4617845384 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 173248 + timestamp: 1753312185917 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hbdd918e_13.conda + sha256: 0f2f176ac8ef71e953d6cf3301460abcd1b5bf4fcf1971b97901f57e7cb15e89 + md5: dac2888dad24c08c9e54867138a7aae6 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 168683 + timestamp: 1753312613032 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311h2a51a2c_13.conda + sha256: 89f476be13d24af80ccaaac4c3dc4bca9def0a5f260b3bbc4426b9220fd4e7ad + md5: 4fe9c5bc5557407b54c1e3cc6af72b01 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 137498 + timestamp: 1753311714929 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-dynamic-cpp-6.2.7-np126py311hd5de103_13.conda + sha256: a3f4c0e83be8d51ba7f5a713d8544af2874c8366a3030bd28e3a36ffefa95328 + md5: 45b63c29cd4783ad5f8d6c92cacdf41e + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-rmw-fastrtps-shared-cpp + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 175454 + timestamp: 1753326252818 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hbc2a38a_13.conda + sha256: 8815be9d597397a9c05745de45007d9c04ff8f2d78ada14d3a27ecd0bd555fc5 + md5: 658223d46ec46354c2a32b2cab778678 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 209275 + timestamp: 1753311893445 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hbdd918e_13.conda + sha256: cabcf0b2163d9613d54dbbe88a095521421ecfa2861bfeb1ac9902026102ce5f + md5: 563a869448f8c1c984c1ab8fe3174ceb + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 199204 + timestamp: 1753312379817 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311h2a51a2c_13.conda + sha256: 2d447906888931e5d2202cc1f12602d2279aaaf79d78c6ec543204f777a4b33e + md5: cc3d121ed8fa398fa5396d5fafda3a48 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 170138 + timestamp: 1753311269303 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-fastrtps-shared-cpp-6.2.7-np126py311hd5de103_13.conda + sha256: 6cf3dc280e3d098e36a04016f3f43b7d9666ff21a790897f087cf8caef5a5d78 + md5: 031ae6555fd0b2dcb7eaba75ddeaf135 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-fastcdr + - ros-humble-fastrtps + - ros-humble-fastrtps-cmake-module + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw + - ros-humble-rmw-dds-common + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros-humble-tracetools + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 221675 + timestamp: 1753323867527 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-implementation-2.8.4-np126py311hbc2a38a_13.conda + sha256: 570f3285348f78ba5fda5ca4a0e1d97f6a6c28f28340a0c08ce2dec4fcad777a + md5: 31834425147f85a3e35f7abdc7c3dcd8 + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw-connextdds + - ros-humble-rmw-cyclonedds-cpp + - ros-humble-rmw-fastrtps-cpp + - ros-humble-rmw-fastrtps-dynamic-cpp + - ros-humble-rmw-implementation-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - fmt >=11.2.0,<11.3.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 52264 + timestamp: 1753312347656 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-implementation-2.8.4-np126py311hbdd918e_13.conda + sha256: 27c869fd0344b4d37ebd2139f47a5b0ff50d978a5866536eeb1a84979bc01a3b + md5: 4c9d7fcac08ccc12ee8c0f36b3aae26d + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw-connextdds + - ros-humble-rmw-cyclonedds-cpp + - ros-humble-rmw-fastrtps-cpp + - ros-humble-rmw-fastrtps-dynamic-cpp + - ros-humble-rmw-implementation-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - fmt >=11.2.0,<11.3.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 54036 + timestamp: 1753312746878 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-implementation-2.8.4-np126py311h2a51a2c_13.conda + sha256: a0b80b1b1c0468eae2eb31dbe56b04b384e0e1c4db447e2b1d2895001f7c759c + md5: c08fdee00d7cb097175811d5018ef7e4 + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw-connextdds + - ros-humble-rmw-cyclonedds-cpp + - ros-humble-rmw-fastrtps-cpp + - ros-humble-rmw-fastrtps-dynamic-cpp + - ros-humble-rmw-implementation-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - fmt >=11.2.0,<11.3.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 49260 + timestamp: 1753312095539 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-implementation-2.8.4-np126py311hd5de103_13.conda + sha256: 0e66351a21fee78d6f2bd50296562d09d86d04a11971bf018a3fe3dec61f0c42 + md5: e32a3136ce1ec6d9eccd287c72b6c4ea + depends: + - python + - ros-humble-ament-index-cpp + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-rmw-connextdds + - ros-humble-rmw-cyclonedds-cpp + - ros-humble-rmw-fastrtps-cpp + - ros-humble-rmw-fastrtps-dynamic-cpp + - ros-humble-rmw-implementation-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - fmt >=11.2.0,<11.3.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 55097 + timestamp: 1753327608400 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hbc2a38a_13.conda + sha256: df9e683bda0069a87a1076b0fd18089d742b39b6c1b5feca044708b129d4f69b + md5: 9fff8270bb17e943748646c958fa1a72 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 28640 + timestamp: 1753309791287 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hbdd918e_13.conda + sha256: 4af3869534e07e41aad9662b5f0edf1b5acbb166e1272c101737f181a5434e99 + md5: 5094cf280f9d6777b3d5103237805620 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 28530 + timestamp: 1753309574840 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311h2a51a2c_13.conda + sha256: 8015eaf19f2e0f2d78c0b35c75616d2f62986dd5eb4e04e4c84ce2e76427389b + md5: 56d1e8ab65ebb899766da161d15b9c1b + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 29475 + timestamp: 1753310262634 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rmw-implementation-cmake-6.1.2-np126py311hd5de103_13.conda + sha256: 3f828b8da760faa60221465ce2a4dede5e4286bf87dabb912037f80e5cd4399a + md5: a0766e1d4488ceb5de41033ce2f9cfee + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 25248 + timestamp: 1753318449142 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-ros-workspace-1.0.2-np126py311hbc2a38a_13.conda + sha256: 6af3bfaeb610b1c7487ef9985fc4df0aa1546369156f28d6256692fada67c4c1 + md5: e880fc309969c933f729e8174f6166e2 + depends: + - python + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 35953 + timestamp: 1753307817565 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-ros-workspace-1.0.2-np126py311hbdd918e_13.conda + sha256: 104115defbaed0f2c5d5cfa78751edcaaf1f6b1037bdc7c190ca51ff9101e267 + md5: a20c36686ec49dc305077e3876c1ef8b + depends: + - python + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 35788 + timestamp: 1753307996232 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-ros-workspace-1.0.2-np126py311h2a51a2c_13.conda + sha256: f6fc33ac852a0c47a620427947ad78dfb769c1b1b6e7cd6b3867c3e6b6312ec8 + md5: b17dd6789d181ea59dcbfdaa9bf78590 + depends: + - python + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 36223 + timestamp: 1753307904148 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-ros-workspace-1.0.2-np126py311hd5de103_13.conda + sha256: 463876a0060ff9ca759bd6767fa3a7c14320cb8b0ac569b1490a0253149f82d9 + md5: 2a679ad4a38b72d1327f979f29b9afbf + depends: + - python + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 32597 + timestamp: 1753308072735 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosgraph-msgs-1.2.1-np126py311hbc2a38a_13.conda + sha256: 8166557f42dacecee819434f76a284750760ca1bde37c7b2128d5dd10bc83a6b + md5: 92092321209406479a2a1d96344b7d92 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 67687 + timestamp: 1753311928293 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosgraph-msgs-1.2.1-np126py311hbdd918e_13.conda + sha256: 9e47f588be1873f834af40bb6897211fdb7cee6f33dad35cc71b75364e0533e2 + md5: 99a5f4bdecefda94989bc5b641a4b57d + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 71276 + timestamp: 1753312402829 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosgraph-msgs-1.2.1-np126py311h2a51a2c_13.conda + sha256: 1445dce765f8f71d82444cd7c07672867f36b9f61d8a0f750b44bcd0fdc1d6e0 + md5: aff34054ad309603b00717feb6a29746 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 65385 + timestamp: 1753311304078 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosgraph-msgs-1.2.1-np126py311hd5de103_13.conda + sha256: 723ba98528cd6eeccfc9a5c767048db18c2d8350603eeb9fe32d31dbda6a3c35 + md5: f7f3ea46b45cc00eefad24705fa0ca16 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 74478 + timestamp: 1753324461126 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-adapter-3.1.6-np126py311hbc2a38a_13.conda + sha256: 515d56e3277b7741be0edfab04c7e639b5e9b3ea95e873f8d37588914252fb2e + md5: b718a316f9de0d9fd34fb77ec46a3baf + depends: + - empy + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 63737 + timestamp: 1753309551686 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-adapter-3.1.6-np126py311hbdd918e_13.conda + sha256: 489c7058732634beeb375638e897479c6eb4a1e67c6fb4b53bc62314919165b3 + md5: 70bc87f61d6e00291d75355b8d83584c + depends: + - empy + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 63617 + timestamp: 1753309429828 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-adapter-3.1.6-np126py311h2a51a2c_13.conda + sha256: 0eabb703cfb36aa7140bac7c17e4f8f686eaddcaaff72a3f91675f7699e2dccb + md5: 761c1490aeb9a5097908188e0abfc455 + depends: + - empy + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 63932 + timestamp: 1753310213784 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-adapter-3.1.6-np126py311hd5de103_13.conda + sha256: 3a118078a294a7add43fa3b233c5fb6d5282b4e8d47233665d8ebfd6e82f2281 + md5: b139288ac7e3453b1d61165e5eedcfa6 + depends: + - empy + - python + - ros-humble-ament-cmake-core + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 60488 + timestamp: 1753317698348 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-cli-3.1.6-np126py311hbc2a38a_13.conda + sha256: f42bee90ca8440bd9779522effa707350623095e0afe2e1eade7be485382333a + md5: a58be72bbb4cace2dcc74c980290130e + depends: + - argcomplete + - importlib-metadata + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 38987 + timestamp: 1753308433844 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-cli-3.1.6-np126py311hbdd918e_13.conda + sha256: ff40e9f9b2d77b0a5f157045d971f0c513b95e5f03ac224ec3d32793849bee30 + md5: bcddb866ec6e2b633ebcfb4b6c698c7b + depends: + - argcomplete + - importlib-metadata + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 38909 + timestamp: 1753308567765 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-cli-3.1.6-np126py311h2a51a2c_13.conda + sha256: 2ebc6c3b48715db0527b358ff93b6bc1b070e225de93449303722194c4be4cdf + md5: 4bb68c8f80f0c1f80485ec1e4e193c00 + depends: + - argcomplete + - importlib-metadata + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 39017 + timestamp: 1753308882416 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-cli-3.1.6-np126py311hd5de103_13.conda + sha256: 3febfb5cffb8285ebaa7ddbcf84d9fa1422d5e974d2d374ffa83c68eb6e2dc3f + md5: 4605e9866242d31914501c2bc76ff21a + depends: + - argcomplete + - importlib-metadata + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 43377 + timestamp: 1753312866073 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-cmake-3.1.6-np126py311hbc2a38a_13.conda + sha256: 8a9a7b6a6a35bce8d9bd0a3ea1ee939ff42c5e091269a20f7f4d1cce5d397e59 + md5: 316d5cd31b285122c1b93c2b82461dae + depends: + - empy + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros-humble-rosidl-parser + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 40094 + timestamp: 1753309938806 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-cmake-3.1.6-np126py311hbdd918e_13.conda + sha256: 195209278a5773ab7875bff6a1d3bbc5686ba9b0f45daf0f698ad87f7a136cd9 + md5: bf3ddbff89715f6f92d369abe3e8e169 + depends: + - empy + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros-humble-rosidl-parser + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 39945 + timestamp: 1753309724968 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-cmake-3.1.6-np126py311h2a51a2c_13.conda + sha256: 207100d52dcaa38d9d5b38edd774e8ba8816f1229fc100747e7b2f56d6a27d67 + md5: a94ba1932abe70e088117bd8855cbf96 + depends: + - empy + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros-humble-rosidl-parser + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 40243 + timestamp: 1753310451694 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-cmake-3.1.6-np126py311hd5de103_13.conda + sha256: a4d1cfcb0a260e215363f3c6c5f77071a23275dc84a45be8f8a9232c666d7ec9 + md5: 9bdaa4dadac4d3d491423aa59f053b09 + depends: + - empy + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros-humble-rosidl-parser + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 36739 + timestamp: 1753319537718 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hbc2a38a_13.conda + sha256: 4d19d1ba262d29d180f8ccda821136f6263d3b551887ecfad5a9481407195d71 + md5: 07fb58a8ac16fee9997dd2f604ea6ea2 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-generator-py + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30396 + timestamp: 1753310512196 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hbdd918e_13.conda + sha256: 6643d5ec919d867345a6c4e3b2cb3321f669d68a67db278fe105df6f330e4cbf + md5: eafe48fd39a4002758383b08bd35c6bf + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-generator-py + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30274 + timestamp: 1753312227988 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-default-runtime-1.2.0-np126py311h2a51a2c_13.conda + sha256: 9d662bb75a8a5a18e927d5a98918740f9c5501ebe9645ad6a6fe8de186527cc6 + md5: 212d556c2d59b2bc35a90a8b0d3be804 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-generator-py + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 30519 + timestamp: 1753311085827 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-default-runtime-1.2.0-np126py311hd5de103_13.conda + sha256: 7fc9704343c3fde4f40bc5f1398d6d420eca2d7b74453f02e895422a05edd0e9 + md5: eed2cfa610eb7178e52280d64ebf7d08 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-generator-py + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-cpp + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-introspection-c + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 27144 + timestamp: 1753322645131 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-c-3.1.6-np126py311hbc2a38a_13.conda + sha256: bea09f20d6d1ee4d536539012c8989e63516c3f425ff9977345da1c9c714a544 + md5: 785321afe129a8e3d982dcf66463ff9e + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 46942 + timestamp: 1753310094240 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-c-3.1.6-np126py311hbdd918e_13.conda + sha256: ac7acfe2cc434988d4145a836a39bce139c29961cdbbf60d3c91f2dab03751f1 + md5: 1fdd77412ba1ff0a597833c3185a8433 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 46823 + timestamp: 1753311780580 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-c-3.1.6-np126py311h2a51a2c_13.conda + sha256: 8cb10ddb603d7aab86441a5ec0dd017e8f81b733a079ddedc15a960af250371b + md5: 9d1abd1b06582a402cfa63595f7a9bb1 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 47140 + timestamp: 1753310631511 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-c-3.1.6-np126py311hd5de103_13.conda + sha256: 4c132e0d1ec39637bcdc0290ed33e58bad3e2bf89de2e54c0c0466bb2b4835e9 + md5: 4f188eb119bc168eea1cbd404158cefc + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 43675 + timestamp: 1753320563542 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hbc2a38a_14.conda + sha256: 6b88cca3bb5c1e9860be6062dc9d8ab5474151181d14469b644e52836edd27ff + md5: ff25ff81fda8538cd85eb8eb92ee7f29 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 50175 + timestamp: 1758227173072 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hbdd918e_14.conda + sha256: a1d2337dc34576ea6a101321ba46a107ac71772af1bff94d8ae91113a268b0c6 + md5: 806495acf40d55a5570117d4ec18a7ee + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50086 + timestamp: 1758227298272 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311h2a51a2c_14.conda + sha256: 8c5e2cdd1c43acd95a02337fd0e4a1bf86b3d7b54a7f0cd67add89665fb13cd5 + md5: 89c58287356b154c04018d299afba011 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50246 + timestamp: 1758227250163 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-cpp-3.1.6-np126py311hd5de103_14.conda + sha256: b392c9201941a0a2cce8ebcaebcb7c296e7bdcf497a57565fec647eb3dcbd1b7 + md5: a971c714123845bedaf5f7c353e261a4 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-cpp + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 47295 + timestamp: 1758227460906 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-generator-py-0.14.4-np126py311hbc2a38a_13.conda + sha256: 78c53c9e7bd057375ef0346ab6a7022f66053e445a38a896690e5c7cfe9ffc5d + md5: 08adac67b2a00fb226e847c75bef174c + depends: + - numpy + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-python-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rpyutils + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 60473 + timestamp: 1753310477459 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-generator-py-0.14.4-np126py311hbdd918e_13.conda + sha256: 33ee7375885d6a81e1f41d55a51e83a10ac17a4bea1d1a510eb07865cb5364d4 + md5: 212a6c3cfc96b1d2341a523f3ae664ef + depends: + - numpy + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-python-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rpyutils + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 60357 + timestamp: 1753312204107 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-generator-py-0.14.4-np126py311h2a51a2c_13.conda + sha256: 8710a54982d9c8c9346382517656b931ad5c29dd58b41cb9d8a7eb8e2facc68e + md5: 14d12f7ce360c75357b9937720d12302 + depends: + - numpy + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-python-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rpyutils + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 60616 + timestamp: 1753311053081 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-generator-py-0.14.4-np126py311hd5de103_13.conda + sha256: 5b5a027990788a272d186ed4050b23f2bc1831ddfdd8da550c387822148288a5 + md5: ec197246c8f9bb57b8b544e802064863 + depends: + - numpy + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-python-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rpyutils + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57403 + timestamp: 1753322557737 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-parser-3.1.6-np126py311hbc2a38a_13.conda + sha256: e5ad966361dbdfa2b8095c8941af05a2298eb0322d95d0f4064384e4571b5df3 + md5: a8c00bdac81f288a6dcb84cd1928186f + depends: + - lark-parser + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 60113 + timestamp: 1753309850541 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-parser-3.1.6-np126py311hbdd918e_13.conda + sha256: 1587d05b980333b2d4c5aa1664b4ff02d917e19d71cf620c94b8729f8a9b8580 + md5: 8b0c6ade1a81a1433024ffcf8457ae29 + depends: + - lark-parser + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 59984 + timestamp: 1753309625093 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-parser-3.1.6-np126py311h2a51a2c_13.conda + sha256: 9bdc612abe00af572a63cd9ab0c055ee311ea381cd2847e09a95eca9bac9dce4 + md5: 5ae230eecdb490f0f871569fe95d9d4f + depends: + - lark-parser + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 60255 + timestamp: 1753310323287 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-parser-3.1.6-np126py311hd5de103_13.conda + sha256: e11a5aafd5ebfb5e92b1d7ae063ae5a59525b71cad6c31cc3f878468c8d5425b + md5: ac2955a245a0564fa7f7ae949209cf03 + depends: + - lark-parser + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-adapter + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57073 + timestamp: 1753318767246 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hbc2a38a_13.conda + sha256: a192468b4f1ddfdb9759469e2dbedd49248c8c98d4d95d571b82c01ca884c042 + md5: 7da60492abfb83b9734baa8cdb2181f8 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 47891 + timestamp: 1753310014127 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hbdd918e_13.conda + sha256: d912293c42e6e05f62be8b42e7ca0f921fa7993fdd5794c45c623717ce2d044e + md5: 7faff48b4ffc19e75872f023b222f0c2 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 49832 + timestamp: 1753309790407 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-runtime-c-3.1.6-np126py311h2a51a2c_13.conda + sha256: 5c7c77953a73be549c51018c4de036735252f28915887f26ef35230ff1160a61 + md5: f6e9ac6fdd5ed49de00da4897073d735 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 45238 + timestamp: 1753310539752 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-runtime-c-3.1.6-np126py311hd5de103_13.conda + sha256: b03baf66499c4c8029157e90e085b83df5392c01d4c5139a2ca1931855e80b4d + md5: 2ee2815435f46d771ede458f5b531bdd + depends: + - python + - ros-humble-ament-cmake + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 47252 + timestamp: 1753319833199 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hbc2a38a_14.conda + sha256: 2e9568d76566fa73ef8078b97dfdf95eaf4511a4aa9727298bbc9b0ce49af269 + md5: d4e6e4d96c8dd9e58dae9015bbd8511a + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 35956 + timestamp: 1758227157909 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hbdd918e_14.conda + sha256: f5104a19b9e177f72b13beb075fad7058e6cddd2a8f41ce5fe746904b4e42774 + md5: dede6769ca4a3b1694475d40be4d088d + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 35904 + timestamp: 1758227281940 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311h2a51a2c_14.conda + sha256: 4a1b347b96bf479768b8b3e66ed6fe28f74b6cec6e80e5ff6127d1da8303c992 + md5: 1fc4d21c39598e97e6f12c4bed8f611f + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35920 + timestamp: 1758227223081 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-runtime-cpp-3.1.6-np126py311hd5de103_14.conda + sha256: 151085a26eb0616fabda59581af1e9c3ca1fecc88f742ee76b4a9f03145c7671 + md5: 1acb503c7d9ea7ae978f97c5af1ee96f + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 32896 + timestamp: 1758227342999 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hbc2a38a_13.conda + sha256: d7224826ccad8fa541d67f5d122611ae72e73cf610af296aae26fb320d6a54ae + md5: 83f6206966603226b14530dde1627f34 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 49253 + timestamp: 1753310431896 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hbdd918e_13.conda + sha256: 1e21f44f460c6a1769d464634ea80fce21370b2b1f0b4281b664ca9a03ae3751 + md5: 1f020673daed1811c14ef93cc17fbd07 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 49231 + timestamp: 1753312161946 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311h2a51a2c_13.conda + sha256: c3329a575b7373a6972a82130560df82af9adfe49de188620744eceed69f6a94 + md5: 4c40cdcc22db4da3f3b4560d0e3e4f89 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48517 + timestamp: 1753310992086 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-c-2.0.2-np126py311hd5de103_13.conda + sha256: 089ea8a2ba73ed143f9306c168f25b9bcc309a21b4fa3e37779203f226f56201 + md5: ebdf39f3099c9c816c7a022df88fdda7 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-typesupport-fastrtps-c + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 49314 + timestamp: 1753322274140 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hbc2a38a_13.conda + sha256: d253d7cb2eb09ba4e1aba0e1d18f14ced7b8cf80d7e64f580f985ffd4fd95d3c + md5: 67a66cf0c06e65f9c3bba408d78a1b58 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 48261 + timestamp: 1753310471154 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hbdd918e_13.conda + sha256: cdac0126884ea446558eb18c22d4bf51529562bbb68c8deff678b049782a0c8b + md5: 02c32989ff83f6ddc9999bb953bfe18c + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48340 + timestamp: 1753312199008 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311h2a51a2c_13.conda + sha256: 26c8e85e167ea01a714bd747f96d2ad37072068ef694f5885dae3590fd10ec71 + md5: 22ca30e72d516c5bf3e00eb950380a99 + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 47731 + timestamp: 1753311043801 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-cpp-2.0.2-np126py311hd5de103_13.conda + sha256: daf0fb3e9c89222c60579015d6c3d76def472a5ed7ea17ed97835a16bf42627d + md5: 72e01312597bda742aaacce2b19a58ee + depends: + - python + - ros-humble-ament-cmake-core + - ros-humble-ament-index-python + - ros-humble-rcpputils + - ros-humble-rcutils + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-c + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 48599 + timestamp: 1753322473989 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hbc2a38a_13.conda + sha256: 6e90bf11a116585e6bd674185d4a3138989063323c611b31b3b45423f1ecd247 + md5: e204519f1511a6ec75303f5971ceec7c + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48569 + timestamp: 1753310358501 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hbdd918e_13.conda + sha256: 46822fff43be45071676f732bea3d36b5c47db76ad46b64a12739ae42d7de587 + md5: e1560df4242f348e9aae6f0cb88b2e98 + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 48734 + timestamp: 1753312055188 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311h2a51a2c_13.conda + sha256: 5bb76fe945b15e3fe4c9c4db584987c6f7b71d856247794bb29f39df8564a12d + md5: e6f92a4c8bd7df6ebe9fe640fa34f877 + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 48099 + timestamp: 1753310899131 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-fastrtps-c-2.2.2-np126py311hd5de103_13.conda + sha256: 5ca478a5e3321f9c0f2cd2e375c1d6bd2c2e1fdbd01891c0eae857f7bcda7822 + md5: 21813552c1831acbb4a15c72a28a75bd + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-c + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-fastrtps-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 49554 + timestamp: 1753322012544 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hbc2a38a_13.conda + sha256: ea2965c714b0179d2282ccb8f2179185a0b7793d3c5fb04fa1ec46690a829ab7 + md5: 45ac398aa96b8fee98181bb58c889a9c + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-cpp + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 50901 + timestamp: 1753310208201 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hbdd918e_13.conda + sha256: 04ce945e770c0e876dd01cfe105ea3ab1c564b483013a61dbf85c0376ae14d2e + md5: f7ceed905e352c20f63a88bb6e3d5fd6 + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-cpp + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 51028 + timestamp: 1753311909136 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311h2a51a2c_13.conda + sha256: e366e565890c41052c1943a0d7db9c72271b9980ed38e51d061ba90d129468a7 + md5: 93702deb28de7e2a07f012e41a7fdf8f + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-cpp + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 50326 + timestamp: 1753310778806 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-fastrtps-cpp-2.2.2-np126py311hd5de103_13.conda + sha256: 7c12457ad4480d97527493a3497bf7a04b79cc46534ef35b6db48f85de2abdcf + md5: 6a0ebeb36ee8cc4a3ab8b75b7e06787c + depends: + - python + - ros-humble-ament-cmake-ros + - ros-humble-ament-index-python + - ros-humble-fastcdr + - ros-humble-fastrtps-cmake-module + - ros-humble-rmw + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-generator-cpp + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 50796 + timestamp: 1753321596363 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hbc2a38a_13.conda + sha256: 173a23669323e48bcca88d72286eff434a8d8f7aee65f6bac8d8cd07eef9ab99 + md5: 9fbac5db3d41389d99f9dd8eee11f67a + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 28380 + timestamp: 1753309557611 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hbdd918e_13.conda + sha256: f9b8528548c6c05370b8ec38f0a676c6009cf19d5f6f45a8e819baf64ba09a18 + md5: 438f77bd13ae60b1d61b9288ee6a391b + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 28324 + timestamp: 1753309435736 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311h2a51a2c_13.conda + sha256: cc58de55ec9dfcf89dfa3ab3f4bac78cfbcf8bc77f9cd1020d489f94226b25c8 + md5: 3d26def234ca338ecdb7f91584457fcd + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 28558 + timestamp: 1753310222434 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-interface-3.1.6-np126py311hd5de103_13.conda + sha256: fa64da4245cabfcd35e16271e91a49a54cd374f5a00e82135e09865d6d522cbe + md5: 664530b0f16157cae712a20b80a9fe42 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 25142 + timestamp: 1753317762721 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hbc2a38a_13.conda + sha256: 634a5971241eda58dc346d02c2c50e7cbb6ad0fbef80909baa81bc3b55f14c80 + md5: baf9e6fdebd6e2ded62d3eda779880b9 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 46249 + timestamp: 1753310104538 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hbdd918e_13.conda + sha256: 7689d6e4555da2bec7f9ba16fc9bbdcf6d80e702ea298642df8fb031bff615c4 + md5: 43ac043c25e79abc13b39b542778bee1 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 46615 + timestamp: 1753311794800 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311h2a51a2c_13.conda + sha256: a89965102d83af59ca988619746d7933eb66eb2d71d67fbaeb439ee15a2186ca + md5: 8165197001a6cb8c618df0f41cf0de10 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 45920 + timestamp: 1753310648784 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-introspection-c-3.1.6-np126py311hd5de103_13.conda + sha256: 7a356de281bab50815b4dbcb64976f7dbc3e02581d5b51c412d1b521f6b5fcf0 + md5: c3526524aa83bcbb0f6c8afb7ef4aa7e + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 46484 + timestamp: 1753320719839 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hbc2a38a_13.conda + sha256: 4e07e15955e22121d0176b2c7611a9a48d11c70d6e9e8d940b8c8ab30e919b00 + md5: d6cf0b066c0b5223f4c84905dbdfb98c + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 46489 + timestamp: 1753310162084 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hbdd918e_13.conda + sha256: a39bea2e1bb1993d71c0f91531fbd803829d05ddae70e8e54a5e5809df354ad2 + md5: 8c30e975c59cdd0035bd76b9d9e51297 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 46799 + timestamp: 1753311853451 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311h2a51a2c_13.conda + sha256: 655d08ab740b6e828083e0c5f5c8a33a03a4f114d77165f3488a08b90d7bd3c6 + md5: 0848cc3e8d8cf4698591465a20c31295 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 46121 + timestamp: 1753310710733 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rosidl-typesupport-introspection-cpp-3.1.6-np126py311hd5de103_13.conda + sha256: 6c7b681f62c74fe72e408374df5fcfa5169b8676eae491da0f45bd7219451d3b + md5: 95f58ba92ba65a07dfbcc13251d01b1d + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ament-index-python + - ros-humble-ros-workspace + - ros-humble-rosidl-cli + - ros-humble-rosidl-cmake + - ros-humble-rosidl-parser + - ros-humble-rosidl-runtime-c + - ros-humble-rosidl-runtime-cpp + - ros-humble-rosidl-typesupport-interface + - ros-humble-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 46827 + timestamp: 1753321302009 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rpyutils-0.2.1-np126py311hbc2a38a_13.conda + sha256: d88f4d08ac0ca071a178d371f232eb1e4fbe09864333d12b26e2091f4be3056f + md5: b0592615a16741a80c5d809660ba6231 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 25726 + timestamp: 1753308439784 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rpyutils-0.2.1-np126py311hbdd918e_13.conda + sha256: b5f049fceea16d5afed676b0833ad0588f0cd15a3925fb6b277d7f866d2775b8 + md5: 8023a684168719992a7066f56a1971b9 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 25694 + timestamp: 1753308576715 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rpyutils-0.2.1-np126py311h2a51a2c_13.conda + sha256: c0f426d3bbd4d5a05de79f8c2ef88dbcafdc11d8b5bae43197e5783058c476e3 + md5: 97980a7d0429576ee3f6405ba48a7d79 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 25826 + timestamp: 1753308890520 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rpyutils-0.2.1-np126py311hd5de103_13.conda + sha256: 15b8976166441b99baf94088842026a19cfd21c82a28bbc645df5373b37d1005 + md5: ddb9382b8194d9c5da245ed933ba30a9 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 18682 + timestamp: 1753312899510 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hbc2a38a_13.conda + sha256: 710b793c1a78baab8626c07ed04aba0c20200cc229dbeb2d29414364c91ab331 + md5: 044ff177cdfdc53a802018d42355fb44 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30811 + timestamp: 1753309786021 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hbdd918e_13.conda + sha256: 7163dcf5c45e656eca3b1137567a3a510efa3045f7717c347704aeb45d698471 + md5: 09a26ceeea15b1ae7066d9d4f8a507f6 + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 30741 + timestamp: 1753309569389 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311h2a51a2c_13.conda + sha256: eb0e31bf4691327c08e7e674c97aa0b3a82db16e486c02dfd6734c4ea888a6d3 + md5: 3151b798860ee7250a094be4ed5e849c + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 30970 + timestamp: 1753310254638 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-rti-connext-dds-cmake-module-0.11.3-np126py311hd5de103_13.conda + sha256: 87bedcf9b81b888a4ac58781d96797b11afe8a0502e6eb185911d9e5904a3a7b + md5: 5ffaed20398c8d3fecb7444bd430768f + depends: + - python + - ros-humble-ament-cmake + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 27515 + timestamp: 1753318381252 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-spdlog-vendor-1.3.1-np126py311h11365e7_13.conda + sha256: ea5aada82ffde9e73df2933bb8c5292132cdd8c0bb39b428620e0009643f8bbd + md5: 2326efbd7109deeb4c2226478b2459ab + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - spdlog >=1.15.3,<1.16.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 26816 + timestamp: 1753309530353 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-spdlog-vendor-1.3.1-np126py311h5f8052a_13.conda + sha256: 913836a8436afe8daf28d0e64fc57827614e5ac14644f56392426ca9a777bbd3 + md5: fe1a420f011750bdf859f5871b894bff + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - spdlog >=1.15.3,<1.16.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 26744 + timestamp: 1753309383162 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-spdlog-vendor-1.3.1-np126py311h6932ae0_13.conda + sha256: 19ddd342a090ead8c44876abc51b1a0b2a71a007547c047bac26b364000bced6 + md5: ea80390dd9ce91561fedb4084d14a3b3 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - __osx >=11.0 + - libcxx >=18 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 26972 + timestamp: 1753310096446 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-spdlog-vendor-1.3.1-np126py311hc120487_13.conda + sha256: d1eff449ea44fc07cc0932ded798784a0b0961c0446105830f254b5f7ee4a05d + md5: 0228bab0f455ef4cc582c134423ab1ba + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - spdlog + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23564 + timestamp: 1753317468674 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-statistics-msgs-1.2.1-np126py311hbc2a38a_13.conda + sha256: 55028eab49855bb489d68d7adb5e659cebb2e33129e8bc1d9b502c78c332f2b6 + md5: 3b6ef2c32b065eb26541c7275ae02094 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 99723 + timestamp: 1753311916926 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-statistics-msgs-1.2.1-np126py311hbdd918e_13.conda + sha256: 725c3d6814d874a84b45548791c833b0212611707f1dcfa6d59b4451bb3f51f0 + md5: 6b004311efee16adb2e016f055d2c9e1 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 104099 + timestamp: 1753312393096 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-statistics-msgs-1.2.1-np126py311h2a51a2c_13.conda + sha256: 75e86648ee6e325322a2afa648844780b24af884bfea14a1378e22b8ffcef7e4 + md5: 68d5ab3d6aac9877a7f7b7bfeb37ab84 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 93263 + timestamp: 1753311290334 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-statistics-msgs-1.2.1-np126py311hd5de103_13.conda + sha256: e302452e1f3aaeee84639d650fcb9abcd5be0c9d3baf3709f2603f97d172d455 + md5: 52b6c2b4a65f311560f7e9a0621b1a01 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 103654 + timestamp: 1753324381627 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-std-msgs-4.9.0-np126py311hbc2a38a_13.conda + sha256: 77c59dcc66b059a92d305b14e63559c043dd0258023059f32ea919b52003c713 + md5: f86d9cbd68ae901ca1bed2780c69b169 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 285335 + timestamp: 1753311872139 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-std-msgs-4.9.0-np126py311hbdd918e_13.conda + sha256: b7817796813a371be7cd2ade42ca546992ee247aea2a8a2e0556f91efa970076 + md5: 9783682ecf0b5d23386b94e6b3cf2337 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 288605 + timestamp: 1753312351494 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-std-msgs-4.9.0-np126py311h2a51a2c_13.conda + sha256: c8498cf18ffc571ce9acbc7acc12d1c3fc0ca934f884e17d140c5a2a557913c8 + md5: 8ce14a1f457a737a6deb10ccd3d107cb + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 245288 + timestamp: 1753311243013 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-std-msgs-4.9.0-np126py311hd5de103_13.conda + sha256: d0b2e97572ee4bd5e9aa6a4b67cd36cfab57cbd07b4dde39392bfb75f55c8f53 + md5: dd17ae64465e2627c55443b4ca4b4018 + depends: + - python + - ros-humble-builtin-interfaces + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 252366 + timestamp: 1753324261347 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-std-srvs-4.9.0-np126py311hbc2a38a_13.conda + sha256: a942136652e9d4a18b7d8717b21956274643d2cbb3672bf3d45363b53a40514d + md5: b6457bd6dd3c30b9cd5a92ab9f3839d0 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 105085 + timestamp: 1753310615822 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-std-srvs-4.9.0-np126py311hbdd918e_13.conda + sha256: b5840c454c6360e68e6bceea308e0e1501a98c9c248ee4ec4bebb4f9272ea2ca + md5: 7c22d00353e3cd59ddf7ff2988795dac + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 109136 + timestamp: 1753312321430 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-std-srvs-4.9.0-np126py311h2a51a2c_13.conda + sha256: e2a4a10ee05f04c409e8be711dc0f2012a5b124d0c4bf8473908685f435462e7 + md5: 8f8eccf4b61bbeedd5e7aec2350488a4 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 94709 + timestamp: 1753311204458 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-std-srvs-4.9.0-np126py311hd5de103_13.conda + sha256: 04e6e57c5abaf7c1a2037d9f59794e95a82a728a3a00fa19599afec317ed740d + md5: 0e2e7699cce24b623e6b3e909c687953 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 104184 + timestamp: 1753323353116 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-tracetools-4.1.1-np126py311hbc2a38a_13.conda + sha256: 93982131be249a36fddde88395345ccdc6d3aed356e13ffcb1a54bb43c1b8b4c + md5: de14d6283f08354ac73d99104822d0c3 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + size: 40131 + timestamp: 1753309856987 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-tracetools-4.1.1-np126py311hbdd918e_13.conda + sha256: 024ad33634c1f321d9f9973154f2354ae3dc8ccdf9e024f57caa11d34f3b200f + md5: ca6c6f2ffa43a584280a689bf0f7d9c8 + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 41784 + timestamp: 1753309631034 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-tracetools-4.1.1-np126py311h2a51a2c_13.conda + sha256: 441fdd2f9a03d346fc816a05b9d9d293e28c6d200e4dc7de4f4263f872a706b9 + md5: 981283f9101e0428444a28066e91d02c + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 38084 + timestamp: 1753310333354 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-tracetools-4.1.1-np126py311hd5de103_13.conda + sha256: c3400a8b4f1b953d5a5b04bb54822b1317619310221b7957639b65073610bf26 + md5: c78bb3e7ae6e9b4a8de748d4c5f1614a + depends: + - python + - ros-humble-ros-workspace + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30187 + timestamp: 1753318816812 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-turtlesim-1.4.2-np126py311hbc2a38a_13.conda + sha256: 2861cdde048d88ab081bf226cfd68f53609a0704d2535baacc71530ab5d58d79 + md5: 01bf42b40fd87cadb5fa1a4bce98c26e + depends: + - python + - qt-main + - ros-humble-ament-index-cpp + - ros-humble-geometry-msgs + - ros-humble-rclcpp + - ros-humble-rclcpp-action + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros-humble-std-srvs + - ros2-distro-mutex 0.7.* humble_* + - xorg-libx11 + - xorg-libxext + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - libopengl >=1.7.0,<2.0a0 + - qt-main >=5.15.15,<5.16.0a0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + license: BSD-3-Clause + size: 694150 + timestamp: 1753313541543 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-turtlesim-1.4.2-np126py311hbdd918e_13.conda + sha256: 837a2e05ff015aef8904d20e80e6e723e7f613a3a85a02bff61040121dcc1165 + md5: 22747ad9315b302878ab59918c337c6f + depends: + - python + - qt-main + - ros-humble-ament-index-cpp + - ros-humble-geometry-msgs + - ros-humble-rclcpp + - ros-humble-rclcpp-action + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros-humble-std-srvs + - ros2-distro-mutex 0.7.* humble_* + - xorg-libx11 + - xorg-libxext + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - qt-main >=5.15.15,<5.16.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - python_abi 3.11.* *_cp311 + - libopengl >=1.7.0,<2.0a0 + license: BSD-3-Clause + size: 714748 + timestamp: 1753313707025 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-turtlesim-1.4.2-np126py311h2a51a2c_13.conda + sha256: 88acaff887366ae4b2ba12dc68ee493c47ae1e146210dfe93ba2af44a4644eda + md5: 901f27a224a37d75d1ade5aa2ae2e90d + depends: + - python + - qt-main + - ros-humble-ament-index-cpp + - ros-humble-geometry-msgs + - ros-humble-rclcpp + - ros-humble-rclcpp-action + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros-humble-std-srvs + - ros2-distro-mutex 0.7.* humble_* + - xorg-libx11 + - xorg-libxext + - __osx >=11.0 + - libcxx >=18 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - qt-main >=5.15.15,<5.16.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 541119 + timestamp: 1753313455935 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-turtlesim-1.4.2-np126py311hd5de103_13.conda + sha256: 174a7a68152747e8afc59858af2992271f6ffca6aa0a0b72b530534ccde8cc49 + md5: d040e8800827f7ce14a627ddf6ca985f + depends: + - python + - qt-main + - ros-humble-ament-index-cpp + - ros-humble-geometry-msgs + - ros-humble-rclcpp + - ros-humble-rclcpp-action + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros-humble-std-msgs + - ros-humble-std-srvs + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - qt-main >=5.15.15,<5.16.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 463322 + timestamp: 1753333093378 +- conda: https://prefix.dev/robostack-humble/linux-64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hbc2a38a_13.conda + sha256: ccc13d84deee0f7edeaef59899cf1c5fe543410ff733159c696a713198d76f6a + md5: e3895d655cd3d772f28d1507fc1a5b6c + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 69952 + timestamp: 1753310559029 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hbdd918e_13.conda + sha256: d840719bbbb81657941d35bb7dfe3ad80fe5b9458fb0604f1ca516b45d485af7 + md5: ae04fe294ed947aee59e7c5497a19ea1 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 73096 + timestamp: 1753312264532 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros-humble-unique-identifier-msgs-2.2.1-np126py311h2a51a2c_13.conda + sha256: 1957c505e0e8cf2a830026b1bc163c49e98246b1c66704f9a7ae32191d41484b + md5: 89ea54c37d04bab0d8b6b214e72a7daa + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.11.* *_cp311 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + license: BSD-3-Clause + size: 67171 + timestamp: 1753311129210 +- conda: https://prefix.dev/robostack-humble/win-64/ros-humble-unique-identifier-msgs-2.2.1-np126py311hd5de103_13.conda + sha256: f5949af08a1bd166db0c51f69b44aad592be1776958235dcb35cd69c5b5efdba + md5: a17629424099cba28fbc63a963d0c936 + depends: + - python + - ros-humble-ros-workspace + - ros-humble-rosidl-default-runtime + - ros2-distro-mutex 0.7.* humble_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - ros2-distro-mutex >=0.7.0,<0.8.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 76144 + timestamp: 1753322922951 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-action-msgs-2.0.3-np126py312h3bd2861_10.conda + sha256: 1b8a875e47775e899830d48cfccb1d258d3bfd702f69914ccc49567fc467e8b5 + md5: ff46c9e8166e2255a2c9830e9bc6c4a7 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 152182 + timestamp: 1759136410687 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-action-msgs-2.0.3-np126py312h01c0cb9_10.conda + sha256: 4d750bf6b4b08602b27caade967b813d4f945da41853b57b449d780bc6196b19 + md5: 7379354a294e82809070c333205b7622 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 157350 + timestamp: 1759136556873 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-action-msgs-2.0.3-np126py312h9e87179_10.conda + sha256: bbbe3cdd7dba336af3543a9573a61191c93c68e431657c3fe78b88515c2993e9 + md5: 5c4c95620303dedc66d6ba6ff9a1c3b9 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 139943 + timestamp: 1759190493773 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-action-msgs-2.0.3-np126py312h4d29ed4_10.conda + sha256: 5e2164a9d833fa5befa937a7575c3894cc58cd006fcb9085cea9aa63466bd5d0 + md5: efdf820a73d46f5127049143200ff254 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 153076 + timestamp: 1759231658171 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-2.5.4-np126py312h3bd2861_10.conda + sha256: da8dd702f6b270346c303f855cbcddc73e3cb2cc2a5e0b3d7c1dc22dce44702a + md5: d515c31f480d0de07aa5d21786600ac6 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-definitions + - ros-jazzy-ament-cmake-export-dependencies + - ros-jazzy-ament-cmake-export-include-directories + - ros-jazzy-ament-cmake-export-interfaces + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ament-cmake-export-link-flags + - ros-jazzy-ament-cmake-export-targets + - ros-jazzy-ament-cmake-gen-version-h + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ament-cmake-python + - ros-jazzy-ament-cmake-target-dependencies + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cmake-version + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23133 + timestamp: 1759134416228 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-2.5.4-np126py312h01c0cb9_10.conda + sha256: dae43d11a64d5c0d40224080f31ad5c19358933c4dc8d45847d645ca49aa8c84 + md5: f01b56d1b968fd15898a9eee1cae5889 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-definitions + - ros-jazzy-ament-cmake-export-dependencies + - ros-jazzy-ament-cmake-export-include-directories + - ros-jazzy-ament-cmake-export-interfaces + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ament-cmake-export-link-flags + - ros-jazzy-ament-cmake-export-targets + - ros-jazzy-ament-cmake-gen-version-h + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ament-cmake-python + - ros-jazzy-ament-cmake-target-dependencies + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cmake-version + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23085 + timestamp: 1759134600387 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-2.5.4-np126py312h9e87179_10.conda + sha256: c6e826c270d68e71c72a1285c7eee2e7f9919f53c50b667cdcba929db4afe10d + md5: 4ea236967ec8fa8ce8a097eedd818522 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-definitions + - ros-jazzy-ament-cmake-export-dependencies + - ros-jazzy-ament-cmake-export-include-directories + - ros-jazzy-ament-cmake-export-interfaces + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ament-cmake-export-link-flags + - ros-jazzy-ament-cmake-export-targets + - ros-jazzy-ament-cmake-gen-version-h + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ament-cmake-python + - ros-jazzy-ament-cmake-target-dependencies + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cmake-version + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 23485 + timestamp: 1759188037995 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-2.5.4-np126py312h4d29ed4_10.conda + sha256: 5b73ee213346d28104ac448e87a59c7b04c8e60768b5c6ce45ed5802d125b146 + md5: eb7746d631965cffc841b8a7997e5f24 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-definitions + - ros-jazzy-ament-cmake-export-dependencies + - ros-jazzy-ament-cmake-export-include-directories + - ros-jazzy-ament-cmake-export-interfaces + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ament-cmake-export-link-flags + - ros-jazzy-ament-cmake-export-targets + - ros-jazzy-ament-cmake-gen-version-h + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ament-cmake-python + - ros-jazzy-ament-cmake-target-dependencies + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cmake-version + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20234 + timestamp: 1759210262491 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h3bd2861_10.conda + sha256: fbdb102ca21ac8339b407cd5e95194ad38b6de823f3ab343ec3078f7b56a7621 + md5: 1320afd8f5ac3e13de730ae0b3a24036 + depends: + - catkin_pkg + - python + - ros-jazzy-ament-package + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 44602 + timestamp: 1759133832453 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h01c0cb9_10.conda + sha256: 8ab9c72a199a10f43acca482d320b3597e07b5c1bcf8948f49056a90c6557147 + md5: 6016f2d55f94cbb2e076b07165104b1c + depends: + - catkin_pkg + - python + - ros-jazzy-ament-package + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 44616 + timestamp: 1759134091620 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h9e87179_10.conda + sha256: 697fdbc059448b7529bd0faf2695e2745924a5b039ea2ef7d30a5c94182b6f5d + md5: 962963f4bd8b0412ca66ce6db03ebfca + depends: + - catkin_pkg + - python + - ros-jazzy-ament-package + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 45047 + timestamp: 1759187294851 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-core-2.5.4-np126py312h4d29ed4_10.conda + sha256: f0ad57a0882054f07579d8f9fba570ffbbaa0f6613ddb91b3695133d28eb462a + md5: 87c91c88c42d38edee71cb30b91a004f + depends: + - catkin_pkg + - python + - ros-jazzy-ament-package + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 41383 + timestamp: 1759206903242 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h3bd2861_10.conda + sha256: 057fd3c14e6816725bd9649a92a7d01abda25c4edda6e662d956a34041ce645d + md5: a469fee178503acbc9691d10f4682489 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cppcheck + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24145 + timestamp: 1759134739203 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h01c0cb9_10.conda + sha256: 350e005528ef7953d72a491354134d26d5167c117e376449233c1c594da518b7 + md5: 5d4dd7d94f6c424def2a44df8965acc1 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cppcheck + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24190 + timestamp: 1759134907657 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h9e87179_10.conda + sha256: 4313edab347dc1f45657c2596586a438c892d509a70117fd655fff50518a64b4 + md5: e3a2d41203b48d8ab34ee52a2f1ec98c + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cppcheck + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24557 + timestamp: 1759188506550 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np126py312h4d29ed4_10.conda + sha256: 0eda248d1e81fd14538a9cb63c227cf472fce80581031c4b28c8919313d49317 + md5: 3276b05b82e73db6964ef8fce6f5fa9d + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cppcheck + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21394 + timestamp: 1759221674605 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h3bd2861_10.conda + sha256: 5865778dd7d0ab8dcc2847dc5daa26216720f44c769e776ae19be58ee08fa610 + md5: cea76e84cdc5a61005e7bfdf5659bd4d + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cpplint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23166 + timestamp: 1759134782570 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h01c0cb9_10.conda + sha256: 62ab3fc67fcc93db6059e5f0f0268020feb00f4e9f44cc92b639d609b25ab7e8 + md5: 09936d210c4e288d8b9b705bfd1a294e + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cpplint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23155 + timestamp: 1759134935211 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h9e87179_10.conda + sha256: c6b0373c44113e94c084e107237dbd757fa337bb25587c215dc89b1a0fc327e6 + md5: 6d95291df484d372b132f59c13f20566 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cpplint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23492 + timestamp: 1759188540307 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-cpplint-0.17.3-np126py312h4d29ed4_10.conda + sha256: 4ff8a4ff55f117b01976d29a94244fc65875edd22d46e6e019de800f4204f696 + md5: 0fde46d3377cb1ede75085bc333a7c3c + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-cpplint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20255 + timestamp: 1759221619402 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h3bd2861_10.conda + sha256: ef005d7fb3bac97e56f95b9b7771bb69dc226574d9e282abfc499c04052e4c31 + md5: 70d6722a575b2457fa58daab5c2badb5 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21928 + timestamp: 1759133959384 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h01c0cb9_10.conda + sha256: 09ed32a8029421cc1901177fb39a6815f9102e60969b642bbbef37bf23c285b1 + md5: 2b83a51e5af3e480527ac58f891f2b65 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21888 + timestamp: 1759134207800 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h9e87179_10.conda + sha256: 304432a254618dc01172d2ee41a2cb2dd4b77e04736f8883f3e36bf0d1e6421f + md5: 98e85f50d1b9d8f93a9b416e71992985 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 22338 + timestamp: 1759187410255 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-definitions-2.5.4-np126py312h4d29ed4_10.conda + sha256: 51dfa888411c5e6365f61b2dc67faff1654316a66f5e72f55c91b329d63a18ce + md5: 5d8789516b87fc5bd250f7a41be27f3c + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 19043 + timestamp: 1759207761821 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h3bd2861_10.conda + sha256: bb05409ba9a68e3eeec6e8fd811f957191fedbb42d5511dfb7dbb1a24dacf65d + md5: 591a40185a935ba5d1663db318d59309 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22822 + timestamp: 1759134075185 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h01c0cb9_10.conda + sha256: 323758368927012c7f3a58d6053a8d32ada3e107c37381ce9c1e57408beeb783 + md5: ef52cb554a7cd7f7fab57a2f6b10e990 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 22809 + timestamp: 1759134294419 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h9e87179_10.conda + sha256: c7255941d0356f4a683581b58fba9ce413ad7989fd2bb9810639b41031216a3c + md5: aaf2759d8d8df417b29d78d1d2944a99 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23193 + timestamp: 1759187735212 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-dependencies-2.5.4-np126py312h4d29ed4_10.conda + sha256: 7a9d564d7348b9fecf1d3e993616c94a83e0bb5b9adab093b85a327afddd146d + md5: 2631ea5361fc1bae99f9e183fcfd7c25 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 19952 + timestamp: 1759208117716 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h3bd2861_10.conda + sha256: 1ab6d0ccb814415bab5c4def1065a63f71764314ffd261e65ffddcb5e79dc110 + md5: 2c6d7567d6ff94d0d4f3d31590a65b3b + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22313 + timestamp: 1759133955377 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h01c0cb9_10.conda + sha256: d8501780638d449d409c2856a9fde2bc8e77633cd3c66d0c4402f245afd343a9 + md5: 36b4ad2197bd7847ca253a4e333c7a3a + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22307 + timestamp: 1759134204155 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h9e87179_10.conda + sha256: ed8ae12a5a1a125c4dc242a2bf915703c0a0a64587f0aa75ecc447e0a7e75312 + md5: 92699b2f0ebe6e4598e50f56c636ad41 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22741 + timestamp: 1759187405116 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-include-directories-2.5.4-np126py312h4d29ed4_10.conda + sha256: 13e7efe770ea73a397c92e843c78bff2a4ff8aabf59997e0bc78d29410a8d426 + md5: 259e0ae34f18a0f76d75f3081cbb9505 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 19394 + timestamp: 1759207700861 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h3bd2861_10.conda + sha256: 2b1487576c4f83cfe3de7deb8fa618a124e0757877a3748fba5675db3794d9b8 + md5: 9bd5f96a85e35c2f769f4281d6e6215e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22521 + timestamp: 1759134052942 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h01c0cb9_10.conda + sha256: d7036e74aab785fd1cc66fe8245cb47c0777bdcae14b2824b6d79b89f352925a + md5: 611f538bbd88dbdb6446c3fc8772ddc6 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22513 + timestamp: 1759134265684 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h9e87179_10.conda + sha256: ed522aef20e70ccb0b1cf05e465b09d2f4276b532a15510dda52756adabbcdf9 + md5: d38df9d969dd7a89ec872d44b89708c2 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22902 + timestamp: 1759187613422 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-interfaces-2.5.4-np126py312h4d29ed4_10.conda + sha256: b0444ed4e5dffa1154b5642855dd1ef2ee478cac6ce4ecc50688401c9a7fae1a + md5: e82c1af0586daf572304c1c3667702d2 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 19613 + timestamp: 1759208261836 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h3bd2861_10.conda + sha256: f9947aeb9a7af1e95ab85bf6f6fd308ba24600ea30d0322f88032917903e3089 + md5: 23e5475abbc527069e52a58b97bc1301 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 23851 + timestamp: 1759133934452 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h01c0cb9_10.conda + sha256: 98b427f0a73e62e19ee13734bce2874bc9689dd38be4da32835e43c58ae5b038 + md5: 9a1c985fe31b9e4535735d9a29e6293a + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23837 + timestamp: 1759134167783 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h9e87179_10.conda + sha256: 1b1740dbece8e1a04210f243ed593074cd2d15d60cc0efd3760f068273d433c6 + md5: 9543ce3e0affb40babe1b0c9e173f5c4 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24260 + timestamp: 1759187374030 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-libraries-2.5.4-np126py312h4d29ed4_10.conda + sha256: b2dfca0affe5c748c6119b624dd3fa99f62f3c771972bdffd2bbaf5e7a4c9eef + md5: b9c7dc71a7b0b25aa78de8cc78b16038 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 20959 + timestamp: 1759207518104 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h3bd2861_10.conda + sha256: a2e1c9fd6734c3dfb52e7d9354d2e4664740a5e26a2e01497e7e0fffdd5f2add + md5: 4bf8e57b7f3d0f39d61cb914342eeac6 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21862 + timestamp: 1759133951470 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h01c0cb9_10.conda + sha256: a16e401c238de646352a7d91f137288a8e2dcb2415b43c06a2039fb3e39abede + md5: c78ea94b6519f0d42a16c39183159b07 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 21852 + timestamp: 1759134200329 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h9e87179_10.conda + sha256: 0066e60a447a4200d567cddde4176dddcd2f499b709ba63269687af905765ccf + md5: ed2548909276d30191f974475b49453e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22295 + timestamp: 1759187399180 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-link-flags-2.5.4-np126py312h4d29ed4_10.conda + sha256: af6409a92bfc3bf2d86b83b662273438eb5c47ee577afc4edb67e8eb522bfa31 + md5: 16acc3cb127b89a62b9b4e05726e8a70 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 18907 + timestamp: 1759207640971 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h3bd2861_10.conda + sha256: 9284f224865194d32c95be170377ea6fe82692fd23523465b64ff8cbba7d46fc + md5: 3435ad804d61112efa0ad8bc67fe9ba8 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 22622 + timestamp: 1759134083673 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h01c0cb9_10.conda + sha256: 32ab9cccdffde02bd5a10126467f8d704634093bd20d8ee4e5fd876192256024 + md5: d57084c82fa094733d25a4a6cfceecef + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22645 + timestamp: 1759134302779 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h9e87179_10.conda + sha256: 2abf7e14b7fb24a526c3093a961db152b31772e7d3739c30f04c082419ca9e6f + md5: 39731a85a2f4fdfa0c583bed4d980c1e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23048 + timestamp: 1759187747392 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-export-targets-2.5.4-np126py312h4d29ed4_10.conda + sha256: 9c5cf004892cac360bf1be0d63cea5172c6bbcc607967bd93e9dadc93d813abe + md5: a6537adc07902b91f030fbcc2fb1d3b5 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-export-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 19723 + timestamp: 1759208213627 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h3bd2861_10.conda + sha256: 7e4323ab2ada33f1109077261c55f7b3ce6fef33a72889735d7c718f3d3028ae + md5: 3ab7241cb3e4e32bb68ee4bb0bbd9bf0 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-flake8 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24166 + timestamp: 1759134777625 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h01c0cb9_10.conda + sha256: 8254afc933f0c510c1c16b58bacaac9b04db944e7ea780f6c6de8438419cba09 + md5: d3fc6f507a0596d4a4139d0ef079f827 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-flake8 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24209 + timestamp: 1759134930987 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h9e87179_10.conda + sha256: b2903d79fd9d9e90b0e2df558766c293d472286c361a0c1f636aeaa58395f78b + md5: 33581d00b86868375eb2c40d45d7c7ac + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-flake8 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24584 + timestamp: 1759188534846 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-flake8-0.17.3-np126py312h4d29ed4_10.conda + sha256: ee239f8e0974a9f3306866d6f8f4794c80e0001a92f6b818e2a13a75fb4c76d7 + md5: 05764633e62c40c0c915b114ac565412 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-flake8 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21333 + timestamp: 1759221568956 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h3bd2861_10.conda + sha256: 68f86ebc83c162fe616c37e66a2b39a36a844bee11deccb1bd31b610fe441f4c + md5: 10f12182fabce09e326bc28635921582 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24657 + timestamp: 1759134302877 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h01c0cb9_10.conda + sha256: c3c267656a91a6dbc427869356de47b223297a69cfef5be915ee636e84322f07 + md5: 6bbd18d396d0745317dc7457ed00cc88 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24645 + timestamp: 1759134489336 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h9e87179_10.conda + sha256: 11d52294d46498b34c0cf5db68502305318c36ebee8fd52146d15ed83180cdec + md5: e1109b8720008b3bf8e92964027fb4b4 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 25020 + timestamp: 1759187909133 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gen-version-h-2.5.4-np126py312h4d29ed4_10.conda + sha256: 7ce0ca88715c5bf325b5f4357ea1c3bafe251da6d76ff781f9208683ec47778d + md5: 1c5b4b339d97517e5fa33e6c855281df + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21768 + timestamp: 1759209549881 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h3bd2861_10.conda + sha256: 89e91f052b66ddb4f9f722159be85d619a270ad14665c535caad4400a780b094 + md5: 53e5c1cbb0c3a4c439507e0eff40a40f + depends: + - gmock + - python + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-test + - ros-jazzy-gmock-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24766 + timestamp: 1759134310146 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h01c0cb9_10.conda + sha256: 223c4e0283234557a64f76173a9f2b3919498ae2cc66752eb2fa11b33132aa65 + md5: a20400b6f70d8c09c43eb4ecd9f0abc5 + depends: + - gmock + - python + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-test + - ros-jazzy-gmock-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 24787 + timestamp: 1759134500348 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h9e87179_10.conda + sha256: 1fb84b02d43f54372430f0f2deac15c6f073cb475a70cd1b5122e971749dd00e + md5: b3b6c0b803865755873dff0ca77a86c5 + depends: + - gmock + - python + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-test + - ros-jazzy-gmock-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 25144 + timestamp: 1759187919584 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gmock-2.5.4-np126py312h4d29ed4_10.conda + sha256: 612f4512c7a4237266214696dd2fd6f17f79989d61c7656524b1dd16f4e6fa90 + md5: 6fb791ce8485953c3fc240ac9ffc9041 + depends: + - gmock + - python + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-test + - ros-jazzy-gmock-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21838 + timestamp: 1759209612784 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h3bd2861_10.conda + sha256: 3271e75e2695121cfed4fefba600e41e405bdb751396bf6fb6c7d50f37d36209 + md5: 2fbc03a4d11983ef7e2e7d45007bc5c4 + depends: + - gtest + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - gtest >=1.17.0,<1.17.1.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24522 + timestamp: 1759134185222 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h01c0cb9_10.conda + sha256: ffbdbdfc46999edbcabce8fdab0f936651bd049b5cc7b7729a169c6902276c01 + md5: 67fea5f79ecd15fab4eb3846dbdc0cbc + depends: + - gtest + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - gtest >=1.17.0,<1.17.1.0a0 + license: BSD-3-Clause + size: 24525 + timestamp: 1759134377032 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h9e87179_10.conda + sha256: 7cb1131fb66fd585eaaabe5459b0781cb24665050d1462b7930072f2521c1288 + md5: 6131e332780348d667e2e12f32c5fa66 + depends: + - gtest + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - gtest >=1.17.0,<1.17.1.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24928 + timestamp: 1759187799202 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-gtest-2.5.4-np126py312h4d29ed4_10.conda + sha256: f5466cd60d62ae7713a4bb6789d7f4c3017d143a88c41a9e056598de02798db0 + md5: 78e7f405f82e748a8208757ad3de0b02 + depends: + - gtest + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - gtest >=1.17.0,<1.17.1.0a0 + license: BSD-3-Clause + size: 21578 + timestamp: 1759208793097 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h3bd2861_10.conda + sha256: 7193e6896a70e5f3d0d2b233dd1efade6ddc35e896fa5f1a2993152aaff552b0 + md5: 40e460086dd375ef4096cc352f95eece + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21789 + timestamp: 1759133966450 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h01c0cb9_10.conda + sha256: 9818ea44d9e16a0fed5acb3ce4c54af181ff0e2e07362685ba08e20b1df49753 + md5: df5e5315f7a728c6112d87b9ceb32ec4 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 21769 + timestamp: 1759134200724 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h9e87179_10.conda + sha256: 00ebad2f6e561c2dc9f3bed0810a664217c5b0408d4f9950cc38ea24759fbb71 + md5: 44152a59211c74d8c20c44369fdb0a33 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22198 + timestamp: 1759187424303 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-include-directories-2.5.4-np126py312h4d29ed4_10.conda + sha256: c800127a50f0d48cac9ecd38364a374b2889628eb1c2e25661a465ea6b197589 + md5: 3efc324cae547461248ee3452d169604 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 18902 + timestamp: 1759207463703 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h3bd2861_10.conda + sha256: 4e7c17261e8fb54c91202c4b01948b067f9e531f8f8d96965208447e41d4aa9d + md5: 7cafa7a9acb195a46c7800d859a23c47 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 21459 + timestamp: 1759133962441 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h01c0cb9_10.conda + sha256: 8d2225aacf15edcacbde554db1f3a65f1278a3c930dbfdc5ce1b2773350a74a2 + md5: 902f7314bda2e08c4dee04a23f63899e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21488 + timestamp: 1759134197319 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h9e87179_10.conda + sha256: 690336b05a5a1859c3796cb2e24a3a0991a5fa17f7bcd733e73940b797da72df + md5: 468824e6d016a18544f0aaaf0458704c + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 21896 + timestamp: 1759187416905 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-libraries-2.5.4-np126py312h4d29ed4_10.conda + sha256: fbf2ab936ab8717d3956667e7a4a47f6f802a2c8f4287ee31255d8561503ed3a + md5: 606cebbedda0b13ee74a0d32bcfb369d + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 18502 + timestamp: 1759207407656 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h3bd2861_10.conda + sha256: 48272f00f6f83b3cca6c12cb4016bddddd51bf5c88af2b9e22b12469e43ad8fa + md5: f2fa0bbb788526a5b363a2bc36134b4f + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-pep257 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22947 + timestamp: 1759134772680 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h01c0cb9_10.conda + sha256: fd468b924aad99efe0caf776b687e24e7e47452f0c4fbc5283206bd823493072 + md5: fd7ca0c0a0706821bc1de9f52b9067c7 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-pep257 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22928 + timestamp: 1759134926932 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h9e87179_10.conda + sha256: 6eb1a72811e4c3c57f09eca3e7e4623827711c1c52d0055571878b5c96aaebc4 + md5: 1c950ee4306017c03f6e57959ae62c88 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-pep257 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23360 + timestamp: 1759188529385 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-pep257-0.17.3-np126py312h4d29ed4_10.conda + sha256: a97da7d1c8db6c99bae8bebdf8986d165de7542b6db88a9a40a8b026c2c2838a + md5: b99d321a7891423d0d1812a9272cb27c + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-pep257 + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 20054 + timestamp: 1759221517393 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h3bd2861_10.conda + sha256: 686c39b6ccacc370d982e53e6510c7ecafd60ce5fdff55d35548660a12ee4175 + md5: f0d8dba6c1ae9e31ae548f785ec377a5 + depends: + - pytest + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24660 + timestamp: 1759134171332 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h01c0cb9_10.conda + sha256: 47c680456028c12c4ee8ada297471f7f50dbbcc854e3ad7ad2c17fe799d85cc7 + md5: 947cfa0273783aec41e7c237171f0759 + depends: + - pytest + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 24648 + timestamp: 1759134362137 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h9e87179_10.conda + sha256: 589f46f6d1f9b669467c5ff26b65ae32c2bb144b5c93a159f94d83afce54ba94 + md5: e6f2f7f585ef2001b34feae66b73e9b4 + depends: + - pytest + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 25069 + timestamp: 1759187779255 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-pytest-2.5.4-np126py312h4d29ed4_10.conda + sha256: 2084f3bf1cf7cd4a445b40498b51874831b18b3f496396f38528c768afec9069 + md5: d60f4d5d3a8aa9a165ac0d4aeedbe625 + depends: + - pytest + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 21792 + timestamp: 1759208964473 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h3bd2861_10.conda + sha256: d8ed05e93039229c49afe5a211c98128cecdea9bc32880947b126bba4a44d5ea + md5: 2dfe91c923a3c63f5a374e94dec1fbe8 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24026 + timestamp: 1759133950758 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h01c0cb9_10.conda + sha256: f2deb1aeb5521883e22713c22f78e338befbbff0decefc0af1daa95bc2749d01 + md5: bf4dd1a4fa5d3d9de70f6faffeb85c1b + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24004 + timestamp: 1759134183256 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h9e87179_10.conda + sha256: 2bb3abcd2b950389a42072e68a560d80d5772456c187caff9bee4a1035a07102 + md5: 70ed7cacc8bbec005651e23dab7a0a18 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24405 + timestamp: 1759187395290 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-python-2.5.4-np126py312h4d29ed4_10.conda + sha256: 01b3bca85f7fd30cfcb99577454c447df6d1c157ea1091a2e0c417ecd7446797 + md5: 7b87b031df3ca4d5cda98f8297573a40 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21136 + timestamp: 1759207279564 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h3bd2861_10.conda + sha256: 5e30081736cc5715c1c50ace6fe4fdcda97db043af8a87d52963c64eda90aab2 + md5: 5675917194d623b947c721b891ca90a5 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-gmock + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-pytest + - ros-jazzy-domain-coordinator + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31057 + timestamp: 1759135157872 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h01c0cb9_10.conda + sha256: 40d91028e275aef5ceac8c64373e738c871ccd7cbb8975be25856e3738ddb044 + md5: 4f043a10f3d6a679fb359c018fb20921 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-gmock + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-pytest + - ros-jazzy-domain-coordinator + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31133 + timestamp: 1759135244272 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h9e87179_10.conda + sha256: 66221a5665c52a140646ebe734a7089c37c213e8cca8c71beb7a06f7bd607a17 + md5: 5e60534c1930c1769650bc63324606ae + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-gmock + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-pytest + - ros-jazzy-domain-coordinator + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31346 + timestamp: 1759188957622 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-ros-0.12.0-np126py312h4d29ed4_10.conda + sha256: 61c8c550c3387f2798ba505d2ecbea4c2d1f85283a03f7195d08ecdb3fccf687 + md5: 29f70c64be98b50b8064c84500094197 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-gmock + - ros-jazzy-ament-cmake-gtest + - ros-jazzy-ament-cmake-pytest + - ros-jazzy-domain-coordinator + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 28079 + timestamp: 1759223616733 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h3bd2861_10.conda + sha256: 5af99e38e0f12bcff9d88c8dad6aa594662e01e7641a5679e05202e3fff31d0b + md5: 2bc3c4d9b2fd625252b6655ac991abcd + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-include-directories + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23452 + timestamp: 1759134079465 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h01c0cb9_10.conda + sha256: af757a2e93da61cb23ca80be17d8c11198e63e79b729905a819128a08937b77e + md5: 74aa6cacac693f7220e094c750eea29e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-include-directories + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23459 + timestamp: 1759134298538 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h9e87179_10.conda + sha256: a1176654b83769a7a3d9157f14d408bed268a20d5e539ce59577582ace94f8ca + md5: ebb0afb2edc79cae3b723fc1d4c265a0 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-include-directories + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23894 + timestamp: 1759187741769 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-target-dependencies-2.5.4-np126py312h4d29ed4_10.conda + sha256: 8731b15f51236f21a08e3f45617554bfca50032821f6599501b008610bc52556 + md5: a05a4c82bb6b94c3b2627271ee3ebd16 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-cmake-include-directories + - ros-jazzy-ament-cmake-libraries + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 20563 + timestamp: 1759208167383 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h3bd2861_10.conda + sha256: 3218389dab2fe118003bb27856a54c427967d202cd065b817407adaa12892fab + md5: 6a9e03a04772d82d44a36f3f99691164 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35962 + timestamp: 1759134067824 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h01c0cb9_10.conda + sha256: 69814d4701a83f2e3803d21191b84e54d62dc062c6b8814d1ee82511067840ae + md5: 1a5e97834566bfece5b5687b2fa415a9 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35955 + timestamp: 1759134287474 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h9e87179_10.conda + sha256: c720618cd8fd1ddd348f1a60f21b38ec3c761bdccd4f8277c759d0ca8f4dd81a + md5: 9327ed1d325d570ab0e8eb0bfe82e7cf + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 36376 + timestamp: 1759187725367 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-test-2.5.4-np126py312h4d29ed4_10.conda + sha256: 598444a11a0fc7299623284a2b92d26fc9ad51641873ba3a2b3bb30b7ba75e04 + md5: e62471e4dcda312f453362e87193e44b + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 33137 + timestamp: 1759208037245 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h3bd2861_10.conda + sha256: d161b232b731ffc4433514861e96319c43d4554dc3e01c42ca10e30e2b23dc38 + md5: 63639073778df79369ef6585977371bd + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-uncrustify + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23554 + timestamp: 1759134766752 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h01c0cb9_10.conda + sha256: 4eb3c967f0f273676e9bf6b93eccac24c0a13fbb5a6482cd03e567398728ae4a + md5: 170c193717c9e8e5a8c667b77e1c54ca + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-uncrustify + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 23552 + timestamp: 1759134922138 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h9e87179_10.conda + sha256: cd8be72f5725b3c9bb2f6865cb1e5f9c26d577815bfe4c24bcdeac979d689fc6 + md5: f1739ec0e8a2d5e4439efa9e3e7a5771 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-uncrustify + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 23882 + timestamp: 1759188522970 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-uncrustify-0.17.3-np126py312h4d29ed4_10.conda + sha256: 7c73d98a3f55f9a135f9141f4f375284fb39ff09c0f9ee1aab7e558bcf1cf2ab + md5: ce4f80cfb42b611c7426bbdda5a3f5f9 + depends: + - python + - ros-jazzy-ament-cmake-test + - ros-jazzy-ament-uncrustify + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20693 + timestamp: 1759221466359 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h3bd2861_10.conda + sha256: 421c9f272d211494564851ac1edc2cc3cc8da813a35006bb1b8a6af4e697fe47 + md5: e4a57c0d18ec4b143c866d979bb74550 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21647 + timestamp: 1759133947231 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h01c0cb9_10.conda + sha256: f19d3803902ab94355a85b6db7e5d5a3da72f071bae0bbd131eb9717f742d0ef + md5: f789ed1e6ce19956dd139cbd6c1d35d7 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 21629 + timestamp: 1759134186306 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h9e87179_10.conda + sha256: 11f3c0d2946b29a4ab78acfc6386736b5fd92c24a6d81fe6b4d1b595c733cc7f + md5: 871f4a30234e09992e1614b6633d719b + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 22075 + timestamp: 1759187393809 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cmake-version-2.5.4-np126py312h4d29ed4_10.conda + sha256: 7a2c36d081f3466feee75c00756e65b3d0336fa8dbc1d3284a158266f398c0c6 + md5: 1daca6e82bd8211ad60c9d77de458073 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 18785 + timestamp: 1759207586246 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h3bd2861_10.conda + sha256: 0d1c849eca4bbd215658bdbc0d7e714fd541353f4b3a651e0c0320524a4e1b9f + md5: 1a428d58bd65774b99fb4b6541645674 + depends: + - cppcheck + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29727 + timestamp: 1759134435250 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h01c0cb9_10.conda + sha256: d07d239ce0d5cf95b067db6164c89ddbc13562b89a47621e6cd8d2a71e68aefe + md5: a6f0b8309f8c8bb01118f4f6e66cac59 + depends: + - cppcheck + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29719 + timestamp: 1759134618891 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h9e87179_10.conda + sha256: 7d07a8a80691ba6cd2b775f17a1613846b04324a267573e449610a2e8d9cf60e + md5: 988b45bb81d3c35b155bed3cbfebe9b2 + depends: + - cppcheck + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 30034 + timestamp: 1759188061926 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cppcheck-0.17.3-np126py312h4d29ed4_10.conda + sha256: c2dab534d1cd529c1254263150b59e5426398473efedf0bf588719f6b9013887 + md5: 908f3061d5462708360d2a4c33adb623 + depends: + - cppcheck + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 35029 + timestamp: 1759210444988 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-cpplint-0.17.3-np126py312h3bd2861_10.conda + sha256: 558550657ad4de03cda5c0bc5c26ca6ccde42994e1da73bc699205e000221a4e + md5: 70a9e0c4c63f464b9cab132720a17f13 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 168508 + timestamp: 1759134429635 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cpplint-0.17.3-np126py312h01c0cb9_10.conda + sha256: 819923959cd110c5a8c7f12a25063e6b7ed0d100ef9134905ce6fd5076c5f4e6 + md5: 67111186bdc01daec3a127f208b7a9cc + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 168477 + timestamp: 1759134612933 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-cpplint-0.17.3-np126py312h9e87179_10.conda + sha256: cb675b200a0eb664a209cd7c77c7e81ebe9de1ad8ebeedd71f1533b02633be09 + md5: 3c5265e9dc78846e61509fee4d555aed + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 168816 + timestamp: 1759188055059 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-cpplint-0.17.3-np126py312h4d29ed4_10.conda + sha256: 5f43a910c1afa9d390546c18f145ed191ca3a2aa19e8f20f83e745ad5cf50ecf + md5: 78b254c70da40d60e5767ef5edf6c516 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 177559 + timestamp: 1759210346050 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-flake8-0.17.3-np126py312h3bd2861_10.conda + sha256: e14771d2b63d98fbf81fc85199e756cf6f57b9302d6e9f6574aec518d4e86f85 + md5: 0ee380510b6161bde6021ae0b6409624 + depends: + - flake8 + - flake8-builtins + - flake8-comprehensions + - flake8-docstrings + - flake8-import-order + - flake8-quotes + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 28199 + timestamp: 1759134054135 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-flake8-0.17.3-np126py312h01c0cb9_10.conda + sha256: bc9b3cd26766c2ff2f9fa694be6fc93f90879be9df95b1457034460b13991beb + md5: 1d5a7044f733e5d99a93828513d94a52 + depends: + - flake8 + - flake8-builtins + - flake8-comprehensions + - flake8-docstrings + - flake8-import-order + - flake8-quotes + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 28220 + timestamp: 1759134265946 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-flake8-0.17.3-np126py312h9e87179_10.conda + sha256: 0580c1ad9b0e4cd3c8c848fbe4ccdb6ce865b2aef89aa6ef42200ba6dd1db323 + md5: 0e685f1798252e2f83850c34c29aab63 + depends: + - flake8 + - flake8-builtins + - flake8-comprehensions + - flake8-docstrings + - flake8-import-order + - flake8-quotes + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 28552 + timestamp: 1759187708414 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-flake8-0.17.3-np126py312h4d29ed4_10.conda + sha256: 39760e84ef518504c5109c6674d90b0ed1fb32272b0a3a5e346867ee838c2db8 + md5: e8458cd3ee17bda0fed2181d61d0f15c + depends: + - flake8 + - flake8-builtins + - flake8-comprehensions + - flake8-docstrings + - flake8-import-order + - flake8-quotes + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 33348 + timestamp: 1759207968482 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h3bd2861_10.conda + sha256: e833b1bec68df1eb14c0762ae19b569916c1f430f63b3f15f66dd9b15d3d3e68 + md5: 8455c02a66a9c9007b3655adb6d17d0f + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 46717 + timestamp: 1759135470380 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h01c0cb9_10.conda + sha256: aa1820d1771802fa49373cc99232922ab52c864ad8fde39d1531609cf1014909 + md5: 05f1806c851d472acb89988cda1a0b64 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 46273 + timestamp: 1759135430806 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h9e87179_10.conda + sha256: 94ef3577a88cd8e231d0107e368ea031d5255ab95db1163f8fab94bed2f3a922 + md5: f08547c5cd74bad6a14c2413a78db419 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 47200 + timestamp: 1759189143923 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-index-cpp-1.8.1-np126py312h4d29ed4_10.conda + sha256: 036556ab1d162741640bfb75a9f01872a5d7a3d0881b9d84899d23233a186495 + md5: af191e55b9bd49dcddc5a107f60b0f89 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50330 + timestamp: 1759224513481 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-index-python-1.8.1-np126py312h3bd2861_10.conda + sha256: 0495ec46605fbb98ff48cbbaa32db1ec06d2184bb9d35f7a8ad196f60baf09d4 + md5: 631a7aecb0be6a68f940d599500d3f1b + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29534 + timestamp: 1759134402900 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-index-python-1.8.1-np126py312h01c0cb9_10.conda + sha256: dd28a35629fd50161a0658d988e2c09c7343b8e627451e3386276d19d763893c + md5: ab2cf99ac0e95571da70d680ce13c370 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29526 + timestamp: 1759134582326 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-index-python-1.8.1-np126py312h9e87179_10.conda + sha256: aeb357419e3be01170f3f69c56dfe3f764b3f4b8e1816b1fdaab0e6497ef3539 + md5: 251f81f555d3e25f9c1ebe03fef204eb + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29876 + timestamp: 1759188020665 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-index-python-1.8.1-np126py312h4d29ed4_10.conda + sha256: d558530678b536a098804ffa8a82621b5421da8ef3a4447740e4c877c9d631fd + md5: d35550d8f49ef9a4e2511cb8ad1a74ed + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 34550 + timestamp: 1759210683893 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-lint-0.17.3-np126py312h3bd2861_10.conda + sha256: fd143a729d7931fcbbdb8a75fbbbb836cca851377f9ce57818bb5696c12969e7 + md5: 3dd09189cde6cc9dff17c0df07386914 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 17540 + timestamp: 1759133935127 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-lint-0.17.3-np126py312h01c0cb9_10.conda + sha256: 4b05c1f89aecb44d3bee7cf780c963b15de54f2b464aedf3ddf4362026d5acd5 + md5: 930d21638aaacef67da49815e7c5fece + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 17540 + timestamp: 1759134167558 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-lint-0.17.3-np126py312h9e87179_10.conda + sha256: 125b7456468d2ce90cc13010a10656378081f9fe1aaf674c30491bc9e29ebb42 + md5: 75c38adb9d47923817d1f79e47c1b3e0 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 17900 + timestamp: 1759187373543 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-lint-0.17.3-np126py312h4d29ed4_10.conda + sha256: 8784a2fa56e9b4eb5a0da7c897452167caaf5d99ba334d25fa131d0fa100661f + md5: 3ddc88a41cb4a66ff304e9b66fb89873 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 14725 + timestamp: 1759207199842 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-package-0.16.4-np126py312h3bd2861_10.conda + sha256: aba2a3caa178275121077d78eaa0bb543ca78a15fad489ef0934440cf1384818 + md5: 219e221ff912c30fa84d10e21e67ad16 + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.11.* jazzy_* + - setuptools + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 42819 + timestamp: 1759133819428 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-package-0.16.4-np126py312h01c0cb9_10.conda + sha256: a66e5a341e8ce8e3d39cbe6089c43b431c315d1e319d172f45fa415efc8e34ee + md5: 9e27e7402532e7b43b8c5776cac996f4 + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.11.* jazzy_* + - setuptools + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 42888 + timestamp: 1759134071773 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-package-0.16.4-np126py312h9e87179_10.conda + sha256: 74ebe8869aa4ca89a4bc7900a1b83dd1d52bc29b52742efa2d7a061cf3563911 + md5: 614be0efc4ff1baa008a8faa7400157d + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.11.* jazzy_* + - setuptools + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 43206 + timestamp: 1759187279747 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-package-0.16.4-np126py312h4d29ed4_10.conda + sha256: 67a83878f80ec1ad28a2dfcbf4a1ca8c5a84199ab8b8c9b8723e4636ab02c297 + md5: d1b2512c69709deadb3b127daeb01d4f + depends: + - importlib-metadata + - importlib_resources + - python + - ros2-distro-mutex 0.11.* jazzy_* + - setuptools + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35316 + timestamp: 1759206814853 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-pep257-0.17.3-np126py312h3bd2861_10.conda + sha256: 054807a1024f4e016c28d5996d0a6913a83c39aa54fdcfb68ea7c593315d882b + md5: 36c3e341e6316533dcd10526dc37f302 + depends: + - pydocstyle + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 26874 + timestamp: 1759134170804 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-pep257-0.17.3-np126py312h01c0cb9_10.conda + sha256: 3c8dcba89f5186f2e679479c1a8668d07077867e1efe28ccadf4dfe899df63e2 + md5: 872d2d804c7f40a1bd496d8103e298c6 + depends: + - pydocstyle + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 26909 + timestamp: 1759134361400 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-pep257-0.17.3-np126py312h9e87179_10.conda + sha256: f8bc3f8ec5ee0e4623ccd53b87e56979588eaf33c6b7a36a792fcf68b6a6e9f3 + md5: 32866173624f01b0ad8c5e7be686179f + depends: + - pydocstyle + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 27215 + timestamp: 1759187781004 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-pep257-0.17.3-np126py312h4d29ed4_10.conda + sha256: 8232434bc6f14b0887be3a663e0aa39eefe0ac341958e0d87844f325e83e9c9a + md5: d4691d4d9483159c1c42c9bcd074a211 + depends: + - pydocstyle + - python + - ros-jazzy-ament-lint + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 32067 + timestamp: 1759208727294 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h3bd2861_10.conda + sha256: 6a8c9a9fc05d6e70751464a626e8ad7db197781b17cb4a22b4aa00b160e683e7 + md5: b320c684c834fab56dbec576acc8937f + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-uncrustify-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 67974 + timestamp: 1759134614981 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h01c0cb9_10.conda + sha256: e881fd14c286e89bdabeac710961c5d86d899aadaf61cf8df34bc97c76ba9e51 + md5: 54ad7fc7cb13b759658774407823e99f + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-uncrustify-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 67941 + timestamp: 1759134794493 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h9e87179_10.conda + sha256: f93329138f7c5d11a79f69be48fbc7d3a1664eefc52d2edbc2beed201e4e619e + md5: f51895bba15cd2157aa7cf25b8b15adb + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-uncrustify-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 68293 + timestamp: 1759188401226 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ament-uncrustify-0.17.3-np126py312h4d29ed4_10.conda + sha256: bf1551059798077e21e87f688ef187202c36ef456bba17264344c988769a0e79 + md5: 814d61e6b63f72864f3113d814982e48 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-uncrustify-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 74536 + timestamp: 1759220796853 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h3bd2861_10.conda + sha256: 61591684d33300b93566ad1cca53a3650ec16733ae4a68cd032e4f20812d03ce + md5: 01a602042c395cf018dabdadd12482ac + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 79473 + timestamp: 1759136335359 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h01c0cb9_10.conda + sha256: c382d7c2665e79ed31de5d05969fe3cfbc81fe58d41d99772fca6c81aebe308e + md5: c45ff1bab9f2496d77f736c57869f721 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 84159 + timestamp: 1759136455628 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h9e87179_10.conda + sha256: 64e55629d639ba9ee03229cb12125d583f8abea2f61b3c08bb558aba6a862cc6 + md5: db5fa797d9f24a759979a418775ca9c5 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 76021 + timestamp: 1759190398999 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-builtin-interfaces-2.0.3-np126py312h4d29ed4_10.conda + sha256: cd37e492c258450fc144e6e4c02a95c1fbee5bf9dc8bd84789063ad8a67edba0 + md5: a21b93d6b6c27d431952016be0e11468 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 84783 + timestamp: 1759231203344 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-cyclonedds-0.10.5-np126py312h3bd2861_10.conda + sha256: 215189a1a3943b68bffe815fbd28c871f578c40015df68f70bb59fc3d6ee38ea + md5: dd85d860da3116391d794ece4dc97c79 + depends: + - openssl + - python + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-iceoryx-posh + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - openssl >=3.5.3,<4.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 1199357 + timestamp: 1759134314376 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-cyclonedds-0.10.5-np126py312h01c0cb9_10.conda + sha256: 5972ba42667a4df8f023a398508113b0f634e5f098180dbfe79df49f0d70153d + md5: 09078ed33b9fca78613ca7bd26dcfb1a + depends: + - openssl + - python + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-iceoryx-posh + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - openssl >=3.5.3,<4.0a0 + license: BSD-3-Clause + size: 1247089 + timestamp: 1759134504817 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-cyclonedds-0.10.5-np126py312h9e87179_10.conda + sha256: d90cef46fbaa29e8541139f9d4fa95b7f63abdb2fdf5b793dab71a6868ba6dc0 + md5: 9cde0f29be4b8336e3e9ae608ff3a66a + depends: + - openssl + - python + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-iceoryx-posh + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - openssl >=3.5.3,<4.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 1053348 + timestamp: 1759187925576 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-cyclonedds-0.10.5-np126py312h4d29ed4_10.conda + sha256: 61be88621ce34c4693e519a520e1898603af1438f139c573d62f2a92b0cc8b61 + md5: 07e4953f100d79a0d86b2043b2540575 + depends: + - openssl + - python + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-iceoryx-posh + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - openssl >=3.5.3,<4.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 1080547 + timestamp: 1759209652411 +- conda: src/distro_less_package + name: ros-jazzy-distro-less-package + version: 0.0.0 + build: h9352c13_0 + subdir: win-64 + depends: + - ros-jazzy-rclpy + - ros2-distro-mutex + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - vc >=14.1,<15 + - vc >=14.2,<15 + - vc14_runtime >=14.16.27033 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 78f0d61a9f1b9f10df4e93bf6ccfa983dce52f4a7bb1deab1aebb4c8c0c228a8 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/distro_less_package + name: ros-jazzy-distro-less-package + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - ros-jazzy-rclpy + - ros2-distro-mutex + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 78f0d61a9f1b9f10df4e93bf6ccfa983dce52f4a7bb1deab1aebb4c8c0c228a8 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/distro_less_package + name: ros-jazzy-distro-less-package + version: 0.0.0 + build: hbf21a9e_0 + subdir: linux-aarch64 + depends: + - ros-jazzy-rclpy + - ros2-distro-mutex + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 78f0d61a9f1b9f10df4e93bf6ccfa983dce52f4a7bb1deab1aebb4c8c0c228a8 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: src/distro_less_package + name: ros-jazzy-distro-less-package + version: 0.0.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - ros-jazzy-rclpy + - ros2-distro-mutex + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - libcxx >=21 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: LicenseRef-BSD-3-Clause + input: + hash: 78f0d61a9f1b9f10df4e93bf6ccfa983dce52f4a7bb1deab1aebb4c8c0c228a8 + globs: + - CMakeLists.txt + - package.xml + - setup.cfg + - setup.py +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-domain-coordinator-0.12.0-np126py312h3bd2861_10.conda + sha256: a5ff0e936b903f3e86fb2524c6a7f594ab24dac3fad910a53e97b36ae5413637 + md5: 7c0173e23b895b5be8e3fd15a4a77f59 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20968 + timestamp: 1759134414484 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-domain-coordinator-0.12.0-np126py312h01c0cb9_10.conda + sha256: 3f0d52f2f1ddc4eac0cabf87355b5cbffc80aba1bab80fff7f8c1a3171f06244 + md5: 8b193a57e0f9c70fd5545ccf2a9bec00 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 20946 + timestamp: 1759134594842 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-domain-coordinator-0.12.0-np126py312h9e87179_10.conda + sha256: dafeb8cc4bced0873a4300dded2893baac6192072b5e7373e7193ac75d34287e + md5: 4c09dbe6c465c4faa11e12008fe651ca + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 21317 + timestamp: 1759188034269 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-domain-coordinator-0.12.0-np126py312h4d29ed4_10.conda + sha256: c7c7e7e502ca6aed37e09f014ff64fa34c2bb93981606c397e26ba883adba832 + md5: cde36f7d561208f0f2765533cb9d150c + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 18206 + timestamp: 1759210719089 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastcdr-2.2.5-np126py312h3bd2861_10.conda + sha256: 7b4737c7fe822a8449685ba5f57edf6adf9d32e611c8cb4ed0242db0578c6627 + md5: 658d8fd55a9fdcb15ff5e57708aa0874 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 88286 + timestamp: 1759134519610 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastcdr-2.2.5-np126py312h01c0cb9_10.conda + sha256: 6d086a35377c5836365d23a75bf0f468c23eda189dd469b13fc9baf54ae92aaa + md5: 0a37977a91d6e85604af35c83e7e0cc3 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 85494 + timestamp: 1759134691517 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastcdr-2.2.5-np126py312h9e87179_10.conda + sha256: 2c9eccada20b27a2532dad9b2d7ae39f8e81e845029ba6b3a3169938497c6ccd + md5: bec93e5c1e1bfb7140d009fec5fd6ea2 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 80094 + timestamp: 1759188172813 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastcdr-2.2.5-np126py312h4d29ed4_10.conda + sha256: 8018df01377a085b9927797922fe834bd52cb61b052a308562c605e67a3f8b35 + md5: d3fb5aba611be9087759f3b0219d0f55 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 95082 + timestamp: 1759220065785 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastrtps-2.14.5-np126py312h3bd2861_10.conda + sha256: 758024f49b2848bf43b6f3dff1309a1bd2a6251bbe7194d076e452037d16e457 + md5: 17195143e89af3cc92c875ea6b057d7c + depends: + - openssl + - python + - ros-jazzy-fastcdr + - ros-jazzy-foonathan-memory-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - tinyxml2 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - openssl >=3.5.3,<4.0a0 + license: BSD-3-Clause + size: 4289370 + timestamp: 1759135144417 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastrtps-2.14.5-np126py312h01c0cb9_10.conda + sha256: 1ae4617b9609fca57b5d4200a94cc8f8bba29756f6300f2ed520e112753b02ac + md5: b278d0bed2c7350fae1a997000fa3bbc + depends: + - openssl + - python + - ros-jazzy-fastcdr + - ros-jazzy-foonathan-memory-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - tinyxml2 + - libstdcxx >=14 + - libgcc >=14 + - tinyxml2 >=11.0.0,<11.1.0a0 + - openssl >=3.5.3,<4.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 4101665 + timestamp: 1759135220852 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastrtps-2.14.5-np126py312h9e87179_10.conda + sha256: 5e9855fe0c75d75d36cd45f8af9612c57d3bff5142e5d191bbf921769a897e10 + md5: b0e392a5a3acfa2ae4ce5ee8db71a910 + depends: + - openssl + - python + - ros-jazzy-fastcdr + - ros-jazzy-foonathan-memory-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - tinyxml2 + - libcxx >=18 + - __osx >=11.0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - python_abi 3.12.* *_cp312 + - openssl >=3.5.3,<4.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 2909408 + timestamp: 1759188941798 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastrtps-2.14.5-np126py312h4d29ed4_10.conda + sha256: d8c6c82c74085c04b8118c8f5bf7d0267b707b9b0a028f11d718fe5ab2b6b683 + md5: 0c653a4a14e2ddaecf20af61cb2b8799 + depends: + - openssl + - python + - ros-jazzy-fastcdr + - ros-jazzy-foonathan-memory-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - tinyxml2 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - openssl >=3.5.3,<4.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 3130818 + timestamp: 1759223800603 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h3bd2861_10.conda + sha256: 0a1e9032d4dc0c628269a4e4745d8f4580c74f324378d6a659afcee5d58ec5af + md5: f5db45c7a0798d404cdcbd4b19218afe + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 27248 + timestamp: 1759135131215 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h01c0cb9_10.conda + sha256: 5941d8a3d142b2982bf98e292779a1d9e797caf7d6dfb2cde2973bd89f50b465 + md5: 36eca733cf7d2f4010d0820906f1e2e3 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 27287 + timestamp: 1759135204807 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h9e87179_10.conda + sha256: 3e1e555c8c10d93bade2dfebdd1b183f69bdf5abcb4d519245c34d9e2a44c2d1 + md5: b767ab96dffb2a7850c069638b13af63 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 27478 + timestamp: 1759188926409 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-fastrtps-cmake-module-3.6.2-np126py312h4d29ed4_10.conda + sha256: fa68817cd364b39fbfc2d20f0ec3f3734502d992551096e903dd1342827c3cd6 + md5: 4471300890dcc81d12e1cf2d93805908 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 24253 + timestamp: 1759223737401 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h3bd2861_10.conda + sha256: cb8c94ec85adb43f1ad85fabff560bb4d08b41634eaee6f6f5144ed548e1f482 + md5: cef3439419d6b3f1224b340baf4ddc75 + depends: + - foonathan-memory + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 19317 + timestamp: 1759134837854 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h01c0cb9_10.conda + sha256: 6aba42f0122e3f7b21239e8d1c3b05d7950bee0ef7fa1ea0610c46b81fad558f + md5: 5ef225ea29e5c33bae84c3ebbea42a81 + depends: + - foonathan-memory + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + license: BSD-3-Clause + size: 19447 + timestamp: 1759134993926 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h9e87179_10.conda + sha256: d25cd3d834510855129cbb37a8b36490a9fb34621b170e65ac6976cc12bc1a83 + md5: e70adb2e24bbb0453ce562fa09853cea + depends: + - foonathan-memory + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - __osx >=11.0 + - libcxx >=18 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 19662 + timestamp: 1759188598322 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np126py312h4d29ed4_10.conda + sha256: b5eda95bd3affb07049721ca0ae477a4363c36f7bd3da960e89a69f99d49723b + md5: a6ff2072747ee0a4af0010ff1e23386e + depends: + - foonathan-memory + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - cmake + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - foonathan-memory >=0.7.3,<0.7.4.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 17127 + timestamp: 1759222184479 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h3bd2861_10.conda + sha256: 9d5e5875ec8401fb2817326e38beef97b0cbd2756b78fc314993a7c2b44fe95a + md5: afcf2ee3fffc54b8b34953e699839bad + depends: + - python + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 122315 + timestamp: 1759134065861 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h01c0cb9_10.conda + sha256: 2304e2acab4fddf63449350e51fcb84682a7a48c09fafba21314a293df3d8766 + md5: 23878823661c0ec3d05a7e624c69cbec + depends: + - python + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 122347 + timestamp: 1759134278870 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h9e87179_10.conda + sha256: a762ae40a3df9eb525fb289c73c871a05f8ff51f0740f6e05305331200401d2b + md5: 8569b35dbaf4bba6f35c441da12cb5b4 + depends: + - python + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 122721 + timestamp: 1759187636429 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-gmock-vendor-1.14.9000-np126py312h4d29ed4_10.conda + sha256: 64fd34fd2fc030cfa1a39e397eaa7c8d8b44996c8044366ddcef84159357c49f + md5: 4975260f6f7b3ad6f04ea07170348636 + depends: + - python + - ros-jazzy-gtest-vendor + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 120760 + timestamp: 1759208308119 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h3bd2861_10.conda + sha256: 25a1b01f399bcbafb4412ab0b5efe4b90a6b49ea3a637e862cfe0249a4f5c1e3 + md5: d70d6583728901de9696557fca2f30e5 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 208735 + timestamp: 1759133958435 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h01c0cb9_10.conda + sha256: 337718177a4ce50b468d42ea74fc04cf6cdc5a8795945a1cf64d5a4f022b1720 + md5: aa9ea9ebbf1a65bc6f39a1239a4496be + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 208718 + timestamp: 1759134194096 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h9e87179_10.conda + sha256: 0b2735ed4a4cc0ba761f5b7e9bfeaee887b40604e059fe31ec4a9b438e5901b4 + md5: faeeafc7f9d07252055032e3270a48f8 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 209095 + timestamp: 1759187407464 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-gtest-vendor-1.14.9000-np126py312h4d29ed4_10.conda + sha256: 870795748b1468b83652224e6d96eadd9fad34e96f51c4b6c4da1d954491a629 + md5: 747aebf4b753a52a38c126bd317bf611 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 207445 + timestamp: 1759207356517 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h3bd2861_10.conda + sha256: a0f6cb479e432c1e49ab9a5baf837e8c2a40c15999b98c1da6db7c4068da15e9 + md5: c5bd1e766e134b1eba20db9ea3db187b + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 92732 + timestamp: 1759134188843 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h01c0cb9_10.conda + sha256: 94a5771525dc487f685a9b8fb33dac4bceaf5cef674a17e0c84bc7c9e2d54176 + md5: f8291ecf1222d36fa66e24f7256f8b69 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 90750 + timestamp: 1759134381771 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h9e87179_10.conda + sha256: 26b4a30ad4df0c05cc22bc97e9a7c9b934ea9ddce4306b69c390b2be9f5ba88a + md5: 0c209138cd1573af60ea85e57804cbd0 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 81558 + timestamp: 1759187801914 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-binding-c-2.0.6-np126py312h4d29ed4_10.conda + sha256: 527c7bb39d5041a3e28e0f0efcde8cc2b32386fd32e30370e12ff18218670661 + md5: 8b94f858f766b40e5f77dd960267d677 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 218217 + timestamp: 1759209045492 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h3bd2861_10.conda + sha256: 0e863a15142e5da8da31d39a6ea07ab418a02ac10b8a8633d50be231ba9554a3 + md5: 8bcd51c6a2ef2d39834472111423a5ee + depends: + - libacl + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - libacl >=2.3.2,<2.4.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 263628 + timestamp: 1759133934792 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h01c0cb9_10.conda + sha256: 8b279bb85bb73963aba4a570fc6352bd1a23b550d2c6214c81d1d3bf0af9d179 + md5: a6c2e3b8d68d91cda205287f024aec02 + depends: + - libacl + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - libacl >=2.3.2,<2.4.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 263924 + timestamp: 1759134169938 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h9e87179_10.conda + sha256: 65c2966e4e0533b99de14928464301f3e328a5bfbf4cdab151ed56e530c5b449 + md5: 98ed49a0481e9b95a4aa08497c4b24a4 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 257783 + timestamp: 1759187395472 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-hoofs-2.0.6-np126py312h4d29ed4_10.conda + sha256: 4c4df8511374211fc09adf511994b7cf78c8d362930b2c4f35b1f2adccdfe4e8 + md5: 3d3fb1fe052ef7923d0087b7c5c2e626 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 730336 + timestamp: 1759207484556 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h3bd2861_10.conda + sha256: a734989bf0b048a932ef9511d1cb1c053d3393fab5904c90927fbb8e3f886578 + md5: 9147ed0273d8c604324c0831895292e2 + depends: + - python + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 573580 + timestamp: 1759134069976 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h01c0cb9_10.conda + sha256: 4b8c721eca32d0e946455726b73c680d5cd8b5fd830464d214b804694e28bf7e + md5: fc16b67215b66f71442077a73e385ec1 + depends: + - python + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 577051 + timestamp: 1759134283951 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h9e87179_10.conda + sha256: 81f09d0355e8a1dc357d9cb9b0a75dd74e9cc4df41a954a7cc33429ded4ed975 + md5: 430f2258adc02d4004690b9d3f458228 + depends: + - python + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 433199 + timestamp: 1759187646283 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-iceoryx-posh-2.0.6-np126py312h4d29ed4_10.conda + sha256: e8131032164646bfdc853937beb9d15f136ed9856bb93bd93c416b6d901d88cd + md5: 3c1177ff2a745826aef2049a0700c7d2 + depends: + - python + - ros-jazzy-iceoryx-hoofs + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 2164510 + timestamp: 1759208353911 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h3bd2861_10.conda + sha256: ce3af2e97af8da05bf3af031bdb8aa85fa3d9a29b86eb5d2d1ae0848841f8740 + md5: b5eff53b16c8541dc20228599fa5445c + depends: + - pkg-config + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 29475 + timestamp: 1759135559646 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h01c0cb9_10.conda + sha256: 6cd3fb0a0c9106e452acd8de72b6841e4d124cec20792174497ccf84c42808f3 + md5: a61026a60308630889de53e1707c462d + depends: + - pkg-config + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + size: 29533 + timestamp: 1759135498093 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h9e87179_10.conda + sha256: aba39b632fa0fe9c3053a9f7ed84561278416bac7ee11d5b14fcce84f929969f + md5: 175131421cea0843f02bce05b3462d62 + depends: + - pkg-config + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - __osx >=11.0 + - libcxx >=18 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - yaml >=0.2.5,<0.3.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 29749 + timestamp: 1759189408921 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-libyaml-vendor-1.6.3-np126py312h4d29ed4_10.conda + sha256: 7a42ae99fd7f59c5f157dc05b6bcbaaefb0ea213bb171a20fff3a4a94fb12587 + md5: 20ae9eed172270c7478b8cd3f8381ec9 + depends: + - pkg-config + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 26427 + timestamp: 1759224900159 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h3bd2861_10.conda + sha256: b52aaa5d92156e8da5b79c0a8f13d8ea984fc9c6c4de96dafd613a0498d2dbd3 + md5: e24a3e9ceaf4ddc096180eb218682da5 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 268176 + timestamp: 1759136537008 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h01c0cb9_10.conda + sha256: 567664ceae51d452220f5fcd23a902531cb7f5ad0c0584297eb9f8b9a79f269c + md5: 6d5ec6c95a32b23d31e5e27b37e51943 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 276189 + timestamp: 1759136766232 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h9e87179_10.conda + sha256: 61237037f964a5fa4f0042b698b8da9496c646e0cba3386b0f23aac9c767504d + md5: bba1743f33e4497c6f764b3d5133ed5a + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 235777 + timestamp: 1759190744123 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-lifecycle-msgs-2.0.3-np126py312h4d29ed4_10.conda + sha256: 155feb5b4eb6136603c791beb49aab338b25f75e3da608aa937c92e355559b1f + md5: 5fac19c3becdcdf900cc5bc732127ef1 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 249089 + timestamp: 1759232723276 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-python-cmake-module-0.11.1-np126py312h3bd2861_10.conda + sha256: 7e63c152f78759fe99d79f4f2218a16edebfb0f0e406b585c35d2c31782b0959 + md5: 8d8268a354f258950e2381bce6c628c0 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 27606 + timestamp: 1759135131754 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-python-cmake-module-0.11.1-np126py312h01c0cb9_10.conda + sha256: d2fe27ec3a3755c8bb6faded01ef8f58b7e585cb2d4783e962e0666025761300 + md5: cbe107bdfd2ed73b3c666ca303f569a8 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 27695 + timestamp: 1759135206100 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-python-cmake-module-0.11.1-np126py312h9e87179_10.conda + sha256: 85ee2728ebbd4d1106f90d59d7cdd2441bfeee12c31d3d372d761fff043a92bc + md5: 7a36554c5560e722286367a3d2b1bfee + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 27888 + timestamp: 1759188924921 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-python-cmake-module-0.11.1-np126py312h4d29ed4_10.conda + sha256: 3da9de59727a2bd2bb2bbf947929667b93719ef5bceed34d4cf1c0e31a2cc4c8 + md5: 98743db98e7faf439917c8d1a0391689 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 24639 + timestamp: 1759223364899 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-9.2.7-np126py312h3bd2861_10.conda + sha256: 9bf9e007a2f7986731e8cb6ce6359a9ae98ce58a1d966575d7899659e3ed1119 + md5: 6abad32f74bfe8f8583c73cfdb82a909 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-logging-spdlog + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-service-msgs + - ros-jazzy-tracetools + - ros-jazzy-type-description-interfaces + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - yaml >=0.2.5,<0.3.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + size: 201210 + timestamp: 1759137495192 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-9.2.7-np126py312h01c0cb9_10.conda + sha256: ebc02802883a54f4b23c064b73a33dad5708f3741f8f2310fdcc9923ecae12c3 + md5: c82a0fd1c1d44d5c819ed11e6714b0c0 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-logging-spdlog + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-service-msgs + - ros-jazzy-tracetools + - ros-jazzy-type-description-interfaces + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 206606 + timestamp: 1759137514793 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-9.2.7-np126py312h9e87179_10.conda + sha256: ea708b39af2e41a5cbbde43b9386b751482040f048e7bc99ec987eece3f19779 + md5: efcb52c0cbcbba4aef2d74fc67578fc6 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-logging-spdlog + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-service-msgs + - ros-jazzy-tracetools + - ros-jazzy-type-description-interfaces + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + size: 182985 + timestamp: 1759192008395 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-9.2.7-np126py312h4d29ed4_10.conda + sha256: 3d48356b599ab532c7f53c749db02276ef0ff2321497f3a52b2cf6f56b3b899d + md5: 7998767d9d671e5a30a406c5ff6968f0 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-logging-spdlog + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-service-msgs + - ros-jazzy-tracetools + - ros-jazzy-type-description-interfaces + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 197611 + timestamp: 1759237133215 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-action-9.2.7-np126py312h3bd2861_10.conda + sha256: a7c84e402761127b9f7036c6c73dbbf196d53d2544c9c665388cc150e05cba48 + md5: b8a8b6dda0eec9080ba7bf2cbbdcd67a + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 80470 + timestamp: 1759137925701 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-action-9.2.7-np126py312h01c0cb9_10.conda + sha256: 834b49e3e80ce749c868c8ca171f2db4ddbbf9122430d251a44879f77cdc06ca + md5: 7b3c692b5e8dff72ce6e30f08ea74036 + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 80993 + timestamp: 1759137824759 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-action-9.2.7-np126py312h9e87179_10.conda + sha256: 63ab0e8fc41657458cae7748413b40bb1218c1ce6475021bb6bfd83e1216abe6 + md5: 08be611fa566f30122a2b3c2b995808e + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 75631 + timestamp: 1759192528370 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-action-9.2.7-np126py312h4d29ed4_10.conda + sha256: 7d1b585db4465760c1db27f33e34d01a621ff019509ec2c69fed7924745d47d6 + md5: d7faad1907ecbc3dfb9f63b02450abbe + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 82242 + timestamp: 1759238519118 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h3bd2861_10.conda + sha256: 1638a8038a7891a5800e17802654d5faf14ac071b2755141e7a82629cab0b4d3 + md5: 10d8e200bbd2bd07e2bd8616397e3545 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 570206 + timestamp: 1759136612244 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h01c0cb9_10.conda + sha256: 6529244e38c95cf70ecd90b4d4954bf52aca25d367c99e22029185df528187a9 + md5: 6cb4d77596b7d05665d36a7b4e03db76 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 581422 + timestamp: 1759136835940 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h9e87179_10.conda + sha256: 7943d857c1bd99012041cc253ba4c40c4adb79b291fbfef1d8510fe5661cecb7 + md5: 9a65db0d4aa04ff87330b4a9d4a14eb5 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 469197 + timestamp: 1759190861839 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-interfaces-2.0.3-np126py312h4d29ed4_10.conda + sha256: 7d7fc9118cd037433c9ffaba56e4b6bf6f6ca3f646f44c15cf6e057634ad4ecd + md5: 873a0cf006c6fad2998089a63560a517 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 477955 + timestamp: 1759232336540 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h3bd2861_10.conda + sha256: 7ff773f141b7d07f9f97f4c9b4d61d4ceddc5bc5b1f127384a19464b4fdebf32 + md5: f2bce5e8e6a2dd921b81e163413c1b60 + depends: + - python + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57975 + timestamp: 1759137917796 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h01c0cb9_10.conda + sha256: e9edccb44bd22c7d3455a71575a92b16ee827fbf8c0b237df13a0a70ab1e2d59 + md5: c51e3a3e870823917930204ed8755ece + depends: + - python + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 58690 + timestamp: 1759137814580 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h9e87179_10.conda + sha256: 7da0b0c78dc3d43048213119fff0d7f364c99622f064d8bfc9a1eed7eb09d12e + md5: d3cbf8d726a2645581a83ea6d896c939 + depends: + - python + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 54492 + timestamp: 1759192514111 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-lifecycle-9.2.7-np126py312h4d29ed4_10.conda + sha256: e6f12520a83b173f01b1f629909d5c5ee1d0883327c7cb3647bc9e5980ff10e5 + md5: 2b7b084dcf50935f42ce45b5ccab270d + depends: + - python + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 56683 + timestamp: 1759238431235 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h3bd2861_10.conda + sha256: 815ced2e31d60df46ab95a6ac1d3914203ea19acab7fc3d7f5b40bbb50b60853 + md5: d823a66d091b680808641438ceca0078 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35352 + timestamp: 1759135851282 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h01c0cb9_10.conda + sha256: ab49c7090a4dc5077061696b5bae7a04214ea423a2bf3a56e9893280e8c7b8b3 + md5: 0d7ebc8212a59b1b6e4a94d365b419ba + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 35909 + timestamp: 1759135869229 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h9e87179_10.conda + sha256: f6484ad56ce61e4a4f7b21c6df4d9f859dc89972321ab209f6a238b4b2a3ac17 + md5: 5226eb30710ecfebd8429b1905dd170e + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 34989 + timestamp: 1759189827466 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-logging-interface-3.1.1-np126py312h4d29ed4_10.conda + sha256: 9f6f251f20d409b81931f26c663c94ac16786539bf42132d82c12975bb428cda + md5: c11b1621dfa1795f7459df6d89dfbcdb + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35532 + timestamp: 1759227369044 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312he340118_10.conda + sha256: 3422ebeec09a0d41ec7c85ccc4aaba86de3197b30c80d1703f6be697bcf4f6a1 + md5: a021831db4f20a42022ef9923c79a26d + depends: + - python + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-spdlog-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - spdlog >=1.15.3,<1.16.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 45954 + timestamp: 1759135935520 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312hbd405f3_10.conda + sha256: ca5335499cdee35e3a625c23f7166e47a301b82bbcbc5b4a78913ac7c237fc9f + md5: 0395e12f28a35f1e5879608803b07675 + depends: + - python + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-spdlog-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - spdlog >=1.15.3,<1.16.0a0 + license: BSD-3-Clause + size: 47652 + timestamp: 1759136052531 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312h55ce18a_10.conda + sha256: 3a8ae30a469b73f25da38e3dc6d9ed297c37c1bde52cc5d58df12de18335349c + md5: 5888fa09569eecdd349ebc9eb3839a96 + depends: + - python + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-spdlog-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - spdlog >=1.15.3,<1.16.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 44732 + timestamp: 1759189961799 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-logging-spdlog-3.1.1-np126py312ha1e63b2_10.conda + sha256: 90d81a174b78ef85644ec9edc6a68d37766d5b69e6c05e57ecbbc84c314a00e6 + md5: 17100ab9ce43a758b25cdc710c17e2e2 + depends: + - python + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-spdlog-vendor + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 47445 + timestamp: 1759228916820 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h3bd2861_10.conda + sha256: cc79978e35ed388c961f928df46a422cdaff5290416473950524f0bc07f20fcd + md5: 8236b5b6f305ab7fa5c7ecc3e8f3de3b + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - yaml >=0.2.5,<0.3.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 51623 + timestamp: 1759136002236 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h01c0cb9_10.conda + sha256: 5fe057f945f301563882e87cad6dba64b606dbf6978bcad969ebdb27704e1ebf + md5: 4062eea3c323e444400016c9a72c5b68 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - libstdcxx >=14 + - libgcc >=14 + - yaml-cpp >=0.8.0,<0.9.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 53297 + timestamp: 1759136127518 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h9e87179_10.conda + sha256: d2890cb40b6d631ec89e668eca2eb0903215f63304a8ed7671c7f3949e99d7ab + md5: 5efb16a8007bc8807cfd4509fb519a07 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - yaml >=0.2.5,<0.3.0a0 + license: BSD-3-Clause + size: 49339 + timestamp: 1759190043204 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcl-yaml-param-parser-9.2.7-np126py312h4d29ed4_10.conda + sha256: e6ca038774ccffbe29721e0e91050cb53640318b8c7e0920fb02384f6f315b51 + md5: 462c5ada52e467e07036b75a95d59c30 + depends: + - python + - ros-jazzy-libyaml-vendor + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - yaml + - yaml-cpp + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - yaml >=0.2.5,<0.3.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 52774 + timestamp: 1759230160159 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rclpy-7.1.5-np126py312h3bd2861_10.conda + sha256: 66e39e1a82e360d41aa447b9b62fba41cefb8fe3530ac8f27bc5d3b16f737bc7 + md5: 7d9f1d33df970f0e0fcc450e4544b6dc + depends: + - python + - pyyaml + - ros-jazzy-action-msgs + - ros-jazzy-ament-index-python + - ros-jazzy-builtin-interfaces + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcl-action + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-lifecycle + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosgraph-msgs + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rpyutils + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 722454 + timestamp: 1759138136299 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rclpy-7.1.5-np126py312h01c0cb9_10.conda + sha256: d5d3ddc4fe75e2a95e4461f2b274c545bfb6db58dbd23b7a4fff8a9eef124a2d + md5: fcd5fc183629794c24459d0384c96755 + depends: + - python + - pyyaml + - ros-jazzy-action-msgs + - ros-jazzy-ament-index-python + - ros-jazzy-builtin-interfaces + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcl-action + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-lifecycle + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosgraph-msgs + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rpyutils + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 673208 + timestamp: 1759137983238 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rclpy-7.1.5-np126py312h9e87179_10.conda + sha256: 8b4749fb8ffc59ce16203562edbcb2b7e4b83b07436e8a91a448c2173ee82b05 + md5: d4f2a04161c6eaf828c1aa2599d1acf4 + depends: + - python + - pyyaml + - ros-jazzy-action-msgs + - ros-jazzy-ament-index-python + - ros-jazzy-builtin-interfaces + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcl-action + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-lifecycle + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosgraph-msgs + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rpyutils + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 618057 + timestamp: 1759192738311 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rclpy-7.1.5-np126py312h4d29ed4_10.conda + sha256: a55e8aa66060f8767cf5423a1844a688b81398ac47fe869aa8282d1efeb56af7 + md5: a4cbf2e2d1fe2b069c58542d0b105a58 + depends: + - python + - pyyaml + - ros-jazzy-action-msgs + - ros-jazzy-ament-index-python + - ros-jazzy-builtin-interfaces + - ros-jazzy-lifecycle-msgs + - ros-jazzy-rcl + - ros-jazzy-rcl-action + - ros-jazzy-rcl-interfaces + - ros-jazzy-rcl-lifecycle + - ros-jazzy-rcl-logging-interface + - ros-jazzy-rcl-yaml-param-parser + - ros-jazzy-rmw + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosgraph-msgs + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rpyutils + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 553296 + timestamp: 1759238966886 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcpputils-2.11.2-np126py312h3bd2861_10.conda + sha256: 3592b3549328122ceac5d8d5c9a85e1032cbfae81c40342b5a8dc6d708535680 + md5: ab6f98127dddc09649e150499d0d0f11 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 80389 + timestamp: 1759135754694 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcpputils-2.11.2-np126py312h01c0cb9_10.conda + sha256: e04a00b2d1b6e8ae78d40c43877bb9a0c6ef73d4592621bb2af16b848a076926 + md5: 6ccf2bb507ad51c4fa7a02d0e0f6a23e + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 80970 + timestamp: 1759135715636 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcpputils-2.11.2-np126py312h9e87179_10.conda + sha256: 361211673b5ca0541b7e84159092f93f074716976590a80ca4eb3b28347641f3 + md5: 1e82609fd0c1effb004c7b55232cea5e + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 79140 + timestamp: 1759189683380 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcpputils-2.11.2-np126py312h4d29ed4_10.conda + sha256: 491dd399fd5117de2b9ea268e05e167322c64536fb78b1239e274cfb5b057c2a + md5: 60c4b13ebec353232ef865244df59288 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 87273 + timestamp: 1759226359597 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rcutils-6.7.4-np126py312h3bd2861_10.conda + sha256: f477bc94ca5d7d7de15c9edcb74a435824ea5feff0824485d456702f1a82a221 + md5: 9fba73b4a6fc4c75ec91b3d6df1e7eb2 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 122119 + timestamp: 1759135628086 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rcutils-6.7.4-np126py312h01c0cb9_10.conda + sha256: 549a95d2b2a15955b00419bae2c35037322c671c38f58a596e99fac49a4ad11c + md5: c7f2e277bd2b05606eb1f3fd8b9561a8 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 126746 + timestamp: 1759135595288 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rcutils-6.7.4-np126py312h9e87179_10.conda + sha256: a71e3f17e8c2979ad10ab667886b7d2f238f98871089d5728548e29fe2773763 + md5: dd2781ff8c88a98c3a7a5c782e3187df + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 115677 + timestamp: 1759189498948 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rcutils-6.7.4-np126py312h4d29ed4_10.conda + sha256: 8892c71ec5aa8949709576842d69f2b2eb9d972a4213ac35160d00c44e1d43e6 + md5: 8cd5ec9b2b29681d3179d1c196300e56 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 126867 + timestamp: 1759225465292 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-7.3.2-np126py312h3bd2861_10.conda + sha256: 57f23ae2beb22304328e2cee8535e9d547190700e73fcd169e3538eba79c7947 + md5: 630603ba196ed5efebd28d281bfa848d + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 97009 + timestamp: 1759135915627 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-7.3.2-np126py312h01c0cb9_10.conda + sha256: b48e9c4f9788c9301e6c68edff24adba8a58e9de9940282c6f083021b15a3bf3 + md5: 2352a3585d4fb0a07644ef698ca703eb + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 98195 + timestamp: 1759136029290 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-7.3.2-np126py312h9e87179_10.conda + sha256: 47e5e2221f03b5bfa27c5796868269551015f2ea3ee068cc84e79e94994b2c89 + md5: 916871ceca2f6de12f079cb8b4e509b0 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 93585 + timestamp: 1759189931352 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-7.3.2-np126py312h4d29ed4_10.conda + sha256: b569eec0933f3383b798af172389d1a72d9ddefa48ee0f8622ae08cd2b6edd60 + md5: b56d3424ab388a32d267c006b5408081 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 98687 + timestamp: 1759228659761 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h3bd2861_10.conda + sha256: 30af3dbc51c6a65ca48c5836f4dd3cb000126ee6d682a62cd3c4ced5ab767199 + md5: 6dc89b6b65a0e4d1bb292baffd93ca02 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rmw-connextdds-common + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 31990 + timestamp: 1759137073605 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h01c0cb9_10.conda + sha256: 832a9b71d0c57c9f6f9121d2fac94f89cc92a76d35714384912994b58a121613 + md5: c7b2432ad0676ca13e9415b14e1d9385 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rmw-connextdds-common + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31996 + timestamp: 1759137156789 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h9e87179_10.conda + sha256: 0790c2b1521e17d6d9ceb90ba702f989c5bcca58245d6f4e1bc4a8f30a84edee + md5: 943331b46d2c4946c2cf844d03b4a5b8 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rmw-connextdds-common + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 31940 + timestamp: 1759191398053 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-connextdds-0.22.1-np126py312h4d29ed4_10.conda + sha256: 7c63c63c92c8e5d9b2d0a838c670fe3798eb43306bfdb1b5226133ffa5e50b91 + md5: 132ec798a2c50133b6e0b0c6035e591a + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rmw-connextdds-common + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 28719 + timestamp: 1759235079253 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h3bd2861_10.conda + sha256: 7e6dbb64826667344f1425f3c79445a17f694610c61ac0f09a9cff6c45d20050 + md5: 671ed12124c2f6fdaf172b8b9059c358 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-rti-connext-dds-cmake-module + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 53892 + timestamp: 1759136858268 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h01c0cb9_10.conda + sha256: da5e96f168b08721548071fa75e0cd07b73e4a6b8efb37b380f0c8136753076e + md5: b073c604f2e1f6a013e6772cbf70c5d8 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-rti-connext-dds-cmake-module + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 53839 + timestamp: 1759137000614 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h9e87179_10.conda + sha256: 291ddedae4a1827fcfc092ead1bdc7ddbd0fc81f4d217290a66668680a0760bd + md5: 2d7b634adea49def1e032602d7b81ad2 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-rti-connext-dds-cmake-module + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 53769 + timestamp: 1759191114100 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-connextdds-common-0.22.1-np126py312h4d29ed4_10.conda + sha256: e5f89f2c420ae5933e7c8613d8cea4970184cca4d9c4f1fd7e37b82408a0406b + md5: df666e285c86517bad3399f36d99c4cb + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-rti-connext-dds-cmake-module + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 50619 + timestamp: 1759233649417 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h3bd2861_10.conda + sha256: b1bb8703ddc30c4304d14188a0fa25ccfcfda60307b66f2ab9a848bdc114a43a + md5: 409eb17f609d8fa0fe481597b4fffe14 + depends: + - python + - ros-jazzy-cyclonedds + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 265844 + timestamp: 1759136864665 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h01c0cb9_10.conda + sha256: 800936cdd950eb630fa9d652487a9253b03ef7536a29edbfe391611acfa2c308 + md5: 8d2a5b8c4d5585b956c868006a73608a + depends: + - python + - ros-jazzy-cyclonedds + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 263516 + timestamp: 1759137006671 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h9e87179_10.conda + sha256: 47b47cc3b1d9e9361bf835942f1e2dc4b0267a2fafcf520235f90bf42db5c987 + md5: 8ed3f276ced97a41ecb6fc6aa9198933 + depends: + - python + - ros-jazzy-cyclonedds + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 189233 + timestamp: 1759191127832 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-cyclonedds-cpp-2.2.3-np126py312h4d29ed4_10.conda + sha256: 36a02aec88c33566183187bcddb250fc39a2154af7c03a0452a7cb588b7e70b4 + md5: f377fe4de758280333ae1f415fb59fd8 + depends: + - python + - ros-jazzy-cyclonedds + - ros-jazzy-iceoryx-binding-c + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 181358 + timestamp: 1759233736096 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h3bd2861_10.conda + sha256: b89576829c4206f362fd56c8620271059d05f9abda5e071176716ca1bfe1d4dc + md5: f57fb5582e0b488e9d442b319bb07962 + depends: + - python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 177140 + timestamp: 1759136532747 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h01c0cb9_10.conda + sha256: 9bda9e0c7aaf9ae1ea46bd94862f09c141d928f318b9040417e671dfac45f2f8 + md5: 981ed6815950a54f044721347f57c271 + depends: + - python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 179166 + timestamp: 1759136765895 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h9e87179_10.conda + sha256: b4f2474853b2d8c27c8e9a3b61075550ddd437d499109d3c0e1de03744bb8017 + md5: 3f24d4c2ae124761ba8d813d14b8277d + depends: + - python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 161721 + timestamp: 1759190749739 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-dds-common-3.1.0-np126py312h4d29ed4_10.conda + sha256: b2a0da6cf1cb8492187958653f03dff2551c9e55bda5941fdc8cc42cce427fac + md5: acf7354cc4cbe92f60961e2b58bee4de + depends: + - python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 184913 + timestamp: 1759232003219 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h3bd2861_10.conda + sha256: bcd12c84589f18855a56ec09a37ed827f63699f526a1bccfb3926320ef9e0a7c + md5: 60b7ea0455cc4697ff70513a5eac6522 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-dynamic-typesupport-fastrtps + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 159786 + timestamp: 1759137049673 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h01c0cb9_10.conda + sha256: c14016711df17fe506c7ee38a41107ff2a866b9b92852d6179bb0fe1e932e998 + md5: 0ea98b87d93cee3048e5616ff57610ef + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-dynamic-typesupport-fastrtps + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 158880 + timestamp: 1759137137880 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h9e87179_10.conda + sha256: ad61f935da82d52da74e5573cd2b2b68d5fcb1f719a251c4941b29eccf74daf4 + md5: 8c04c0c6a4f37f64f0e2a88ff345bdcf + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-dynamic-typesupport-fastrtps + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 121383 + timestamp: 1759191375760 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-cpp-8.4.3-np126py312h4d29ed4_10.conda + sha256: dbf77576e4d2e8fd79a860dff12f805eb3bf1c56cd6ed8f392e3f810d90ce046 + md5: 8c90d03c3f66b3c96f93c0a48911ca3a + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-dynamic-typesupport-fastrtps + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 147841 + timestamp: 1759234946177 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h3bd2861_10.conda + sha256: 645d73d3eee4fe4a779810e596b73d5ed7c9256dd0eee1ac80719375ec55dfb6 + md5: 0a7d3993e3df733e51161bf02d7f2e0f + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 187065 + timestamp: 1759137014712 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h01c0cb9_10.conda + sha256: 78df7b606346c3c1afeeeb234c251194dcde7bf95b51403d9acd88433cb084e4 + md5: 9ef2bcf7a636f2738b0fdd1750aae0ef + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 180071 + timestamp: 1759137107122 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h9e87179_10.conda + sha256: cb4277cf34b9b55f47759bc1e323ae55ec2f2d182d86079b8ab5d5de56c01b26 + md5: e3e3624624dba74e7c70a71b75c884c8 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 138699 + timestamp: 1759191339945 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-dynamic-cpp-8.4.3-np126py312h4d29ed4_10.conda + sha256: 0c913b3813581da5f26962c0c19b7c64e87734deb225847a1d1343d702084a76 + md5: 0e9e48393c40e512cc3258b9ebdb4c63 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-rmw-fastrtps-shared-cpp + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 172641 + timestamp: 1759234731338 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h3bd2861_10.conda + sha256: a8fe05f2e9d56b580827c8b7caba319e8d65131280f5df157455ae5be7d965f7 + md5: 76d071067b8d9ddcdb46236d811dc3c5 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 231656 + timestamp: 1759136812044 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h01c0cb9_10.conda + sha256: cf4903cfbc2896639975042e4666e6b548c3ef1a1d250ff2811fb45e25803075 + md5: 2fc14cdf959e505c1a1b5fafe33f726f + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 219004 + timestamp: 1759136956422 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h9e87179_10.conda + sha256: a4a475778015f7010d045ba23fbccac227c4d79a1db795683761c4cb4a973222 + md5: ebc33f138f38a414d6cec0a0ee5dd522 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 186100 + timestamp: 1759191045702 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np126py312h4d29ed4_10.conda + sha256: 23d349560cfc03aca51db282bd454265a787b79d4240cce1a231dea1cf301e2d + md5: 25c2dc11ba301fd28391b0180cded31c + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-rmw-dds-common + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros-jazzy-tracetools + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 238551 + timestamp: 1759233437330 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-2.15.6-np126py312h3bd2861_10.conda + sha256: 620c35ce03b22195ff4500019d6e0e5fa550797f2aafdc9a16ceb9142315a091 + md5: 1c3b731bd70dbca6143a26ecdc1de850 + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw-connextdds + - ros-jazzy-rmw-cyclonedds-cpp + - ros-jazzy-rmw-fastrtps-cpp + - ros-jazzy-rmw-fastrtps-dynamic-cpp + - ros-jazzy-rmw-implementation-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 54228 + timestamp: 1759137231735 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-2.15.6-np126py312h01c0cb9_10.conda + sha256: 29bfd8e5ab0be3659a1c71dec79a983e6c5ba7531068a0dceef1212d798e6973 + md5: ecae421472d6c8aef919d283ca8893d1 + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw-connextdds + - ros-jazzy-rmw-cyclonedds-cpp + - ros-jazzy-rmw-fastrtps-cpp + - ros-jazzy-rmw-fastrtps-dynamic-cpp + - ros-jazzy-rmw-implementation-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 55927 + timestamp: 1759137296232 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-implementation-2.15.6-np126py312h9e87179_10.conda + sha256: 62d394c5c0934aecbc4ce8be1307b03e6151f51d5788d47b1f6e50b1df0e2322 + md5: bcd8a49cb9d7fd8cdff1acc4551fca0d + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw-connextdds + - ros-jazzy-rmw-cyclonedds-cpp + - ros-jazzy-rmw-fastrtps-cpp + - ros-jazzy-rmw-fastrtps-dynamic-cpp + - ros-jazzy-rmw-implementation-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 50629 + timestamp: 1759191770936 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-implementation-2.15.6-np126py312h4d29ed4_10.conda + sha256: a4a79ed194ea52c650cc2fb619e68dc0fdfb2198631d5adc3679006a2b4f2516 + md5: 19c6ae1dc30de3eb6b47131647dd8c12 + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw-connextdds + - ros-jazzy-rmw-cyclonedds-cpp + - ros-jazzy-rmw-fastrtps-cpp + - ros-jazzy-rmw-fastrtps-dynamic-cpp + - ros-jazzy-rmw-implementation-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57275 + timestamp: 1759236089593 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h3bd2861_10.conda + sha256: 3ef8f2185c5a7f0adb9ea8306a78cbd7f6aea4b150f1d57f03e21838f93e0711 + md5: 797411e57cbedf5800826bc6d966f4b0 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29235 + timestamp: 1759135465529 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h01c0cb9_10.conda + sha256: da16590ce27f016171a8ae9b94f2bb251e91b162229d8b2331e69090bc09db7e + md5: b6db03a84b8920fa848dfe7898e8c970 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 29303 + timestamp: 1759135426406 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h9e87179_10.conda + sha256: dd43c657d341c7b519ecfab92e50ecace07dce86d8e55445d94499a801c9cd9d + md5: 550d76de5c5c899dab96226b1dc84d83 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29478 + timestamp: 1759189136951 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np126py312h4d29ed4_10.conda + sha256: a61937e43252128bff47d0b05ebfe47566a6e322296739b72db43450bc1ea9df + md5: c47730dcd5120d9847a49b36979d2f57 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 26184 + timestamp: 1759224449546 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-ros-workspace-1.0.3-np126py312h3bd2861_10.conda + sha256: a6cdeb4918d9886db96dd14a436c863426ac804c37520fba2270671c3d188ff6 + md5: ac5ee1d92135d01d66cf9b10047fac93 + depends: + - python + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 35302 + timestamp: 1759133887784 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-ros-workspace-1.0.3-np126py312h01c0cb9_10.conda + sha256: 9d089e1c0fbab5212942c06d220360903ae60ade79d956bec0d09735f01a4c30 + md5: a66390f5a7dde641d078863c7b5642cb + depends: + - python + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35366 + timestamp: 1759134127288 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-ros-workspace-1.0.3-np126py312h9e87179_10.conda + sha256: ade0b0b684966a0c704a6ffcae27c20203a0c7f8bca336bd972230bcd2826f24 + md5: e5826b78dfaf341a1225903729481b1f + depends: + - python + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 35786 + timestamp: 1759187327925 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-ros-workspace-1.0.3-np126py312h4d29ed4_10.conda + sha256: 78b83f11c92d77a2b5cecdc763eaf74051b3f7d8965555f1cac8193d1f149d31 + md5: 124d57d1848c59deb016f4c4bd976da9 + depends: + - python + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 32280 + timestamp: 1759206967302 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h3bd2861_10.conda + sha256: 4b4ee7e4040cc05e7edc39eb1b1cee5b81336fda96ceffd0be1755b7a9ce5b41 + md5: bae2502ca3142a4fb27825194ba6ea09 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 72341 + timestamp: 1759136567175 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h01c0cb9_10.conda + sha256: add5051cd0541d456b140fafa12ff6d8a346d75ffc5a7c40110aeb18f5f6608d + md5: f94633deb30e4ee0c839d17b67d2382e + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 75334 + timestamp: 1759136799554 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h9e87179_10.conda + sha256: 06e6088367e37478d0f341a5dd5e4d0873c517fe92e5536d2f0f9b9e6e529a06 + md5: ca3c09094f6f472b70629607384a4138 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 69781 + timestamp: 1759190784670 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosgraph-msgs-2.0.3-np126py312h4d29ed4_10.conda + sha256: 66ece8b30948cf0457f528aa836e3f041de1059a5abcac5d905538c64b21cab1 + md5: 1d575f9b4e2ba5968bcb391044b47ad9 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 78384 + timestamp: 1759232827580 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h3bd2861_10.conda + sha256: d4e44209fc8e8cf5f6796d129ee59d5a09f8c2e6a992f5a8b79a12c91c57715c + md5: 65e07ac650b8a5b65fa3d534f07bb2e0 + depends: + - empy + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 63288 + timestamp: 1759135143582 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h01c0cb9_10.conda + sha256: 3f5c20def6237708ae98e15c2ae76b44bef2a5a302bd20e6401681bb42340786 + md5: 4e43ae5fd9f5614c87222b77b908b33c + depends: + - empy + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 63322 + timestamp: 1759135220344 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h9e87179_10.conda + sha256: 1d2e9c1acae38c64af1339bd22d2ef9389d6b0b167657b546cf2600fba9dd1f1 + md5: 3b6f176d4301c235be09602b899b4ba1 + depends: + - empy + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 63623 + timestamp: 1759188938153 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-adapter-4.6.6-np126py312h4d29ed4_10.conda + sha256: e16c91d10c035e39e4e0d565327a11d5d9912eefccb42938d881f3c8da130611 + md5: 704b84d0f5f74b5b18cb4af2a4b9d40e + depends: + - empy + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 60407 + timestamp: 1759223478283 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-cli-4.6.6-np126py312h3bd2861_10.conda + sha256: 2d0cf10e2fcf9455c393bb83b51d4c89576dfdebec3d82453e1da5621d2258e2 + md5: 5c0702b63578a68dc61e488c7ac6859f + depends: + - argcomplete + - importlib-metadata + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 42559 + timestamp: 1759134512964 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-cli-4.6.6-np126py312h01c0cb9_10.conda + sha256: d7b80eb72adb79d5a720e6caaceb4772e89e79c64a241ca45b8972b8cd9659ec + md5: e6e5ca632977fd3246f766f22c413d07 + depends: + - argcomplete + - importlib-metadata + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 42686 + timestamp: 1759134685207 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-cli-4.6.6-np126py312h9e87179_10.conda + sha256: 7b51fccff2c76c5bb5f098a0afdd6647bc0ea34eae9a2de3307cafd1a47dcee6 + md5: ba81f748e03dc9158f896084f778d57e + depends: + - argcomplete + - importlib-metadata + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 42824 + timestamp: 1759188164409 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-cli-4.6.6-np126py312h4d29ed4_10.conda + sha256: 060efe6a7f91259cfa3ef53f179bbde31d4382ff6d07ac26e197f26e90d5a10c + md5: 16dc2dc1d39cac2806e981d48f77ba21 + depends: + - argcomplete + - importlib-metadata + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 47267 + timestamp: 1759219997367 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h3bd2861_10.conda + sha256: 99fbda6a89be497eb3e54b67fc6f9be2efb7cf721b1bf5d9c85799f29145f40b + md5: 654b00ca14494136e3454d97ff072ddc + depends: + - empy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-pycommon + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 35018 + timestamp: 1759135749979 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h01c0cb9_10.conda + sha256: 4a99046d33f7b36d46ca73135cfe783eb322cb0ce707ea30194edc71c6e147ac + md5: e2e3137407e7a2cb39c3f6d21a23d9bf + depends: + - empy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-pycommon + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 35102 + timestamp: 1759135710979 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h9e87179_10.conda + sha256: 61aeeda577e747ff6f666a96c3ad4b6ac713e9d73d8fb6a6e878436fa3fe0a2b + md5: a7d285922ea8fe002dec06d5dfc26c2d + depends: + - empy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-pycommon + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 35253 + timestamp: 1759189673569 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-cmake-4.6.6-np126py312h4d29ed4_10.conda + sha256: 1840ae49e2361d00725ae04165c67425b664ff779f3c9bd2e495a948802fe0e3 + md5: d9181eea8d7496553eb6b200d7291ee9 + depends: + - empy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-pycommon + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 32034 + timestamp: 1759226323809 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h3bd2861_10.conda + sha256: 9efabedab52314ae05188b49254b682280de9385575708957322ab4a120f073a + md5: ffa316df1ea2920a88724d0fbb9aa52a + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-generator-py + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 31161 + timestamp: 1759136319716 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h01c0cb9_10.conda + sha256: 0edc13acc77d45168c2f9ee81ab65876f0a4da5a102a653d56a9412b8e189e94 + md5: e43faa500a4a88daee15139942854b0a + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-generator-py + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31200 + timestamp: 1759136426835 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h9e87179_10.conda + sha256: 8b5c90af17e847505dce37ebb040efd16b5a3284373bf1ec04a43e6c6a36a8ff + md5: d404e9e5db7d81283f77d47f78944389 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-generator-py + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 31456 + timestamp: 1759190376782 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-core-runtime-0.2.0-np126py312h4d29ed4_10.conda + sha256: c94e145d8d489e77cf26b9629b39180bdd758e3425e96a8600759e3886b54978 + md5: f1b77d15bf14c3bfd668df018778ae75 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-generator-py + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-introspection-c + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 28251 + timestamp: 1759231103668 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h3bd2861_10.conda + sha256: 23b17a498e31ec797ead5204d4b3bd1dab9b23bb86dcc2f96c87896a2e1e0b58 + md5: a1c88648a1ee798ae6ba8a3cdd8fecf4 + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 31814 + timestamp: 1759136484793 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h01c0cb9_10.conda + sha256: 53ffe3dc242f758c3f7484cba557ba15e657226803921212abd7f0ef33c12a2d + md5: 7fab95986f1ff1b9bd2c51cbb3da3e35 + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 31883 + timestamp: 1759136616341 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h9e87179_10.conda + sha256: f3ecb3ceca9ba896800b3399ded211116ea87a09321312022902dce9ae594209 + md5: 4e858a7d9953fb54f7a56c2633a13a9f + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 32065 + timestamp: 1759190688828 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-default-runtime-1.6.0-np126py312h4d29ed4_10.conda + sha256: 0cc80acfb55280b58e841b82fc668a28b0779122b43c41be4677c5d1c397ee08 + md5: dd39c8d2b41c209394e3e9ccf2dc2cf3 + depends: + - python + - ros-jazzy-action-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 28822 + timestamp: 1759231793389 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h3bd2861_10.conda + sha256: ba35997f90df5939af3b9c32a5bbfd4e144c1a0fa2edba0c93f3f1d08ac1b245 + md5: 0409589abcc712e53499a63270c64b2b + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 62858 + timestamp: 1759135845185 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h01c0cb9_10.conda + sha256: 57ce352c9189c14abfa7263b001239a975e6133ae96abdcb0d97aef772a1c135 + md5: 5f17b217047587ac9b1b23bba0ea05c9 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 60731 + timestamp: 1759135863663 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h9e87179_10.conda + sha256: 1616274d22ae463f3af05ed25e468cf3131e12f1d676f3df98f892b86a6641f0 + md5: 68d2a926535fa2d661166b44f85b778b + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 56283 + timestamp: 1759189819848 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-dynamic-typesupport-0.1.2-np126py312h4d29ed4_10.conda + sha256: b1f55dfb2c6f127700996bc92987a43e6a4e7d3adbfd912106fb0301b9f7e2d9 + md5: f00dac3a693d3d3c8608def9d9b1e565 + depends: + - python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 67316 + timestamp: 1759227309642 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h3bd2861_10.conda + sha256: 30eefec9684ce8bc9761984cab745ebe8f8ab2786af5e559c3144e8290d1a0ef + md5: 6d3ac5d660f36ce2d5a505547f8f0ae2 + depends: + - python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 86349 + timestamp: 1759135926381 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h01c0cb9_10.conda + sha256: 6ce3b99e4a7528c285311db167ef56db2c4a9d9e260f0ec87a84fbf451c3faec + md5: c46eaf5dffa0c5bd87583a67998dfe0b + depends: + - python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 78630 + timestamp: 1759136042329 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h9e87179_10.conda + sha256: 5a5049a25e83d3765b021b7b393d60f8b698dc4fe8afd8fe04c49017bcc04f53 + md5: 1b52c3b220da5fa58780ce53da3886dc + depends: + - python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 74719 + timestamp: 1759189948379 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-dynamic-typesupport-fastrtps-0.1.0-np126py312h4d29ed4_10.conda + sha256: 99ef714230dbdcc298ff67320f96a8f0a55219fca2e0190ffd3b028a3c38a842 + md5: c346fc531ab5c700dbd6db147cef59fc + depends: + - python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-dynamic-typesupport + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 82733 + timestamp: 1759228824505 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h3bd2861_10.conda + sha256: 35d42979abd9bcd8ee251889e97744ae111fb5a3626b98b76f7d58b329b521da + md5: 720f8420b90a66e5a25c4cd5d8325bb2 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 53004 + timestamp: 1759135839591 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h01c0cb9_10.conda + sha256: c1e89540c2905914504a41a8ec82a8298578333495ce93dacbaeb73787c19840 + md5: 8116f0fc99df0f286d51375f43e7ac54 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 53082 + timestamp: 1759135856259 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h9e87179_10.conda + sha256: 35038219ee82029398aad7f966cfc7733cf6cf28637c6504bd9efd45fc305aad + md5: bdc31948dfb38238f1dec7930fb18b23 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 53389 + timestamp: 1759189811806 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-c-4.6.6-np126py312h4d29ed4_10.conda + sha256: e44636c9994f8215f5c68069be532df542fe99ffd9d1e6759cb7b84b62a8edff + md5: 95883dfb064560b6a08e7102e4a11e5d + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50147 + timestamp: 1759227246461 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h3bd2861_10.conda + sha256: e62600644173e5d1c5c6ebe8472f9d8abe366f0cfc2e8918e2f76ef0143a3ebd + md5: 88adcc872b754780da08c6b69849e254 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 49898 + timestamp: 1759135902089 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h01c0cb9_10.conda + sha256: c7e571f543e08ea9703827e76664cb288e43c089daa06f658417af29928ba18b + md5: 54c9e66339fd76268d03551fd53009a2 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 49919 + timestamp: 1759136014463 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h9e87179_10.conda + sha256: f4549acde71ea045fbeb5f1eb30bfdf9639bf21ef7e058d13a3dc9a9f7bd1c43 + md5: 43bf4ac8c87510861e6125b770b1c68b + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50214 + timestamp: 1759189913573 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-cpp-4.6.6-np126py312h4d29ed4_10.conda + sha256: d0c0f644fec33753dee25ae45c4ca86dc073954690215abdefefff7e54003e1c + md5: a38182a7a1de117e68ff927e02ce61f3 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 46975 + timestamp: 1759228526728 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h3bd2861_10.conda + sha256: 775e66067ffaa69912fe55fdf494503c81ecdbb1b651e9f15737ab63540cff4b + md5: 0cb58a98294d974d0cb6b1a58e6e0ce1 + depends: + - numpy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-cppcheck + - ros-jazzy-ament-cmake-cpplint + - ros-jazzy-ament-cmake-flake8 + - ros-jazzy-ament-cmake-pep257 + - ros-jazzy-ament-cmake-uncrustify + - ros-jazzy-ament-index-python + - ros-jazzy-python-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rpyutils + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 59990 + timestamp: 1759136277836 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h01c0cb9_10.conda + sha256: 65483554644db2192df6a6d6eb5393a0a28853478f11c164d96556f78f175537 + md5: fe0f080f01f497e52fd694275f71fd0a + depends: + - numpy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-cppcheck + - ros-jazzy-ament-cmake-cpplint + - ros-jazzy-ament-cmake-flake8 + - ros-jazzy-ament-cmake-pep257 + - ros-jazzy-ament-cmake-uncrustify + - ros-jazzy-ament-index-python + - ros-jazzy-python-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rpyutils + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 60091 + timestamp: 1759136396134 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h9e87179_10.conda + sha256: b135b23a3e1ffbb3ea8f36875799fd00e2f575d90e2200137ab46460fb62f04b + md5: 9d2544fe7b8b4af53e1ced7c11c600f6 + depends: + - numpy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-cppcheck + - ros-jazzy-ament-cmake-cpplint + - ros-jazzy-ament-cmake-flake8 + - ros-jazzy-ament-cmake-pep257 + - ros-jazzy-ament-cmake-uncrustify + - ros-jazzy-ament-index-python + - ros-jazzy-python-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rpyutils + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 60983 + timestamp: 1759190343498 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-py-0.22.1-np126py312h4d29ed4_10.conda + sha256: 3525c2e99305b448a6423c110f9b293a2575bacaf544b38459610b23bdcd99e1 + md5: 01e541097a39746824cdc0ade63b481a + depends: + - numpy + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-cmake-cppcheck + - ros-jazzy-ament-cmake-cpplint + - ros-jazzy-ament-cmake-flake8 + - ros-jazzy-ament-cmake-pep257 + - ros-jazzy-ament-cmake-uncrustify + - ros-jazzy-ament-index-python + - ros-jazzy-python-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rpyutils + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57072 + timestamp: 1759231054469 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h3bd2861_10.conda + sha256: 1d01791814ce42808f232d8d7857ab94f21d23084580ac2d84834426dd365ec2 + md5: 159c33cc74b36a7ebfe6e49a416b5d6e + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 48511 + timestamp: 1759135649822 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h01c0cb9_10.conda + sha256: c3d1f9da01bf26599745054d4758814200837fb398f7a6734afa75cca071dd16 + md5: 55d732d62a2cadb6de2cda843362f9e2 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48627 + timestamp: 1759135625796 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h9e87179_10.conda + sha256: 31e95a0439b90fa00a8ab4eaa08c8c3d81e5c020b5296637c47ac3d346d71600 + md5: 7cc8ef70edcf656b5847c0dfb5077ee3 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 48846 + timestamp: 1759189551066 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-generator-type-description-4.6.6-np126py312h4d29ed4_10.conda + sha256: 8be10dc5acf8e875ed8734b66b42ab40e14ba05593b80ad3b36a4ae1911d2ff9 + md5: 93310e2ccae62601a3b623b443930272 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 45512 + timestamp: 1759225609534 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-parser-4.6.6-np126py312h3bd2861_10.conda + sha256: 9cda9c91fe734345c9f83e22b24da0045eccf150a7840892d834d5c8c5c42563 + md5: 288b24a8d8cb17b4a3e0b2d9c2dcb35f + depends: + - lark-parser + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-adapter + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 60062 + timestamp: 1759135545410 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-parser-4.6.6-np126py312h01c0cb9_10.conda + sha256: cc8ab86c6bae13c57e8451653b755b63a549953de0d2ba59f981050046a3ab0d + md5: 3241003403650f97ef5d7a0d6bc47273 + depends: + - lark-parser + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-adapter + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 60153 + timestamp: 1759135479334 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-parser-4.6.6-np126py312h9e87179_10.conda + sha256: a25226a6a66201192df75ddde2a10d1ac84a285652ba27028941b2d6734ea252 + md5: 83e9a1625429426fef19c9cd0b762eca + depends: + - lark-parser + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-adapter + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 60311 + timestamp: 1759189391947 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-parser-4.6.6-np126py312h4d29ed4_10.conda + sha256: 91f2d4d362f5e4838d8960c5d0d84316ae3f8344778c427731089e9fe1b795c3 + md5: 907a7d739ec07e288e5efba6918ce531 + depends: + - lark-parser + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-adapter + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 57358 + timestamp: 1759224805443 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h3bd2861_10.conda + sha256: d1a68a4629d184f840098436e13e276c5b39e964f76374a584168e23d4ce82ce + md5: a83a0fedc51d37628dc4230dd37af24c + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 25122 + timestamp: 1759135643674 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h01c0cb9_10.conda + sha256: b7cf378ab83003fc9a7931b6f28cd3469e4932b71c1b3821a743e301134151ca + md5: f3d1f26f6721c482a856be1e096c5ab9 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 25106 + timestamp: 1759135615425 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h9e87179_10.conda + sha256: 6fec8412845bc3d415f38922f1f794e6d42380484ec30a95cbc6347c8df3abbc + md5: aa445de23fb76d15d5b51763bc67c833 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 25486 + timestamp: 1759189538093 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-pycommon-4.6.6-np126py312h4d29ed4_10.conda + sha256: e6911089c7327a04045a590230f4a89e6b43577bd6823a66679bf442ae059964 + md5: 1d469397b1ae2ce548f968dbab2301fc + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-parser + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23071 + timestamp: 1759225566697 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h3bd2861_10.conda + sha256: a6becfeb81b3f1b1eb63ca9bf15b255a03c2319a978e1ea450751ceff0f01070 + md5: dca4734bd880fb4dd628ab01d02a8924 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 83310 + timestamp: 1759135737006 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h01c0cb9_10.conda + sha256: 826530603ff4ff79ae9421fb70b8ee8dc7420048d1b8298ad5acb4ba65c6c9f8 + md5: 0dc712795528fdd17415922fd51b9547 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 87800 + timestamp: 1759135693518 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h9e87179_10.conda + sha256: e546e734b9fb15878064571ed0df3faf1532d69cc527e886ce0def10945fd3d7 + md5: 4554173d8bab7371cf16aeabbf4f1d01 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 78380 + timestamp: 1759189649406 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-runtime-c-4.6.6-np126py312h4d29ed4_10.conda + sha256: ed937650895af8f5106203a77ee708bbdef9352947ec8ab4fe79e6fed11a262e + md5: 17128bd2f636015874d2f96ff261e7b9 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 86690 + timestamp: 1759226238907 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h3bd2861_10.conda + sha256: 1a6c8a7ce90474afb3089c2902243b43793c27349a8efbbb4be600a9182b8773 + md5: c82c6d7a2ccb6c100a78b450171435d2 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 40765 + timestamp: 1759135826231 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h01c0cb9_10.conda + sha256: cd583e874d309d73ae2a707718e3b8557a22585eb146e74a63a97a214626c530 + md5: 1fe2f4e386479649ceb9aff4c3a88169 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 40838 + timestamp: 1759135842371 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h9e87179_10.conda + sha256: ce09b07b7eda67f741a34e09c8f4fdb6d8c1e876d96b1b135806c962d76914d5 + md5: 9553f9c18a4f053737779dcd39e55458 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 41061 + timestamp: 1759189793333 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-runtime-cpp-4.6.6-np126py312h4d29ed4_10.conda + sha256: 9fdabbd76034848b104c1c83230f0520fa6dc019efebe57d9a771bafaa2025bd + md5: e74133e6fe407a927c842fe01c3f4b5b + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-runtime-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 37725 + timestamp: 1759227138298 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h3bd2861_10.conda + sha256: 48d323f3ee531a77655bb0aed03ef9ae0a7c8b94af626cb7a3ce1eb9405fabe3 + md5: 529f9ffa0a73fcf8c41f1964d16e5022 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50864 + timestamp: 1759136231797 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h01c0cb9_10.conda + sha256: 2961584450bdd0ce285f15d3e53f225983e66e503d01d3b0725bd314343db176 + md5: 03c8ab62ac966fb9392740c09675f416 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 51036 + timestamp: 1759136350675 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h9e87179_10.conda + sha256: b32120a6a0e5f1e7ae1c0bf90c04c96950461f91a4d30b468c862e6770270ac8 + md5: ca3b40d6c956068a8c095066e05b77df + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 50054 + timestamp: 1759190293425 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-c-3.2.2-np126py312h4d29ed4_10.conda + sha256: f8ffbc0d30e94732e3c5b331006e9e72816a1302f6988d331aea55a3838aaaa4 + md5: d9157b03663e9c92ba6c3e78d737affe + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 50971 + timestamp: 1759230811185 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h3bd2861_10.conda + sha256: 6443733659f9f5d6e4514b075f06663af3cdf7300d2016d17c81c594159d4e0e + md5: e03c02f670e399757b56a524e89a4090 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 50085 + timestamp: 1759136271816 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h01c0cb9_10.conda + sha256: a24c40f0790aa314b1a6eb5831e5764fc122dbffb338fdfe4f54d723989a5880 + md5: 8ae24ec8d346d73ac9b3600bd563467d + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 50203 + timestamp: 1759136390025 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h9e87179_10.conda + sha256: c046762af350b65c286a556a5b3c02381d66391e1a575de6839675a00249e667 + md5: c3cb4d1ef1ef4094bd7be2b98d9a41bd + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 49453 + timestamp: 1759190334059 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-cpp-3.2.2-np126py312h4d29ed4_10.conda + sha256: 6e475de0b9cbeff01e732b106e4b3dfe975186ff8bc0f0f848555764d07e050b + md5: ee43c5ca4d2c071e0099baf820a14977 + depends: + - python + - ros-jazzy-ament-cmake-core + - ros-jazzy-ament-index-python + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-type-description + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-cpp + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 50364 + timestamp: 1759231008455 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h3bd2861_10.conda + sha256: 9bee9940d28266a5542570de567e631365e5c98801f91c414d4a828edd2183db + md5: 47b54ef7ab0a20ae0b52b5bea6427c60 + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 51692 + timestamp: 1759136159703 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h01c0cb9_10.conda + sha256: 5e486d9d3d150166c0c11431f3af4be569d8735b6580b970781e3e90a0d8cbbf + md5: f1e7204db7d07d98586722994cfb06ef + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 52051 + timestamp: 1759136278003 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h9e87179_10.conda + sha256: 52c41a6fe89f8926b8f445b63d4a257fb0464ba67af0953a93972ec6b802710f + md5: 71dbcb6fbc146df25835c4aa69d1732c + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 51370 + timestamp: 1759190188820 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-fastrtps-c-3.6.2-np126py312h4d29ed4_10.conda + sha256: 6dec010802ba86df50913886c4161ca2644b4d1a10cd052d62ccdc75202d470b + md5: 22fd302b32e58859a62e24ca353f2640 + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 52795 + timestamp: 1759230376980 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h3bd2861_10.conda + sha256: 98b40c4a00ece5b171619985d8ee1feff9669f3538c2192f19fe1560b37d8a35 + md5: fafacfc793c18e2fc40e6d5b347d73bc + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 53698 + timestamp: 1759135981264 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h01c0cb9_10.conda + sha256: 2c5344c88f9d2abca5158aecb9af67b90f222ee9b21dcd33bf6590d581e7558f + md5: bf8783ece42d24a9a2982a4982b615ff + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 54048 + timestamp: 1759136104346 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h9e87179_10.conda + sha256: 3ec2e504f9264019536fb7172713c44e0ea22f27e5d6e49414192375b4bb5be8 + md5: 7033f881b8dccd685363073b4c7e704a + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 53222 + timestamp: 1759190010281 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-fastrtps-cpp-3.6.2-np126py312h4d29ed4_10.conda + sha256: 3af97902fad274561c9a5a0fa6011ac045af1e2d11d766f5581a2f522cc3123c + md5: d9ef982c5ca6086c775443ce72f9c6fd + depends: + - python + - ros-jazzy-ament-cmake-ros + - ros-jazzy-ament-index-python + - ros-jazzy-fastcdr + - ros-jazzy-fastrtps-cmake-module + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 53708 + timestamp: 1759229986932 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h3bd2861_10.conda + sha256: 77fb97f9d5367b0ea2aadde2a4f004532bb56248a8f5b2ec7e5bcf24bf2ddd61 + md5: 248b1c0c3fb1761ea4e17f6d0303b8f8 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 29117 + timestamp: 1759135163731 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h01c0cb9_10.conda + sha256: b5be8f82c4aea9d5b95bd00603e703543f18394334f8c2d4d6fa9c2b79a31d54 + md5: c8340958cc9ffd55dcbe3c34fe556f86 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29134 + timestamp: 1759135254126 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h9e87179_10.conda + sha256: 659cfcb2f0e8fd16e96e810131e1d1f4002436fe7e100846807d7a6b6fbb1983 + md5: 9b9ea88e24a0522cd9ab7c9175625439 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 29334 + timestamp: 1759188964884 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-interface-4.6.6-np126py312h4d29ed4_10.conda + sha256: cc06d7e2422137f7a2c2547ae4b4a4478b90ee5978764b8e58d7d158a4e4bff9 + md5: 5b52a8201a1ca59dcfd64fb7bf829ccf + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 26168 + timestamp: 1759223680076 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h3bd2861_10.conda + sha256: 6f30e4ae7a3c8c68ae98fb734e5b7366cb76de492d1e9af69b699bee3b1fdd1c + md5: 2ecb6407e4c9b99625e7b9134597ba46 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 48037 + timestamp: 1759135921391 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h01c0cb9_10.conda + sha256: ad9b17aa8e8c74d862ae0ed397d32197dd82864356abdfdef6617a6061f97572 + md5: ff9e480193894e2da1ee8dc36bdbb4ab + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 48610 + timestamp: 1759136036934 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h9e87179_10.conda + sha256: 401355b2caaacf32e5077208e7739c3bb044a642f3c1ee7e011df6eec8d3255c + md5: 3dc7e0c0f49db8618462959177a69c3f + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 47811 + timestamp: 1759189940857 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.6-np126py312h4d29ed4_10.conda + sha256: d6acf290ec6d052a5dd01236e0fdc3ffc24243b7f79f43f824780d123a55c2a2 + md5: d5bb45d0fb6aaa020aad011651a0468e + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-typesupport-interface + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 48389 + timestamp: 1759228738434 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h3bd2861_10.conda + sha256: 5fabcdd7b3ad4b763ab731ebc56d25507597a172542f4a5e052b788ce2fc671b + md5: c530712c799ea65fa4e9fbdbdd8b295a + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48259 + timestamp: 1759135994674 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h01c0cb9_10.conda + sha256: 738f9f16f81ee7ac7920bf167e99f5fe075b12230ba50999c5d16a6dbc7736ef + md5: 8b69eb9e0f7719153433764b8da2fe83 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48728 + timestamp: 1759136120894 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h9e87179_10.conda + sha256: 451eba12f0b68cc3208b2b08660a9927b434abd6bddfd38dbc917dcf1f4a9859 + md5: da9ae0c22ad6dcaade5cf19f5d9d33d9 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 48018 + timestamp: 1759190031418 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.6-np126py312h4d29ed4_10.conda + sha256: c42a4324fbc486bfaabfcfcefa3284f21e6047d17895774119cf009e22720c4b + md5: 8d375e4585b8875544ff319181696f25 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ament-index-python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-cli + - ros-jazzy-rosidl-cmake + - ros-jazzy-rosidl-generator-c + - ros-jazzy-rosidl-generator-cpp + - ros-jazzy-rosidl-parser + - ros-jazzy-rosidl-pycommon + - ros-jazzy-rosidl-runtime-c + - ros-jazzy-rosidl-runtime-cpp + - ros-jazzy-rosidl-typesupport-interface + - ros-jazzy-rosidl-typesupport-introspection-c + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 48546 + timestamp: 1759230097015 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rpyutils-0.4.2-np126py312h3bd2861_10.conda + sha256: feaa9fd7b874f60bb8705f284266e7a5ecd46685743fece17ebd97b15b970ecd + md5: e784214b5b2c6ce6c362ba9cc3ce66f1 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 26130 + timestamp: 1759134487455 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rpyutils-0.4.2-np126py312h01c0cb9_10.conda + sha256: 7482d525cdbdee11e4a9749e4a4dbb76aceb05dbebb4351edd8a7d9ef400a5d1 + md5: 7887e9102c7021377cc9679be4d6dda7 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 26218 + timestamp: 1759134654093 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rpyutils-0.4.2-np126py312h9e87179_10.conda + sha256: 45ce0776f8b5d0b31e635f17d6b51993f1b6d7f29f31905d443561287bb5771d + md5: f21a34f4e2b330913c3be99e7b407b26 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 26443 + timestamp: 1759188131311 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rpyutils-0.4.2-np126py312h4d29ed4_10.conda + sha256: cf8c3109aa56e7ac4c2584ad4b6b010104d39194e47678391a1252fe414ee184 + md5: 44e16da1148d9d4340a0ac432b8d3b68 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 19521 + timestamp: 1759220140965 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h3bd2861_10.conda + sha256: 939f02511575d68e5e213faf011a2cc83bdde7d158a931259334470a0959a0d2 + md5: a814fd56f1d32c08c552c78599d04971 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31364 + timestamp: 1759135460323 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h01c0cb9_10.conda + sha256: db6cbcbace887eaaf3a384599065a632feee8640335cc352079445c8936160bc + md5: c02b009af18e7572f415194f6da02b79 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31459 + timestamp: 1759135421402 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h9e87179_10.conda + sha256: cf34e5ffedb02d29b3ef16f80cadbbc239089e148c2085412fa03b4893c302ba + md5: 93a32bea6c034761ce4523d69e32b182 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 31657 + timestamp: 1759189128393 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-rti-connext-dds-cmake-module-0.22.1-np126py312h4d29ed4_10.conda + sha256: ed7d4a6b568f8bd01b1e6bb6047c44ee8069903f499f0989c3af4748dcc6eb71 + md5: 1c8068eacc57aa9c853d7b2fe6ff1bf8 + depends: + - python + - ros-jazzy-ament-cmake + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 28451 + timestamp: 1759224384937 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-service-msgs-2.0.3-np126py312h3bd2861_10.conda + sha256: 58f5a585a42773ac153529a7a23b63bfbf5a4c5fa1299c6bb9af671847582934 + md5: a0c36bf475e340a819d8b781bd798058 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 80559 + timestamp: 1759136384945 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-service-msgs-2.0.3-np126py312h01c0cb9_10.conda + sha256: ee1fe9f6205d3d24498e925392bb11ea1c26c3e81acbaca8cef23da6c976d272 + md5: 90cb8922664a65f0881714bd0be6780e + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 84335 + timestamp: 1759136527452 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-service-msgs-2.0.3-np126py312h9e87179_10.conda + sha256: 7e1acb6d3515247f3921b25728293dd2e33242b8f1c48c42aabe3ce6b6aa2a84 + md5: 92b01a19d8948eba2d0ff2fff048027f + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 77554 + timestamp: 1759190454399 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-service-msgs-2.0.3-np126py312h4d29ed4_10.conda + sha256: c546b61514d1e12614d58830197b873d4c340675ac7e4a13f1dacd6cae90ec69 + md5: e803d8136435f5b3b05615dccf9bc9b5 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 86204 + timestamp: 1759231444265 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-spdlog-vendor-1.6.1-np126py312he340118_10.conda + sha256: 25c91dfa53a354e9d604895e8f2ac86555d980ce9d06944782bfc156a1dcf86b + md5: 8ea8282ec14e7532dd2ce77cb1baa09a + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 26975 + timestamp: 1759135131375 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-spdlog-vendor-1.6.1-np126py312hbd405f3_10.conda + sha256: 2d0654b10d7f8f9291d936aa01f02debfd4756edbad0e4435f88e7b378f81cb2 + md5: ed960b36f9238d7c087b3577bd76fb12 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - spdlog >=1.15.3,<1.16.0a0 + license: BSD-3-Clause + size: 27031 + timestamp: 1759135205832 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-spdlog-vendor-1.6.1-np126py312h55ce18a_10.conda + sha256: 67e7c125b7c7123705662acf9800cd7f87e6246f25180498b73b2b7e285ce439 + md5: 7e066238dd3fa1ca5db8cfaeadd8aa90 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - __osx >=11.0 + - libcxx >=18 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 27289 + timestamp: 1759188927808 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-spdlog-vendor-1.6.1-np126py312ha1e63b2_10.conda + sha256: 8ff9d0e8a4d1d6cce08110aeb5bcf664e307bef1b7215d54e5445016bc946e4e + md5: 151ed0721f6305d45768528e7b81a41b + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - spdlog + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - spdlog >=1.15.3,<1.16.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23994 + timestamp: 1759223426615 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-tracetools-8.2.4-np126py312h3bd2861_10.conda + sha256: f25d0f1a214c27118745c3ca772ffa64631489be4e9868c9daaf300ca11b26af + md5: af1df22dc8dd175c42fe14c84fcfb71b + depends: + - lttng-ust + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - lttng-ust >=2.13.9,<2.14.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 72568 + timestamp: 1759135552746 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-tracetools-8.2.4-np126py312h01c0cb9_10.conda + sha256: 1557d87bdbcbe26ac4910b45b4feebe59686406a432d4c4aec3567a483705e8d + md5: 42d53e18ac90fcc680a287ab6514dcf9 + depends: + - lttng-ust + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - lttng-ust >=2.13.9,<2.14.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 72387 + timestamp: 1759135490446 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-tracetools-8.2.4-np126py312h9e87179_10.conda + sha256: 1e66a7d4940f39edaca0bd8ab8a409fe86512e9c79ef2a18481d462c60e2ff3c + md5: fd33ad1b2a836e91224f17430377d507 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - __osx >=11.0 + - libcxx >=18 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 34983 + timestamp: 1759189400324 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-tracetools-8.2.4-np126py312h4d29ed4_10.conda + sha256: c446341f29c024a0b89585983e762437b730ded8f6371996ebcf1beb2ec8ae0e + md5: 286da7d078606d96363e5c34c43f9b66 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 31733 + timestamp: 1759224851979 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h3bd2861_10.conda + sha256: 14368876873331ac7451cbf86be9ca2e19266d359bf583112b65bf3d5f06f776 + md5: 148ab2d471c3f2c05ece1bef1a74aa33 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 232014 + timestamp: 1759136425687 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h01c0cb9_10.conda + sha256: 070a97a4abb0995a5fd0aa0145536714046c179816c2aef323c4b7fcda9c3736 + md5: 48a5bf4208ba26f7b628621c57026ed3 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 237255 + timestamp: 1759136569268 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h9e87179_10.conda + sha256: e0350f13fa51ab2f4417d39ababea5bc87f9bf84c06cb2812b5c4958f592925f + md5: be6cd7dee8ea3bebbe53ab625bf77bd9 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 206502 + timestamp: 1759190510948 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-type-description-interfaces-2.0.3-np126py312h4d29ed4_10.conda + sha256: 4edef650ab37a9a891ed3c70d816570fd880286085ac9e15609b53201815e6bf + md5: e149c0fe2a8d4d0c525e7a9b31f2062c + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros-jazzy-service-msgs + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 217833 + timestamp: 1759231718843 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h3bd2861_10.conda + sha256: 8bfec2c28f1d91dae66dc2e340919df515cf24aa9f2b2c10436cb5e7f87a7e2c + md5: 9f7999ca0a848afcf154526c50fd1730 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - uncrustify + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - uncrustify >=0.81.0,<0.82.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22961 + timestamp: 1759134500513 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h01c0cb9_10.conda + sha256: a2208176da92450b608aff4df74a9434eafcc1750eaeebbeb98cc9ff38ebd40c + md5: 6dc7a38cca4caf5010fd72d70b8c2a9d + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - uncrustify + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - uncrustify >=0.81.0,<0.82.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 22911 + timestamp: 1759134669184 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h9e87179_10.conda + sha256: 4cc2ad799de793585ad31086f60fc850d6a4f2a4e9728d3f5afec197976222b9 + md5: 51a4e9a632bbca7ddb9170305d0d4e42 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - uncrustify + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - uncrustify >=0.81.0,<0.82.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 23265 + timestamp: 1759188144347 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-uncrustify-vendor-3.0.1-np126py312h4d29ed4_10.conda + sha256: ed109eabe7063cf0f15361c5f27b0248251f8d0f3b7a7c224010acd037852656 + md5: 2e47dc10f28aaab0c89409d6391ca466 + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.11.* jazzy_* + - uncrustify + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - uncrustify >=0.81.0,<0.82.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + license: BSD-3-Clause + size: 20017 + timestamp: 1759219816533 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h3bd2861_10.conda + sha256: 268d05a4cfdffd530dae91976a9ef5c4b627c0aa98d3d98b112d51ef6e7ee9c1 + md5: 5ec0687171c636826444b41d9f2d1dc5 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 74184 + timestamp: 1759136346004 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h01c0cb9_10.conda + sha256: 6304fd771eac13d5a79c33cae14ff9d71fd3d59121df3accefe9de45451de3b8 + md5: 55308a8e9e8eedeb8ff64dd04e087cff + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 77638 + timestamp: 1759136480421 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h9e87179_10.conda + sha256: 1c4c304a9badcead4d92b7221b77ba2426c01a2314559716e779ef8a861f76c8 + md5: 92adf28e81e557145e67396e77c35ab8 + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - libcxx >=18 + - __osx >=11.0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + - numpy >=1.26.4,<2.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + size: 70397 + timestamp: 1759190418040 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros-jazzy-unique-identifier-msgs-2.5.0-np126py312h4d29ed4_10.conda + sha256: d522b8a472e079340bdf7c3bafc3acea59d9d078829966b641770199fc4ee2ba + md5: cae8239fa086159ef2674ee1ef9d551e + depends: + - python + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-core-runtime + - ros2-distro-mutex 0.11.* jazzy_* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.26.4,<2.0a0 + - ros2-distro-mutex >=0.11.0,<0.12.0a0 + license: BSD-3-Clause + size: 79144 + timestamp: 1759231268612 +- conda: https://prefix.dev/robostack-humble/linux-64/ros2-distro-mutex-0.7.0-humble_13.conda + sha256: 2ac28fd00e56f9cdb285bd42db47002464b94d148171baa13f10f700d554f694 + md5: c5516e14d1c4949c9095caf59f39ea0b + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + license: BSD-3-Clause + size: 2318 + timestamp: 1753307768030 +- conda: https://prefix.dev/robostack-humble/linux-aarch64/ros2-distro-mutex-0.7.0-humble_13.conda + sha256: aa69924a5a632658e495718ca9c1ec1a2cc977d4cd5e54917e3b0056ab0a69e4 + md5: 1aeb3601a3b85b20072f3f43f1f7762c + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + license: BSD-3-Clause + size: 2321 + timestamp: 1753307949132 +- conda: https://prefix.dev/robostack-humble/osx-arm64/ros2-distro-mutex-0.7.0-humble_13.conda + sha256: 719c7f514125b8e60d760cef73440328e6f1f4ccb1be22657ca377519e0efa6a + md5: 6a9795b9c72889afded8b5fb550f032c + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + license: BSD-3-Clause + size: 2304 + timestamp: 1753307858174 +- conda: https://prefix.dev/robostack-humble/win-64/ros2-distro-mutex-0.7.0-humble_13.conda + sha256: 26383accb38cb8c7cb5c675d74b9f504590d61f62b860f306cd413f009081198 + md5: 1c35324823f1b1f1f68ce659633201dc + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + license: BSD-3-Clause + size: 2323 + timestamp: 1753307971823 +- conda: https://prefix.dev/robostack-jazzy/linux-64/ros2-distro-mutex-0.11.0-jazzy_10.conda + sha256: 7fcc5b58a9c7dda98bd4f13cfd5aa9d548d0564064d1375e153ab329ea04a7e8 + md5: 0f3a0a48488540478bc8bdb536522b59 + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + - libxml2 2.13.* + - vtk 9.4.2.* + license: BSD-3-Clause + size: 2353 + timestamp: 1759133819339 +- conda: https://prefix.dev/robostack-jazzy/linux-aarch64/ros2-distro-mutex-0.11.0-jazzy_10.conda + sha256: eec61947bafd89bb6a43b4f93364b9da36b3ee08cc1abcc0e829146347c61f4a + md5: 1bcbecb5864689e92f66f31e1ffad155 + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + - libxml2 2.13.* + - vtk 9.4.2.* + license: BSD-3-Clause + size: 2355 + timestamp: 1759134071681 +- conda: https://prefix.dev/robostack-jazzy/osx-arm64/ros2-distro-mutex-0.11.0-jazzy_10.conda + sha256: 62baa026d0b26f294688dad8095eeece3833f9eb2fa89e4bfc6c0adb96bbb5b0 + md5: 03de3bc87a46646c8dd35c95ce9917da + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + - libxml2 2.13.* + - vtk 9.4.2.* + license: BSD-3-Clause + size: 2332 + timestamp: 1759187278707 +- conda: https://prefix.dev/robostack-jazzy/win-64/ros2-distro-mutex-0.11.0-jazzy_10.conda + sha256: a7f8914af39a8767fc92d203b1fe651dad1ceafde840ae71615fe6e4d8861e86 + md5: 523fe89e02d5d62a3f8d5a0c81de8ca9 + constrains: + - libboost 1.86.* + - libboost-devel 1.86.* + - pcl 1.15.0.* + - gazebo 11.* + - libprotobuf 5.29.3.* + - libxml2 2.13.* + - vtk 9.4.2.* + license: BSD-3-Clause + size: 2355 + timestamp: 1759206814596 +- conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 748788 + timestamp: 1748804951958 +- conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 18455 + timestamp: 1753199211006 +- conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + sha256: 17007a4cfbc564dc3e7310dcbe4932c6ecb21593d4fec3c68610720f19e73fb2 + md5: 755cf22df8693aa0d1aec1c123fa5863 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 73009 + timestamp: 1747749529809 +- conda: https://prefix.dev/conda-forge/linux-64/spdlog-1.15.3-h6dc744f_1.conda + sha256: e5ddcc73dac4c138b763aab4feace6101bdccf39ea4cf599705c9625c70beba0 + md5: ffeb70e2cedafa9243bf89a20ada4cfe + depends: + - __glibc >=2.17,<3.0.a0 + - fmt >=11.2.0,<11.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 195618 + timestamp: 1751348678073 +- conda: https://prefix.dev/conda-forge/linux-aarch64/spdlog-1.15.3-h881af89_1.conda + sha256: 06588517354b886feaa9c0264a8bb823b9665b81ac4923ae739152b432bc5e44 + md5: 4173e7480140c5ae80b87114b61a2ebf + depends: + - fmt >=11.2.0,<11.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 194529 + timestamp: 1751348711276 +- conda: https://prefix.dev/conda-forge/osx-arm64/spdlog-1.15.3-h217a1f9_1.conda + sha256: 673e4475bc9ca8e321bc98c8f6e48bf0efd530b5978d6a675de03c77b0a41227 + md5: bd3f40ea227bed3b00b13a574a9dd9ee + depends: + - __osx >=11.0 + - fmt >=11.2.0,<11.3.0a0 + - libcxx >=18 + license: MIT + license_family: MIT + size: 166201 + timestamp: 1751348813679 +- conda: https://prefix.dev/conda-forge/win-64/spdlog-1.15.3-h430ee68_1.conda + sha256: dab3103c03a2d26e40a5c4e83e192d99cf6de806280fe4c1298943970503e56c + md5: d195ba9419c5704fc42cfacb88f4c3f0 + depends: + - fmt >=11.2.0,<11.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 173572 + timestamp: 1751348807537 +- conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda + sha256: 30e82640a1ad9d9b5bee006da7e847566086f8fdb63d15b918794a7ef2df862c + md5: 72226638648e494aaafde8155d50dab2 + depends: + - libhwloc >=2.12.1,<2.12.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + size: 150266 + timestamp: 1755776172092 +- conda: https://prefix.dev/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda + sha256: 3ae98c2ca54928b2c72dbb4bd8ea229d3c865ad39367d377908294d9fb1e6f2c + md5: aeb0b91014ac8c5d468e32b7a5ce8ac2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + license: Zlib + size: 131351 + timestamp: 1742246125630 +- conda: https://prefix.dev/conda-forge/linux-aarch64/tinyxml2-11.0.0-h5ad3122_0.conda + sha256: 720c2f979947b22940424245b780a792b947a4e2d8bfb9939acf75dcb4728af9 + md5: ffd0eb9816b6372f7283d3d7ba830ac1 + depends: + - libstdcxx >=13 + - libgcc >=13 + license: Zlib + size: 133310 + timestamp: 1742246428717 +- conda: https://prefix.dev/conda-forge/osx-arm64/tinyxml2-11.0.0-ha1acc90_0.conda + sha256: bbd9294551ff727305f8335819c24d2490d5d79e0f3d90957992c39d2146093a + md5: 6778d917f88222e8f27af8ec5c41f277 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Zlib + size: 122269 + timestamp: 1742246179980 +- conda: https://prefix.dev/conda-forge/win-64/tinyxml2-11.0.0-he0c23c2_0.conda + sha256: f22e0ef11cce8b25e48a2d4a0ca8a2fc5b89841c36f8ec955b01baff7cd3a924 + md5: e80ff399c7b08f37ecdaeaeb5017b9fb + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: Zlib + size: 75152 + timestamp: 1742246154008 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 +- conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + sha256: 46e10488e9254092c655257c18fcec0a9864043bdfbe935a9fbf4fb2028b8514 + md5: 2562c9bfd1de3f9c590f0fe53858d85c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3342845 + timestamp: 1748393219221 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3466348 + timestamp: 1748388121356 +- conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff + md5: d2732eb636c264dc9aa4cbee404b1a53 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 20973 + timestamp: 1760014679845 +- conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + size: 51692 + timestamp: 1756220668932 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://prefix.dev/conda-forge/linux-64/uncrustify-0.81.0-h5888daf_0.conda + sha256: f0b3ad46b173de03c45134b16d7be0b5bdaff344cccb6a4d205850809c1a4dca + md5: c2310445798370fe622fc6b03d79a3a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: GPL-2.0-only + license_family: GPL + size: 650318 + timestamp: 1747514389910 +- conda: https://prefix.dev/conda-forge/linux-aarch64/uncrustify-0.81.0-h5ad3122_0.conda + sha256: d886da4b98a0b38eebcfc80a0818def69d4d735c98f548d678dcac1f1e859c4c + md5: 0a56cd95bc8308d26db08135328b4f62 + depends: + - libgcc >=13 + - libstdcxx >=13 + license: GPL-2.0-only + license_family: GPL + size: 636572 + timestamp: 1747514438016 +- conda: https://prefix.dev/conda-forge/osx-arm64/uncrustify-0.81.0-h286801f_0.conda + sha256: 27c90ec707ed48dd3c02c68d69c96508e419b7a2f59bf06c01687e729594bf8d + md5: b7ccf88050c409410385bec64cafa412 + depends: + - __osx >=11.0 + - libcxx >=18 + license: GPL-2.0-only + license_family: GPL + size: 540919 + timestamp: 1747514576305 +- conda: https://prefix.dev/conda-forge/win-64/uncrustify-0.81.0-he0c23c2_0.conda + sha256: 787077c15b69d7fe6f6ded93d62e2180b8d775cdc8b6550d2270e943b3d8b636 + md5: 4809798e2e5e8749445d08bd4422ce7b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-only + license_family: GPL + size: 413662 + timestamp: 1747514675025 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf + md5: ef02bbe151253a72b8eda264a935db66 + depends: + - vc14_runtime >=14.42.34433 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18861 + timestamp: 1760418772353 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd + md5: 378d5dcec45eaea8d303da6f00447ac0 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_32 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682706 + timestamp: 1760418629729 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 + md5: 58f67b437acbf2764317ba273d731f1d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 114846 + timestamp: 1760418593847 +- conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_32.conda + sha256: 65cea43f4de99bc81d589e746c538908b2e95aead9042fecfbc56a4d14684a87 + md5: dfc1e5bbf1ecb0024a78e4e8bd45239d + depends: + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 18919 + timestamp: 1760418632059 +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d + md5: fdc27cb255a7a2cc73b7919a968b48f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 20772 + timestamp: 1750436796633 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-0.4.1-hca56bd8_2.conda + sha256: d874906e236a5edc9309d479599bf2de4d8adca0f23c355b76759d5fb3c4bef8 + md5: 159ffec8f7fab775669a538f0b29373a + depends: + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 21517 + timestamp: 1750437961489 +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 + md5: a0901183f08b6c7107aab109733a3c91 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + license: MIT + license_family: MIT + size: 24551 + timestamp: 1718880534789 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-image-0.4.0-h5c728e9_2.conda + sha256: a43058edc001e8fb97f9b291028a6ca16a8969d9b56a998c7aecea083323ac97 + md5: b82e5c78dbbfa931980e8bfe83bce913 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + license: MIT + license_family: MIT + size: 24910 + timestamp: 1718880504308 +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 + md5: ad748ccca349aec3e91743e08b5e2b50 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 14314 + timestamp: 1718846569232 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-keysyms-0.4.1-h5c728e9_0.conda + sha256: 9d92daa7feb0e14f81bf0d4b3f0b6ff1e8cec3ff514df8a0c06c4d49b518c315 + md5: 57ca8564599ddf8b633c4ea6afee6f3a + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 14343 + timestamp: 1718846624153 +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df + md5: 0e0cbe0564d03a99afd5fd7b362feecd + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 16978 + timestamp: 1718848865819 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-renderutil-0.3.10-h5c728e9_0.conda + sha256: 5827f5617c9741599f72bb7f090726f89c6ef91e4bada621895fdc2bbadfb0f1 + md5: 7beeda4223c5484ef72d89fb66b7e8c1 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 18139 + timestamp: 1718849914457 +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a + md5: 608e0ef8256b81d04456e8d211eee3e8 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 51689 + timestamp: 1718844051451 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xcb-util-wm-0.4.2-h5c728e9_0.conda + sha256: 3f52cd8783e7d953c54266255fd11886c611c2620545eabc28ec8cf470ae8be7 + md5: f14dcda6894722e421da2b7dcffb0b78 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + size: 50772 + timestamp: 1718845072660 +- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + sha256: aa03b49f402959751ccc6e21932d69db96a65a67343765672f7862332aa32834 + md5: 71ae752a748962161b4740eaff510258 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 396975 + timestamp: 1759543819846 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xkeyboard-config-2.46-he30d5cf_0.conda + sha256: c440a757d210e84c7f315ac3b034266980a8b4c986600649d296b9198b5b4f5e + md5: 9524f30d9dea7dd5d6ead43a8823b6c2 + depends: + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 396706 + timestamp: 1759543850920 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 58628 + timestamp: 1734227592886 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda + sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 + md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 60433 + timestamp: 1734229908988 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + size: 27590 + timestamp: 1741896361728 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda + sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a + md5: 2d1409c50882819cb1af2de82e2b7208 + depends: + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + size: 28701 + timestamp: 1741897678254 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 835896 + timestamp: 1741901112627 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libx11-1.8.12-hca56bd8_0.conda + sha256: 452977d8ad96f04ec668ba74f46e70a53e00f99c0e0307956aeca75894c8131d + md5: 3df132f0048b9639bc091ef22937c111 + depends: + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 864850 + timestamp: 1741901264068 +- conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libx11-1.8.12-h6a5fb8c_0.conda + sha256: 3ba39f182ecb6bf0bfb2dbbc08b1fc80a0a97e5c07cad06a03e71baf1fe7ac9d + md5: 89b59aaa3c35257dba0b7c2d980f35f0 + depends: + - __osx >=11.0 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 761938 + timestamp: 1741901455497 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 15873 + timestamp: 1734230458294 +- conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + size: 13217 + timestamp: 1727891438799 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxdamage-1.1.6-h86ecc28_0.conda + sha256: 3afaa2f43eb4cb679fc0c3d9d7c50f0f2c80cc5d3df01d5d5fd60655d0bfa9be + md5: d5773c4e4d64428d7ddaa01f6f845dc7 + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + size: 13794 + timestamp: 1727891406431 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 20615 + timestamp: 1727796660574 +- conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda + sha256: 8e216b024f52e367463b4173f237af97cf7053c77d9ce3e958bc62473a053f71 + md5: bd1e86dd8aa3afd78a4bfdb4ef918165 + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + license: MIT + license_family: MIT + size: 50746 + timestamp: 1727754268156 +- conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxext-1.3.6-hd74edd7_0.conda + sha256: 4526fcd879b74400e66cc2a041ca00c0ecd210486459cc65610b135be7c6a2d2 + md5: acf6c394865f1b7a51c8e57fec6fcde3 + depends: + - __osx >=11.0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 41870 + timestamp: 1727752280756 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 20071 + timestamp: 1759282564045 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda + sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e + md5: e8b4056544341daf1d415eaeae7a040c + depends: + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 20704 + timestamp: 1759284028146 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda + sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f + md5: ae2c2dd0e2d38d249887727db2af960e + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 33649 + timestamp: 1734229123157 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda + sha256: c0830fe9fa78d609cd9021f797307e7e0715ef5122be3f784765dad1b4d8a193 + md5: 9a809ce9f65460195777f2f2116bae02 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 12302 + timestamp: 1734168591429 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxshmfence-1.3.3-h86ecc28_0.conda + sha256: 9057e4a85a093d733719228d44aa09924e879ee769a9bb79ef7035cd0f260c8e + md5: c11f706a5072c34a559848f27d6c28c3 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 13805 + timestamp: 1734168631514 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + sha256: 8a4e2ee642f884e6b78c20c0892b85dd9b2a6e64a6044e903297e616be6ca35b + md5: 5efa5fa6243a622445fdfd72aee15efa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + size: 17819 + timestamp: 1734214575628 +- conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda + sha256: 012f0d1fd9fb1d949e0dccc0b28d9dd5a8895a1f3e2a7edc1fa2e1b33fc0f233 + md5: d745faa2d7c15092652e40a22bb261ed + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + size: 18185 + timestamp: 1734214652726 +- conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + size: 85189 + timestamp: 1753484064210 +- conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 + md5: 032d8030e4a24fe1f72c74423a46fb88 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + size: 88088 + timestamp: 1753484092643 +- conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 83386 + timestamp: 1753484079473 +- conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + size: 63944 + timestamp: 1753484092156 +- conda: https://prefix.dev/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + sha256: 4b0b713a4308864a59d5f0b66ac61b7960151c8022511cdc914c0c0458375eca + md5: 92b90f5f7a322e74468bb4909c7354b5 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 223526 + timestamp: 1745307989800 +- conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-cpp-0.8.0-h5ad3122_0.conda + sha256: e146d83cdcf92506ab709c6e10acabd18a3394a23e6334a322c57e5d1d6d9f26 + md5: b9e5a9da5729019c4f216cf0d386a70c + depends: + - libstdcxx >=13 + - libgcc >=13 + license: MIT + license_family: MIT + size: 213281 + timestamp: 1745308220432 +- conda: https://prefix.dev/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + sha256: 66ba31cfb8014fdd3456f2b3b394df123bbd05d95b75328b7c4131639e299749 + md5: 30475b3d0406587cf90386a283bb3cd0 + depends: + - libcxx >=18 + - __osx >=11.0 + license: MIT + license_family: MIT + size: 136222 + timestamp: 1745308075886 +- conda: https://prefix.dev/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + sha256: 031642d753e0ebd666a76cea399497cc7048ff363edf7d76a630ee0a19e341da + md5: 9bb5064a9fca5ca8e7d7f1ae677354b6 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + size: 148572 + timestamp: 1745308037198 +- conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad + md5: df5e78d904988eb55042c0c97446079f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 22963 + timestamp: 1749421737203 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 +- conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda + sha256: 0812e7b45f087cfdd288690ada718ce5e13e8263312e03b643dd7aa50d08b51b + md5: 5be90c5a3e4b43c53e38f50a85e11527 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 551176 + timestamp: 1742433378347 +- conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 399979 + timestamp: 1742433432699 +- conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 + md5: 21f56217d6125fb30c3c3f10c786d751 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 354697 + timestamp: 1742433568506 diff --git a/tests/data/pixi-build/ros-workspace/pixi.toml b/tests/data/pixi-build/ros-workspace/pixi.toml new file mode 100644 index 0000000000..d644a8cd55 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/pixi.toml @@ -0,0 +1,27 @@ +[workspace] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", + "https://prefix.dev/robostack-humble", +] +platforms = ["osx-arm64", "linux-64", "win-64", "linux-aarch64"] +preview = ["pixi-build"] + +[tasks] +navigator = "ros2 run navigator navigator" +navigator_py = "ros2 run navigator_py navigator" + +[dependencies] +ros-humble-navigator = { path = "src/navigator" } +ros-humble-navigator-py = { path = "src/navigator_py" } + +[feature.distro-less] +channels = [ + "https://prefix.dev/robostack-jazzy", + "https://prefix.dev/conda-forge", +] +dependencies = { ros-jazzy-distro-less-package = { path = "src/distro_less_package" } } +tasks = { distro-less-task = "ros2 run distro_less_package distro_less_package" } + +[environments] +distro-less = { features = ["distro-less"], no-default-feature = true } diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/__init__.py b/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py b/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py new file mode 100644 index 0000000000..a8341fd42f --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py @@ -0,0 +1,9 @@ +# Simple hello world script for ROS2 in Python +from typing import Any + +import rclpy # type: ignore[import-not-found] + + +def main(args: Any = None) -> None: + rclpy.init(args=args) + print("Distroless package") diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml b/tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml new file mode 100644 index 0000000000..1f73cf8cac --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml @@ -0,0 +1,20 @@ + + + + distro_less_package + 0.0.0 + TODO: Package description + jane + BSD-3-Clause + + rclpy + + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest + + + ament_python + + diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml b/tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml new file mode 100644 index 0000000000..9734e254f1 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml @@ -0,0 +1,6 @@ +[package.build.backend] +name = "pixi-build-ros" +version = "*" + +# Specifically no distro specified here: +# [package.build.config] diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/resource/distro_less_package b/tests/data/pixi-build/ros-workspace/src/distro_less_package/resource/distro_less_package new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg b/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg new file mode 100644 index 0000000000..e9dd2aa2e0 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/distro_less_package +[install] +install_scripts=$base/lib/distro_less_package diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py b/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py new file mode 100644 index 0000000000..800e576196 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py @@ -0,0 +1,22 @@ +from setuptools import find_packages, setup + +package_name = "distro_less_package" + +setup( + name=package_name, + version="0.0.0", + packages=find_packages(exclude=["test"]), + data_files=[ + ("share/ament_index/resource_index/packages", ["resource/" + package_name]), + ("share/" + package_name, ["package.xml"]), + ], + install_requires=["setuptools"], + zip_safe=True, + maintainer="rubenarts", + maintainer_email="ruben.arts@hotmail.com", + description="TODO: Package description", + license="TODO: License declaration", + entry_points={ + "console_scripts": ["distro_less_package = distro_less_package.distro_less_package:main"], + }, +) diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt b/tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt new file mode 100644 index 0000000000..567da958c3 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.8) +project(navigator) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(turtlesim REQUIRED) + +add_executable(navigator src/navigator.cpp) +target_include_directories(navigator PUBLIC + $ + $) +target_compile_features(navigator PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +ament_target_dependencies( + navigator + "rclcpp" + "geometry_msgs" + "turtlesim" +) + +install(TARGETS navigator + DESTINATION lib/${PROJECT_NAME}) + +# if(BUILD_TESTING) +# find_package(ament_lint_auto REQUIRED) +# # the following line skips the linter which checks for copyrights +# # comment the line when a copyright and license is added to all source files +# set(ament_cmake_copyright_FOUND TRUE) +# # the following line skips cpplint (only works in a git repo) +# # comment the line when this package is in a git repo and when +# # a copyright and license is added to all source files +# set(ament_cmake_cpplint_FOUND TRUE) +# ament_lint_auto_find_test_dependencies() +# endif() + +ament_package() diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/package.xml b/tests/data/pixi-build/ros-workspace/src/navigator/package.xml new file mode 100644 index 0000000000..65ab9585eb --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator/package.xml @@ -0,0 +1,22 @@ + + + + navigator + 0.0.0 + TODO: Package description + rarts + BSD-3-Clause + + ament_cmake + + rclcpp + geometry_msgs + turtlesim + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml b/tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml new file mode 100644 index 0000000000..fd07c45853 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml @@ -0,0 +1,6 @@ +[package.build.backend] +name = "pixi-build-ros" +version = "*" + +[package.build.config] +distro = "humble" diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp b/tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp new file mode 100644 index 0000000000..7fcd73235d --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp @@ -0,0 +1,94 @@ +#define _USE_MATH_DEFINES + +#include + +#include "rclcpp/rclcpp.hpp" +#include "geometry_msgs/msg/point.hpp" +#include "geometry_msgs/msg/twist.hpp" +#include "turtlesim/msg/pose.hpp" + +class TurtleNavigator : public rclcpp::Node +{ +public: + TurtleNavigator() + : Node("turtle_navigator"), x_goal_(4.0), y_goal_(5.0), kp_(1.0), ki_(0.0), kd_(0.05), prev_error_(0.0), integral_(0.0) + { + subscription_ = this->create_subscription( + "coordinates", 10, std::bind(&TurtleNavigator::goal_callback, this, std::placeholders::_1)); + pose_subscription_ = this->create_subscription( + "turtle1/pose", 10, std::bind(&TurtleNavigator::pose_callback, this, std::placeholders::_1)); + publisher_ = this->create_publisher("turtle1/cmd_vel", 10); + + timer_ = this->create_wall_timer( + std::chrono::milliseconds(100), std::bind(&TurtleNavigator::control_loop, this)); + + RCLCPP_INFO(this->get_logger(), "Turtle Navigator has been started!"); + RCLCPP_INFO(this->get_logger(), "Initial goal: x=%f, y=%f", x_goal_, y_goal_); + } + +private: + void goal_callback(const geometry_msgs::msg::Point::SharedPtr msg) + { + x_goal_ = msg->x; + y_goal_ = msg->y; + RCLCPP_INFO(this->get_logger(), "Received goal: x=%f, y=%f", x_goal_, y_goal_); + } + + void pose_callback(const turtlesim::msg::Pose::SharedPtr msg) + { + x_current_ = msg->x; + y_current_ = msg->y; + theta_current_ = msg->theta; + } + + void control_loop() + { +// RCLCPP_INFO(this->get_logger(), "Hello Ruben!"); + double error_x = x_goal_ - x_current_; + double error_y = y_goal_ - y_current_; + double distance_error = std::sqrt(error_x * error_x + error_y * error_y); + + double angle_to_goal = std::atan2(error_y, error_x); + double angle_error = angle_to_goal - theta_current_; + + // Normalize angle error to the range [-pi, pi] + while (angle_error > M_PI) angle_error -= 2 * M_PI; + while (angle_error < -M_PI) angle_error += 2 * M_PI; + + // PID control + double control_signal = kp_ * distance_error + ki_ * integral_ + kd_ * (distance_error - prev_error_); + integral_ += distance_error; + prev_error_ = distance_error; + + // Limit control signal + double max_linear_speed = 2.0; // Max linear speed + double max_angular_speed = 2.0; // Max angular speed + control_signal = std::clamp(control_signal, -max_linear_speed, max_linear_speed); + + // Publish velocity commands + auto msg = geometry_msgs::msg::Twist(); + msg.linear.x = control_signal; + msg.angular.z = 4.0 * angle_error; // simple P controller for angle + msg.angular.z = std::clamp(msg.angular.z, -max_angular_speed, max_angular_speed); + + publisher_->publish(msg); + } + + rclcpp::Subscription::SharedPtr subscription_; + rclcpp::Subscription::SharedPtr pose_subscription_; + rclcpp::Publisher::SharedPtr publisher_; + rclcpp::TimerBase::SharedPtr timer_; + + double x_goal_, y_goal_; + double x_current_, y_current_, theta_current_; + double kp_, ki_, kd_; + double prev_error_, integral_; +}; + +int main(int argc, char *argv[]) +{ + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt new file mode 100644 index 0000000000..567da958c3 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.8) +project(navigator) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(turtlesim REQUIRED) + +add_executable(navigator src/navigator.cpp) +target_include_directories(navigator PUBLIC + $ + $) +target_compile_features(navigator PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +ament_target_dependencies( + navigator + "rclcpp" + "geometry_msgs" + "turtlesim" +) + +install(TARGETS navigator + DESTINATION lib/${PROJECT_NAME}) + +# if(BUILD_TESTING) +# find_package(ament_lint_auto REQUIRED) +# # the following line skips the linter which checks for copyrights +# # comment the line when a copyright and license is added to all source files +# set(ament_cmake_copyright_FOUND TRUE) +# # the following line skips cpplint (only works in a git repo) +# # comment the line when this package is in a git repo and when +# # a copyright and license is added to all source files +# set(ament_cmake_cpplint_FOUND TRUE) +# ament_lint_auto_find_test_dependencies() +# endif() + +ament_package() diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml new file mode 100644 index 0000000000..65ab9585eb --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml @@ -0,0 +1,22 @@ + + + + navigator + 0.0.0 + TODO: Package description + rarts + BSD-3-Clause + + ament_cmake + + rclcpp + geometry_msgs + turtlesim + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp new file mode 100644 index 0000000000..7fcd73235d --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp @@ -0,0 +1,94 @@ +#define _USE_MATH_DEFINES + +#include + +#include "rclcpp/rclcpp.hpp" +#include "geometry_msgs/msg/point.hpp" +#include "geometry_msgs/msg/twist.hpp" +#include "turtlesim/msg/pose.hpp" + +class TurtleNavigator : public rclcpp::Node +{ +public: + TurtleNavigator() + : Node("turtle_navigator"), x_goal_(4.0), y_goal_(5.0), kp_(1.0), ki_(0.0), kd_(0.05), prev_error_(0.0), integral_(0.0) + { + subscription_ = this->create_subscription( + "coordinates", 10, std::bind(&TurtleNavigator::goal_callback, this, std::placeholders::_1)); + pose_subscription_ = this->create_subscription( + "turtle1/pose", 10, std::bind(&TurtleNavigator::pose_callback, this, std::placeholders::_1)); + publisher_ = this->create_publisher("turtle1/cmd_vel", 10); + + timer_ = this->create_wall_timer( + std::chrono::milliseconds(100), std::bind(&TurtleNavigator::control_loop, this)); + + RCLCPP_INFO(this->get_logger(), "Turtle Navigator has been started!"); + RCLCPP_INFO(this->get_logger(), "Initial goal: x=%f, y=%f", x_goal_, y_goal_); + } + +private: + void goal_callback(const geometry_msgs::msg::Point::SharedPtr msg) + { + x_goal_ = msg->x; + y_goal_ = msg->y; + RCLCPP_INFO(this->get_logger(), "Received goal: x=%f, y=%f", x_goal_, y_goal_); + } + + void pose_callback(const turtlesim::msg::Pose::SharedPtr msg) + { + x_current_ = msg->x; + y_current_ = msg->y; + theta_current_ = msg->theta; + } + + void control_loop() + { +// RCLCPP_INFO(this->get_logger(), "Hello Ruben!"); + double error_x = x_goal_ - x_current_; + double error_y = y_goal_ - y_current_; + double distance_error = std::sqrt(error_x * error_x + error_y * error_y); + + double angle_to_goal = std::atan2(error_y, error_x); + double angle_error = angle_to_goal - theta_current_; + + // Normalize angle error to the range [-pi, pi] + while (angle_error > M_PI) angle_error -= 2 * M_PI; + while (angle_error < -M_PI) angle_error += 2 * M_PI; + + // PID control + double control_signal = kp_ * distance_error + ki_ * integral_ + kd_ * (distance_error - prev_error_); + integral_ += distance_error; + prev_error_ = distance_error; + + // Limit control signal + double max_linear_speed = 2.0; // Max linear speed + double max_angular_speed = 2.0; // Max angular speed + control_signal = std::clamp(control_signal, -max_linear_speed, max_linear_speed); + + // Publish velocity commands + auto msg = geometry_msgs::msg::Twist(); + msg.linear.x = control_signal; + msg.angular.z = 4.0 * angle_error; // simple P controller for angle + msg.angular.z = std::clamp(msg.angular.z, -max_angular_speed, max_angular_speed); + + publisher_->publish(msg); + } + + rclcpp::Subscription::SharedPtr subscription_; + rclcpp::Subscription::SharedPtr pose_subscription_; + rclcpp::Publisher::SharedPtr publisher_; + rclcpp::TimerBase::SharedPtr timer_; + + double x_goal_, y_goal_; + double x_current_, y_current_, theta_current_; + double kp_, ki_, kd_; + double prev_error_, integral_; +}; + +int main(int argc, char *argv[]) +{ + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/__init__.py b/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py b/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py new file mode 100644 index 0000000000..2aed04fde3 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py @@ -0,0 +1,91 @@ +import math +from typing import Any + +import rclpy # type: ignore[import-not-found] +from geometry_msgs.msg import Point, Twist # type: ignore[import-not-found] +from rclpy.node import Node # type: ignore[import-not-found] +from turtlesim.msg import Pose # type: ignore[import-not-found] + + +class TurtleNavigator(Node): # type: ignore[misc] + def __init__(self) -> None: + super().__init__(node_name="turtle_navigator") + self.x_goal = 5.0 + self.y_goal = 5.0 + self.kp = 1.0 + self.ki = 0.0 + self.kd = 0.05 + self.prev_error = 0.0 + self.integral = 0.0 + + self.subscription = self.create_subscription(Point, "coordinates", self.goal_callback, 10) + self.pose_subscription = self.create_subscription( + Pose, "turtle1/pose", self.pose_callback, 10 + ) + self.publisher = self.create_publisher(Twist, "turtle1/cmd_vel", 10) + + self.timer = self.create_timer(0.1, self.control_loop) + + self.x_current = 0.0 + self.y_current = 0.0 + self.theta_current = 0.0 + + def goal_callback(self, msg: Any) -> None: + self.x_goal = msg.x + self.y_goal = msg.y + self.get_logger().info(f"Received goal: x={self.x_goal}, y={self.y_goal}") + + def pose_callback(self, msg: Any) -> None: + self.x_current = msg.x + self.y_current = msg.y + self.theta_current = msg.theta + + def control_loop(self) -> None: + error_x = self.x_goal - self.x_current + error_y = self.y_goal - self.y_current + distance_error = math.sqrt(error_x**2 + error_y**2) + + angle_to_goal = math.atan2(error_y, error_x) + angle_error = angle_to_goal - self.theta_current + + # Normalize angle error to the range [-pi, pi] + while angle_error > math.pi: + angle_error -= 2 * math.pi + while angle_error < -math.pi: + angle_error += 2 * math.pi + + # PID control + control_signal = ( + self.kp * distance_error + + self.ki * self.integral + + self.kd * (distance_error - self.prev_error) + ) + self.integral += distance_error + self.prev_error = distance_error + + # Limit control signal + max_linear_speed = 2.0 # Max linear speed + max_angular_speed = 2.0 # Max angular speed + control_signal = max(min(control_signal, max_linear_speed), -max_linear_speed) + + # Publish velocity commands + msg = Twist() + msg.linear.x = control_signal + msg.angular.z = 4.0 * angle_error # Simple P controller for angle + msg.angular.z = max(min(msg.angular.z, max_angular_speed), -max_angular_speed) + + self.publisher.publish(msg) + + +def main(args: Any = None) -> None: + rclpy.init(args=args) + print("Turtle Navigator") + turtle_navigator = TurtleNavigator() + print("Waiting for command..") + rclpy.spin(turtle_navigator) + turtle_navigator.destroy_node() + rclpy.shutdown() + + +if __name__ == "__main__": + main() diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml b/tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml new file mode 100644 index 0000000000..97a27d803c --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml @@ -0,0 +1,18 @@ + + + + navigator_py + 0.0.0 + TODO: Package description + rubenarts + BSD-3-Clause + + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest + + + ament_python + + diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml b/tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml new file mode 100644 index 0000000000..f851e96bdb --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml @@ -0,0 +1,7 @@ +[package.build.backend] +name = "pixi-build-ros" +version = "*" + +[package.build.config] +distro = "humble" +extra-input-globs = ["hi"] diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/resource/navigator_py b/tests/data/pixi-build/ros-workspace/src/navigator_py/resource/navigator_py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg b/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg new file mode 100644 index 0000000000..c9717fcbb7 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/navigator_py +[install] +install_scripts=$base/lib/navigator_py diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py b/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py new file mode 100644 index 0000000000..d4e7d71bf0 --- /dev/null +++ b/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py @@ -0,0 +1,22 @@ +from setuptools import find_packages, setup + +package_name = "navigator_py" + +setup( + name=package_name, + version="0.0.0", + packages=find_packages(exclude=["test"]), + data_files=[ + ("share/ament_index/resource_index/packages", ["resource/" + package_name]), + ("share/" + package_name, ["package.xml"]), + ], + install_requires=["setuptools"], + zip_safe=True, + maintainer="rubenarts", + maintainer_email="ruben.arts@hotmail.com", + description="TODO: Package description", + license="TODO: License declaration", + entry_points={ + "console_scripts": ["navigator = navigator_py.navigator:main"], + }, +) diff --git a/tests/data/pixi-build/simple-package/pixi.toml b/tests/data/pixi-build/simple-package/pixi.toml index 5a3c3a33a6..91353fc9f3 100644 --- a/tests/data/pixi-build/simple-package/pixi.toml +++ b/tests/data/pixi-build/simple-package/pixi.toml @@ -2,10 +2,10 @@ channels = ["https://prefix.dev/conda-forge"] preview = ["pixi-build"] +[package] +name = "simple-package" +version = "0.1.0" + [package.build.backend] -channels = [ - "https://prefix.dev/pixi-build-backends", - "https://prefix.dev/conda-forge", -] name = "pixi-build-rattler-build" version = "*" diff --git a/tests/data/pixi-build/target-specific/foo/__init__.py b/tests/data/pixi-build/target-specific/foo/__init__.py new file mode 100644 index 0000000000..8dc224f95f --- /dev/null +++ b/tests/data/pixi-build/target-specific/foo/__init__.py @@ -0,0 +1,2 @@ +def main() -> None: + print("Build backend works") diff --git a/tests/data/pixi-build/target-specific/pixi.toml b/tests/data/pixi-build/target-specific/pixi.toml new file mode 100644 index 0000000000..77d8ac21e5 --- /dev/null +++ b/tests/data/pixi-build/target-specific/pixi.toml @@ -0,0 +1,25 @@ +[workspace] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] +preview = ["pixi-build"] + +[package] +name = "foo" +version = "0.1.0" + +[package.build.backend] +name = "pixi-build-python" +version = "*" + +[package.host-dependencies] +hatchling = "*" + +# Add packages that would be unavailable for the wrong target +[package.target.unix.host-dependencies] +package-unix = "*" + +[package.target.win-64.host-dependencies] +package-windows = "*" diff --git a/tests/data/pixi-build/target-specific/pyproject.toml b/tests/data/pixi-build/target-specific/pyproject.toml new file mode 100644 index 0000000000..c42033333e --- /dev/null +++ b/tests/data/pixi-build/target-specific/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "foo" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] diff --git a/tests/integration_python/pixi_build/__init__.py b/tests/integration_python/pixi_build/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration_python/pixi_build/common.py b/tests/integration_python/pixi_build/common.py new file mode 100644 index 0000000000..bc3ea4e748 --- /dev/null +++ b/tests/integration_python/pixi_build/common.py @@ -0,0 +1,169 @@ +"""Build-specific test utilities for pixi-build tests.""" + +import os +import shutil +import subprocess +from contextlib import contextmanager +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Generator + +import tomli_w +import yaml + +# Re-export from parent common module +from ..common import ( + ALL_PLATFORMS, + CONDA_FORGE_CHANNEL, + CURRENT_PLATFORM, + EMPTY_BOILERPLATE_PROJECT, + ExitCode, + Output, + bat_extension, + current_platform, + default_env_path, + exec_extension, + get_manifest, + is_binary, + pixi_dir, + repo_root, + verify_cli_command, +) + +__all__ = [ + # Re-exports + "ALL_PLATFORMS", + "CONDA_FORGE_CHANNEL", + "CURRENT_PLATFORM", + "EMPTY_BOILERPLATE_PROJECT", + "ExitCode", + "Output", + "bat_extension", + "current_platform", + "default_env_path", + "exec_extension", + "get_manifest", + "is_binary", + "pixi_dir", + "repo_root", + "verify_cli_command", + # Build-specific + "Workspace", + "copy_manifest", + "copytree_with_local_backend", + "cwd", + "git_test_repo", +] + + +@dataclass +class Workspace: + """Represents a pixi workspace for build tests.""" + + recipe: dict[str, Any] + workspace_manifest: dict[str, Any] + workspace_dir: Path + package_manifest: dict[str, Any] + package_dir: Path + recipe_path: Path + debug_dir: Path + + def write_files(self) -> None: + self.recipe_path.write_text(yaml.dump(self.recipe)) + workspace_manifest_path = self.workspace_dir.joinpath("pixi.toml") + workspace_manifest_path.write_text(tomli_w.dumps(self.workspace_manifest)) + package_manifest_path = self.package_dir.joinpath("pixi.toml") + package_manifest_path.write_text(tomli_w.dumps(self.package_manifest)) + + def iter_debug_dirs(self) -> list[Path]: + candidates: list[Path] = [] + work_root = self.workspace_dir.joinpath(".pixi", "build", "work") + if work_root.is_dir(): + for entry in sorted(work_root.iterdir()): + debug_candidate = entry.joinpath("debug") + if debug_candidate.is_dir(): + candidates.append(debug_candidate) + return candidates + + def find_debug_file(self, filename: str) -> Path | None: + for debug_dir in self.iter_debug_dirs(): + target = debug_dir.joinpath(filename) + if target.is_file(): + return target + return None + + +def copy_manifest( + src: os.PathLike[str], + dst: os.PathLike[str], +) -> Path: + """Copy file (simple copy, no channel rewriting needed in merged repo).""" + return Path(shutil.copy(src, dst)) + + +def copytree_with_local_backend( + src: os.PathLike[str], + dst: os.PathLike[str], + **kwargs: Any, +) -> Path: + """Copy tree while ignoring .pixi directories and .conda files.""" + kwargs.setdefault("copy_function", copy_manifest) + + return Path( + shutil.copytree(src, dst, ignore=shutil.ignore_patterns(".pixi", "*.conda"), **kwargs) + ) + + +@contextmanager +def cwd(path: str | Path) -> Generator[None, None, None]: + """Context manager to temporarily change the current working directory.""" + oldpwd = os.getcwd() + os.chdir(path) + try: + yield + finally: + os.chdir(oldpwd) + + +def git_test_repo(source_dir: Path, repo_name: str, target_dir: Path) -> str: + """Create a git repository from the source directory in a target directory.""" + repo_path: Path = target_dir / repo_name + + # Copy source directory to temp + copytree_with_local_backend(source_dir, repo_path, copy_function=copy_manifest) + + # Initialize git repository in the copied source + subprocess.run( + ["git", "init"], + cwd=repo_path, + check=True, + capture_output=True, + ) + + # Add all files and commit + subprocess.run( + ["git", "add", "."], + cwd=repo_path, + check=True, + capture_output=True, + ) + subprocess.run( + ["git", "config", "user.email", "bot@prefix.dev"], + cwd=repo_path, + check=True, + capture_output=True, + ) + subprocess.run( + ["git", "config", "user.name", "Bot"], + cwd=repo_path, + check=True, + capture_output=True, + ) + subprocess.run( + ["git", "commit", "--message", "Initial commit"], + cwd=repo_path, + check=True, + capture_output=True, + ) + + return f"file://{repo_path}" diff --git a/tests/integration_python/pixi_build/conftest.py b/tests/integration_python/pixi_build/conftest.py new file mode 100644 index 0000000000..5c06b3d51f --- /dev/null +++ b/tests/integration_python/pixi_build/conftest.py @@ -0,0 +1,111 @@ +"""Pytest fixtures for pixi-build integration tests.""" + +import shutil +from pathlib import Path + +import pytest + +from .common import CURRENT_PLATFORM, Workspace + + +def get_local_backend_channel() -> str: + """Get the local backend channel from the test data directory.""" + channel_dir = Path(__file__).parents[2].joinpath( + "data", "channels", "channels", "pixi_build_backends" + ) + if channel_dir.is_dir() and any(channel_dir.rglob("repodata.json")): + return channel_dir.as_uri() + raise RuntimeError( + f"Local backend channel not found at {channel_dir}. " + "Run 'pixi run update-backends-channel' to generate it." + ) + + +@pytest.fixture(scope="session") +def local_backend_channel_dir() -> Path: + """Return the path to the local backend channel directory.""" + channel_dir = Path(__file__).parents[2].joinpath( + "data", "channels", "channels", "pixi_build_backends" + ) + if not channel_dir.is_dir() or not any(channel_dir.rglob("repodata.json")): + pytest.skip( + f"Local backend channel not found at {channel_dir}. " + "Run 'pixi run update-backends-channel' to generate it." + ) + return channel_dir + + +@pytest.fixture(scope="session") +def local_backend_channel_uri(local_backend_channel_dir: Path) -> str: + """Return the file URI of the local backend channel.""" + return local_backend_channel_dir.as_uri() + + +@pytest.fixture +def build_data(test_data: Path) -> Path: + """Return the pixi build test data directory.""" + return test_data.joinpath("pixi-build") + + +@pytest.fixture +def simple_workspace( + tmp_pixi_workspace: Path, + request: pytest.FixtureRequest, + local_backend_channel_uri: str, +) -> Workspace: + """Create a simple workspace for build tests.""" + name = request.node.name + + workspace_dir = tmp_pixi_workspace.joinpath("workspace") + workspace_dir.mkdir() + shutil.move(tmp_pixi_workspace.joinpath(".pixi"), workspace_dir.joinpath(".pixi")) + + debug_dir = tmp_pixi_workspace.joinpath("debug_dir") + debug_dir.mkdir() + + recipe = {"package": {"name": name, "version": "1.0.0"}} + + package_rel_dir = "package" + + workspace_manifest = { + "workspace": { + "channels": [ + local_backend_channel_uri, + "https://prefix.dev/conda-forge", + ], + "preview": ["pixi-build"], + "platforms": [CURRENT_PLATFORM], + }, + "dependencies": {name: {"path": package_rel_dir}}, + } + + package_manifest = { + "package": { + "name": name, + "version": "1.0.0", + "build": { + "backend": { + "name": "pixi-build-rattler-build", + "version": "*", + "channels": [ + local_backend_channel_uri, + "https://prefix.dev/conda-forge", + ], + }, + }, + }, + } + + package_dir = workspace_dir.joinpath(package_rel_dir) + package_dir.mkdir(exist_ok=True) + recipe_path = package_dir.joinpath("recipe.yaml") + + return Workspace( + recipe, + workspace_manifest, + workspace_dir, + package_manifest, + package_dir, + recipe_path, + debug_dir, + ) diff --git a/tests/integration_python/pixi_build/test_backends.py b/tests/integration_python/pixi_build/test_backends.py new file mode 100644 index 0000000000..76e1ff2418 --- /dev/null +++ b/tests/integration_python/pixi_build/test_backends.py @@ -0,0 +1,49 @@ +from pathlib import Path + +import pytest + +from .common import copytree_with_local_backend, get_manifest, repo_root, verify_cli_command + + +def _get_minimal_backend_workspaces() -> list[Path]: + """Get all minimal backend workspace directories for parametrization.""" + base_dir = repo_root().joinpath("tests", "data", "pixi-build", "minimal-backend-workspaces") + if not base_dir.exists(): + return [] + return [p for p in base_dir.iterdir() if p.is_dir()] + + +@pytest.mark.slow +@pytest.mark.parametrize( + "pixi_project", + [pytest.param(p, id=p.name) for p in _get_minimal_backend_workspaces()], +) +def test_pixi_minimal_backend(pixi_project: Path, pixi: Path, tmp_pixi_workspace: Path) -> None: + # Copy to workspace + copytree_with_local_backend(pixi_project, tmp_pixi_workspace, dirs_exist_ok=True) + + # Get manifest + manifest = get_manifest(tmp_pixi_workspace) + + # Install the environment + verify_cli_command( + [pixi, "run", "-v", "--manifest-path", manifest, "start"], + stdout_contains="Build backend works", + ) + + +# Enable after the backends have been released +# def test_nameless_versionless(pixi: Path, tmp_pixi_workspace: Path): +# project_dir = repo_root().joinpath("tests", "data", "pixi_build", "name-and-version-less-package") +# +# # Copy to workspace +# shutil.copytree(project_dir, tmp_pixi_workspace, dirs_exist_ok=True) +# +# # Get manifest +# manifest = get_manifest(tmp_pixi_workspace) +# +# # Install the environment +# verify_cli_command( +# [pixi, "list", "-v", "--locked", "--manifest-path", manifest], +# stdout_contains=["rust-app", "1.2.3", "conda"] +# ) diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py new file mode 100644 index 0000000000..3040e3c8ff --- /dev/null +++ b/tests/integration_python/pixi_build/test_build.py @@ -0,0 +1,615 @@ +from pathlib import Path + +import pytest +import tomli_w +import tomllib + +from .common import ( + CURRENT_PLATFORM, + ExitCode, + Workspace, + copy_manifest, + copytree_with_local_backend, + verify_cli_command, +) + + +BUILD_RUNNING_STRING = "Running build for recipe:" + + +def test_build_conda_package( + pixi: Path, + simple_workspace: Workspace, +) -> None: + simple_workspace.write_files() + verify_cli_command( + [ + pixi, + "build", + "--path", + simple_workspace.package_dir, + "--output-dir", + simple_workspace.workspace_dir, + ], + ) + + # Ensure that we don't create directories we don't need + assert not simple_workspace.workspace_dir.joinpath("noarch").exists() + assert not simple_workspace.workspace_dir.joinpath(CURRENT_PLATFORM).exists() + + # Ensure that exactly one conda package has been built + built_packages = list(simple_workspace.workspace_dir.glob("*.conda")) + assert len(built_packages) == 1 + + +def test_no_change_should_be_fully_cached(pixi: Path, simple_workspace: Workspace) -> None: + simple_workspace.write_files() + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_contains=BUILD_RUNNING_STRING, + ) + + conda_build_params = simple_workspace.find_debug_file("conda_build_v1_params.json") + + assert conda_build_params is not None + + # Remove the files to get a clean state + conda_build_params.unlink() + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_excludes=BUILD_RUNNING_STRING, + ) + + # Everything should be cached, so no build call, + assert simple_workspace.find_debug_file("conda_build_v1_params.json") is None + + +def test_recipe_change_trigger_metadata_invalidation( + pixi: Path, simple_workspace: Workspace +) -> None: + simple_workspace.write_files() + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_contains=BUILD_RUNNING_STRING, + ) + + # Touch the recipe + simple_workspace.recipe_path.touch() + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_contains=BUILD_RUNNING_STRING, + ) + + +def test_project_model_change_trigger_rebuild( + pixi: Path, simple_workspace: Workspace, dummy_channel_1: Path +) -> None: + simple_workspace.write_files() + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_contains=BUILD_RUNNING_STRING, + ) + + conda_build_params = simple_workspace.find_debug_file("conda_build_v1_params.json") + assert conda_build_params is not None + + # Remove the conda build params to get a clean state + conda_build_params.unlink() + + # modify extra-input-globs + simple_workspace.package_manifest["package"]["build"].setdefault( + "configuration", dict() + ).setdefault("extra-input-globs", ["*.md"]) + simple_workspace.write_files() + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + simple_workspace.workspace_dir, + ], + stderr_contains=BUILD_RUNNING_STRING, + ) + + # modifying the project model should trigger a rebuild and therefore create a file + assert simple_workspace.find_debug_file("conda_build_v1_params.json") is not None + + +@pytest.mark.slow +def test_editable_pyproject(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + """ + This one tries to run the Python based rich example project, + installed as a normal package by overriding with an environment variable. + """ + project = "editable-pyproject" + test_data = build_data.joinpath(project) + + target_dir = tmp_pixi_workspace.joinpath(project) + copytree_with_local_backend(test_data, target_dir) + manifest_path = target_dir.joinpath("pyproject.toml") + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + ) + + # Verify that package is installed as editable + verify_cli_command( + [ + pixi, + "run", + "-v", + "--manifest-path", + manifest_path, + "check-editable", + ], + stdout_contains="The package is installed as editable.", + ) + + +@pytest.mark.slow +def test_non_editable_pyproject(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + """ + This one tries to run the Python based rich example project, + installed as a normal package by overriding with an environment variable. + """ + project = "editable-pyproject" + test_data = build_data.joinpath(project) + + target_dir = tmp_pixi_workspace.joinpath(project) + copytree_with_local_backend(test_data, target_dir) + manifest_path = target_dir.joinpath("pyproject.toml") + + env = { + "BUILD_EDITABLE_PYTHON": "false", + } + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + env=env, + ) + + # Verify that package is installed as editable + verify_cli_command( + [ + pixi, + "run", + "-v", + "--manifest-path", + manifest_path, + "check-editable", + ], + ExitCode.FAILURE, + env=env, + stdout_contains="The package is not installed as editable.", + ) + + +@pytest.mark.slow +def test_build_using_rattler_build_backend( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + copytree_with_local_backend( + test_data / "array-api-extra", tmp_pixi_workspace, dirs_exist_ok=True + ) + + manifest_path = tmp_pixi_workspace / "pixi.toml" + + # Running pixi build should build the recipe.yaml + verify_cli_command( + [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], + ) + + # really make sure that conda package was built + package_to_be_built = next(manifest_path.parent.glob("*.conda")) + + assert "array-api-extra" in package_to_be_built.name + assert package_to_be_built.exists() + + # check that immediately repeating the build also works (prefix-dev/pixi-build-backends#287) + verify_cli_command( + [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], + ) + + +@pytest.mark.parametrize( + ("backend", "non_incremental_evidence"), + [("pixi-build-rust", "Compiling simple-app"), ("pixi-build-cmake", "Configuring done")], +) +def test_incremental_builds( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, + backend: str, + non_incremental_evidence: str, +) -> None: + test_workspace = build_data / "minimal-backend-workspaces" / backend + copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) + manifest_path = tmp_pixi_workspace / "pixi.toml" + + verify_cli_command( + [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], + stderr_contains=non_incremental_evidence, + strip_ansi=True, + ) + + # immediately repeating the build should give evidence of incremental compilation + verify_cli_command( + [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], + stderr_excludes=non_incremental_evidence, + strip_ansi=True, + ) + + +def test_error_manifest_deps(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey project to the tmp_pixi_workspace + copytree_with_local_backend(test_data / "smokey", tmp_pixi_workspace / "smokey") + manifest_path = tmp_pixi_workspace / "smokey" / "pixi.toml" + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + expected_exit_code=ExitCode.FAILURE, + stderr_contains="Please specify all binary dependencies in the recipe", + ) + + +def test_error_manifest_deps_no_default( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey2 project to the tmp_pixi_workspace + copytree_with_local_backend(test_data / "smokey2", tmp_pixi_workspace / "smokey2") + manifest_path = tmp_pixi_workspace / "smokey2" / "pixi.toml" + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + expected_exit_code=ExitCode.FAILURE, + stderr_contains="Please specify all binary dependencies in the recipe", + ) + + +def test_rattler_build_source_dependency( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey2 project to the tmp_pixi_workspace + copytree_with_local_backend( + test_data / "source-dependency", tmp_pixi_workspace / "source-dependency" + ) + manifest_path = tmp_pixi_workspace / "source-dependency" / "b" / "pixi.toml" + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + expected_exit_code=ExitCode.SUCCESS, + stderr_contains="hello from package a!", + ) + + +def test_rattler_build_point_to_recipe( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey2 project to the tmp_pixi_workspace + copytree_with_local_backend( + test_data / "source-dependency", tmp_pixi_workspace / "source-dependency" + ) + manifest_path = tmp_pixi_workspace / "source-dependency" / "c" / "recipe.yaml" + + output_dir = tmp_pixi_workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--path", + manifest_path, + "--output-dir", + output_dir, + ], + expected_exit_code=ExitCode.SUCCESS, + ) + + built_packages = list(output_dir.glob("*.conda")) + assert built_packages, "no package artifacts produced" + + +def test_rattler_build_autodiscovery( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey2 project to the tmp_pixi_workspace + copytree_with_local_backend( + test_data / "source-dependency", tmp_pixi_workspace / "source-dependency" + ) + # don-t point to recipe.yaml, but to the directory containing it + manifest_path = tmp_pixi_workspace / "source-dependency" / "c" + + output_dir = tmp_pixi_workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--path", + manifest_path, + "--output-dir", + output_dir, + ], + expected_exit_code=ExitCode.SUCCESS, + ) + + built_packages = list(output_dir.glob("*.conda")) + assert built_packages, "no package artifacts produced" + + +def test_suggest_what_manifest_file_should_be( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") + # copy the whole smokey2 project to the tmp_pixi_workspace + copytree_with_local_backend( + test_data / "source-dependency", tmp_pixi_workspace / "source-dependency" + ) + # don-t point to recipe.yaml, but to the directory containing it + manifest_path = tmp_pixi_workspace / "source-dependency" / "empty-dir" + + manifest_path.mkdir(parents=True, exist_ok=True) + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--path", + manifest_path, + ], + expected_exit_code=ExitCode.FAILURE, + stderr_contains="Ensure that the source directory contains a valid pixi.toml, pyproject.toml, recipe.yaml, package.xml or mojoproject.toml file.", + ) + + +@pytest.mark.slow +def test_recursive_source_run_dependencies( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + """ + Test whether recursive source dependencies work properly if + they are specified in the `run-dependencies` section + """ + project = "recursive_source_run_dep" + test_data = build_data.joinpath(project) + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + ) + + # Package B is a dependency of Package A + # Check that it is properly installed + verify_cli_command( + [ + pixi, + "run", + "-v", + "--manifest-path", + manifest_path, + "package-b", + ], + stdout_contains="hello from package-b", + ) + + +@pytest.mark.slow +def test_maturin(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + project = "maturin" + test_data = build_data.joinpath(project) + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + + verify_cli_command( + [ + pixi, + "run", + "--manifest-path", + manifest_path, + "start", + ], + stdout_contains="3 + 5 = 8", + ) + + +@pytest.mark.slow +def test_recursive_source_build_dependencies( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + """ + Test whether recursive source dependencies work properly if + they are specified in the `host-dependencies` section + """ + project = "recursive_source_build_dep" + test_data = build_data.joinpath(project) + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + + verify_cli_command( + [ + pixi, + "lock", + "--manifest-path", + manifest_path, + ], + ) + + # Package B is a dependency of Package A + # Check that Package A works properly and that the output is valid + verify_cli_command( + [ + pixi, + "run", + "--frozen", + "--manifest-path", + manifest_path, + "start", + ], + stdout_contains=["Package A application starting", "5 + 3 = 8"], + ) + + +@pytest.mark.slow +def test_source_path(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + """ + Test path in `[package.build.source]` + """ + test_data = build_data.joinpath("minimal-backend-workspaces", "pixi-build-cmake") + + copytree_with_local_backend( + test_data, tmp_pixi_workspace, dirs_exist_ok=True, copy_function=copy_manifest + ) + + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + manifest = tomllib.loads(manifest_path.read_text()) + manifest.setdefault("package", {}).setdefault("build", {})["source"] = {"path": "."} + manifest_path.write_text(tomli_w.dumps(manifest)) + + verify_cli_command( + [ + pixi, + "build", + "--path", + tmp_pixi_workspace, + "--output-dir", + tmp_pixi_workspace, + ], + ) + + # Ensure that exactly one conda package has been built + built_packages = list(tmp_pixi_workspace.glob("*.conda")) + assert len(built_packages) == 1 + + +@pytest.mark.slow +def test_extra_args(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + """ + Check that `package.build.config.extra-args` are picked up, + and can be used to alter the build directory for meson-python. + """ + project = "python-builddir" + test_data = build_data.joinpath(project) + + target_dir = tmp_pixi_workspace.joinpath(project) + copytree_with_local_backend(test_data, target_dir) + manifest_path = target_dir.joinpath("pixi.toml") + + verify_cli_command( + [ + pixi, + "install", + "-v", + "--manifest-path", + manifest_path, + ], + ) + assert target_dir.joinpath("src", "mybuilddir", "build.ninja").is_file() + + +def test_target_specific_dependency( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path, target_specific_channel_1: str +) -> None: + """ + Check that target-specific dependencies are not solved for on other targets. + """ + project = "target-specific" + test_data = build_data.joinpath(project) + + target_dir = tmp_pixi_workspace.joinpath(project) + copytree_with_local_backend(test_data, target_dir) + manifest_path = target_dir.joinpath("pixi.toml") + + manifest = tomllib.loads(manifest_path.read_text()) + manifest["workspace"]["channels"] += [target_specific_channel_1] + manifest_path.write_text(tomli_w.dumps(manifest)) + + verify_cli_command( + [pixi, "build", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], + ) diff --git a/tests/integration_python/pixi_build/test_config.py b/tests/integration_python/pixi_build/test_config.py new file mode 100644 index 0000000000..6bb633dfc9 --- /dev/null +++ b/tests/integration_python/pixi_build/test_config.py @@ -0,0 +1,128 @@ +import platform +from pathlib import Path + +import pytest + +from .common import ExitCode, copytree_with_local_backend, get_manifest, verify_cli_command + + +@pytest.mark.slow +def test_pixi_build_cmake_env_config_without_target( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """Test that env configuration without target specific configuration works correctly with pixi-build-cmake backend.""" + + # Copy the cmake env config test workspace + cmake_env_test_project = build_data.joinpath("env-config-cmake-test") + + # Copy to workspace + copytree_with_local_backend(cmake_env_test_project, tmp_pixi_workspace, dirs_exist_ok=True) + + # Get manifest + manifest = get_manifest(tmp_pixi_workspace) + + # Install the package - this should show env vars in the build output + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", manifest], + stderr_contains=[ + "CUSTOM_BUILD_VAR=test_value", + "PIXI_TEST_ENV=pixi_cmake_test", + "BUILD_MESSAGE=hello_from_env", + ], + ) + + +@pytest.mark.slow +def test_pixi_build_cmake_env_config_with_target( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """Test that target-specific env configuration works correctly with pixi-build-cmake backend.""" + + # Copy the target cmake env config test workspace + cmake_target_env_test_project = build_data.joinpath("env-config-target-cmake-test") + + # Copy to workspace + copytree_with_local_backend( + cmake_target_env_test_project, tmp_pixi_workspace, dirs_exist_ok=True + ) + + # Get manifest + manifest = get_manifest(tmp_pixi_workspace) + + # Platform-specific expectations + current_sys = platform.system().lower() + + if current_sys == "windows": + # On Windows, expect win-64 specific variables + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", manifest], + stderr_contains=[ + "GLOBAL_ENV_VAR=global_value", + "WIN_SPECIFIC_VAR=windows_value", + "PLATFORM_TYPE=win-64", + ], + ) + else: + # On Unix-like systems (Linux, macOS), expect unix specific variables + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", manifest], + stderr_contains=[ + "GLOBAL_ENV_VAR=global_value", + "UNIX_SPECIFIC_VAR=unix_value", + "PLATFORM_TYPE=unix", + ], + ) + + +@pytest.mark.slow +def test_pixi_build_cmake_invalid_config_rejection( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """Test that invalid configuration keys are rejected.""" + + # Copy the invalid config test workspace + cmake_invalid_test_project = build_data.joinpath("env-config-invalid-test") + + # Copy to workspace + copytree_with_local_backend(cmake_invalid_test_project, tmp_pixi_workspace, dirs_exist_ok=True) + + # Get manifest + manifest = get_manifest(tmp_pixi_workspace) + + # Install should fail due to invalid configuration key + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", manifest], + expected_exit_code=ExitCode.FAILURE, + stderr_contains=[ + "failed to parse configuration", + "unknown field `invalid_config_key`", + ], + ) + + +@pytest.mark.slow +def test_pixi_build_cmake_invalid_target_config_rejection( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """Test that invalid target-specific configuration keys are rejected.""" + + # Copy the invalid target config test workspace + cmake_target_invalid_test_project = build_data.joinpath("env-config-target-invalid-test") + + # Copy to workspace + copytree_with_local_backend( + cmake_target_invalid_test_project, tmp_pixi_workspace, dirs_exist_ok=True + ) + + # Get manifest + manifest = get_manifest(tmp_pixi_workspace) + + # Install should fail due to invalid target configuration key + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", manifest], + expected_exit_code=ExitCode.FAILURE, + stderr_contains=[ + "failed to parse target configuration", + "unknown field `invalid_target_config_key`", + ], + ) diff --git a/tests/integration_python/pixi_build/test_git.py b/tests/integration_python/pixi_build/test_git.py new file mode 100644 index 0000000000..4b5a09f227 --- /dev/null +++ b/tests/integration_python/pixi_build/test_git.py @@ -0,0 +1,277 @@ +from pathlib import Path + +import pytest + +from .common import ( + CURRENT_PLATFORM, + copy_manifest, + copytree_with_local_backend, + verify_cli_command, +) + + +@pytest.mark.slow +def test_build_git_source_deps(pixi: Path, tmp_pixi_workspace: Path, build_data: Path) -> None: + """ + This one tries to build the rich example project + """ + + project = build_data / "rich_example" + target_git_dir = tmp_pixi_workspace / "git_project" + copytree_with_local_backend(project, target_git_dir) + + # init it as a git repo and commit all files + verify_cli_command(["git", "init"], cwd=target_git_dir) + # set some identity + verify_cli_command(["git", "config", "user.email", "some@email.com"], cwd=target_git_dir) + verify_cli_command(["git", "config", "user.name", "some-name"], cwd=target_git_dir) + + verify_cli_command(["git", "add", "."], cwd=target_git_dir) + verify_cli_command(["git", "commit", "-m", "initial commit"], cwd=target_git_dir) + + # extract exact commit hash that we will use + commit_hash = verify_cli_command( + ["git", "rev-parse", "HEAD"], cwd=target_git_dir + ).stdout.strip() + + minimal_workspace = tmp_pixi_workspace / "minimal_workspace" + minimal_workspace.mkdir() + copy_manifest(build_data / "manifests" / "workspace_git.toml", minimal_workspace / "pixi.toml") + + # edit the minimal_workspace to include the git_project + workspace_manifest = minimal_workspace / "pixi.toml" + + target_git_url = target_git_dir.as_uri() + + workspace_manifest.write_text( + workspace_manifest.read_text().replace("file:///", target_git_url) + ) + + workspace_manifest.write_text( + workspace_manifest.read_text().replace("CURRENT_PLATFORM", CURRENT_PLATFORM) + ) + + # build it + verify_cli_command([pixi, "install", "-v", "--manifest-path", minimal_workspace / "pixi.toml"]) + + # verify that we indeed recorded the git url with it's commit + pixi_lock_file = minimal_workspace / "pixi.lock" + + assert f"conda: git+{target_git_url}#{commit_hash}" in pixi_lock_file.read_text() + + # now we update source code so we can verify that + # both pixi-git will discover a new commit + # and pixi build will rebuild it + + rich_example = target_git_dir / "src" / "rich_example" / "__init__.py" + rich_example.write_text(rich_example.read_text().replace("John Doe", "John Doe Jr.")) + # commit the change + verify_cli_command(["git", "add", "."], cwd=target_git_dir) + verify_cli_command(["git", "commit", "-m", "update John Doe"], cwd=target_git_dir) + + # extract updated commit hash that we will use + new_commit_hash = verify_cli_command( + ["git", "rev-parse", "HEAD"], cwd=target_git_dir + ).stdout.strip() + + # build it again + verify_cli_command([pixi, "update", "-v", "--manifest-path", minimal_workspace / "pixi.toml"]) + + # verify that we indeed recorded the git url with it's commit + pixi_lock_file = minimal_workspace / "pixi.lock" + + assert f"conda: git+{target_git_url}#{new_commit_hash}" in pixi_lock_file.read_text() + + # run the *built* script to verify that new name is used + verify_cli_command( + [pixi, "run", "rich-example-main", "--manifest-path", minimal_workspace / "pixi.toml"], + stdout_contains="John Doe Jr.", + cwd=minimal_workspace, + ) + + +@pytest.mark.slow +def test_build_git_source_deps_from_branch( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """ + This one tries to build the rich example project + """ + + project = build_data / "rich_example" + target_git_dir = tmp_pixi_workspace / "git_project" + copytree_with_local_backend(project, target_git_dir) + + # init it as a git repo and commit all files to a test-branch + verify_cli_command(["git", "init"], cwd=target_git_dir) + # set some identity + verify_cli_command(["git", "config", "user.email", "some@email.com"], cwd=target_git_dir) + verify_cli_command(["git", "config", "user.name", "some-name"], cwd=target_git_dir) + + verify_cli_command(["git", "checkout", "-b", "test-branch"], cwd=target_git_dir) + + verify_cli_command(["git", "add", "."], cwd=target_git_dir) + verify_cli_command(["git", "commit", "-m", "initial commit"], cwd=target_git_dir) + + # extract exact commit hash that we will use + commit_hash = verify_cli_command( + ["git", "rev-parse", "HEAD"], cwd=target_git_dir + ).stdout.strip() + + minimal_workspace = tmp_pixi_workspace / "minimal_workspace" + minimal_workspace.mkdir() + copy_manifest(build_data / "manifests" / "workspace_git.toml", minimal_workspace / "pixi.toml") + + # edit the minimal_workspace to include the git_project + workspace_manifest = minimal_workspace / "pixi.toml" + + target_git_url = target_git_dir.as_uri() + + # Replace the rich_example entry using string manipulation + original = '[dependencies]\nrich_example = { "git" = "file:///" }' + replacement = '[dependencies]\nrich_example = { "git" = "file:///", "branch" = "test-branch"}' + + workspace_manifest.write_text(workspace_manifest.read_text().replace(original, replacement)) + workspace_manifest.write_text( + workspace_manifest.read_text().replace("file:///", target_git_url) + ) + + workspace_manifest.write_text( + workspace_manifest.read_text().replace("CURRENT_PLATFORM", CURRENT_PLATFORM) + ) + + # build it + verify_cli_command([pixi, "install", "--manifest-path", minimal_workspace / "pixi.toml"]) + + # verify that we indeed recorded the git url with it's commit + pixi_lock_file = minimal_workspace / "pixi.lock" + + # verify that we recorded used the branch + assert ( + f"conda: git+{target_git_url}?branch=test-branch#{commit_hash}" + in pixi_lock_file.read_text() + ) + + +@pytest.mark.slow +def test_build_git_source_deps_from_rev( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """ + This one tries to build the rich example project + """ + + project = build_data / "rich_example" + target_git_dir = tmp_pixi_workspace / "git_project" + copytree_with_local_backend(project, target_git_dir) + + # init it as a git repo and commit all files to a test-branch + verify_cli_command(["git", "init"], cwd=target_git_dir) + # set some identity + verify_cli_command(["git", "config", "user.email", "some@email.com"], cwd=target_git_dir) + verify_cli_command(["git", "config", "user.name", "some-name"], cwd=target_git_dir) + + verify_cli_command(["git", "add", "."], cwd=target_git_dir) + verify_cli_command(["git", "commit", "-m", "initial commit"], cwd=target_git_dir) + + # extract exact commit hash that we will use + commit_hash = verify_cli_command( + ["git", "rev-parse", "HEAD"], cwd=target_git_dir + ).stdout.strip() + + minimal_workspace = tmp_pixi_workspace / "minimal_workspace" + minimal_workspace.mkdir() + copy_manifest(build_data / "manifests" / "workspace_git.toml", minimal_workspace / "pixi.toml") + + # edit the minimal_workspace to include the git_project + workspace_manifest = minimal_workspace / "pixi.toml" + + # Replace the rich_example entry using string manipulation + original = '[dependencies]\nrich_example = { "git" = "file:///" }' + replacement = ( + '[dependencies]\nrich_example = {{ "git" = "file:///", "rev" = "{commit_hash}" }}'.format( + commit_hash=commit_hash[:7] + ) + ) + + target_git_url = target_git_dir.as_uri() + + workspace_manifest.write_text(workspace_manifest.read_text().replace(original, replacement)) + workspace_manifest.write_text( + workspace_manifest.read_text().replace("file:///", target_git_url) + ) + workspace_manifest.write_text( + workspace_manifest.read_text().replace("CURRENT_PLATFORM", CURRENT_PLATFORM) + ) + + # build it + verify_cli_command([pixi, "install", "--manifest-path", minimal_workspace / "pixi.toml"]) + + # verify that we indeed recorded the git url with it's commit + pixi_lock_file = minimal_workspace / "pixi.lock" + + # verify that we recorded used rev but also the full one + assert ( + f"conda: git+{target_git_url}?rev={commit_hash[:7]}#{commit_hash}" + in pixi_lock_file.read_text() + ) + + +@pytest.mark.slow +def test_build_git_source_deps_from_tag( + pixi: Path, tmp_pixi_workspace: Path, build_data: Path +) -> None: + """ + This one tries to build the rich example project + """ + + project = build_data / "rich_example" + target_git_dir = tmp_pixi_workspace / "git_project" + copytree_with_local_backend(project, target_git_dir) + + # init it as a git repo and commit all files to a tag called v1.0.0 + verify_cli_command(["git", "init"], cwd=target_git_dir) + # set some identity + verify_cli_command(["git", "config", "user.email", "some@email.com"], cwd=target_git_dir) + verify_cli_command(["git", "config", "user.name", "some-name"], cwd=target_git_dir) + + verify_cli_command(["git", "add", "."], cwd=target_git_dir) + verify_cli_command(["git", "commit", "-m", "initial commit"], cwd=target_git_dir) + verify_cli_command(["git", "tag", "v1.0.0", "-m 'my version 1.0.0"], cwd=target_git_dir) + + # extract exact commit hash that we will use + commit_hash = verify_cli_command( + ["git", "rev-parse", "HEAD"], cwd=target_git_dir + ).stdout.strip() + + minimal_workspace = tmp_pixi_workspace / "minimal_workspace" + minimal_workspace.mkdir() + copy_manifest(build_data / "manifests" / "workspace_git.toml", minimal_workspace / "pixi.toml") + + # edit the minimal_workspace to include the git_project + workspace_manifest = minimal_workspace / "pixi.toml" + + # Replace the rich_example entry using string manipulation + original = '[dependencies]\nrich_example = { "git" = "file:///" }' + replacement = '[dependencies]\nrich_example = { "git" = "file:///", "tag" = "v1.0.0" }' + + workspace_manifest.write_text(workspace_manifest.read_text().replace(original, replacement)) + workspace_manifest.write_text( + workspace_manifest.read_text().replace("file:///", target_git_dir.as_uri()) + ) + + workspace_manifest.write_text( + workspace_manifest.read_text().replace("CURRENT_PLATFORM", CURRENT_PLATFORM) + ) + + # build it + verify_cli_command([pixi, "install", "--manifest-path", minimal_workspace / "pixi.toml"]) + + # verify that we indeed recorded the git url with it's commit + pixi_lock_file = minimal_workspace / "pixi.lock" + + # verify that we recorded used rev but also the full one + assert ( + f"conda: git+{target_git_dir.as_uri()}?tag=v1.0.0#{commit_hash}" + in pixi_lock_file.read_text() + ) diff --git a/tests/integration_python/pixi_build/test_global.py b/tests/integration_python/pixi_build/test_global.py new file mode 100644 index 0000000000..88755f57cb --- /dev/null +++ b/tests/integration_python/pixi_build/test_global.py @@ -0,0 +1,341 @@ +from pathlib import Path + +import pytest +import tomli_w +import tomllib + +from .common import ( + ExitCode, + copy_manifest, + copytree_with_local_backend, + exec_extension, + git_test_repo, + verify_cli_command, +) + + +@pytest.mark.parametrize( + "package_name", + ["simple-package", None], +) +@pytest.mark.parametrize( + "relative", + [True, False], +) +def test_install_path_dependency( + pixi: Path, tmp_path: Path, build_data: Path, package_name: str | None, relative: bool +) -> None: + """Test installing a pixi project from a git repository.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("simple-package") + if relative: + source_project = source_project.relative_to(Path.cwd()) + + # Build command based on whether package name is provided + cmd: list[str | Path] = [pixi, "global", "install", "--path", source_project] + if package_name: + cmd.append(package_name) + + # Test install + verify_cli_command(cmd, env=env) + + # Ensure that path is relative to the manifest directory + manifest_path = pixi_home.joinpath("manifests", "pixi-global.toml") + manifest = tomllib.loads(manifest_path.read_text()) + source_from_manifest = Path( + manifest["envs"]["simple-package"]["dependencies"]["simple-package"]["path"] + ) + assert not source_from_manifest.is_absolute() + assert manifest_path.parent.joinpath(source_from_manifest).resolve() == source_project.resolve() + + # Check that the package was installed + simple_package = pixi_home / "bin" / exec_extension("simple-package") + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + +@pytest.mark.parametrize( + "relative", + [True, False], +) +def test_sync(pixi: Path, tmp_path: Path, build_data: Path, relative: bool) -> None: + """Test that global sync works when manifest contains a path dependency.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Prepare manifest path + manifest_path = pixi_home.joinpath("manifests", "pixi-global.toml") + manifest_path.parent.mkdir(parents=True, exist_ok=True) + + # Set up source project path (absolute or relative to manifest dir) + source_project = build_data.joinpath("simple-package") + if relative: + # Make path relative to manifest directory + source_project_str = str(source_project.relative_to(manifest_path.parent, walk_up=True)) + else: + source_project_str = str(source_project.resolve()) + + manifest_content = { + "envs": { + "simple-package": { + "channels": ["conda-forge"], + "dependencies": {"simple-package": {"path": source_project_str}}, + "exposed": {"simple-package": "simple-package"}, + } + } + } + manifest_path.write_text(tomli_w.dumps(manifest_content)) + + # Run global sync + verify_cli_command([pixi, "global", "sync"], env=env) + + # Check that the package was installed + simple_package = pixi_home / "bin" / exec_extension("simple-package") + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + +@pytest.mark.parametrize( + "package_name", + ["simple-package", None], +) +def test_install_git_repository( + pixi: Path, + tmp_path: Path, + build_data: Path, + package_name: str | None, +) -> None: + """Test installing a pixi project from a git repository.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("simple-package") + + # Create git repository + git_url = git_test_repo(source_project, "test-project", tmp_path) + + # Build command based on whether package name is provided + cmd: list[str | Path] = [pixi, "global", "install", "--git", git_url] + if package_name: + cmd.append(package_name) + + # Test git install + verify_cli_command(cmd, env=env) + + # Check that the package was installed + simple_package = pixi_home / "bin" / exec_extension("simple-package") + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + +def test_add_git_repository_to_existing_environment( + pixi: Path, tmp_path: Path, build_data: Path, dummy_channel_1: Path +) -> None: + """Test adding a git-based source package to an existing global environment.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # First create a basic environment with a regular package + verify_cli_command( + [ + pixi, + "global", + "install", + "--channel", + dummy_channel_1, + "--environment", + "test_env", + "dummy-f", + ], + env=env, + ) + + # Specify the source + source_project = build_data.joinpath("simple-package") + + # Create git repository + git_url = git_test_repo(source_project, "test-project", tmp_path) + + # Test adding git package to existing environment + verify_cli_command( + [ + pixi, + "global", + "add", + "--environment", + "test_env", + "--git", + git_url, + "simple-package", + "--expose", + "simple-package=simple-package", + ], + env=env, + ) + + # Check that the package was added to the existing environment + simple_package = pixi_home / "bin" / exec_extension("simple-package") + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + +def test_update(pixi: Path, tmp_path: Path, build_data: Path) -> None: + """Test that pixi global update works with path dependencies.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Create a modifiable copy of simple-package + source_project = tmp_path / "simple-package-copy" + + # by using copy_manifest we change the metadata and therefore get a higher timestamp + # that way we make sure that we don't use old caches + copytree_with_local_backend( + build_data.joinpath("simple-package"), + source_project, + copy_function=copy_manifest, + ) + + # Install the package from the path + verify_cli_command( + [pixi, "global", "install", "--path", source_project, "simple-package"], + env=env, + ) + + # Check that the package was installed with original message + simple_package = pixi_home / "bin" / exec_extension("simple-package") + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + # Modify the package to output a different message + recipe_path = source_project / "recipe.yaml" + recipe_content = recipe_path.read_text() + updated_recipe = recipe_content.replace( + "echo hello from simple-package", "echo goodbye from simple-package" + ) + recipe_path.write_text(updated_recipe) + + # Run global sync - this should NOT pick up the changes + verify_cli_command([pixi, "global", "sync"], env=env) + + # Verify the old message is still there (sync doesn't update) + verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") + + # Run global update - this SHOULD pick up the changes + verify_cli_command([pixi, "global", "update"], env=env) + + # Verify the new message is now there + verify_cli_command([simple_package], env=env, stdout_contains="goodbye from simple-package") + + +def test_install_multi_output_failing( + pixi: Path, + tmp_path: Path, + build_data: Path, +) -> None: + """Test installing a pixi project from a git repository.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("multi-output", "recipe") + + # Test install without any specs mentioned + # It should tell you which outputs are available + verify_cli_command( + [pixi, "global", "install", "--path", source_project], + ExitCode.FAILURE, + env=env, + stderr_contains=["multiple package outputs found", "bizbar", "foobar"], + ) + + +@pytest.mark.xfail( + reason="multi output recipes where one package depends on another doesn't work yet with pixi global" +) +def test_install_multi_output_single( + pixi: Path, + tmp_path: Path, + build_data: Path, +) -> None: + """Test installing a pixi project from a git repository.""" + pixi_home = tmp_path / "pixi_home" + env = { + "PIXI_HOME": str(pixi_home), + } + + # Specify the project + source_project = build_data.joinpath("multi-output", "recipe") + + # Test install and explicitly requesting `foobar` + verify_cli_command( + [pixi, "global", "install", "--path", source_project, "foobar-desktop"], env=env + ) + + # Check that the package was installed + foobar_desktop = pixi_home / "bin" / exec_extension("foobar") + verify_cli_command([foobar_desktop], env=env, stdout_contains="Hello from foobar-desktop") + + +def test_install_multi_output_multiple( + pixi: Path, + tmp_path: Path, + build_data: Path, +) -> None: + """Test installing a pixi project from a git repository.""" + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("multi-output", "recipe") + + # Test install and explicitly requesting `foobar` and `bizbar` + verify_cli_command( + [pixi, "global", "install", "--path", source_project, "foobar", "bizbar"], env=env + ) + + # Check that the packages were installed + foobar = pixi_home / "bin" / exec_extension("foobar") + bizbar = pixi_home / "bin" / exec_extension("bizbar") + verify_cli_command([foobar], env=env, stdout_contains="Hello from foobar") + verify_cli_command([bizbar], env=env, stdout_contains="Hello from bizbar") + + +def test_install_recursive_source_run_dependencies( + pixi: Path, + tmp_path: Path, + build_data: Path, +) -> None: + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("recursive_source_run_dep", "package_a") + + verify_cli_command([pixi, "global", "install", "--path", source_project], env=env) + + # Check that package_a is exposed and works + package_a = pixi_home / "bin" / exec_extension("package-a") + verify_cli_command( + [package_a], env=env, stdout_contains=["Pixi Build is number 1", "hello from package-b"] + ) + + # Check that package_b is not exposed + package_b = pixi_home / "bin" / exec_extension("package-b") + assert not package_b.is_file() + + +def test_install_recursive_source_build_dependencies( + pixi: Path, + tmp_path: Path, + build_data: Path, +) -> None: + pixi_home = tmp_path / "pixi_home" + env = {"PIXI_HOME": str(pixi_home)} + + # Specify the project + source_project = build_data.joinpath("recursive_source_build_dep", "package_a") + + verify_cli_command([pixi, "global", "install", "--path", source_project], env=env) + + # Check that package_a is exposed and works + package_a = pixi_home / "bin" / exec_extension("package-a") + verify_cli_command([package_a], env=env, stdout_contains=["5 + 3 = 8"]) diff --git a/tests/integration_python/pixi_build/test_log.py b/tests/integration_python/pixi_build/test_log.py new file mode 100644 index 0000000000..3a3d25dd79 --- /dev/null +++ b/tests/integration_python/pixi_build/test_log.py @@ -0,0 +1,54 @@ +from pathlib import Path + +from .common import ExitCode, copytree_with_local_backend, verify_cli_command + + +def test_log_working_quiet(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + test_data = build_data.joinpath("log-example", "working") + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + + verify_cli_command( + [ + pixi, + "install", + "--quiet", + "--manifest-path", + tmp_pixi_workspace, + ], + stderr_excludes="Building package simple-app", + ) + + +def test_log_working_default(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + test_data = build_data.joinpath("log-example", "working") + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + + verify_cli_command( + [ + pixi, + "install", + "--manifest-path", + tmp_pixi_workspace, + ], + stderr_contains="Building package simple-app", + ) + + +def test_log_failing(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + test_data = build_data.joinpath("log-example", "failing") + + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + + verify_cli_command( + [ + pixi, + "install", + "--quiet", + "--manifest-path", + tmp_pixi_workspace, + ], + ExitCode.FAILURE, + stderr_contains="Building package simple-app", + ) diff --git a/tests/integration_python/pixi_build/test_multi_output.py b/tests/integration_python/pixi_build/test_multi_output.py new file mode 100644 index 0000000000..62e6ada84b --- /dev/null +++ b/tests/integration_python/pixi_build/test_multi_output.py @@ -0,0 +1,67 @@ +from pathlib import Path + +from .common import CURRENT_PLATFORM, ExitCode, copytree_with_local_backend, verify_cli_command + + +def test_build(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + project = "multi-output" + test_data = build_data.joinpath(project) + test_data.joinpath("pixi.lock").unlink(missing_ok=True) + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + package_manifest = tmp_pixi_workspace.joinpath("recipe", "pixi.toml") + + verify_cli_command( + [ + pixi, + "build", + "--path", + package_manifest, + "--output-dir", + tmp_pixi_workspace, + ], + ) + + # Ensure that we don't create directories we don't need + assert not tmp_pixi_workspace.joinpath("noarch").exists() + assert not tmp_pixi_workspace.joinpath(CURRENT_PLATFORM).exists() + + # Ensure that exactly three conda packages have been built + built_packages = list(tmp_pixi_workspace.glob("*.conda")) + assert len(built_packages) == 3 + + +def test_install(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + project = "multi-output" + test_data = build_data.joinpath(project) + test_data.joinpath("pixi.lock").unlink(missing_ok=True) + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + + # Run `install` should work and create a lock file + verify_cli_command([pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace]) + + # Running `install` again require a lock file update + verify_cli_command([pixi, "install", "-v", "--locked", "--manifest-path", tmp_pixi_workspace]) + + +def test_available_packages(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + project = "multi-output" + test_data = build_data.joinpath(project) + test_data.joinpath("pixi.lock").unlink(missing_ok=True) + copytree_with_local_backend(test_data, tmp_pixi_workspace, dirs_exist_ok=True) + + # foobar-desktop is a direct dependency, so it should be properly installed + verify_cli_command( + [pixi, "run", "-v", "--manifest-path", tmp_pixi_workspace, "foobar-desktop"], + stdout_contains="Hello from foobar-desktop", + ) + # foobar is a dependency of foobar-desktop, so it should be there as well + verify_cli_command( + [pixi, "run", "-v", "--manifest-path", tmp_pixi_workspace, "foobar"], + stdout_contains="Hello from foobar", + ) + # bizbar is a output of the recipe, but we don't request it + # So it shouldn't be part of the environment + verify_cli_command( + [pixi, "run", "-v", "--manifest-path", tmp_pixi_workspace, "bizbar"], + expected_exit_code=ExitCode.COMMAND_NOT_FOUND, + ) diff --git a/tests/integration_python/pixi_build/test_ros.py b/tests/integration_python/pixi_build/test_ros.py new file mode 100644 index 0000000000..43876e0c9e --- /dev/null +++ b/tests/integration_python/pixi_build/test_ros.py @@ -0,0 +1,157 @@ +import json +from pathlib import Path +from typing import Any + +import pytest + +from .common import ExitCode, copytree_with_local_backend, verify_cli_command + +ROS_WORKSPACE_NAME = "ros-workspace" +ROS_PACKAGE_DIRS = ["navigator", "navigator_py", "distro_less_package"] +ROS_IMPLICIT_PACKAGE_DIR = "navigator_implicit" +ROS_PACKAGE_OUTPUT_NAMES = { + "navigator": "ros-humble-navigator", + "navigator_py": "ros-humble-navigator-py", + # The `humble` distro is automatically selected from the channels in the pixi.toml + "distro_less_package": "ros-humble-distro-less-package", +} + + +def _prepare_ros_workspace(build_data: Path, tmp_pixi_workspace: Path) -> Path: + workspace_src = build_data.joinpath(ROS_WORKSPACE_NAME) + copytree_with_local_backend(workspace_src, tmp_pixi_workspace, dirs_exist_ok=True) + return tmp_pixi_workspace + + +def _load_package_metadata(project_root: Path, package_name: str) -> dict[str, Any]: + metadata_root = project_root.joinpath(".pixi", "build", "metadata-v0") + assert metadata_root.exists(), f"metadata directory missing for {package_name}" + selected_metadata: dict[str, Any] | None = None + selected_mtime: float = -1.0 + for metadata_file in metadata_root.rglob("metadata.json"): + metadata = json.loads(metadata_file.read_text()) + outputs = metadata.get("outputs", []) + if any( + isinstance(output, dict) and output.get("metadata", {}).get("name") == package_name + for output in outputs + ): + mtime = metadata_file.stat().st_mtime + if mtime > selected_mtime: + selected_metadata = metadata + selected_mtime = mtime + if selected_metadata is not None: + return selected_metadata + raise AssertionError(f"metadata for {package_name} not found") + + +@pytest.mark.slow +@pytest.mark.parametrize("package_dir", ROS_PACKAGE_DIRS, ids=ROS_PACKAGE_DIRS) +def test_ros_packages_build( + package_dir: str, pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + workspace = _prepare_ros_workspace(build_data, tmp_pixi_workspace) + output_dir = workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + # point to the concrete package manifest + manifest_path = workspace.joinpath("src", package_dir, "pixi.toml") + + verify_cli_command( + [ + pixi, + "build", + "--path", + manifest_path, + "--output-dir", + output_dir, + ] + ) + + expected_name = ROS_PACKAGE_OUTPUT_NAMES[package_dir] + built_packages = list(output_dir.glob("*.conda")) + assert built_packages, f"no package artifacts produced for {expected_name}" + assert any(expected_name in artifact.name for artifact in built_packages) + + +@pytest.mark.slow +@pytest.mark.parametrize("package_dir", ROS_PACKAGE_DIRS, ids=ROS_PACKAGE_DIRS) +def test_ros_packages_build_point_to_package_xml( + package_dir: str, pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + workspace = _prepare_ros_workspace(build_data, tmp_pixi_workspace) + output_dir = workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + # point to the concrete package manifest + manifest_path = workspace.joinpath("src", package_dir, "package.xml") + + verify_cli_command( + [ + pixi, + "build", + "--path", + manifest_path, + "--output-dir", + output_dir, + ] + ) + + expected_name = ROS_PACKAGE_OUTPUT_NAMES[package_dir] + built_packages = list(output_dir.glob("*.conda")) + assert built_packages, f"no package artifacts produced for {expected_name}" + assert any(expected_name in artifact.name for artifact in built_packages) + + +@pytest.mark.slow +def test_ros_packages_build_point_to_package_xml_in_the_same_dir( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + workspace = _prepare_ros_workspace(build_data, tmp_pixi_workspace) + output_dir = workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + # point to the concrete package manifest + manifest_path = workspace.joinpath("src", ROS_IMPLICIT_PACKAGE_DIR) + + verify_cli_command( + [ + pixi, + "build", + "--path", + "package.xml", + "--output-dir", + output_dir, + ], + cwd=manifest_path, + ) + + built_packages = list(output_dir.glob("*.conda")) + assert built_packages, "no package artifacts produced" + + +@pytest.mark.slow +def test_ros_packages_build_point_to_implicit_package_xml_fails( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + workspace = _prepare_ros_workspace(build_data, tmp_pixi_workspace) + output_dir = workspace.joinpath("dist") + output_dir.mkdir(parents=True, exist_ok=True) + + # point to the concrete package manifest + manifest_path = workspace.joinpath("src", ROS_IMPLICIT_PACKAGE_DIR) + + verify_cli_command( + [ + pixi, + "build", + "--path", + manifest_path, + "--output-dir", + output_dir, + ], + expected_exit_code=ExitCode.FAILURE, + stderr_contains=[ + "is a directory, please provide the path to the manifest file", + "did you mean package.xml", + ], + ) diff --git a/tests/integration_python/pixi_build/test_specified_build_source/__init__.py b/tests/integration_python/pixi_build/test_specified_build_source/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration_python/pixi_build/test_specified_build_source/conftest.py b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py new file mode 100644 index 0000000000..d200a887d5 --- /dev/null +++ b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py @@ -0,0 +1,90 @@ +import subprocess +from dataclasses import dataclass +from pathlib import Path + +import pytest + +from ..common import copytree_with_local_backend + + +@dataclass(frozen=True) +class LocalGitRepo: + path: Path + main_rev: str + other_feature_rev: str + tag: str + + +@pytest.fixture +def local_cpp_git_repo( + pixi: Path, + build_data: Path, + tmp_path_factory: pytest.TempPathFactory, +) -> LocalGitRepo: + """ + Create a local git repository mirroring the minimal pixi-build-cmake workspace so tests can + exercise git sources without touching the network. + """ + + source_root = build_data.joinpath("minimal-backend-workspaces", "pixi-build-cmake") + repo_root = tmp_path_factory.mktemp("git-repo") + repo_path = repo_root.joinpath("repo") + copytree_with_local_backend(source_root, repo_path) + + marker = repo_path.joinpath("src", "LOCAL_MARKER.txt") + marker.write_text("local git fixture marker\n", encoding="utf-8") + + main_source_path = repo_path.joinpath("src", "main.cpp") + original_source = main_source_path.read_text(encoding="utf-8") + + def run_git(*args: str) -> str: + result = subprocess.run( + [str(pixi), "run", "git", *args], + cwd=repo_path, + capture_output=True, + text=True, + ) + if result.returncode != 0: + raise RuntimeError( + "git command failed ({}):\nstdout: {}\nstderr: {}".format( + " ".join(args), result.stdout, result.stderr + ) + ) + return result.stdout.strip() + + run_git("init", "-b", "main") + run_git("config", "user.email", "pixi-tests@example.com") + run_git("config", "user.name", "Pixi Build Tests") + run_git("add", ".") + run_git("commit", "-m", "Initial commit") + + run_git("checkout", "-b", "other-feature") + feature_text = original_source.replace( + "Build backend works", "Build backend works from other-feature branch" + ) + if feature_text == original_source: + feature_text = original_source + "\n// other-feature branch tweak\n" + main_source_path.write_text(feature_text) + run_git("add", main_source_path.relative_to(repo_path).as_posix()) + run_git("commit", "-m", "Add branch change") + other_feature_rev = run_git("rev-parse", "HEAD") + + run_git("checkout", "main") + main_update_text = original_source.replace( + "Build backend works", "Build backend works on main branch" + ) + if main_update_text == original_source: + main_update_text = original_source + "\n// main branch tweak\n" + main_source_path.write_text(main_update_text) + run_git("add", main_source_path.relative_to(repo_path).as_posix()) + run_git("commit", "-m", "Update main") + main_rev = run_git("rev-parse", "HEAD") + + run_git("tag", "fixture-v1") + + return LocalGitRepo( + path=repo_path, + main_rev=main_rev, + other_feature_rev=other_feature_rev, + tag="fixture-v1", + ) diff --git a/tests/integration_python/pixi_build/test_specified_build_source/test_git.py b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py new file mode 100644 index 0000000000..5b1dc7478b --- /dev/null +++ b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py @@ -0,0 +1,417 @@ +import json +import shutil +from pathlib import Path +from typing import Any, Iterator + +import pytest +import tomli_w +import tomllib +import yaml + +from ..common import ( + ExitCode, + verify_cli_command, +) +from .conftest import LocalGitRepo + + +def _git_source_entries(lock_file: Path) -> list[dict[str, Any]]: + data = yaml.safe_load(lock_file.read_text()) + + def iter_entries() -> Any: + yield from data.get("packages", []) + + for env_cfg in data.get("environments", {}).values(): + for platform_packages in env_cfg.get("packages", {}).values(): + yield from platform_packages + + serialized_sources: list[dict[str, Any]] = [] + for entry in iter_entries(): + if isinstance(entry, dict) and entry.get("conda") == ".": + package_build_source = entry.get("package_build_source") + if package_build_source is not None: + serialized_sources.append(package_build_source) + + assert serialized_sources, ( + "expected at least one git package with package_build_source in pixi.lock" + ) + return serialized_sources + + +def extract_git_sources(lock_file: Path) -> list[str]: + return sorted(json.dumps(source, sort_keys=True) for source in _git_source_entries(lock_file)) + + +def configure_local_git_source( + workspace_dir: Path, + repo: LocalGitRepo, + *, + rev: str | None = None, + branch: str | None = None, + tag: str | None = None, + subdirectory: str = ".", +) -> None: + manifest_path = workspace_dir / "pixi.toml" + manifest = tomllib.loads(manifest_path.read_text()) + source = manifest.setdefault("package", {}).setdefault("build", {}).setdefault("source", {}) + for key in ("branch", "tag", "rev"): + source.pop(key, None) + source["git"] = "file://" + str(repo.path.as_posix()) + source["subdirectory"] = subdirectory + if rev is not None: + source["rev"] = rev + if branch is not None: + source["branch"] = branch + if tag is not None: + source["tag"] = tag + manifest_path.write_text(tomli_w.dumps(manifest)) + + +def prepare_cpp_git_workspace( + workspace_dir: Path, + build_data: Path, + repo: LocalGitRepo, + **source_kwargs: Any, +) -> None: + project = build_data.joinpath("minimal-backend-workspaces", "pixi-build-cmake") + + # Remove existing .pixi folders + shutil.rmtree(project.joinpath(".pixi"), ignore_errors=True) + + # Copy to workspace + shutil.copytree(project, workspace_dir, dirs_exist_ok=True) + + kwargs = dict(source_kwargs) + kwargs.setdefault("subdirectory", ".") + configure_local_git_source(workspace_dir, repo, **kwargs) + + +@pytest.mark.slow +def test_git_path_build( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """ + Test git path in `[package.build.source]` using a local repository. + """ + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--path", + tmp_pixi_workspace, + "--output-dir", + tmp_pixi_workspace, + ], + ) + + built_packages = list(tmp_pixi_workspace.glob("*.conda")) + assert len(built_packages) == 1 + + +@pytest.mark.slow +def test_git_path_lock_behaviour( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """Exercise git source locking behaviour when switching manifest branches.""" + + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + initial_sources = extract_git_sources(lock_path) + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + assert extract_git_sources(lock_path) == initial_sources + + configure_local_git_source(tmp_pixi_workspace, local_cpp_git_repo, branch="other-feature") + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + expected_exit_code=ExitCode.FAILURE, + ) + assert extract_git_sources(lock_path) == initial_sources + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + new_sources = extract_git_sources(lock_path) + assert new_sources != initial_sources + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + assert extract_git_sources(lock_path) == new_sources + + +@pytest.mark.slow +def test_git_path_lock_update_preserves_git_source( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """Ensure updating another dependency leaves git package_build_source untouched.""" + + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + manifest_path = tmp_pixi_workspace / "pixi.toml" + manifest = tomllib.loads(manifest_path.read_text()) + manifest.setdefault("dependencies", {})["zlib"] = "*" + manifest_path.write_text(tomli_w.dumps(manifest)) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + initial_sources = extract_git_sources(lock_path) + + verify_cli_command( + [ + pixi, + "update", + "-v", + "--manifest-path", + tmp_pixi_workspace, + "zlib", + ], + ) + + assert extract_git_sources(lock_path) == initial_sources + + +@pytest.mark.slow +def test_git_path_lock_branch_records_branch_metadata( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, branch="other-feature" + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("branch") for entry in entries} == {"other-feature"} + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.other_feature_rev} + assert all("tag" not in entry for entry in entries) + assert {entry.get("subdir") for entry in entries} == {"."} + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + + +@pytest.mark.slow +def test_git_path_build_has_absolutely_no_respect_to_lock_file( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, branch="other-feature" + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + initial_sources = extract_git_sources(lock_path) + assert any(local_cpp_git_repo.other_feature_rev in entry for entry in initial_sources) + + repo_path = local_cpp_git_repo.path + main_path = repo_path.joinpath("src", "main.cpp") + verify_cli_command([pixi, "run", "git", "checkout", "other-feature"], cwd=repo_path) + main_path.write_text( + main_path.read_text().replace("Build backend works", "Build backend works v2") + ) + verify_cli_command( + [pixi, "run", "git", "add", main_path.relative_to(repo_path).as_posix()], + cwd=repo_path, + ) + verify_cli_command( + [pixi, "run", "git", "commit", "-m", "Update branch for pixi build test"], + cwd=repo_path, + ) + new_branch_rev = verify_cli_command( + [pixi, "run", "git", "rev-parse", "HEAD"], cwd=repo_path + ).stdout.strip() + assert new_branch_rev != local_cpp_git_repo.other_feature_rev + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--path", + tmp_pixi_workspace, + "--output-dir", + tmp_pixi_workspace, + ], + ) + + built_packages = list(tmp_pixi_workspace.glob("*.conda")) + assert built_packages + + # lock file should remain untouched when running `pixi build` + assert extract_git_sources(lock_path) == initial_sources + + work_dir = tmp_pixi_workspace / ".pixi" / "build" / "work" + assert work_dir.exists() + + target_phrase = b"Build backend works v2" + legacy_phrase = b"Build backend works on main branch" + + def iter_candidate_files() -> Iterator[Path]: + for path in work_dir.rglob("*"): + if not path.is_file(): + continue + if path.suffix in {".o", ".bin", ".txt", ".json"} or "simple-app" in path.name: + yield path + + found = [] + for candidate in iter_candidate_files(): + try: + data = candidate.read_bytes() + except OSError: + continue + if target_phrase in data: + found.append(candidate) + assert legacy_phrase not in data, f"found legacy string in {candidate}" + + assert found, "expected build artifacts to include updated branch contents" + + +@pytest.mark.slow +def test_git_path_lock_tag_records_tag_metadata( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, tag=local_cpp_git_repo.tag + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("tag") for entry in entries} == {local_cpp_git_repo.tag} + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.main_rev} + assert all("branch" not in entry for entry in entries) + assert {entry.get("subdir") for entry in entries} == {"."} + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + + +@pytest.mark.slow +def test_git_path_lock_rev_marks_explicit_rev( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.main_rev} + assert {entry.get("explicit_rev") for entry in entries} == {True} + + +@pytest.mark.slow +def test_git_path_lock_consistent_across_platforms( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + serialized = extract_git_sources(lock_path) + assert len(set(serialized)) == 1 + + +@pytest.mark.slow +def test_git_path_lock_detects_manual_rev_change( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + lock_data = yaml.safe_load(lock_path.read_text()) + + def mutate(node: Any) -> None: + if isinstance(node, dict): + if node.get("conda") == "." and "package_build_source" in node: + node["package_build_source"]["rev"] = local_cpp_git_repo.other_feature_rev + for value in node.values(): + mutate(value) + elif isinstance(node, list): + for item in node: + mutate(item) + + mutate(lock_data) + lock_path.write_text(yaml.safe_dump(lock_data)) + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + expected_exit_code=ExitCode.FAILURE, + ) diff --git a/tests/integration_python/pixi_build/test_variants.py b/tests/integration_python/pixi_build/test_variants.py new file mode 100644 index 0000000000..24fb404579 --- /dev/null +++ b/tests/integration_python/pixi_build/test_variants.py @@ -0,0 +1,197 @@ +from pathlib import Path + +import pytest +import rattler +import tomli_w +import tomllib + +from .common import CURRENT_PLATFORM, copytree_with_local_backend, verify_cli_command + + +@pytest.mark.parametrize( + "workspace_dirname", + ["build-variant-manifest-rattler-build", "build-variant-manifest-python"], +) +def test_inline_variants_produce_multiple_outputs( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, + multiple_versions_channel_1: str, + workspace_dirname: str, +) -> None: + test_workspace = build_data.joinpath(workspace_dirname) + copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) + + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + manifest = tomllib.loads(manifest_path.read_text()) + manifest["workspace"]["channels"].append(multiple_versions_channel_1) + manifest_path.write_text(tomli_w.dumps(manifest)) + + output_dir = tmp_pixi_workspace.joinpath("dist") + + verify_cli_command( + [ + pixi, + "build", + "--path", + manifest_path, + "--output-dir", + output_dir, + ], + ) + + # Ensure that we don't create directories we don't need + assert not output_dir.joinpath("noarch").exists() + assert not output_dir.joinpath(CURRENT_PLATFORM).exists() + + # Ensure that exactly two conda packages have been built + built_packages = list(output_dir.glob("*.conda")) + assert len(built_packages) == 2 + for package in built_packages: + assert package.exists() + + +@pytest.mark.parametrize( + "workspace_dirname", + ["build-variant-manifest-rattler-build", "build-variant-manifest-python"], +) +def test_inline_variants_change_triggers_rebuild( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, + multiple_versions_channel_1: str, + workspace_dirname: str, +) -> None: + test_workspace = build_data.joinpath(workspace_dirname) + copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) + + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + manifest = tomllib.loads(manifest_path.read_text()) + manifest["workspace"]["channels"].append(multiple_versions_channel_1) + manifest_path.write_text(tomli_w.dumps(manifest)) + + verify_cli_command( + [ + pixi, + "install", + "--manifest-path", + manifest_path, + ], + ) + + verify_cli_command( + [pixi, "run", "package3"], + cwd=tmp_pixi_workspace, + stdout_contains="0.3.0", + ) + + manifest["workspace"]["build-variants"]["package3"] = ["0.2.0"] + manifest_path.write_text(tomli_w.dumps(manifest)) + + verify_cli_command( + [pixi, "run", "package3"], + cwd=tmp_pixi_workspace, + stdout_contains="0.2.0", + ) + + +@pytest.mark.parametrize( + "workspace_dirname", + [ + "build-variant-files-rattler-build", + "build-variant-files-python", + "build-variant-conda-config-rattler-build", + "build-variant-conda-config-python", + ], +) +def test_variant_files_produce_multiple_outputs( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, + multiple_versions_channel_1: str, + workspace_dirname: str, +) -> None: + test_workspace = build_data.joinpath(workspace_dirname) + copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) + + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + manifest = tomllib.loads(manifest_path.read_text()) + manifest["workspace"]["channels"].append(multiple_versions_channel_1) + manifest_path.write_text(tomli_w.dumps(manifest)) + + output_dir = tmp_pixi_workspace.joinpath("dist") + + verify_cli_command( + [ + pixi, + "build", + "--path", + manifest_path, + "--output-dir", + output_dir, + ], + ) + + built_packages = list(output_dir.glob("*.conda")) + + # On unix, the variant has three entries, on windows only two + if rattler.Platform.current().is_unix: + assert len(built_packages) == 3 + else: + assert len(built_packages) == 2 + + +@pytest.mark.parametrize( + "workspace_dirname", + [ + "build-variant-files-rattler-build", + "build-variant-files-python", + "build-variant-conda-config-rattler-build", + "build-variant-conda-config-python", + ], +) +def test_variant_files_change_triggers_rebuild( + pixi: Path, + tmp_pixi_workspace: Path, + build_data: Path, + multiple_versions_channel_1: str, + workspace_dirname: str, +) -> None: + test_workspace = build_data.joinpath(workspace_dirname) + copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) + + manifest_path = tmp_pixi_workspace.joinpath("pixi.toml") + manifest = tomllib.loads(manifest_path.read_text()) + manifest["workspace"]["channels"].append(multiple_versions_channel_1) + manifest_path.write_text(tomli_w.dumps(manifest)) + + verify_cli_command( + [ + pixi, + "install", + "--manifest-path", + manifest_path, + ], + ) + + verify_cli_command( + [pixi, "run", "package3"], + cwd=tmp_pixi_workspace, + stdout_contains="0.3.0", + ) + + uses_conda_config = "conda-config" in workspace_dirname + variant_file = tmp_pixi_workspace.joinpath( + "corp-pinning", + "conda_build_config.yaml" if uses_conda_config else "config.yaml", + ) + + variant_contents = variant_file.read_text() + assert "0.3.0" in variant_contents + variant_file.write_text(variant_contents.replace("\n - 0.3.0", "", 1)) + + verify_cli_command( + [pixi, "run", "package3"], + cwd=tmp_pixi_workspace, + stdout_contains="0.2.0", + ) diff --git a/tests/recipe/boltons/recipe.yaml b/tests/recipe/boltons/recipe.yaml new file mode 100644 index 0000000000..072c3e92c8 --- /dev/null +++ b/tests/recipe/boltons/recipe.yaml @@ -0,0 +1,34 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json + +context: + version: "23.0.0" + +package: + name: boltons-with-extra + version: ${{ version }} + +source: + url: https://github.com/mahmoud/boltons/archive/refs/tags/${{ version }}.tar.gz + sha256: 9b2998cd9525ed472079c7dd90fbd216a887202e8729d5969d4f33878f0ff668 + +build: + noarch: python + script: + - python -m pip install . --no-deps -vv + +requirements: + host: + # - if: linux + # then: + - python + - pip + - setuptools + # - numpy + # - ${{ stdlib('c') }} + run: + - pip + # - ${{ pin_compatible('numpy', min_pin='x.x', max_pin='x') }} + +about: + license: BSD-3-Clause + license_file: LICENSE diff --git a/tests/recipe/custom-build-string/recipe.yaml b/tests/recipe/custom-build-string/recipe.yaml new file mode 100644 index 0000000000..a83f40a8b0 --- /dev/null +++ b/tests/recipe/custom-build-string/recipe.yaml @@ -0,0 +1,20 @@ +context: + # Keep up to date + version: "3.15" + variant: "default" + freethreading_tag: ${{ "t" if "free-threading" in variant else "" }} + abi_tag: cp${{ version | split(".") | join("") }}${{ freethreading_tag }} + +recipe: + name: python + +outputs: + - package: + name: python + version: ${{ version }} + build: + string: "0_${{ abi_tag }}" + +about: + homepage: https://www.python.org/ + license: Python-2.0 diff --git a/tests/recipe/pin-subpackage-variants/recipe.yaml b/tests/recipe/pin-subpackage-variants/recipe.yaml new file mode 100644 index 0000000000..3f895f56da --- /dev/null +++ b/tests/recipe/pin-subpackage-variants/recipe.yaml @@ -0,0 +1,27 @@ +# regression test that pin subpackage works with `my.package` +context: + name: my-package + version: 0.1.0 + +recipe: + version: ${{ version }} + +build: + number: 0 + +outputs: + - package: + name: ${{ name }} + requirements: + host: + - python + build: + noarch: generic + + - package: + name: ${{ name }}-pinned + build: + noarch: generic + requirements: + run: + - ${{ pin_subpackage(name, exact=true) }} diff --git a/tests/recipe/pin-subpackage-variants/variants.yaml b/tests/recipe/pin-subpackage-variants/variants.yaml new file mode 100644 index 0000000000..d1f51d50de --- /dev/null +++ b/tests/recipe/pin-subpackage-variants/variants.yaml @@ -0,0 +1,4 @@ +python: + - "3.8" + - "3.9" + - "3.10" diff --git a/tests/recipe/pin-subpackage/recipe.yaml b/tests/recipe/pin-subpackage/recipe.yaml new file mode 100644 index 0000000000..ddaea97a33 --- /dev/null +++ b/tests/recipe/pin-subpackage/recipe.yaml @@ -0,0 +1,24 @@ +# regression test that pin subpackage works with `my.package` +context: + name: my-package + version: 0.1.0 + +recipe: + version: ${{ version }} + +build: + number: 0 + +outputs: + - package: + name: ${{ name }} + build: + noarch: generic + + - package: + name: ${{ name }}-a + build: + noarch: generic + requirements: + run: + - ${{ pin_subpackage(name, exact=true) }} diff --git a/tests/recipe/variants/recipe.yaml b/tests/recipe/variants/recipe.yaml new file mode 100644 index 0000000000..dd2c06b4de --- /dev/null +++ b/tests/recipe/variants/recipe.yaml @@ -0,0 +1,9 @@ +package: + name: foobar + version: 1.0.0 + +requirements: + host: + - python + run: + - python diff --git a/tests/recipe/variants/variants.yaml b/tests/recipe/variants/variants.yaml new file mode 100644 index 0000000000..d1f51d50de --- /dev/null +++ b/tests/recipe/variants/variants.yaml @@ -0,0 +1,4 @@ +python: + - "3.8" + - "3.9" + - "3.10" From bff758c79f782d77de65a813de1a86d0b040fd8a Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 14:58:44 +0100 Subject: [PATCH 02/70] Fix race condition in test --- .gitignore | 3 ++ crates/pixi-build-cmake/debug/recipe.yaml | 47 ----------------- .../debug/recipe/659f713/recipe.yaml | 46 ---------------- .../debug/recipe/659f713/variants.yaml | 2 - .../debug/recipe/7a5450d/recipe.yaml | 47 ----------------- .../debug/recipe/7a5450d/variants.yaml | 2 - .../debug/recipe/a543858/recipe.yaml | 47 ----------------- .../debug/recipe/a543858/variants.yaml | 2 - crates/pixi-build-cmake/debug/variants.yaml | 8 --- crates/pixi-build-python/debug/recipe.yaml | 36 ------------- .../debug/recipe/a048693/recipe.yaml | 36 ------------- .../debug/recipe/a048693/variants.yaml | 2 - .../debug/recipe/c3a871a/recipe.yaml | 36 ------------- .../debug/recipe/c3a871a/variants.yaml | 2 - crates/pixi-build-python/debug/variants.yaml | 8 --- .../tests/integration/main.rs | 52 ++++++++++++------- 16 files changed, 36 insertions(+), 340 deletions(-) delete mode 100644 crates/pixi-build-cmake/debug/recipe.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml delete mode 100644 crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml delete mode 100644 crates/pixi-build-cmake/debug/variants.yaml delete mode 100644 crates/pixi-build-python/debug/recipe.yaml delete mode 100644 crates/pixi-build-python/debug/recipe/a048693/recipe.yaml delete mode 100644 crates/pixi-build-python/debug/recipe/a048693/variants.yaml delete mode 100644 crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml delete mode 100644 crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml delete mode 100644 crates/pixi-build-python/debug/variants.yaml diff --git a/.gitignore b/.gitignore index b339609b6f..dfc0959f2e 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,9 @@ target/ *.orig **/*.rs.bk +# Backend build debug output +crates/pixi-build-*/debug/ + # IDE and editor files .idea/ .vscode/ diff --git a/crates/pixi-build-cmake/debug/recipe.yaml b/crates/pixi-build-cmake/debug/recipe.yaml deleted file mode 100644 index 058c4b1dc5..0000000000 --- a/crates/pixi-build-cmake/debug/recipe.yaml +++ /dev/null @@ -1,47 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - ninja --version - cmake --version - - mkdir -p build - pushd build - - if [ ! -f "build.ninja" ]; then - cmake $CMAKE_ARGS \ - -GNinja \ - -S "/tmp/.tmp6eLIS9" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - -DBUILD_SHARED_LIBS=ON - fi - - cmake --build . --target install - env: {} - secrets: [] -requirements: - build: - - boltons - - ${{ compiler('cxx') }} - - cmake - - ninja - host: [] - run: [] - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml deleted file mode 100644 index 9e0f999c57..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/659f713/recipe.yaml +++ /dev/null @@ -1,46 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - ninja --version - cmake --version - - mkdir -p build - pushd build - - if [ ! -f "build.ninja" ]; then - cmake $CMAKE_ARGS \ - -GNinja \ - -S "" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - -DBUILD_SHARED_LIBS=ON - fi - - cmake --build . --target install - env: {} - secrets: [] -requirements: - build: - - ${{ compiler('cxx') }} - - cmake - - ninja - host: [] - run: [] - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml b/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml deleted file mode 100644 index 62c2d5a088..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/659f713/variants.yaml +++ /dev/null @@ -1,2 +0,0 @@ -cxx_compiler: vs2022 -target_platform: win-64 diff --git a/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml deleted file mode 100644 index 1cda436251..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/7a5450d/recipe.yaml +++ /dev/null @@ -1,47 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - ninja --version - cmake --version - - mkdir -p build - pushd build - - if [ ! -f "build.ninja" ]; then - cmake $CMAKE_ARGS \ - -GNinja \ - -S "/tmp/.tmpQpbknh" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - -DBUILD_SHARED_LIBS=ON - fi - - cmake --build . --target install - env: {} - secrets: [] -requirements: - build: - - boltons - - ${{ compiler('cxx') }} - - cmake - - ninja - host: [] - run: [] - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml b/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml deleted file mode 100644 index 811531170c..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/7a5450d/variants.yaml +++ /dev/null @@ -1,2 +0,0 @@ -boltons: ==1.0.0 -target_platform: linux-64 diff --git a/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml b/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml deleted file mode 100644 index 058c4b1dc5..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/a543858/recipe.yaml +++ /dev/null @@ -1,47 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - ninja --version - cmake --version - - mkdir -p build - pushd build - - if [ ! -f "build.ninja" ]; then - cmake $CMAKE_ARGS \ - -GNinja \ - -S "/tmp/.tmp6eLIS9" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - -DBUILD_SHARED_LIBS=ON - fi - - cmake --build . --target install - env: {} - secrets: [] -requirements: - build: - - boltons - - ${{ compiler('cxx') }} - - cmake - - ninja - host: [] - run: [] - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml b/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml deleted file mode 100644 index 10dfcaa6b8..0000000000 --- a/crates/pixi-build-cmake/debug/recipe/a543858/variants.yaml +++ /dev/null @@ -1,2 +0,0 @@ -boltons: ==2.0.0 -target_platform: linux-64 diff --git a/crates/pixi-build-cmake/debug/variants.yaml b/crates/pixi-build-cmake/debug/variants.yaml deleted file mode 100644 index 3c9181080d..0000000000 --- a/crates/pixi-build-cmake/debug/variants.yaml +++ /dev/null @@ -1,8 +0,0 @@ -pin_run_as_build: null -zip_keys: null -boltons: -- ==2.0.0 -build_platform: -- linux-64 -target_platform: -- linux-64 diff --git a/crates/pixi-build-python/debug/recipe.yaml b/crates/pixi-build-python/debug/recipe.yaml deleted file mode 100644 index 2b78d5a5d8..0000000000 --- a/crates/pixi-build-python/debug/recipe.yaml +++ /dev/null @@ -1,36 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - "$PYTHON" -m pip install --ignore-installed -vv \ - --no-deps \ - --no-build-isolation \ - \ - /tmp/.tmpwgH1t3 - env: {} - secrets: [] - noarch: python -requirements: - build: - - boltons - host: - - pip - - python - run: - - python - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml b/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml deleted file mode 100644 index 2b78d5a5d8..0000000000 --- a/crates/pixi-build-python/debug/recipe/a048693/recipe.yaml +++ /dev/null @@ -1,36 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - "$PYTHON" -m pip install --ignore-installed -vv \ - --no-deps \ - --no-build-isolation \ - \ - /tmp/.tmpwgH1t3 - env: {} - secrets: [] - noarch: python -requirements: - build: - - boltons - host: - - pip - - python - run: - - python - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-python/debug/recipe/a048693/variants.yaml b/crates/pixi-build-python/debug/recipe/a048693/variants.yaml deleted file mode 100644 index 15bac2d170..0000000000 --- a/crates/pixi-build-python/debug/recipe/a048693/variants.yaml +++ /dev/null @@ -1,2 +0,0 @@ -boltons: ==2.0.0 -target_platform: noarch diff --git a/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml b/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml deleted file mode 100644 index beeef268d3..0000000000 --- a/crates/pixi-build-python/debug/recipe/c3a871a/recipe.yaml +++ /dev/null @@ -1,36 +0,0 @@ -context: {} -package: - name: foobar - version: 0.1.0 -source: [] -build: - number: null - script: - content: |- - "$PYTHON" -m pip install --ignore-installed -vv \ - --no-deps \ - --no-build-isolation \ - \ - /tmp/.tmpvnqpYq - env: {} - secrets: [] - noarch: python -requirements: - build: - - boltons - host: - - pip - - python - run: - - python - run_constraints: [] -tests: [] -about: - homepage: null - license: null - license_file: null - summary: null - description: null - documentation: null - repository: null -extra: null diff --git a/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml b/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml deleted file mode 100644 index 9fe671617d..0000000000 --- a/crates/pixi-build-python/debug/recipe/c3a871a/variants.yaml +++ /dev/null @@ -1,2 +0,0 @@ -boltons: ==1.0.0 -target_platform: noarch diff --git a/crates/pixi-build-python/debug/variants.yaml b/crates/pixi-build-python/debug/variants.yaml deleted file mode 100644 index 3c9181080d..0000000000 --- a/crates/pixi-build-python/debug/variants.yaml +++ /dev/null @@ -1,8 +0,0 @@ -pin_run_as_build: null -zip_keys: null -boltons: -- ==2.0.0 -build_platform: -- linux-64 -target_platform: -- linux-64 diff --git a/crates/pixi_command_dispatcher/tests/integration/main.rs b/crates/pixi_command_dispatcher/tests/integration/main.rs index b8c39ccfcb..ede51e971e 100644 --- a/crates/pixi_command_dispatcher/tests/integration/main.rs +++ b/crates/pixi_command_dispatcher/tests/integration/main.rs @@ -77,6 +77,33 @@ fn workspaces_dir() -> PathBuf { cargo_workspace_dir().join("tests/data/workspaces") } +/// Recursively copies a directory and its contents to a destination. +fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { + fs::create_dir_all(dst)?; + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path)?; + } else { + fs::copy(&src_path, &dst_path)?; + } + } + Ok(()) +} + +/// Copies a workspace to a temporary directory for isolated testing. +/// +/// Returns the temp directory handle (must be kept alive) and the path to the workspace copy. +fn copy_workspace_to_temp(workspace_name: &str) -> (TempDir, PathBuf) { + let temp = tempfile::tempdir().unwrap(); + let src = workspaces_dir().join(workspace_name); + let dst = temp.path().join(workspace_name); + copy_dir_recursive(&src, &dst).unwrap(); + (temp, dst) +} + /// Returns the default build environment to use for tests. fn default_build_environment() -> BuildEnvironment { let (tool_platform, tool_virtual_packages) = tool_platform(); @@ -559,22 +586,6 @@ pub async fn instantiate_backend_with_from_source() { let source_dir = workspaces_dir().join("source-backends"); let tmp_dir = tempfile::tempdir().unwrap(); let root_dir = tmp_dir.path().to_path_buf(); - - // Copy all files from source to temp - fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { - fs_err::create_dir_all(dst)?; - for entry in fs_err::read_dir(src)? { - let entry = entry?; - let src_path = entry.path(); - let dst_path = dst.join(entry.file_name()); - if src_path.is_dir() { - copy_dir_recursive(&src_path, &dst_path)?; - } else { - fs_err::copy(&src_path, &dst_path)?; - } - } - Ok(()) - } copy_dir_recursive(&source_dir, &root_dir).unwrap(); // Update workspace pixi.toml to use local channel instead of conda-forge @@ -1251,7 +1262,8 @@ pub async fn pin_and_checkout_url_validates_cached_results() { /// and verifies that the cache is properly reused (CacheStatus::UpToDate). #[tokio::test] pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory for isolation from other tests + let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1338,7 +1350,8 @@ pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { /// and verifies that file changes are detected and trigger a rebuild. #[tokio::test] pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory for isolation from other tests + let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1432,7 +1445,8 @@ pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { /// without testing dependency chains or force rebuild flags. #[tokio::test] pub async fn test_package_rebuilt_when_source_file_modified() { - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory for isolation from other tests + let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); From f183db475fee8e47d612760f62badabc06dbcee3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 16:17:27 +0100 Subject: [PATCH 03/70] All fast tests are succeeding --- .../src/lock_file/satisfiability/mod.rs | 1 + .../.condapackageignore | 1 + .../linux-64/package-0.1.0-hb0f4dca_0.conda | Bin 1247 -> 1253 bytes .../linux-64/package-0.2.0-hb0f4dca_0.conda | Bin 1249 -> 1255 bytes .../linux-64/package2-0.1.0-hb0f4dca_0.conda | Bin 1172 -> 1181 bytes .../linux-64/package2-0.2.0-hb0f4dca_0.conda | Bin 1170 -> 1180 bytes .../linux-64/package3-0.1.0-abc.conda | Bin 1139 -> 1198 bytes .../linux-64/package3-0.2.0-abc.conda | Bin 1138 -> 1197 bytes .../linux-64/package3-0.3.0-abc.conda | Bin 0 -> 1197 bytes .../linux-64/package4-0.1.0-hb0f4dca_0.conda | Bin 1186 -> 1188 bytes .../linux-64/package4-0.2.0-hb0f4dca_0.conda | Bin 1187 -> 1187 bytes .../linux-64/repodata.json | 2 +- .../noarch/repodata.json | 2 +- .../osx-64/package-0.1.0-h0dc7051_0.conda | Bin 1238 -> 1254 bytes .../osx-64/package-0.2.0-h0dc7051_0.conda | Bin 1242 -> 1256 bytes .../osx-64/package2-0.1.0-h0dc7051_0.conda | Bin 1171 -> 1177 bytes .../osx-64/package2-0.2.0-h0dc7051_0.conda | Bin 1169 -> 1175 bytes .../osx-64/package3-0.1.0-abc.conda | Bin 1134 -> 1192 bytes .../osx-64/package3-0.2.0-abc.conda | Bin 1137 -> 1193 bytes .../osx-64/package3-0.3.0-abc.conda | Bin 0 -> 1193 bytes .../osx-64/package4-0.1.0-h0dc7051_0.conda | Bin 1185 -> 1187 bytes .../osx-64/package4-0.2.0-h0dc7051_0.conda | Bin 1185 -> 1186 bytes .../osx-64/repodata.json | 2 +- .../osx-arm64/package-0.1.0-h60d57d3_0.conda | Bin 1247 -> 1255 bytes .../osx-arm64/package-0.2.0-h60d57d3_0.conda | Bin 1250 -> 1257 bytes .../osx-arm64/package2-0.1.0-h60d57d3_0.conda | Bin 1170 -> 1179 bytes .../osx-arm64/package2-0.2.0-h60d57d3_0.conda | Bin 1170 -> 1179 bytes .../osx-arm64/package3-0.1.0-abc.conda | Bin 1136 -> 1193 bytes .../osx-arm64/package3-0.2.0-abc.conda | Bin 1138 -> 1193 bytes .../osx-arm64/package3-0.3.0-abc.conda | Bin 0 -> 1193 bytes .../osx-arm64/package4-0.1.0-h60d57d3_0.conda | Bin 1186 -> 1185 bytes .../osx-arm64/package4-0.2.0-h60d57d3_0.conda | Bin 1186 -> 1187 bytes .../osx-arm64/repodata.json | 2 +- .../rattler-build-log.txt | 36 ++++++++++++++++++ .../win-64/package-0.1.0-h9490d1a_0.conda | Bin 1243 -> 1258 bytes .../win-64/package-0.2.0-h9490d1a_0.conda | Bin 1242 -> 1258 bytes .../win-64/package2-0.1.0-h9490d1a_0.conda | Bin 1174 -> 1182 bytes .../win-64/package2-0.2.0-h9490d1a_0.conda | Bin 1175 -> 1186 bytes .../win-64/package3-0.1.0-abc.conda | Bin 1142 -> 1196 bytes .../win-64/package3-0.2.0-abc.conda | Bin 1142 -> 1194 bytes .../win-64/package3-0.3.0-abc.conda | Bin 0 -> 1196 bytes .../win-64/package4-0.1.0-h9490d1a_0.conda | Bin 1190 -> 1189 bytes .../win-64/package4-0.2.0-h9490d1a_0.conda | Bin 1189 -> 1190 bytes .../win-64/repodata.json | 2 +- tests/data/channels/mappings.toml | 1 + .../multiple_versions_channel_1_010.yaml | 4 ++ .../multiple_versions_channel_1_020.yaml | 4 ++ .../multiple_versions_channel_1_030.yaml | 27 +++++++++++++ tests/integration_python/common.py | 19 +++++++-- tests/integration_python/conftest.py | 5 +++ .../pixi_build/test_build.py | 2 +- tests/integration_python/test_upgrade.py | 18 ++++----- 52 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/.condapackageignore create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/linux-64/package3-0.3.0-abc.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-64/package3-0.3.0-abc.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package3-0.3.0-abc.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/rattler-build-log.txt create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/win-64/package3-0.3.0-abc.conda create mode 100644 tests/data/channels/recipes/multiple_versions_channel_1_030.yaml diff --git a/crates/pixi_core/src/lock_file/satisfiability/mod.rs b/crates/pixi_core/src/lock_file/satisfiability/mod.rs index b9afeb6774..42969235eb 100644 --- a/crates/pixi_core/src/lock_file/satisfiability/mod.rs +++ b/crates/pixi_core/src/lock_file/satisfiability/mod.rs @@ -2476,6 +2476,7 @@ mod tests { } } + #[cfg_attr(not(feature = "slow_integration_tests"), ignore)] #[rstest] #[tokio::test] #[traced_test] diff --git a/tests/data/channels/channels/multiple_versions_channel_1/.condapackageignore b/tests/data/channels/channels/multiple_versions_channel_1/.condapackageignore new file mode 100644 index 0000000000..72e8ffc0db --- /dev/null +++ b/tests/data/channels/channels/multiple_versions_channel_1/.condapackageignore @@ -0,0 +1 @@ +* diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda index 8ff26c7ee6d7f8a8f116648983262bdcf625b5e8..a8919574fb860210ba0cd4ee8bcbd27d1398a8fd 100644 GIT binary patch delta 781 zcmcc5`IM6{z?+#xmjMJmR_Me`+4xB~3uVr7XJm!vmetbM^^u zZZDpE&T7HZ|LoaY*+pGmYL(oG_{B7tmC*)lryob2;bc!nQ&|-zh^;UhVyXC50fw|W zA(Lk_%GLWZ_%V1fa4nwisnp=?#o)RjyrE;>dHWx;=C?X%WMt&KsWvEzPRYwTcV0(J zl|jW*^VeGOPW98e+wKT+*jh#B?wx8A|E{z6!sI_MjwI;I{c3rhCR5?Q<5KIkj&L3R z$mgFIrg7hVwQ_-y_gvSon4e2`y`Hj?H||11Q9$FSg+Y$>hTdORo93L2u++%VG0F?k z(onB@_m3@To2$$ItKF-QJ_|U;_%E$B_}^yj%+-^0)goi>D7_VW-E?{Sj|X$~=jMpm zed`HJxpU=(?voo_ipi@)MCEe=jDIUWZ8rVzCqXvySn&nh=e?d1;!pluyT;kj+_?3c z)N@(pz0-v(9OnC<`#yOSlWBdPk3vINM{my+X33u8{Cm!em-g@`ykaO~I3zWRFVREr z2*ZAbfX^kjYEB3({@Q43@ZgZd3JJA83}r=ksw>Ra)L%?Uf52MP{X$CQ&adzmErw?g zwg{N9U((KDVA#RUR?ui1y2t$8WWEHa36U;Y7q|8#Jp6rNE!zS1JtoX^J_=Wa_p2=s zTp6q6(G`DQ%BiJ{z1v@FA9KVi2IDEWWv}+GoHS9Vk#)ul8HoUIMkZZmL<*d|m)RSh1SboyI9bEe9*joU0ZKRjp+J>E m1e#(Q7?w0zOzvgTQG+ET7#-lv$_7%z41_X_3=Er@K|BC_SR-8k delta 772 zcmaFLd7qOnz?+#xmjMK})U-!U+`ky2ZGLFBPp_oq7@`(yp< zOZLL86F!#yyB{3&{<3_^Wy9zdIgFFp7;V5-7R9BDP4;3mm6d0LSPG*dc8aeRVE7gt zJb4bIT)i)Y4}%9oMB*1?PnH4?&IKIbxCAbK{>dKyd9wfqEAQL0D_9JcG+pXF`*Wu2 zQkDi4P1pTjl|HKMJ36iU(VxnmJk|5ls~^dHQL(o&ywTlm_i(2q`z@;q_Z^p7!^A#z zJym>N^DQJ`;?i?U+Ux!V-7P(Jg-t)h!E%Me&485)W~f%xzfj7)F>7N{z=epEJ1as0 z{Jz}z%ey3}yQ6OPwutVt3uUg~UsG_ZzDzYYbkk9l)!orcVv}MEehJCX`Mh*;@1f)K zE_U_ImfG7Y6RnuyGj&m13vX7M{gRpuZ1d#TD4&k_Xqocv&dwbQ&&wN{7jC^K^<0*D z?{pyxhxz{JzP~xVJtt-IUM7QjCSQey9*^FhE4-3D$NBf1-+tB5j3Lmyg4OY@XS(4M zo+Au03{wu5ycReiw79g<(%`^hi5(K=7Z}Ql?-W&-t*O75ApU^0ru&7I$emkZEnSY~ z5>^6XEQdIn85r(xGjBLBQ|q4ecTaW$MV^<5TQlO_Hhi#sV8$Hrc#jEl#7E9O;RQDo zYHUvnXl*gx#&9BJ?}J`zhTx~O7T$TcBF|@P4^JhRfWaq*Z(Q30L@OC?OESwlF)H(J zO;FtCA=7bLi%~I(&)=aVQ;#vgn~_PE8Ib@dA7=K3r@+Z#EKZ!Tq}MVzkwsVylsG{t xW zArSoKJG+0r31b1V!?RI5~ z%&#pUZ`c@;XjxqKOloS}?s?o&-P!Y(a&gaEr1oFgaHrC;^QXn1iCw?6wMY2Fe$xOe zF6rzI7k{d)DPDLc`Mm2#33`G^@zL{`lt559>slA;6`*xp-y6m+?j@eJ4psV9- z&lP6Lp5y#`&Wo4U_wXjXVklxgBsIw|*+Z~{(T-ukvzJ?bPEd8rZm3Mij(B{vi6w8r zqgfxC@186?{BUN}|5XRyJ!Gxv{vjoD!z!$$nXy z%Pw%55P2jd_`nUBN!)ps40dO{%@0W0Hrkso_IkV(at!)Ybxpu%i>Gx&&GJXq4M9(5 zExhw?Mcx}NM#)Da3IR_TZ;9p^Y85e>S+JFHF!z{TX==R@_K4Zj{e+bUquMeiwg7KN wCS7Jka-6)M*&Ci7CkwH}A<|g|i?bRmeZlAeZ&o%?%3}sX8Ab+%t;`@E0ByA}2><{9 delta 737 zcmaFP`H+(@z?+#xmjMK}*0e`Wn3l{E`oXXG^60mEhrG0Ry7lX&7pfAz-LjGbgIXl%a%s>7j>{HE7 z^>g)({+|{LH}9=@Av{m@afSPhORZtzAG>~CD7CBBTJa(%eWGaizNqaMsX5K!CJSUj z7UZl53GnH?=X!02S@P2b3pSqE5x8=}oEMSb%qMKpSNgT~UXrd^yHOZZ!KwOf9=Fz{ zbbF?)Uj6A>hWMPg$IZq2N;U=lxM3VMu`qe@{t3z2E%iMsgF<>XIG%meK863rfzQpQ zC6XI-*=Aao>*<~Nxpuv9L-WC{*QB1yGVh%(WZ`gPR_*Sv+UtJV4}UM&a!Gx*2<;tnI~R-R~Dd}{M7El+=7{t>~hLC9=*SX(O+SL*Ah3kS8S3! z$NBf1-+tB5j3MxNMLk#3uSw^UJS009Ef_S~UtUw3pt@}90h0~(Yc5`8V#r(Y=-!9s zyC(~uKb*PkpKJ5oX7LZYi?Ra>vSS2o*zP92aK0hTq0Ga?P@vCqfGK^YMShHmY(tB| z684LWY9$XI`rdGxC!zQAC7y(%>K6_zY<}@o#(BntbvKw5qFLwlSTh7WADy}I&bt+P zI#XMC9JvG(J~2Gu+8!WU$#7eeS^f}%GV9g{g3%r_8JDye8Kd~~9Xd|xG6r}vGU+lS s65`~e%--;nI9Y-v4w1s@Se(^hDGNpic(byB(i}4o$}lo8tY-%C03B;P;{X5v diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda index 46038fc2dc3b8e286b41a58e05fc32dfddf3e3ba..a09d986c018aee36ff6eb8b212d98bb6dc6cf1be 100644 GIT binary patch delta 800 zcmbQjIhT_!z?+#xmjMJmR_Me`+fKDjMZ&;4ZY zsjV)#6v?jh^?$;ns#GeW#^BXQwtMq=d#yF z=BG5v#>&rB_Wh{Cz46{NrRWx~9vL3#@=Lj|&n53YJgwBvb;S{`&GY(KuKp=~=tKXv z8DAEBdbOw1rmsOiL4hY}<9v%x!Oy20`>=1veUZ7(Z@6TK$k*1mdipq(byw$PZ@ZVZ zdI?)me`V;8-?1P23+Ec==WzJ*?JH}wUi^FCw)$xSoj1;fGH#Zb613`&%)|Zn>&*_8 zU--N8PRYGDec|c$W*0rqwkKwmYS}H>S{ZFCJooFJsx(X8t>-uAZ|yfUJbQj=RC;<` zHjBH$0~pEJsyj7xEo2v(j6zi;pAaY(QYjn{Syu-KXQF zrgO9W;9q*Ze#wDr+njiK4A__RC;BVwKE%h+uqlB-&q4aZtGkCIJlR(WBuQ+HGSOGo zso~%8mf@Fy{!xaE8!Yn``BPl3>Io_xUH_bSq4Vx0+u*&v$7CB;E;rmEmP zjfthlreW_PU2j*hgwx3j6j=-|EfteV((dH9kyXCEfI&@-N02SRn~_PE8IdR_7chIn zQ|08t%+A)ZFQ28Jb#Dw7>qbk$%<3q}Wcv$BB{F$19-F!^ON GgLnXW;y7CX delta 761 zcmbQsIfauiz?+#xmjMK})U-!U7#Lu*##a5m2@LGI%nVMh zf`Suj8FDN`?!TKi#hdB&H}5qfeA|{-U67h5@oAykcZVabr^1eW5YRgv@q2gFi5d0& z>+9BT2{T%E>HqGa*MDtJEKA-NaC0&nqXyW<^p8*XPBvpStAEM}u@go^tQ5b?$M8(t zQ!?N>^B&iUdAaDo5zb5dlulku-BY@T<6>@fbYQ}xrHO&{+SOIlw!EKs zu30T4E!tlAKPLyXyFgRM6XA`={rB9ub?DafGq3wMe(m+Q(Rv#EU*}YkSW)tfG`zt^0YC{yfR^+RK-kbr}WamYi8`?xb-{oXbsN zg4Yobu2+nbANcp2Uv715P2WcmmZz$77xG;&vkF*YB`%e6HXtzN&9)4m?$hy7)47@d zv~0=_s(2lzSkK0`tNC*K1|W}qaGN`dEv~}rTm)g?$o^iVb zgY>hd@(;ND9(2fD<1jhT(XzR0-D@7v;->cuUQ?6WigqvFwJ}7?)bYOZIC&z`V3T7vtJk9`bMkZZmT~2W9gVNySN@j0(Vw`-2 z*_jiT3iBs#WENHgsR5;$|4^XDAOcOT3=B&el^Gc(J2Gl>!jjR`$qg*xYzfRDB>=MW BHc0>g diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda index 737072119f2d969805f35ce20d4b692bdbaf7d53..ae041e7fbe35724de9030110ce0dbda1d0d46dcd 100644 GIT binary patch delta 755 zcmbQlIfs)kz?+#xmjML6ROrM^7#Lu*##a5m2@LGI%nVMh zf`Suj8FDN`?!TKi#hdB&H}5qfeA|{-U67h5^J$^mcZVabr^1eW5YRgv@%wksi5d0b zudmBD_ZY3a^nZ8I>%TT9mL+csxH*}PQ3Gt_5{}eOlg${->fbU#?1a$}E5&8`8MfW< zk_@=c{KsdlKp;o$+9k7R1|ILp?KUq>>q&8QW^iS2Vi0yLy!BlFUYf5_k6V6qco2uo z!iiG5E$dZ19XVVa1a{ot#Vj-9#FERh9wOm$&Lyh}d(`Y=<_MBKF>71b-OP*9x2Dt= z23|`&v2ePMQDsOZPx(cKiCkBoPIgk(?yQb_{xNp;Mi;G*rIN`(87apyFW2QXe_Oia zzER+_g);k6c|w0_C-BHQax5uiHeDG1QakxfQN4MAv)i$WEh$cdv2X7$5#RD*P2$D!y^Gs6pXAZt}z9D>K-3Dfc1v(N9+!xq(RDCxHyTqu~BH^}1 z?Cfa{?)%Jn)(v)NybT$o%nqiXV3rKr>fPe;@pYy1iwo-#&WGerE@V$wrC~hfw(Qm3 zP|gz*mNGCZ^Czq?I2|;R^~NWO3=YPgl9jCOH@qG(`yW4HrqR&J*~}Q=&B&z7%!Np0 zlk=Fp;mK_BL1t%LSo(s|5G@EDpw#gn3e*@xpsA99VM(JhBg14zMr}1%a)HqS-mGjO PWz0Y*2TW2K%pe{BWz;5Q delta 773 zcmbQkIf;`mz?+#xmjMK}*0e`W3JTemJ@l|d~#c+o%_lD z=KA(!QNipwU;ihp{l?(>Qmf=f#IMP$j2d7oZ|*&!H`$cYto{)r#8Mayu~YmgAA^{L zr)0o&=084b1p+y0*DjeoGw^tfnt9}oRbE%zofw=M92m-#H2i-5IeL4IXWPXWx$nKW z8kJ3glFgs5SJC8X~8z)Azz4pOyCPfmAW0wQ^MFcEnAyZ9`&WoELEmH z@LKALh0}HB+N{!P+nq6Ci&N>(B^OS3J=&-BdAC`zr}oEE$>gAnlw+Bf>vEdEE!}b7 z$Wm>Q!oF0V&|lgKJaUd4O9cN-T6^-3SG;8MwBNfMrHzdGR8*#V3dX*@zeIfVhc$_3 zW7jJkUvqh7@G6<;Z_)R8^7(GBxcoV&-gE!mH=FCZd!OVTd>p{yxZ%w~r~KOQjJ%7R z?(n(=9J|2#@p6CKRGs9Np=(0-_?312sY|L?bGOaes;_u*>a(wzM&-M{?ouh6XydA| z!0U(`*DFTJ5Bz)1FSk0jr0=5?%TX2Cg?tChtO6ETiF2f!4G2tm^DWb-`*fps;XWR< zJDL$DtpYg=^>+`xbiN^cLg@`7gN8WU0j4dC>+bC>oLbVr<(R?0+V!*1p+nyrZu2$p zeh%U(X!U&{VL3<8>^xsf>f4C#K4068l`|~sGIHK|H}G!6)CQhNE&+p24Bxo6>xf1+ z==L|Z2^{d49#zn>R)w!7v$R2CZ5z8l(jo5vZ$>6vW>7+8gQUdC70ll7q&WFBv$HKM v4Z>)I7Kjc|0{RaHY78RKl*_=dq)~;DVX_0GHYY4aJ(^t4BF+}a3{nCBigh&b diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package3-0.1.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package3-0.1.0-abc.conda index e9bc7a8bc0b496cc9d999a492262c3f4e069e4e2..eb3c23683cd16fc00342dda08b3151e86449764e 100644 GIT binary patch delta 834 zcmey&v5u23z?+#xmjMJmR_Me`3JTemJ@l|d~!D4&;KwV z+h=R_at-seU-cWpswXTe5w*(Esb!q_Uma}a_LZBJC+jil*Gn-$EQQe!JEdC%7}%ox z*FqzPDCGyVblS^)w**1;I^V+F>rBk;Yas3{XeR9s)%=3=wu}ZVEbvp~UvG~_p zZG4lp>6{OH4YR(bnaz)t^>?H;{0UoCP`bwc;#!@Cqmk;l8%z@>O#W-iYxeKp^rMm) zAwS%5cxOyme)wC*s^5Y)%_sLZ^X7=`6TQTzDtL4Q)4MA>mwq&5oXT$|DW7?F%6Y}L z2h6KBIs03drGD7D#^~pwwr#;{bn`MRc3J&*I#w^4n)Bh}&45Yye=ptrX}9gt2f=j( zbGW(|eo$zc_@vJ@|L^UM`#4&ben>we{%}g}^UkcAqoHM@0+|o;+t>cMR)0rq_O})C zbC!Qv$-MG$#PfFw_eC6DrS$~wvp#6d?7zTJvFMbd;!MrFrIr&smbkfWVwUWA-~RpQ z%DNnekkcNF8ub>IN8}br{7&5;(h-~ZUPFO_b^cN#7Pn2D67mb)TH7=zadK?)T&t9P zceQ%&TDcukUk{Wp&oHjngt9t7n2AlhC5doVqK&kym~9CZ|cz68r*Tk{l3;= z!IInz!w%V}FWL?tu>61F%UO@JRSt@EyVDLIEnu&k_DW?xvqG<3!n&tr;a4|?O3$=l zWoh7RSXb>G-p`p-z>wm>u4Kt&z!5shvf-u6od56vW<&~}9LwwtPr{Qo zFx#lW(k_ff*8xs=0xV)2vWyH2nR#jX6YJ#FV2KY#2Y9oxfs!RN5DEa*bufc?0Dt>L AV*mgE delta 788 zcmZ3-`I&<+z?+#xmjMK})U-!U&$ffoA(+KzHLjaE=bLj__WaNyTg&zQ(;Fw26k@ z`E|Nm#Ej-$_+Rby`mfE2Wy#wDZZb_`R0rGmTkA*mWPL{c`Ui{WVTMEYvPwJ z-w%r!Metm{aQ3JC>1$3B$D^*~$I8~}Y~1;*&Y^#w&IZ|wvwt%#{G#lAYr-3^RqH+K z{f;qicMDy%t&aKODkh03A?H}4d8&2326(*`+J16|qohZOq;rm;&LWj`dy|W`+*k6y z&8j~ASu^?9i~2q`rwH!EQ>9EBI=7yD@$X`L&%(A}&;7c5r}k(sK67yS{J+AVm#EHD zU9++~Vv+ar3yLwzUTohdcuyoRYw3O6KL`JnEIwbKYuLlZk@(?Wb-R|EK@9T3CFr=UpX_tHJ`W zBW_%;7$raO?>WER>e!OLk5Vj0Rb&_P9Wb+sTd+%tBjs#BV9J|snLgd88@&tn@u+pQ z{i&ZR5uw2ES1*5Po`YB-KZCRu7M1{E zG_n?u4p8#>4+ZiJBG6>Zz_6rIhLK^i6{Ct8EIq;K0B=?{kTPZ<6ac0k5Ru~k_loM zjE0ycT`RzFZKj``!)luw+j!3~`9|%u>RY7qOygg%R^+6V|LYI0Qs&EXV{l_|Wzfky z?at`DPG9{3?$7{+48o1(jOy zId7_6)R|*1anz`5?EWH_e4RD^c2@F&E0@YvTe52Lg@-@)H}U;kzpO-%OKq#h{a-70 ze{OxV^s%(e#~q@cjSR^>!cTcz^Z)+dc#e&^?L)YS#^aPb=caD`(Y5}M)&s}K`E6@| zT+6?c;lytjSXc7l=a&<2Q(m}pEM{+d(<8xHlOY_iKvA{ml%nEH&Ag?i4IW3_TsARF z_PlTZ{&Qtr4ns(GPE)8;R#(040mJX7|E(0TK6EeIiGj;5_$kMmmudku3|n4&V8~KY z*r8V1)sx#j&tzMb>9k1puUxwr-`>U+)ZJ&&d>`MOOuF5eM=^HkOXf#?kTq;;*8<1DN z(yA>>QFv)1!v)3*t@(zp3LSa)8f1eSJX*PUf@Dw1cJU-F=%)1NWGn~_PE8Idq2 z$1r=tQ|9FL%r+{pBnhL@b%4_yKZ_WLEF%L$W?owU#5#F3SlWZp0p6@^pj62WgaSZy I?aUw^0DTTL6aWAK delta 728 zcmZ3>`H6!sz?+#xmjMK}*0e`WMgD5EdP)i$R;GZPcWKy@~1C3 z{TjRWPpI8|)Yc+#@rR`o%3fqBv}_ev_D7f_Sns@I?E&+mP0s$BW}zR}_H6p8bmc-> z*VZShy#C?O-928+tI^#ip|1M#n*QCn>w~p<_dj5NeZ{-)ZdSyUrx?J-A z-VSs~K6Jm!>*Lb>JNirRY&NjVIluGE@zpWU4u6+>Z4qkM{ov-w0~WfE@7XebHnuu( z<-59@!UV4)9$c>&B|q@*IltWM*qXkNA}mi;=Pu;CU}hD!VwaRu%GrRxlsDTle7aBT zAMFv{@SpLUoAdAOYOe%NG+%D7-=HMmc7vHAK#!+^HG?^3Z}nrnmkeqxDpoGt>rxL* zSfY6+i6M2y^g0F&i$>*7A<7qO6xq(*+WAiM)zg$aj8n9Z@;ohbFHK&llEM+xz%Y?r zA$&*csuRpNj!66vV3W`c;O5)7^+==sS|Nc2Uq7(5%(x>I;LXUS%M49i%)nGNc{;N< zJb6ui#cX2@OII)&MGH^|DE0h@0(k}zXli6&SkfpnIgv$;3znGfGftk!BF5&!3{n9A DNk=8x diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package3-0.3.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package3-0.3.0-abc.conda new file mode 100644 index 0000000000000000000000000000000000000000..d58e6e0bc438d27dec475d02201c52c3f390963d GIT binary patch literal 1197 zcmWIWW@gc40DUejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf+}g&!9A>y2&~Tt0-GapA?8Nj`V_gG1 zV?6`i#H3`slEfmts^SumZTV2!V6?_o{l5te?7GYhPOgH26KWZ9EJNWRq>Gn78 zH6nc5mRMbony2t-q1$(dBdw>xj(iZ%J00=+w|2^z{fo_C_dB{thQItDyYg$FT*_s` z=oLAPTnY+?*DbE!TrXSEEs}Lm;I@jLgOyTt0E74CUreaZS5mdKggIXx=={vQw0r{Y zmtul=07gUHFWoA@aP6j_yu)dm8{5*I?7v)DB)wqcq_#vJn=q%_CmQFJ%1AH!$>_!a zf}RVv9?`XD<@sLpy36}p*EH9LjdL`w3poi}#O&Sb=elm|k;W}$wvTx-TPp8zym@Z& z`9Zear7y4DlBV?D;Fg~`kTJ*#oR)$-}) z0^bKKURXUgiP@8~y4z^OiJY}D!WOUNg1>Ri{>giNbM}*FzMM1HJQJ5saOdrn>F8XR z_Q-kR^uEu+M}8QeY%Ana&RM(U^_Aov8}aCsv-OMwgKrvM=L)$MCwkw1ON)%8v{8SF z!D-{V)z6|;XC?k%b7%2v{GiY>^(hZ)`X9?h_t=`-K7=0;UzlTcpF8@`mYcQ09||6% zv(4RhEq}1Zz4h(b_`J^6%3(5 z0y&eTT#xN?^_PnNd%O3Sp)BLEnHz=JFPA)(+Om`}PB($!T~WijMZ5*C9!gG^df;?e z^T?~kwNoD~jhDW~o6K(U%0a^Hwe_rRk_#jGT|8n%-|jeZ?!ft=wJzlhOCO(Eedk?J zDbH0WB`;>i1+fJ~^3b=YF#H z)K-^Vie%UM`afaqHwV|3S|v9kelbmEWmFdi*|}V&Zq0uvP-7689LQolxr&iX>DUZ! ziGc5ad{V-;Bu#aGccy3FR7H&+liik`Rb+Ev0Kv&C7**;WbWLB(VL0}A2HV;%K@a?_ z)Dv{)IUKif{lj~C=Yd7%n19{cWjyzfgW0UACY^nmj!|zCmP`(uczN+t%lx-yS9Wfx zc(LuAuB2#XX2h4xQ!VSgqyBx8+agz*HrIOcd0_!I-=0RDGPij(S9h{zR;J%8?>e`& zWL@IlFU8jk-)%h`*t-nqyNt4@@4p}2e@t<2rRzKG@16lkdfscIPhFjCyyAV1 zv$0mtZAQn#5?jMwpOSmH|NeZdhk@U}Z@Ij4v;DuEj%T|ju6bFjSM=t2mepk6jdc@V zX#X~p(dKIw&v`Q(k0>2lbKonF z^NtJW63&O{t3T#j5MpUO<+kkA-dI(01?M?TEL}DZyASEQx#}HYJAQyKv0-9cltG8C zs$D|~!%a5X14md61b8zt=`tfy+~hiDZ+McMe39AN8kW{zG`bG7bOKGG3=B&eRVMqh K__7r+gMUB+|&IGD|3HjP%#z806E81*YTbV;cSUjL`wO{qqm8sa zUE1&>UAy?-v@L&9m%1G-O`B^y`Mj_In{SWfcY{w)R-e=LIBorTUvSB~rON9Q|9&aH zX83OF*}$6mGub}YYmb`j{`CF#qxi=Y?(I?fKJ~YXhT(M8Yr0Qgos_&%zHOo8RL8?t zqE?rt_J6ql-hZyZ^}n`nOWwWdx0hbDGfySE%7(q^dvS)r zzSqoYL+gg#cgL=FXz_X~G<0?J`b6+cp5Whee!11Lb$uVjSf19a%5K;sDE@bG9z*k; zDN+*oYr>^+TR3C3{NPHxw&cLIjZPwLDeafrHz-YrOXPlFF2-|!HG_Fh)klN8ON<&v zS~Xo59RxGXm3RELD_G4K!=!(fq3I8&k#&IA=}P7(fsGvo+6A`f1*C2XzPb78Y04eO zDO!1LMY|X8G7L2`dZOuIdf)`}4edLZLQ|M>(s@!iI3+k&u=d{wdvstz7&pg)qaT=B zW?T^p@MdJvWkw{h$qmfj@Dw)rGPAQaENQ`LbRD3C@gEA*7(}26l7V4KqtfI+7GJhJ HW{?m7lo&Gb diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package4-0.2.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package4-0.2.0-hb0f4dca_0.conda index 2a4cc9ab3b0f629c76b7bc194f8191a9f4efec1b..d7b86c1d40697238a359cf8e3a6259a087730971 100644 GIT binary patch delta 807 zcmZ3?xtNnLz?+#xmjML6ROrM^zV7Bb<*3Zj`o3K6pv-^Q6R!%gn>jN$GdMA{9XPn?&#p&bgF+M< z3Z@ociEv5?IDF~;Yr)(eRlXL()5iNIxW$y5FID!w>}$_{_tAuPR=b?c@Ie&eWAVLdiU?ZEZRfb1->UClYqOM{neBi51I|~Wd*f?!*-T$Edp3ShXu0%+ zhc*4r&6DoT_QuQhgw-AXS2HKoPrb_e--R0=GyDHPNSSxp=BoPA_do5U#J`&yib|oN~%E4~2rRj$WSya*`+b_ncQR?QxWSXvxv#Wpy-4S?`zoT?V$Do~8!3BDzg( zaR~3o`Y7(Tw%&8$+R|1Fwv_hE?GZ<1&$pgEl&>q%zP7J&{ef-C}9x4$tHW?2+M&0Z$>6v zW<=VYT+i$cPn?r4F*{qsQYDN=*8xgV|DiyQK?ItX85ou{s!R@G(N%*bFc=-+&B_K+ P#0-RTz(knO4B`O*n1ei3 delta 807 zcmZ3?xtNnLz?+#xmjMK}*0e`WP09z$FfhPqjjj5B6ByWanHij1 z1qCP6GUQl>+)-us9M-?k-I7o_INd|K%C-Qh^-t;{@X77+9#KC*)V!V4&!8YMs={2ch_6Ynry~sR{w<&VkwM<*eM>$&#+9w zTh3v%&5dJo8zaiJuer*3_AQRSEL!%rQ}&72rq7#taLE1e%C1lGlVtkT@2 z!@sVmPs*F)O=iTeYTHG<8;>*^q*Wdhztl1L-OfB0v&+81vWK?3c1xPl8^fhMr6#cc zviPZj+_S$dW5u&hWcIer3!M7Klu_5qgG;Q}R(H{~a^r%JUvG(}CKSeMn||AJauLtX zrCg`#H`tgTv%PU(-MUt#H-eu$xO!9>CsoQlJhC-t>mO~mwrSbv%~79~`Zk46-*ls@ zwdLK(>l>4EVoWQK+272$X{G;X%ltpvK24G1k*NREtiB@rYu(qaH-$YL1r%E@J>g+Z z|8vu^pRF#<=S9>D>2J%G6P}5<mB*K=`ez|>v(uBA~?g!>#JO@}anCDb|G|0QesBxrK(}mGNFvDDV z$6vdG)r>Jr`ezxM{%{&u2Y8*XWR4Qp*kPbuV0&Ib>XzV}o3Eax++m!emDg6Zd+{#A zP$Q!!nhpm}FyGL=b15{1DJPvLg@aRqa|LVvjj%@tCWLWwNGv$|fvIK26`=rcMkZZm zMB1EO&+H9PoRcpxJ6pq2C5%Sb0ZLN;p+Jp61e%r^7?w0DPYz(wRfDB47#-lv$_7%z O41{vPRG7~U;sF4_jXdT6 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/repodata.json index ff54950df4..b1f7b5035d 100644 --- a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/repodata.json @@ -1 +1 @@ -{"info":{"subdir":"linux-64"},"packages":{},"packages.conda":{"package-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"1949a67cc830e87782cb7e29c6090ea5","name":"package","platform":"linux","sha256":"1662d8010634c6d9e0eecfdfafda131524f0f2491ec2095e238cd2559dfa9fe2","size":1247,"subdir":"linux-64","timestamp":1744040260571,"version":"0.1.0"},"package-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"fdc1b9bd4f5e8e5db49a14aa6a252ace","name":"package","platform":"linux","sha256":"66b78878be72acf3d79b24bd7610cd0acc7839c8e9d8c5b67dc6eaad731b1801","size":1249,"subdir":"linux-64","timestamp":1744040262136,"version":"0.2.0"},"package2-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"3748795e8ca6d06f805f06239c72c23a","name":"package2","platform":"linux","sha256":"5b0ce387e55b365491931c6faaac21e089e4da1370062d93bbabee634d378551","size":1172,"subdir":"linux-64","timestamp":1744040260571,"version":"0.1.0"},"package2-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"eeb69edb688dc978fd1cc8723ad65eeb","name":"package2","platform":"linux","sha256":"f7cfe3af389599dc528a5020998e3a79f587862160adc9f10ef843f18d7e7b52","size":1170,"subdir":"linux-64","timestamp":1744040262136,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"997f3159ba1018fe4758822260ce930a","name":"package3","platform":"linux","sha256":"646fd77f2f34c0852dbce0124b0ba6f8d357be84530a323f78cfe508217c17f5","size":1139,"subdir":"linux-64","timestamp":1744040260571,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"492d1ec360b8a1a125599987ce9f642c","name":"package3","platform":"linux","sha256":"d3a6981135d332244deee6dc530906743f2216ceff7e30fcabe2ee6e9249e7d5","size":1138,"subdir":"linux-64","timestamp":1744040262136,"version":"0.2.0"},"package4-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"2270ddc350eb17b9269dd6b1b9a4bfa8","name":"package4","platform":"linux","sha256":"b6c326e533930534e5bb1c67cf5d347900a28c162c97b49be7eac720a9839054","size":1186,"subdir":"linux-64","timestamp":1744040260571,"version":"0.1.0"},"package4-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"ea798aa9d526e1b97de6baaa586df0ff","name":"package4","platform":"linux","sha256":"8c4cab151ea8817bb89147b1780ce9bd0655504feab0839ce1d07b3a737d87e1","size":1187,"subdir":"linux-64","timestamp":1744040262136,"version":"0.2.0"}},"repodata_version":2} +{"info":{"subdir":"linux-64"},"packages":{},"packages.conda":{"package-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"76e1d9904e44e1d320a1fde110cc3b43","name":"package","platform":"linux","sha256":"42491b38780d4013dda5f5ec612f62c06369d624a7fea5c85cfdb49ab7f22995","size":1253,"subdir":"linux-64","timestamp":1768230454645,"version":"0.1.0"},"package-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"3a5c898a96696fe858662e4a2be7f67d","name":"package","platform":"linux","sha256":"88bee87910eae454187890c695085af5f2ed870d1fb8a189151245a4575bbf1f","size":1255,"subdir":"linux-64","timestamp":1768230462000,"version":"0.2.0"},"package2-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"da342cdf9cc6d1fdaa4da928cb0e2249","name":"package2","platform":"linux","sha256":"a5615f243a655f7e6753aa18c585a8e07e04638b0c0e90b6ae8f0ba228b4cd93","size":1181,"subdir":"linux-64","timestamp":1768230454645,"version":"0.1.0"},"package2-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":[],"md5":"41bbedbae6c08946206d93620f12eda4","name":"package2","platform":"linux","sha256":"ede7fbbc095e42dd176e2b144f09ffc7a8920b7a0839b4e07f5df663515bd64a","size":1180,"subdir":"linux-64","timestamp":1768230461999,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"df85ee93f1c038798ec4c739a6345749","name":"package3","platform":"linux","run_exports":{"weak":["package3 ==0.1.0 abc"]},"sha256":"63c1fa508430c69200ce172839cb670acdf52ef98553f5d101ded4623a23410c","size":1198,"subdir":"linux-64","timestamp":1768230454645,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"25ff89fda5e06173f41dc891f28f7685","name":"package3","platform":"linux","run_exports":{"weak":["package3 ==0.2.0 abc"]},"sha256":"933982cf049f3ea20fc271ff7262e1ad3e58673cd676c090aabb3c523d576fda","size":1197,"subdir":"linux-64","timestamp":1768230461999,"version":"0.2.0"},"package3-0.3.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"346241368885dc317d862142cd920ec9","name":"package3","platform":"linux","run_exports":{"weak":["package3 ==0.3.0 abc"]},"sha256":"3986b77c0c95c48ed30b28efc03fbbd8e445780f14ab7a2fc0bfe65326e57fe2","size":1197,"subdir":"linux-64","timestamp":1768230467960,"version":"0.3.0"},"package4-0.1.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"abfe529966e23a57f61eafe95f862c31","name":"package4","platform":"linux","sha256":"ca01c3df8db4d70392aff2d95f9fd34fcf1b61adca3e1d78e698008bb3091f41","size":1188,"subdir":"linux-64","timestamp":1768230454644,"version":"0.1.0"},"package4-0.2.0-hb0f4dca_0.conda":{"arch":"x86_64","build":"hb0f4dca_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"30fd7fecc55f7d008b2d2894a62c1241","name":"package4","platform":"linux","sha256":"25396f0431e0c892b0c834e97ce84873558abe8a751f311d8813e60d55e6138f","size":1187,"subdir":"linux-64","timestamp":1768230461998,"version":"0.2.0"}},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/channels/multiple_versions_channel_1/noarch/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/noarch/repodata.json index 8010a6626c..d6f6f3f3cc 100644 --- a/tests/data/channels/channels/multiple_versions_channel_1/noarch/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/noarch/repodata.json @@ -1 +1 @@ -{"info":{"subdir":"noarch"},"packages":{},"packages.conda":{},"repodata_version":2} +{"info":{"subdir":"noarch"},"packages":{},"packages.conda":{},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda index cc5201c953cb852708faff272f3cdc68a675b041..2033e15fc3b04e711292f5959fae1ab827122f3a 100644 GIT binary patch delta 891 zcmcb{`HYh^+X0+xp^MJ}dQ?+i=W{(t9KN$WP+%l{5hbm$K;M4-J~7=j_y2MnLPAAe z?|L`w&tns#v#lE${TTchycoKh?+2TPqhVvXboG{pHa*Md#ZKxo^*4yn64`Bj=?}MKfMZx2_JU zTAStn;XuC^>(P#RYX6y{id+q zcPD>J?#{8>ey{#uSGKsxFD}PVPCLq0xte~zaoDfUG?76}#KIJ(7f%?nauNs;$1h${x zkhJ0h^No{*?;qZb_`m4jxd*Io#2%Vz z>@kfKv|&4wn4y@%wi368~BPQD%F8c$L zOPJp$H?dv3tJ)M*_%PDBv|wal$jnR2pIE1=21}SQI>4Ki4WyJA2xWlkwlITu0OLw& Ar~m)} delta 847 zcmaFHd5x1Vz?+#xmjMK})U-!U&$ffoA(+Ku7&Dtdzy7u@@;7gSX`~}NU5#8AoAF)`}K;+|7>f2 zZM_h6;)m7$_nK?JzvSQaa)xfmw#jUaHeees1+adZ?8RtWFU|z96GlU<6wei4*fu*z z)*)B!&Yjucoi_)|EaQD8;wm_uZ|$TP_YHZKpB>=$Ven?~V3>UIyoT@rMnwmuJFX2C zv(DRB%%1I~AhKn%`DB3u4P2i3dFRewX%TQ(r10g>HQuA5^;w$bM|T!;%nq8PUB0w_ z>vONXlB5mNytPi7Q)KpkO?~h;!CTrY_K5Z?>**hF1}fT4H=_d>$w}Oc^4eA z^7sAlSTSM7uRVvq?l60NW!{5@vs<`2KboBW*J}LT)n@gPPtVpmJ~d!!XkKV|OsuD!=S!GzL4{uIlyi6M{bF~h{B6B?bnnVk!|hT_ zKgv6?rpDIYpPN%wd3|TkyQx8qok``+FV0ll{{^q#dpp7S*#J%9_-d;K6x>VV}a1$0hG0P6#dh+GuLPa7bc?g!K)EvZ6b670cGv zpG`=Az*^k>KuYA+uW*(&$M4d+1g^1f(&k}c2oU4>!IZu_BL9w>Y(q;yO8b?jO3B7U z=?7BvJd%T@4{(_~oJ|yWd}!HrVd30^x2#L=FwR(YisyM=ylk@d>YI|Dmm3%+vMYq| zNL_h?>Bc#U3=YPgk}FNFIqHQ9zN?v!WSH7C2nfe91$Z+u=`tfy@8l!Q-tgo*S)9em z36^eQG`bE@s{0QGsth8~)Xu=Lq|uC#fgv+5Eq`L2sv0aQ!sq~RRyL4QW+0RSs$0Sg G;sF3UB~@qu diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda index ba22313268fc9e6302d95b3d88fae29a2622a4a4..f7a73972e98b6fdb222c7725aca0d290a0128e07 100644 GIT binary patch delta 743 zcmcb``GS)#z?+#xmjML6Rp`V_ohW3%U25l?P zDmZk!+4k&#qxY*h^#%X7xU0`Cb@2Yre=Un&tK(AWiwzsUuuf)Yv;mtEsJeXKWN${( zdNn4n4Gb_^W2^q(1P1Y^0u0Y)2g?QI%FQWQ^zHir-evjKW(upcy58=7H|@`36Qi@O z8yS5Vd>A|#e#oXWSu9}*Xt~89aPjkZcK`RroGnakMP(sO5L4v(qcUVrIU_ES3x!xO#kb`LYx@lHF%wyq=mOuN?O_l@_s zLT{~Hut-a?_q565b<;g>FXX;Gf$^%`=LgP9n~KuDoSAE@wKr_5dc_0xrA)1Jp=Z+j3elT>qTYGScSL-Rt(WbR|mY!=qS z7JIf!)V{KdT{`j7ciE+LE*(6U7$dq(GCh0Rx?I~^N1oONc`p5Z;7H_Ifs-+(uXL>a zXexNBe$B6}Tdu#D{1qCyI(mDq@QP14&VS(Y_N#{VW(d`j?;JQ9+Q_#1cH!ZNGq?S7ZJygG{y}$9c0j@FctI_;Gl?0B zIebgPZ!j?|(2+R6dM@PSy&e8m4V(v`39M%QZPe6yzS%o=0sAro<~bi_E9})01Wv{( ztq>KTXWGK?){F0(&(|uWcMLvPv)hWdFYYtE`lshfro({~%r~^}TnbHL%1P%*;oy|u zT*2CZBkU2gr~3)B6%4|YnVAE;8JTpM5eani4rXt73Z2Z&5{F1=g)GjTumq+yc`u7N K+csuUvI79@n?$Gp delta 747 zcmaFCd5e=Tz?+#xmjMK}*0e`WVo|NVjtI`r(dzhxcrH2{R@x2Esi%kJN^k-O0o;w6W(UB@Vf4wh5Jeto?pk3 zy-URF$ua3;6>F}^cOT&7ir_a3(3>W-X1U+{jk@d3R@h2JyvWcz*tG1#&Hf3qYPm1J ze;QGIZfVbK^@3CXpLx7mle6Yz+UwPyu4PEhiBo2NUh{Lw;t84mUpOD*u>Lz$Vt1rb z{j$}OhED8XH^)bn>U+Dns0A>-*Rrsmxa66 zSf2Bd_EnhRwZvnxmH3p${0A;ieCmtGN#~M0IFB&wQ&{r2H zOpay>@MdJvWkw{)$;X(z;c0TRBugA3Y1OkhtHF{Kj1KT-1v-|2ff)#87#SE=FoSpi DH!?g> diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda index 0ce90893598a96f72f176dca6a52b6af54b12aea..4eb9ef731a6ec260ffc4c5a1ad958eda54cbeed5 100644 GIT binary patch delta 796 zcmbQtIg^twz?+#xmjMJmSLnn{7#Lu*##a5m2@LGI%nVMh zf`Suj8FDN`?!TKi#hdB&H}5qfeA|{-U67h5@oAykcZVabr^1eW5YRgv@w+qDr~$Tdm6Ote$!3gZ^{*HqcEV_gmEx@Y3~mx$ z5&_@;_@snwN#a)DVQl<0zeVB0WVdB!71^8_oEe-L1kxV%ajx0@ROINR_5T-hFth1h z4BlNXV<~v(0JFl858ovf8k_x+y*MR0T$UKV+#~-X#(It`dn*?4L_NR0gbWUte%<|cld$)4U@eP&Qhg8F6e68_`{hrTp*xoB8 zNNfGM{3nGhHIB@Q0^NUk7}@&%T(MkgxJUop{Y9T;^4DB-myZt=nml1+^qu7B*(Mu9 zgOn{NREGZe9s9AraISHF4u?PAzOvTp#lQD$tDjcTdE*?T<6$2!&CtZY5BJ~Oum7M} zQm=Ra-1~PGrQec8=U(ZNm=?A?$t7y`_N&1cBhRl*pLRLux6SVr-wf53{j^+h?dHsO zUU!8JUPn||zlwk0KX7@u)v;B46+BIsCi?}jS4hiB$Ha2TZ%SLCVN~|pWZBWD`m)ox zng6s+$_^^1&)((4!)S1PA$y{~LR=y%L&M4h20aJq2d`!t%=y9`u)(w=z?5}Hq;t{% zRs9=_mwjMf;Ar(DxnhAr({2|JZ8e*G4%u6RZz8`Y8NFlh3QcG$-oCicFssh(l8J)D z6UGywd4gI+3}zN=W-Ux^TvwW$bF@D)E@$4vV|Cz&$bkTFK1L>8W<-LVoX_kHPmz-k zF*{qsk|K-_@J7`EN=W~qK#f5Jnt&M?mNY6)c3{y}gQY7N9pKH%22#WfgmS>Nm&y#{ F0RW{$GXnqs delta 775 zcmbQqIhm6$z?+#xmjMK})U-!U+fKDiCk&i!P6 zeSQ0~s9<)Tum2O)eq(Tbsa0|#;@4zWMh&o)UpMZEpKQu#R{xk0VkwM<*eQONkKx#K z4>^a`HaCuSHb#_bU!NrU(z@+o?zUC4d?x)bjVL|R$ZOBw$Y967=xqA8_UX&Hb5aux zrWzj!bBf?O9Ju$pV*A>u78ACvI&aZva_Qpia^($)-alm;-`+h@y>X)T!{$lCm;aO1Ii@!vW!Fp2@3To|F&tUDx)? zIQ!n5>{qwg4)H7YFWC@wXxc9p!ENmZk8X8@#cR6dP0Lo#o{@7tQN#XdRN>P1DTSe; zMt1#ct;-(mGF+x!^(4(ulllG{P3!JtEHZeALbNK{KCVU9<$lJp}oY^ zIITE0So)jg*G6WoieR%B^FGI!wQP2J#cZ`Q{MBYzs~8(t4h8x`YGo z`$PN%tkwlGe9|oI(j^W#TQ}P}@14_Q-4L{O#=|>rS0wA0nkzd>2`GGGc*3Z%rdfPg8p_19MebgMz~pGA0B=SnU1nfPWQQij$)(KR@U%Gj1hcaW vED^$JxE81ma0=3A5o1+vA?+!;=PlX-%AfR_T;`eT^6Eo_~ z^RLM__ZY3a^nZ8I>%TT9mL+csxH*}PQ3GtF#=5?nc{68Ebx3>!?lXS68fJE5v7NV)90 z+NRS4Zd`uzW$QK*>Eur4#5b?9g*lYZ6`wa$?wfn~yyJC?C5gv-417|Sgne6Z$Az{2 zYmnN9jaM8x)o}aUxS?;J_L%+1DqzhFJZ)ns2x+MyqvJ&V-GZa#wHsB(hF) z>vin~!n02p)HJ=Y=zf(wf6@0ve5!A%ot4v~{Y%|-D{5cQy?J?^XX62ZL!DV|N$dZ< zR(bI7zF=Q^49K-kDE^3 zF?O50mPwYyY{4#p$>*5F>Rma?7@t{uQGCOh5`Ke`AwZ1h0BZ(w%wFNPsdWup+t>tG zvwk)@bm;kkRQ(%=mkBU0NR+KHvk4Hm8mqKKRD7O!3*TF=Z$4kmB+D6=tui{i^LF6z z2vcL_NGSn>PYmCyNou~xqs^u8uB delta 748 zcmbQvIgyhuz?+#xmjMK}*0e`W3JTemJ@l|d~#c+o%_lD z=KA(!QNipwU;ihp{l?(>Qmf=f#IMP$j2d7oFA1B@oovczR{xL@VkwM<*eSl3kKx;O z56OV*%zu2=3J6{{3c7Um%!*_^WwHEMXCzMcI5IdfI4}qq7T$WU|1V9~h{r9zIyi_! zs&S&!VM}{aPe%?H2Z0^;cQMP%D7*BMFT&l%^A(H0{C5s(uQjg8Tzz9M+untqJGlbt zuRT3Jzq3LpcDY_y=>>(=wQD|kHckvVVmp`f?}xKf*G&7dMUB-hZI0U81NqqQ3(LPu)qYddZ(d;Uwoc*aiI!{5!N1L4vg+DoPkpwb zyuwNM>#MD5#i#4C=Y-B)t#>7}Yx({~_Y1z=WOZ{cvS_?~<*~(vHwT^ad%xGT8Crf| zTc{q+&$oI#f1vc;r`KlRnZ0A`Iu^^iCw8vO=3c+o&&T2}vfD-6=kKo239DV+F}hCP zz$D8OvA{}l@oaS55R<6jljf@`0`gG|-ZDlOg%c>^#STh8N&U|?1?TX|zvt~}z;pLF1 zWT>gPaSMyTkU4y$-0dC^`cA=J7F}$O6gbuhHEqZ zkPc98LPJ%fceY+n@?K>AoyF-T=RA}8 zq?=bm=FjB$!FE14tSY8q!&03q(++Q18`SzTSU%{^Dkh03A?Mhl`MT%*dH*vzf+LF!Ubt(VTr z*$H|zUbt7>`lZh`KlgiZJujQ~$7vU3YK(rJ6TZ4ZBz$L}!;;D}YptWxZyhhav14|A z#hacoyL>zU-1|HiJrBd$KjSTw#9JTG^Ji0hS6cW5>r5;k$;yQ`hY zrm@8IRwe9WJTr5@ko$!a+pHI&ihH*(Fzh(Z5bG}eVAUJmxS|HGL&6;)Lie=}3x3I& zvcuV(cSobahU@zc{~BD1g}&k;D`n;LXUS%Zy07lOveD;fZ(hYGxZJ zSgM85=sG}Y?mraBGl)RbIs?O!Mj1v1hRnRQ{E2n)YOsU|qXWEI*+5E}flvUbu8A4M F0|5S(Q;Glp delta 780 zcmZ3%`Hq7xz?+#xmjMK})U-!U!mzW2ZVPJsK8e8@MCNQw8GBY@_ z3JNaBS6G<;Fz46(<1F{qv{|%i@)}LCI3YPl;!&dAwF8@74}~6iA+Tzf*!J)L4Ug@e ztp4Bq|A`W(clR{+e$VuCU6wJifOX=3b+CnBIxd`;tjDNde}@rbC5(pHC_a^sp=`Rl zT);{jiIr?^Os%;r!RDI1GiK(m$+&&Zh2hpoo-kWBI|c^^I|f#-Uw=-TM{epm^dj?p zyKc$`iDe6Cf3}~tw$-3->x%okto{_-j48HXxIMMri?TLQzTGiGr$@zZZ7Ci(XJ?eEm+f zU8;}#-}4t8II!tT%{}SqVU3|W6MmoFw0yJ1YNA|82Ff_+ZbwN*-5*30_A$xLz@e zf8alGdAZfGHGLmNSe~lRUC4LA%qnfgE*YtmvjKrAZ?qz^v*T+C- z0{e3QL|29So(=2_3t}V~xG%8nsPg|1dx_D9!?&PAEar5J;>n;LM;MYT#OoL|ZZtmr za7Ce@_8^*21$Z+u=`te{;N(fn-tZJS`6;uFH7x1DXmlN*l=B}7 o%4DPgwg+!S$t9$&H9#OcVdBgN>52d8sm4k5Ru~lnG)O zjE0yc9V@`FOwvy-pj+<7wzEfWw-|7JbDW)KZJhn4b(4xN%S_wvCAw_euf;n;SvP2`6fwC`6p^yo z{YJuL`I^WnjcxO86wR2Tp0T@W(Qp2n=EavBZ)ntHF0u7e>PlQ|;AdU%eqO={V=Idl z?=MU_``JVNL#WNo#mi-88~q4#ldK7JzpZ&~+IAD0*tzwL%X3odb3SlBS)y|P*V5ge zYqORnXqoyU-9~(2&aHF8S1Yr#0 ziH3O>JC99UcTD>Af;h+jtvf&Z7T%h>&b>KO>cLW0h6AxY7g)D2`kC51xWpXeFwbGl zs~h2xdlsZGzN2cD;Lv_(L*D)Lt&dx}Z6|zF2{Ad;TFhqcJ$KSBW{uGFzT)lPmRAi! zvgc`}axh3T#6A&QJdZo4Amq&iCKs(K2?DP@suf@IJLf1iUp0`mJ;oQgP3(}xwNv{_OSc^M{2r6tp5r~+cvo`fx~&mt7T(+-b5L2Dn#1hThob&Db6Yo9E`rSqoE(k~SPX6>Ir(a{& z{t30lFXUQ!4^4NvwQzBxz%{2CpZph0VE*T`)296key z4#|h^cX@qWx_?K1$(_vxb~)#FemTB6=Go!za<45y?YbY_JbA!E_whYj#?Qu9C$8|j zD>QUhFvl`DZZhBDQ~uA_*_1{KKU5e zjsFbki&y@Q7Pe#g^ze(~8jdA`_1hR2?zA!{GTvecUeCGD+p2+cAt&F(rrMbYjMNrf zxb{$px#wZ*55@%v?CaXp*&cosmELjTT*CRF^^*$OH-xYn&)F?o+OzUmx{5zDlbhUu zxQEl$DG4W7Co4F69Pns}+8_|^AtP}qi;;1QL|lWw9Z$>6vW?0%{YLA*cnb{kj zx+Xtkwy}mKD;SNcr9BFic>Y6yJc9@{F)}bLX_T29%c7^1%TUejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{Dyg449svjpy5D0x&?{J*@@|?#<~W2 z#(D<2iAl+NC5c6PRmCMB+w!5d!Dx-G`hOD`*map1oLmJ3C)6_JSccqxH*bnJ)9r8G zYee|AEwQ>FHBaHwLbvY@M_NyX9r+-jcRJ$t?!Xf>>izSt$v5{Ht-JJpchGBD+Y`%@ zw*}l};!;pByl!#*=6czRZjr2m0=HG{9ITYG0~ow7|6)RQ{`$?6#9+>s2Rc79FD;*d z`^A_b9)Qsh_e-Y=Fg&~IC+TpVxyo(BbhAyXnM&Fo&aL6~9t_3{ zTIaE?x?N}g@zT9Tiy|zpSG%TPIMe#c=l$PMm*+el3FqEfe{bNDxGuFVj3K-`G9lY z^@{2vJHEC>-4Z)m$??g;K>?z)H3 zq0IX`udTTkDfHyy>XpYAHD10^oxN~g1{TXkeB;J6YKbzva(!wuTpW<{7OkXKxq}^^ri({YXT&3hotF3!=zr1y`HMq<0>`Z*8a>gz>(=S~eak>c%?}{4ME#fUG{oXKL zZo#3CEJ~rrw|iM!n%^r_{$d5Axd7X@U*^l?-FCfZlz!=CsvKicZjipRgT0(#iKI{A zyRuN(=&jE?f}I(DFucgxUNY4;pn0*9vz5Tfz(&Valg=c3`-h8EP`1Q-8l4YhcGS{$Rs@zqMMJNFA(O-Ffx#nO9H%E*+7Oc1EB!Wh-PLG F4*=bg%Uu8f literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package4-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package4-0.1.0-h0dc7051_0.conda index 0d8c91be3206f1bd9a602fd1f381222f70202a43..7d2abf95f46073f58e8c4bedba907a9b986b15c8 100644 GIT binary patch delta 593 zcmZ3;xtNnLz?+#xmjMJmSLnn{BS%BU_3vh&Z0j@SR8K#f6UasZ3<SuJ1&GhWd**w!WMQ`8qqpEem{L2UG)O&=NZq_*e zLvyx%bS9JiTh0AzEtaw~f4ld97tPYh;; zY<4Y-Zd_NITyyk4GA>b0krZj@>}+NX@aAJ=(q%@(^5j}(Z+J9MzQF8k4U1nG9pH_s Y11)Z#se*xFNu$bSKNerMd}fdk0CF?+M*si- delta 576 zcmZ3?xsa1Dz?+#xmjMK})U-!UP0Rz!FfhPqjjj5B6ByW4nHii| z1%)P@XAIDPotSXvZk0qz!_iH7DZEBgEKW%J@l?*}H~o+^u|U+&s%6!>qksSP8`dvg zyu2jHYT3n~_c@k+&-8O$mNBt_buv4nI@rbu+-vVmHe(E63X7QB!KlRM%;3Oq+I{jm zM&sOHLb+$K|*MqeR)BUe+Y02^~-Neb2 zVQ}t+j#Tw5mRP=r(KUOw9h8W8uxjJ-z;Myj`DN&WXABvVS)FmHeh-ol8aP@X_ zhLB+;GOBflI_#M_2aEDH0-_U9JL6OHGXn~kcQgtVDVU((Z z!|R8<9ELkp1NglenRJ;Ekvh4a*&80KlP@tlTf?FgMhBqj07b@sC{SY%fhGb5h9!+k NlLJ_M*>agdLI7$C;D7)C diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package4-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package4-0.2.0-h0dc7051_0.conda index 18e37bf5f02f9e7c17a95b431d58bc1193aba5b8..eb71d58da496fdc461ebc635a71431ddad066417 100644 GIT binary patch delta 628 zcmZ3;xrmc5z?+#xmjML6Rp`V_|s z(?YlJ4o6x~g&p}Ipm#dr_iwKgGwRLrugN#}7_GbXe|OMpTiX-MlD7riWSY#zs17zv z>ok+YWK%{nna_-1ix^YzoQllS zku+HG@a6l`PP1b|?1yeVl~kYLHtYGk*KRSpm(6ePE9AJmPP#MDtVp{iplH#oeIc#c z%=Rmf^ja19m~Yt@qCR^@gIKD{T-W4)$uFK7xb65+mD_E!;Xr6|z~XhQCe&_P^r!7~ zaq%U`8`ri@Y>9QMm*Z^QxI{OeV^XDF;*qVvd;jRV^-ar8@0OdkDSG>+A5}-QRg{wt zKR|_8zR#@rmMCZ91%X4IMQu&S|K2Qe zXSO#^E6M%B`}=d@49mGM-u`e-KEB-cUvseC^2$~IUiUxOZ!vn8*|V9;%l+=-dHr$9 zJf4#`GTGI4wC;GkbHnBj(%fthn6@ykJ9P4_w^ak@M#Zir4e~5A&T{0~b5Gy7VA5TXA6lv(}Y-SAb=3`{iWk#fp$+gVh@We6s h0&_efa?M#>)L@YcqXWEI*+9|F41{vPh|gmN@c?4@3TOZT delta 638 zcmZ3)xsa1Dz?+#xmjMK}*0e`WFj`}){@(-!aaVqZFp0_Sj4JgG45!7J+E#yh-E}?s zVrt`tshh7v7$pQ8zI^|+P;QSZU(3eR#(oOD7BA<$c1tn7YjRQ1XLp{8+szYeKRBN3 z%=#51x{jA8>$<;I;o?4-%e-rKubxy>Ti`0`nSN2?ib_>wPr=8px5QEt8do1%;1(OI z_&de*C-3yt(&Wxb@p&j+3PT| z`1K8UZGKvn_4IDmIR8U)wtjRvlk;26{cCNOvNEyVf57o7Y;S(;Th2rQ#TMbGJgn(| zZo2lf)uo+zaqETjx95)yimfi*{@8x3&%gQ)`|=vU&mr@t?0fz{BlXT@iS(%)eY=j^ z%I{_Kn!K6GuAYON`JreTLtXMghL{Gk16OY+SH5I7IB4cFG2}xt!)D3Gx9Ja!#6yaL zI~Z9u%04-{pkV4_M%^3RIwnNKR9q8K+oF7p;Y5hzskxC}lF?++4 n$>fX7@n8-pnkQSZxTwM66h;Slv$BC=n;8h@fbpKo4B`O*CJF?Y diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json index 04817a80a3..fe29ae287d 100644 --- a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json @@ -1 +1 @@ -{"info":{"subdir":"osx-64"},"packages":{},"packages.conda":{"package-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"b2a0b1f016848baa6ee06fa4d3e0422b","name":"package","platform":"osx","sha256":"d98f2abd1199f3f0acaf7430d4867dd37c652cf741f6d0822d344a4149bfe892","size":1238,"subdir":"osx-64","timestamp":1744040261467,"version":"0.1.0"},"package-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"fe1f8ec7f9950272755bc4abb5545b13","name":"package","platform":"osx","sha256":"021dfaf6f85c52fbe1d59911d55be7e49a28f7630a6adf26467d40f5f311ec70","size":1242,"subdir":"osx-64","timestamp":1744040262703,"version":"0.2.0"},"package2-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"6f0c0b47d1bc1d202630776f973fe14d","name":"package2","platform":"osx","sha256":"9bafccd7aef5105558bae690e16e5f156f431bfc8bdaeea17e7efcc75404b3cc","size":1171,"subdir":"osx-64","timestamp":1744040261467,"version":"0.1.0"},"package2-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"813bfd14a6151b2573a298d67a2f2650","name":"package2","platform":"osx","sha256":"441668eb6a08a379dbc365ae434b8693945c474e07a20cab7796ca2ca1595a9d","size":1169,"subdir":"osx-64","timestamp":1744040262703,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"4025c6edca6c10a8483efdd2ad30ad3c","name":"package3","platform":"osx","sha256":"031f079e5165914f7d1d1862f32f0926e23eaa9fa1dc0a5c591ce3e8bcfebb7b","size":1134,"subdir":"osx-64","timestamp":1744040261467,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"11be9c199c2b839e6005ea2137cbcf03","name":"package3","platform":"osx","sha256":"7de06106582a8dd00a221c364bd99f4c84c3d416812efa65c0c6db041decf40a","size":1137,"subdir":"osx-64","timestamp":1744040262703,"version":"0.2.0"},"package4-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"df313d53fef438a24153aa72d14cba0c","name":"package4","platform":"osx","sha256":"90692fb9ec5f80243cf82be47d55d2293460941492321490242b51cb90c0dd41","size":1185,"subdir":"osx-64","timestamp":1744040261466,"version":"0.1.0"},"package4-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"4187c815da1ce91017d9e75332db1d4d","name":"package4","platform":"osx","sha256":"5c719af9b6a665b6b76fea076ec7a089fad8a5c4d98ddea0636399f1227a53a5","size":1185,"subdir":"osx-64","timestamp":1744040262703,"version":"0.2.0"}},"repodata_version":2} +{"info":{"subdir":"osx-64"},"packages":{},"packages.conda":{"package-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"4bcd4a3e4c328afc3ef628346e3245bf","name":"package","platform":"osx","sha256":"9a47859a5ed1a6afbba3438b873252adbc2522701d2ec8239ddb96b881f87c11","size":1254,"subdir":"osx-64","timestamp":1768230458310,"version":"0.1.0"},"package-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"294c5f5838841438ef8313833b462cc0","name":"package","platform":"osx","sha256":"c96fec82c559639dd25a47f04dc8c47e47898137b07c093d17d908c0d073acca","size":1256,"subdir":"osx-64","timestamp":1768230465674,"version":"0.2.0"},"package2-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"d4526f5b4a4f965abd23226c91a1208e","name":"package2","platform":"osx","sha256":"521251342614d04a94773cfc35e2fddef9cb24dcb1f57cfd643089d2618768fd","size":1177,"subdir":"osx-64","timestamp":1768230458310,"version":"0.1.0"},"package2-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":[],"md5":"6a6594c69c40d7fd966fb3ed1b89990c","name":"package2","platform":"osx","sha256":"5cfad75a0e800fa9ec529139ed4f92f8e7a7ec64ecdb4e54a1167a7988aadc2e","size":1175,"subdir":"osx-64","timestamp":1768230465673,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"d9cfba1645df20d27b2b73766c07fa75","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.1.0 abc"]},"sha256":"2e601adfda4dec839b116f4010955863856a8b7277f1440c25ff2ed9b8255be4","size":1192,"subdir":"osx-64","timestamp":1768230458310,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"215b99d1e1a5f07a8de96e4074e1440a","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.2.0 abc"]},"sha256":"76da3085a156423edb3d873d01aa092021f01a20977e2665a264485ebd14d583","size":1193,"subdir":"osx-64","timestamp":1768230465673,"version":"0.2.0"},"package3-0.3.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"3c77daed94d0552e306f8868005e225c","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.3.0 abc"]},"sha256":"69ef6a7bae014e78cf0880478d997782583e3f8afe1a4edbf520a50bdb9e6b74","size":1193,"subdir":"osx-64","timestamp":1768230468920,"version":"0.3.0"},"package4-0.1.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"d44f6a0716f706555964fb9d187fc845","name":"package4","platform":"osx","sha256":"1f7a03d744ffd834afd362ff446d89fe5f75d525bdf13781222b4c88a3f762b4","size":1187,"subdir":"osx-64","timestamp":1768230458309,"version":"0.1.0"},"package4-0.2.0-h0dc7051_0.conda":{"arch":"x86_64","build":"h0dc7051_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"3f02b063e620d6788459f80ee2d2238b","name":"package4","platform":"osx","sha256":"24b42a23b74d0273604ef12a18ac6d386ba73be353954be94538cc7e4dbba415","size":1186,"subdir":"osx-64","timestamp":1768230465672,"version":"0.2.0"}},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda index 899777b063acffef0b801257c389a4a668fe5e77..62a42e117a1a7cb49588e3511169cb114f9d5d57 100644 GIT binary patch delta 855 zcmcc5`J9t4z?+#xmjMJmRp`V_AyxfYd(TIJ}}PG(`W{9y0tVyLlnjbkZO zyXLRoP0P)**qE8771d1(;_BM4VbQ(c{+p)+DRc&1PT%8URd{x${$7*M&(2T2es6BQ z1-tc5K{t+1O0(=c=43PPa5D3sc8+yjyT6Hk=!^A@_q0N9b!}K?weV=_tjvP0LQ4Tt8t(4FBclM;B}_)4l6w@42w&|C!Fs z7f;M_b(6k+TX-15WkpZR3>x&91&K^g{j1)lW{Gd2nmzjIRmJKThhe72B~O zKjmYHq?~NcI_d6$Le5_@T?-$qHD&$6$9V1>1J8!1-JkaU`cN4=W6pb%S0&cv5!GkT zO8%dIRQ%?Kb@%_-4G;A;sP}X5)C=h2$VZ8Nfskz=HJ_n}-o-G+S z_w^(^v_J5XZGyZ1LNE1e*967?w0zOzvgTQG+E(7#-lv S$_7%z41_X_3=CVDK|BB#EL!IP delta 836 zcmaFPd7qOnz?+#xmjMK})U-!UPax6pczmvP`%yj#k_Zktdh3aj4nsrz5ZD|WwT&?g(sja;r^4P8W)18j}vHtZX zd*RjzA4~t;4~}|&Sw7{mVf2ce$*hdF93Tq|SRaW`_F^=xmuG_538Nuaimw%5m=+x* z=g=*8<5=o~{Q+VheKY*NXmr_e&%QECzOGazdKw$6H-k5W2g8}g{~hHx9apC4Ugs29 z_Tsa4e(@EZZU^sbdv8@{)d;D=;(yB{y;S*JR=(Wsr_kqdLaNw(p7ZoihAdXa?)CS& z`<{46Pnp~CN`K&{l}{6x&FiUh1Uw}&t&p#3xEA* z`XtX=Ci~w{uzP)kd#>M)9>W98J9kS?Jvn11Z%t;&i#77GehLj;9=$!+c%?dC^Y1#l z{i>lELty)fdQOhjo>nc2tpdznnhN|bZ@sMGJ>?o>Pa~t~u>(g>G_q}&{dn5p&53_k zv+ZWrUlHAMeaVMwJCrQg?j^r)z9H(degg}`0bPj;2O}NK8di$u-%*ooXbEUxzqqMZ z^5CKW4Uc&kdgmWv2;I<_!MC5ot76*1;1!+;-z6W-%#uETmr=+0FGFPU-o?8NLye4{ zXgVA?!F)se&ZW>4rknzv6b?=a&K0cvH^Lqrm=MOzvEb+jrj{93gaW)7nRJ;EiFoo+ zW^Y(3o-EGdtO85EFdAJ0IPul7h;f)RGB9N3rR7hoQ&oc{Ko}k1&B_K!n#@2b15~$` H8N>qs9nnw} diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda index e5277373d32cafaeb8026f78938cd8483efa810e..8611d10fd1b717741b4446fcb2b0ce4f2350f1d0 100644 GIT binary patch delta 745 zcmaFF`I3__z?+#xmjML6R_Me`6T4g@iV99xP4~j7)UBnzVq|hrye{gW;cw;L!zBHnCmh zlv#FSJ@=n{7j|Z*X+?F@g1EXiY*=*fHGiy^<^-3OCynD&=I%Hy_1aHj+048%8(USq zH@~ZYVteCcuYuD9@rz#^pTtO4Zn78OA!p+lyJ|xG;rm)w^Iao?=U#YZc6UemwEQ1? z4(X{SXdbG1@uY93+u!W#%@>|Dvh__<(#hzW^M-5X$*%^LaXpFa;=Qk%@$>PgmgM`* zd6%55yKQ;@F|V2F0cNRU8cUCh-)-^!%&xvJ^v{#fqWULk1#e@{HeGQ1lQKPwd)9*M zy*l%>7Q3>??-o-$ta8G5-2~pQg%{=&bDfZ7niI)v;Be#4Z)3OVzdp%Vowj@#v*_@m z98){3m&G&Itv^_v5)9u03xrKA;c-6Yz;l4H!PMtCZ=+6N6nhR^S&M0$ZpH&PBRwwL z8+ZGx`On|@6)yRPDK20;#~ROrQOCOqBuv^DGA3p!>_5c9z_2vILC?W?Z`EU?mkjzW zvs`>kS$*y*{yngfZ36r94a_q>%2r4STXej5Cvc4`sAAqi<10oRetXYUh%gF0eR2nL z#42vCXI1W{$>E$Q1eP;2D)C=fS8zIbBI}J`5-$Y!41@x>ikkd+K7RMNVd5^|74=T6t8PV za~%@9?Dl^$b1#i#iMsVWQcF_f;H8e)pY2OEr&eQ#BKl3{_9e!-EN^ZFM~8DO6Si>UGVis1dCt5 zfuN?ZS6;>@-+FYb=X&>rFO98z(}Z*~y5{`lSb1~1!QZ$Z^XKQ6_RLlbKh_3CX-?srygByg zt2O5n|LhZ6Yb^aIYvs}pjQr2urCm^a{LJjb+>0|O)s;*)J(8k#W#wx8hSSY7XF)uPxc!2G4D!0+f*{=FT(Rt%gA zIrtZ){x)iA{m*z@l0nM8m2p)9^F^6D!6_efoRjS* zCa+3KIT75@Fp+&j_>QHkPq5s0AaO!K$UrE7TW;gpBaMn{#RMF>AF^^7u2c>1W@OT3 uMx?~a$C#ksL+tZgG zXg%*(+p?{X;PPC_V@K3xwckO;8a@#m;97D3zq5E zi=<@p?zUgvQabCihH&O&!KqnEOgFM3zQojTxc_M7TAoucs}dSDw@I1Ba-Gr(^{YGl z^~{_%*ArIflq$Uu{N%xvt(wEByZAGQa?aEjU)M|AjLeyPCh>x!OzQfG;Hb=LtA6ZT z#2VmsW1g_bvehSz|E+u${n97lJDa;r+}|hL9Nv0_``_mBY`pN^HnXU$$@t$Lz6S^Q zobP#g<5kV#L(dmlEMT&b6qm1AV61!W=frOfez*LqxAo~eUGSDry#7y3MSkgLPEUmi z9#7mRuVs>`Pe~}1k2o=F)uIz`%JO_JpN z$+mL=w-3BCKC(GvV#*!H8CmU3JMRVFjnLwhY!Xp$c*1x>G*ADfmJy?wA)8SPvs=-X zCf6MQM+;8su5sNWCD$Mz9KjUe&B&z7j7US1^O(KiiD>dc=6Em%lu9ORu(+tfk_3zn U@MdKLB^G8NlmjN4bY>6_0PqwTWB>pF delta 630 zcmbQuIf;`mz?+#xmjMK})U-!Ucor1cMbh_9Sx3_Oj-82k#*UPtQ#eo8oNU*fAU^8?tUA0cwJ7Z z(i_1~9$eX~Ih7ipGkr?r5?j^^?foaJY~8(fvgMhB?Tg=tW-ryuUD@?sJ4wXkv6NZM zrqIdhe}d0$zcll}JKnyEJ-<%ou5Y{R!tdGm;a>HnCp@g_e|B0nwAaj+yu9)1Pq)_d z&V>%F1zzIvH49Gn71k}ubx_aszx_rmzGXprLQBkNbH!(YQtk>9JdSuw-pC|TzapX3 zAmYTVRf|sC$h|mY+4TKl)45rH@ISr2;=;8ZP6ljynlCqO(4OFSgNdO)oUMg5gV~2w z^|9JZ1`(z}IhWJVjG9{iGar|7keYLdC*f%M0}B}|j(1hpE+}5n+why`qt4c&#pMjk z?ki@mD-SWB=H=9;z{(*|$xzf9y{pTo;jLCrBhSNzi85Og1aD8axUl3ZTT6zi4TGZE t29^MCMkZZmM0%NA&g>0OFq2O)$0JgNA&UzqEG0aiT*o5L7RL-q9{_X!3?Tpj diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda index 2dde3df0b122d530abf529d930af1fb0c25f77c9..93cda31f6c111d84793dacc0963ffdfd101dd6e1 100644 GIT binary patch delta 639 zcmbQlIh&I&z?+#xmjML6R_Me`GLO%?Q@U0HZaw>iA4h)RWTW4*%Ql|Q@wdpj08JBgwPWdKcdQ6D@P{iA8VGd=3 zUC(DsT=uYSesf~D-UsCYVFTH!yD%psL)rQMMuTIJfzFvGk;J4XzixU&|t>&Nn)?zb>DcLhRj!SlD zN}Ru#qx#dW|C8>dFBH!5PmbGi`R(eBpG5Mm%-Xi^5$A#)p7{=D?^gY~wf@=K%L`j- z^D|toT=xn0<@Wnul`iJl_(7p1*w)rW(M zI3ML7`)%lFHT|Aoie1(DOVWRm(=`)f1Ps~T6&83rahbfHNuoX_pj6)E#H>||PP{40 z^SOMw@wEj%kJ%lqfG^zwHI2_KN)+F4wuH}MUj^(cR3dZa|mQ<;rZ1;h?-a9R8HMPjxpU&`9olIj!O zX639aRo;|*o>N+Acd4?#DL0)~elNd(K7En;l02 z_-tj;oKx=E z5c=!&mZT?X8?Pqv&gQd|NnIbI?U(5tTC-Bg>cx`m8v^ITeCHX?&D!^ME=$>!2OYHfq&Q893mR*or zvLc|=z~scNRf|sC$h|mY*>vXXg?5rTJ3<${;8(0*xOecSQ+Xn1`TfJLrhy3 zm)*O!!^7$TccTXX%GA$BOs)T$9`h*l&UfNTXf1t^WsxKBr)t|m=M}LD-z6VKh9(%j zWAG|elELT{aEAJ&pW{2Rvp(ZRmLGA(L@Qi_vKd55Gf4 yrXFK}HzSiSGbq8ZK~l`*a%OLMl9_ypIUbQn3|U+_VTt3>7$^Q$2kTIK@QQJ=9;1G}7!%ku1{kfeRsU}SgLJ9@Lztwm zoWW|F8{2rbo78fTe%9T5F(BYT{K`d(74}ptS+Iz~$c4d`!I{A$_=B*)o0nhJ-@kaN z#dUb)y@kgFn3ARXH(cYtdraa{MEAzObHlTDsy=Q$zjLd_k4LlfeZS9%4hq`--4`e8ZPr4>EibpBpaA%~|SYe%&f?oz4QoWsc?bJ=||z+)8~?NL{ayb)cj^VsS1lKPU;6xh(ZXNY za&F>g`9%_Y15388%@p$D`?`FVcif{{^Nj9W1gg%hzvLS6(#i9_<+P&vH#ds*TX-~n zNa~sRrKhF5@Aua8Y|L#HYa-_Ll}EaP@y61h>OcHKBI!9MI3YJWD> zcTJEr+_#;9QKSCEOf5;tZ!AI@j~Fr*GPA5OW^}x^rb{Vxdw6nGEMH9D=K~2Xh5NjY z2|m(usO6JwS?W;N%E`d6GU0%pgS5h{tA}rRvNs5nuuaU8G1w-*-byB!q4jLKkmfqjXtZvXq> z8O^)!zuN2dUz-!llD7riWSaP29jrqx&rEc(9;1H!T}H5J3@}<_tNz~v2JyLk3~u7? zk^$G5|M;vG2;`V6SDl{r>b{G|+T%x0Y`J;Fp22~^jzQ|%@6L9!Zz8RSHs4d1Y*y8p z6kYj#zMNz-1CwFa{hw?;4-Ra(WZ7u_(WcLv(dOlx1AC9Lm>ttxlt1G$t5~jV*Og86 z#kspHWlmh0t$bp|iI*4mNnKwN+qP}m^&MN}t@=)`IN^PG(Z8^3Uvx6>tIoT6&U*9O z*`5DcS{Q|s6}n}3gTxQLPby`8nH;+6q2ttB%{ynl+Juk&7s@9@r#C&wQs;A1nBZ~5gX=Y; z)Cc}uXO~+YTf_H3kE6@e%0>1-Zpo2^QuBxtvsNuSaU=KQjAhfAuNTTm~~`z?+dtml>Xf7^5anX7+|BqRG#gBM|Asjm1_C YmM&m)fHx}}D8(=Xp#U)Lcrk-`0Aqs|Q~&?~ diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package3-0.2.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package3-0.2.0-abc.conda index ec6d86a0132c48459468efcb2cb8fea571c13260..3ae8d498f7a2fcaca67d32af3e1268098c406abc 100644 GIT binary patch delta 789 zcmeywv67Q7z?+#xmjML6R_Me`XJ*5>^finC#?OZ;QCUlBc&3QR43@!}L45!^0 zo!80iek8E&%_fUmx1zIj6b+WYd}&yA((ITJ`=N+$YxR#P2HO3YI~OeFKUKeP)hln&htk*9E|(Ek_;by<-%_`JsotL(T)y8|H5{9xcJqyap4_4B zCp}a7bxN+zxV$39^|t!!oB1d9-CnG3^-`xs-g9@0%_OE|Pj25SSIpkai2KG^#&_le_r#yJ6AtM zU-tfk4$nr0%s4u$8N$^ z7u+xMiu2 zX@`#&Yojvrk?uR6LN*>)%iqfPg~6kND@KKjQ!2n}LH-8@XP*Q70p5&Ey3B|~IXQ;e z8=fjBuV=PVfh9*6jjjWn=J;8}IAj?a7&7zH@+a2GtHIJ8j1KT-Wdo&1W*`&*s%vHj F@c_)oF=qe( delta 745 zcmZ3<`H6!sz?+#xmjMK}*0e`WwIuxGGkm|pa{ z%YNFT)0ZA-J?~iCvO%hC>Go^Nr>=R)oQS$^?5EJXiiv3*H1h zePSMS-e+4i@9s@kJ2$wWP}W>Cb;Hwz4T_&-CrvDrOKe$tso3^c*TlI;ubq@pldZ8h z6}K^L&ZTLqe(Y;1yx@9$gW{B{PbB|`d|rFr=fQV2_ki_vMYowe8|xYFS6_O`~Ux;(91WDn$)97!lOk2o=F)uIzOaxczUHa-4$ zkLZT~jQ`vof6G-{#ryQ}1*aP_9`)-tFfu$4mD7^T}dieXwrK#VgAI)49VDyf`@2lg%nD;C5e5Q8rWO4~8 zd}4UQwY@}iCc|w>X30a0%9dFNmA0uDF7RB<%W*NQg2Blrfiu9Hkx7>snz)#OscQ0M zW^Z`%n*5B}#u}EcU^I#rpbk*#`40v13?k6f$iT3qQD$;1i<%lNF~R5nZ&o&tB4!{I L046veW)KemKHw|? diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package3-0.3.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package3-0.3.0-abc.conda new file mode 100644 index 0000000000000000000000000000000000000000..e377cc05775bbb8d8c12ca4d521a77e4e7b8f58b GIT binary patch literal 1193 zcmWIWW@gc40D&JBIx(jiQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{Dyg449svjpy5D0x&?{J*@@|?#<~W2 z#(D<2iAl+NC5c6PRmCMB+w!5d!Dx-G`hOD`*map1oLmJ3C)6_JSccqxH*bnJ)9r8G zYee|AEwQ>FHBaHwLbvY@M_NyX9r+-jcRJ$t?!Xf>>izSt$v5{Ht-JJpchGBD+Y`%@ zw*}l};!;pByl!#*=6czRZjr2m0=HG{9ITYG0~ow7|6)RQe#O4&yI{_j2Rc79FD;*d z`^A_b9)Qsh_e-Y=Fr>}&m2|kyT;+D*RjA7{t_zZFf7z+ zXD08{aNG9R`GlpFnFAIGE=@Y4s41zNwbZnrqocQ@ zM^>uiv-|d+i!a?^Sj4n}Ej;9qL~%pPx6^e~Ce}8-*VJ%0dTvD=M-HcYKncT^Hw=uY z)D&K%UG16@x!!Hdu4UV0zaA+$FxP%1+atZ;`;Lw4Ieu>CWN}!<_J-*eLtw6)!AnM+ z1?Lo8zVfbS(OB_{p}3;>OAlXjqO2WH#*vJ28xQ5ci=wk1-@JD3FZ-O8ee&-arfpNW z9`k;+)iN)oiI?0SykPivYP(ISPRG~4i;A)WoB>VU5sI$NUhH3ZWeYkue=r7kGcxHi zxCDDyT&vppoVu4K3GaJ+Ik_ajo0Sb@2s0200F7v7 G2Jry7FUsWr literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package4-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package4-0.1.0-h60d57d3_0.conda index f7c786b8348d11a7a8a996d53521f7382e1989de..f95ab1c80c99bbc1b0168314e7a796d9f47dc118 100644 GIT binary patch delta 816 zcmZ3)xsa1Dz?+#xmjMJmRp`V_+i5d0( zzrOBwbdwB!`9F5$*LiX&mkpy=s4<944rI};|HKHfA4Ws0 z7kA}n5S!sC5%B$wPfFO9B<}V*GbL@iRW*K0c3XBlSwz(_m z&I{284YW%EI8q^%u(A`qrk^XJ>l(KhvPP`e|S&t zII!p(bA92&Tj#D{oBuPUSElNoXLQZ!rk?IO3cUW+xo@|Pzn5yk^{Z`9jp{(!~A` z_uu=^7g+hb`sd3(H|5*6E!**qCB4eQy(#C#i4v{Z_jptS6mqrW(RXOACvN0 z+-uOt-93Nd87a{lzrs7}g%0G%ND2J5c(T(Vl0lA@xq$H&!*ZsRXML?0T2CmnhI}w? zicMqL{-6E01cRzwtCWJkCC6txUZIxu4Xl~j9Nnzq^Acb1Y-KHrceZiP{dz~X;idhF zS+8ZU_O6^XQPH1~$xZG++(WU&O5zFD$qDTO2RvG%K6K=&^3A*REXrxM*h5YZ!=0)D z-i%DT%!oufxsKTzo=PWQWOlZOB~KWQt^+M?K@&9t!;(hj$^I<5YOwSLqXWEI*+7bz Nflv;Z26LG~JOHJ+Nj?Ao delta 808 zcmZ3;xrmc5z?+#xmjMK})U-!UHdKfv5ta$p~Jb~%>QntCm8$O?Vyg_8g)-O{ z>0GzDWoflVD)UtpcxFj3N3w{-D|_#IHF@jSGsf?&UFUBpS@Lk{{LOv7agXopJ#pmN zmdm%A)58DFi@$t**;@1U9(7OcIK9rKc20HQSyfcO&HDV0d4`UMuSBgbP3`}1|Fi$x z4=esu-+DRu@cx$%XFoeNam~wGy`m4#v#f;uHr5HeC{kJ2v5jrX&ZWZ1+=}gY+glCn zS214oQkdXz#7$%cyVM8%U1yhD9b3cqL64)$)9Q#-gXqMM@~^luCd>}zZa!w^y|~w) zv0E&D;U6i{TT=Dm9O4IZWTXVjSTAYkFf?QzWQb`nI}mEIv(l5@K+(u!qR5|~gz1t8 z-~Mk*=4}x2OJw7CQa-`5IVkiTe}dyJsY6KzInPU3wcKLfeP7^w$ZVT(_JUvho1Rs< zmnN@NN#O`;V3^3R5WZvS>JuzC&PkjQ;FCBR$St?A^+==sS~CR+m(>p$ISdfBXie%UM`afaqHwV|3S|v9kelbmEV^kLg*;(}T(&qnApvE9FIgrJAay27YeOQE- zoWp9H8^=01clc>vck^BHUV?4TzW3Qhm0!XSKXo)Wb7F92aAaUSy!FnmM^~bXBb92N z+L%t`iMV3$_1Z5J>Eur4#5YyPIF|@Y+%3M_@p#MS^Nz#3a>y%cOq2wQo!J@@?C0gj{Fl&M_6+`YNjR%@x(B z<}v5bTJn{>IUSaH$WF1pG`Tb9q${%1kt>7B;(YPr#jb;0P_C8YvFN;=5 zg$ef^pYeEwTG}_TW@dAAv#Q%zKXa$!hXN jW@l?ydV(uL3=#qW_VON? delta 688 zcmZ3?xrmc5z?+#xmjMK}*0e`WP09z$FfhPqjjj5B6ByWanHij1 z1qCP6GUQl>+)-us9M-?k-I7o_INd|K%C-Qh^-t;{@X77+9#KC*)V!V4&!8YMs;?Om6IhzCz~<`)|=h%lndyVyV2HJxnIET z;EZjRrmI%5_U>75>RGyj;pW>-_Kplr3=RzW95Q-OuZb_8Hj9V(p;mgQZtDhxHqrdG z-jmlZb(pkuUHTpmtIUl%ugyJ@cdIbLdsg0E&X$eB-ib#hiBBnMGrA$go%H?bmJNaK z{Z_nhH3D5@Js6?|CO@nHs&?plMV5AR;V!w1gf86<-|0pv;UR(l4u3r}r)+&<_%=78 zGR;nn)~zDPSoF=#sm|FD>bSoC=?TH))hU9-GSfDNPh0iFZgJrS*XtV;OQK9GkJ(?X z(Voi9vvK~NZ;z(Q@m%}etiCM#O5N8j%wCNQ_p7^3%5tCkQQWO`?)RGs6Lr^Kw10Kl z{ep*P!#$>YwVWSY4ww78sTat-D)M{&=k5~U-<%7VY&`pI%kzc75?+%xGuhXdv0l>7 zVQ9!c$Pm+DcHrvm0?n}b5n@h3Rm zk~)-hkn_BhRm&~r-S-8~hqO*AWG`67&-JXzy)=2HN(x6%1H(jih439qSD#?HaZcid z0H4IkKyJB>tw$R5*P1D~tbWMIVc4iD5a7+oq|1y*M3d{8z2T{7@+D?xYgqDu(HJ@; dL^uD30yPE^Xrg0aSkkCGIe^8NEsq%_1OTX&7-j$f diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json index 80ab44012b..36aeb8fea9 100644 --- a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json @@ -1 +1 @@ -{"info":{"subdir":"osx-arm64"},"packages":{},"packages.conda":{"package-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"0bd77047c86dc575ac25225ca3f132f8","name":"package","platform":"osx","sha256":"140d4b3ad5e09c5738af1a23787db48c83a0df3b0a49aeba0f91f8ff1e8db87a","size":1247,"subdir":"osx-arm64","timestamp":1744040260855,"version":"0.1.0"},"package-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"4808df06d96c348c542c51e48180b5ca","name":"package","platform":"osx","sha256":"8821ce8584787ae8a64515a3656717986c326092adfadcdf17201d0ffbe6fbb0","size":1250,"subdir":"osx-arm64","timestamp":1744040262425,"version":"0.2.0"},"package2-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"a62fe8892b0a6b3cf333d2ae36521f58","name":"package2","platform":"osx","sha256":"560acb7fbbb2ecc8ed4faf913dc2b7bf380d3ed9b783c007d3e13fac0151f1a8","size":1170,"subdir":"osx-arm64","timestamp":1744040260855,"version":"0.1.0"},"package2-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"f6d93f8764a0cb906e5b6fc65b4c47d6","name":"package2","platform":"osx","sha256":"8909e2ae333fa64ed5b97cf93e32158f7246c30e4d439e36efeccd296b655a0d","size":1170,"subdir":"osx-arm64","timestamp":1744040262425,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"arm64","build":"abc","build_number":1,"depends":[],"md5":"d1f116c46cd31c918dc6370c8b0206f6","name":"package3","platform":"osx","sha256":"0851d0dad642858c014544ca231b7b450126af2b21e9ca44a05ebbcc2d0565b5","size":1136,"subdir":"osx-arm64","timestamp":1744040260855,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"arm64","build":"abc","build_number":1,"depends":[],"md5":"2a7f700d556a81516755ca764da1888c","name":"package3","platform":"osx","sha256":"d95bd05944462b300e50aaa5481b365004ebe4a925e899b29f03998f4715a2bb","size":1138,"subdir":"osx-arm64","timestamp":1744040262425,"version":"0.2.0"},"package4-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"277522af5cc8e91ab7ac11c1c89c2a00","name":"package4","platform":"osx","sha256":"93be7222d300b2964a17ecf376cea53bbdb929eb9f19857e689411ab1931bb6b","size":1186,"subdir":"osx-arm64","timestamp":1744040260855,"version":"0.1.0"},"package4-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"f1ce4f1e65d8caba0d8c5e6b73a8cdd0","name":"package4","platform":"osx","sha256":"9c21707196cf12969330818946299d810dba6bc6fcbf482f37bcbe0243f43956","size":1186,"subdir":"osx-arm64","timestamp":1744040262425,"version":"0.2.0"}},"repodata_version":2} +{"info":{"subdir":"osx-arm64"},"packages":{},"packages.conda":{"package-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"a3104fda319bb098699a7c87738944e0","name":"package","platform":"osx","sha256":"71767995eed3aa03c2d054d34f750801e3fb683dc92dc574fa033e27972352a0","size":1255,"subdir":"osx-arm64","timestamp":1768230456481,"version":"0.1.0"},"package-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"7de36c66955903fd3c5afb8d4cf7ae0b","name":"package","platform":"osx","sha256":"8e57d7699c5d2a0daf49ba2454badbc5392c5e1d7dfc05b7aea5a6887f1bec7c","size":1257,"subdir":"osx-arm64","timestamp":1768230463820,"version":"0.2.0"},"package2-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"1e3d01f46bcf7dce150fd3a2c70030f3","name":"package2","platform":"osx","sha256":"ff6d53cea5b9826a921376b616d710c9510a9bb7c41306c73f313265e228abce","size":1179,"subdir":"osx-arm64","timestamp":1768230456481,"version":"0.1.0"},"package2-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":[],"md5":"d46260eedee4c21702c568b057c95799","name":"package2","platform":"osx","sha256":"a3467a7e3734b6f529ba2a4d6e362cfb8fd13330b2ec560feffc6d05ac81cb69","size":1179,"subdir":"osx-arm64","timestamp":1768230463820,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"arm64","build":"abc","build_number":1,"depends":[],"md5":"ca00b7184641571e13cb079c78a14be4","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.1.0 abc"]},"sha256":"94a741918518428b80c0eac4a0b85dfcd194008eee6683a5172804318cd93525","size":1193,"subdir":"osx-arm64","timestamp":1768230456481,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"arm64","build":"abc","build_number":1,"depends":[],"md5":"642a1a49c6850c8d0c19a960f0759356","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.2.0 abc"]},"sha256":"9944b60a4ef117fba13f60dc52ccc1d31b09ed330e63ed622f7ef05a9037d8c2","size":1193,"subdir":"osx-arm64","timestamp":1768230463819,"version":"0.2.0"},"package3-0.3.0-abc.conda":{"arch":"arm64","build":"abc","build_number":1,"depends":[],"md5":"45340603a280ee9effe83ce01c834d55","name":"package3","platform":"osx","run_exports":{"weak":["package3 ==0.3.0 abc"]},"sha256":"2b0997ad3371712c5fc4cbfacd41f33d84083a090ae2004b731d09918f844823","size":1193,"subdir":"osx-arm64","timestamp":1768230468435,"version":"0.3.0"},"package4-0.1.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"bb506a5b1830eafe0c7461ac91c116a9","name":"package4","platform":"osx","sha256":"aa692d1faab8639e3347d31bb1b4e729b2755f2c77c99cf99982e4ea46e26cde","size":1185,"subdir":"osx-arm64","timestamp":1768230456479,"version":"0.1.0"},"package4-0.2.0-h60d57d3_0.conda":{"arch":"arm64","build":"h60d57d3_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"2c0f9a756902a577818ff925cf10f562","name":"package4","platform":"osx","sha256":"2c8823fdcd43d8d92985e6773b6a1121196df1aab734eee2a2cf09613302a8c0","size":1187,"subdir":"osx-arm64","timestamp":1768230463818,"version":"0.2.0"}},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/channels/multiple_versions_channel_1/rattler-build-log.txt b/tests/data/channels/channels/multiple_versions_channel_1/rattler-build-log.txt new file mode 100644 index 0000000000..62c390a187 --- /dev/null +++ b/tests/data/channels/channels/multiple_versions_channel_1/rattler-build-log.txt @@ -0,0 +1,36 @@ +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230452/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230452","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230452/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230452/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230452/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230452","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230452/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230452/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230452/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230452","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230452/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230452/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230452/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230452","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230452/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230452/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230454/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230454","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230454/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230454/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230454/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230454","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230454/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230454/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230454/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230454","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230454/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230454/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230454/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230454","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230454/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230454/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230456/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230456","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230456/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230456/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230456/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230456","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230456/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230456/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230456/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230456","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230456/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230456/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230456/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230456","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230456/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230456/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230458/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230458","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230458/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230458/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230458/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230458","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230458/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230458/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230458/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230458","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230458/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230458/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230458/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230458","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230458/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230458/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230460/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230460","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230460/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230460/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230460/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230460","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230460/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230460/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230460/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230460","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230460/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230460/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230460/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230460","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230460/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230460/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230461/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230461","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230461/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230461/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230461/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230461","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230461/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230461/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230461/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230461","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230461/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230461/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230462/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230462","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230462/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230462/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230463/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230463","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230463/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230463/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230463/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230463","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230463/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230463/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230463/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230463","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230463/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230463/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230463/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230463","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230463/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230463/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230465/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230465","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230465/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package4_1768230465/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230465/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230465","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230465/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230465/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230465/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230465","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230465/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package2_1768230465/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230465/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230465","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230465/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package_1768230465/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230467/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} +{"work_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/work","build_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468","host_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place","build_prefix":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/bld/rattler-build_package3_1768230468/build_env","recipe_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes","recipe_path":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml","output_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1","cache_dir":"/var/home/julian/Projekte/testing_ground/pixi/tests/data/channels/channels/multiple_versions_channel_1/build_cache"} diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.1.0-h9490d1a_0.conda index 0ca12d5bcc938cc1f1d596da7c50a01cc73dc68d..97b8dc76cd9ec6e8472140641e61b2286b778978 100644 GIT binary patch delta 822 zcmcc3`HGV-z?+#xmjMJmROrM^RXHB9KCs(Lt9*fJi`4DU0`E>m{NAkJ=M`l57854t&?|RmlJwffI`0R& z?d=Y&(%3Og#dGGL{iPA5hYs-jGx#%jF70d28CYE-A_Cvno{02fROt%3oPH)Cs`Kp3a&5k{oM&g}YuB&e8(qk^tw^~i!bo|R zeaF0P=J|!OH*6xUBzMT!J=_x_UeEg_Y~`h}7SpRc6YeaVU4E-4Sz*QcGl}w)0Ea66|wy(8Z`NJ;;%h6RoS|%J;n9xmu{Rpnf|Z1_oux? zbcz19@-2zk&(64NXt(s&+qMW_*Lv|KwCRc3hEL~H3*N?@ZQ{4;Sor7CtE1ERO*|T$ zYoL3x`0k9Bi%VS@oDW84cO7*Wo3ocwV#f2Fph(%DcQe-dmsq)_Z;|}ADRS-&9DeFPBFV~W|}0K?qoG{{`vBr{z@hvg$W)<+}!G4v58MP z&VS(Y_N#_w41w$w;w)EHWDiYH>|m^OZ2DaJ?9W-H#V?q$6Bt??ANlQYVEXZP$HNc4 z(d>G+Dmep6%(<`K3e)&1`mDfI;SJZ4@Ec4F3v?t7u$~Jlytl){ih=XsGl4~{zm1w& z&o_I=E?{3~z&z)pY=ymAg22gGB@b;8|9QzA;N$gU8+W9jM>EH}s8ly6I0KytO*p;*c6`tax6Kfix|G1cnG{XhHXPrmm#>Cr*c z+nbub#Do+W3TL*;{_te|$g#qKamT{GpZk_bH%KTPe*PuXXNRd40+&`X2447)|SCn80pjfYBOT_5UU?h))$@2#X1kb69P2V_U9E@!nTD z{_#uROSEl&y=qm?r2nN6rAHcheHnZiJQ+fc`7N<`k~^8OwnbN*OJLQ@&)WH)zvy@` zUb$C!o6y0m8FqK(*jL?%>ST^w{cEjYhqAHR^*e$uE zn>*g!S;A*~(&59sYWA0sUH8s1@?_+!i+W~v=J)3BPM<$o&fe^I*Z5uD)@?=~uD;ay z{O0qWP|KAi+&51|R5J3vc$XHUp8VX*pmx=ksdcUQ(!CTGcr9_8Y$ZPBG5>+f)9YVJ zNIP6HEMh&BHK{M*1jiAEeF~31?x}v0Hc{i(0VxTF#0fKm?PoC572T=(v1~2#^*4W5 zHFnHy-S$tEt9t40*jSF&%r`~Z7#K9T*=ia$hpsWto6P6nWU)@Uqhlj=wjKr60 zT*;fzD!t&@hVBI)WSn1IIG6BtuGKpRpU~7chvMz)`!-&E)3YSgq2UDc1noPULQ)uW z(s@i;7~HI~4k~S%Y%yWkRmP+(QgRL*ocfFb-i%DT%!mX&`2@2!JcUn|W{CrHz{#tT U#hDY9tYjviWf5mv$qY(t08rvz!T&xll|m-0Z8B5Dh4s5C*ek-_pYm;K3rMb(I}|IK{om=|-xcBU z9f}=4X8-?Qe5pFl$7V-bbXmYjCLx9&g`!84Cy4G~Dqw!q@Y8NWUV{wtlXbsXT2`y5 zFJQ_M2v8{epjKC$D$Z!2!7yV6g9NIR`vtXbO!i-2=irwf>89uI0^wY|Li**&?ExZN@$F|Q-KHi!j>eAZS`zkK*h<;E9lw~CzmD{ql( zeLUpndDCbA6LK!@y>ahs+uE7N;)>3SHE$H_=j;eGT)tdL#kz57yk2wm)1t7N3ywTb zr-$k1yp)c#xp=Jj-i6X+o*q42I|k>*t=B}l+jT5<3mcg9nEl_;o~ZVDedN-u2jBgu z*>;>Wc?$39zGJuMu}QMazqqj1ZCUbht@MOP5@!Wo#=O4Jkt@f!JSXnjdx`kq***#r zJdU`zy{cyupK_f4z~${%4b2z=*(=0ZuByl$nxNRhSm)UEx$@bcvr3C!Fl8q&v^YNU z+u^|U3r5NE~227gTs}hldpd z=fP(Ji&%dfHMO2^_Ksb^zRZAm&PUk_d$k0Cld(!3+9LD(k~ze0Nv<&t;kmbi*&uYT zy*hjfIvlGAi*qtSj&ipUAmkuHghl8G}i|+;SURkFd|0V=`03h4s5C*ek-_pYm;K3rMb(I}|IKU0?sD^^bMc z7cbdI`Ty>p_k3Sz`0>H4+?$T7+(HTrg)>`ae|WNf0- zrgd^9gR{d_3xP|k7zA|>GjkYrs-n7B=4Rjd$)1d+_0mibx58+MQ^k7)7{u-b%LVkx z&0(1R;$OgGxtPq#mKih6ew&-_?mV|#V&*fU96ttM26u*Sc7b0f8Zk;-W7=?VNfWc` z-oHv_W`Y=TfQlGtYw{`ksVmC-FAqpy0|woaYiD?ZcUzg^R%V6 zBR2-MM(8igF6#qs>?vJ3Vz{{^>ZKj77|v^2P6LIzq1UGnkpRc!Y`{u?rvY@4L-^e@p3u zS#$R@u$FJWaBaU+;`);PtGN?v74{qwVqi!;*q~p~*7fmN>Ltc74)-zv-5t|fg$}T` zGfv;B(Cb^vpnZqItUZ>cC0*L7y^Jlp|7sz7!YV7{Irh72OM4ckrK$KZGdas8#6J`Z zn#jK4pu`UWHVMrYtnD|V9vzq-#>sJ^s)E_cCyz70n~_PE8IkfQpJ4WeC;iFNEKVx0 kG!LWEb%0Y|Ba0ZL+2k24I-Ia{Cq4Nri#Xc~W>9Jb0Fy^jod5s; diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda index 01a8811e77eac6d75125f6fc65eabc660232e87c..f7feee980aebbd1a66a304fb7bc0380f04efc7f2 100644 GIT binary patch delta 723 zcmbQnIggVsz?+#xmjMJmROrM^tDa#J0Mx7P@yMwo*`4_ zlFGiqyBt&QnmnG@&DZ&Mmmo)~^7cb)s>=0Rue?QLrQc*;59TUN_b=bd8lZ6Xq>{!0 zN6V#~Gu~thl~|_SiLTkZ%~5hk*u@){SFG;ZpQ;R+EwOtL-ol-0SWJ0 zLK6!)<=4%9^)%n`6U&x2A(88r=57;LJrY#5dh4Sp`=%bfuFmq-K=50#%uS2#Pd)QD z{oFKF$)Nr-tGz>>?bGQ2@1x_bITIh;s}_FB!vC8U#baiv92*>96$y-yDut+&wU={j_`sdJlvk7{eB zKorMp=9i*o3=DTznRgwSsdeq}4o~(5fh>WIQ5*D?BYxQIxWZa}KqQO7WJ7a&J3Eik zUDc*7P7f{H3Kq^iIB#K`%45C*A*E>+<<+kwg3q4wn8n7@VB@g+kZ!E2+JUlT4s8Vo zJo=(Obm*$seJE*o(=5toU}$L&;LXUS%Zx~RlZ%+W;c0L3QRa9s2b^YfSX|U#X$3|H Uc(byBQV}x{$^p|;7Bh$k03eVhzyJUM delta 697 zcmbQoIgOJqz?+#xmjMK})U-!U*pborkkO%qQ-=}N@RJr7 zOC}pLn$^E#1Y5`eqcyhb|4m>J|I5eV7U3!9u-fLvHr_K#zEL}^x)$j?)7Z7wY2unk zf7TyfrOcP($l%Ce&mhmrv%TnbS8%lB=}!sT=_@z39GKU(eET)k6^7F+1dgpsuTku^ z=uM6>XWE^4ypb>SR;jYUF}Ivney@G2Ue1vJNDJTE5z20ege9!f1Yl9ByDfTZp5OHZ*kGDkP zYnS!=kDd^^u*pAlW2xEAdBP752bHbf`e@3w(4*glo71d}c%_|=M@~uq6LNO@rOL!- zynPLKs_IYWZeD)Zv+={dYT>6mtm%JldLCGOKmFL0ZKv`>IAn95v)|-P2QF{FYG}p~$X+4N za#Tfj5#Iwdql67s(mE-Dp@mQ0e9P*&d^*0H|0L6&cBNg*>RGejiu%+pwT|QE*v*vL zlFPtws+BR~fsW|&-tHyL69jtRDMT4e7u2bd+i`^0|095 BBR2p5 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda index e2432b8930a7637a27461b1eee8fc143ab8bb179..471210df11a9b68cbb2b4934b8496b818c88d360 100644 GIT binary patch delta 646 zcmbQvxrmc5z?+#xmjML6ROrM^i^x=dREr5)SKXItw0N{(=d(VCW0K`>x89iW;;d|AfYl`R+yJwr zs=AqZ#~Armzfo5F^yTN;DrV^wZW13EB&Gy&iRD=GEV_F9`K{<1vkaS!CTwidZTGxd z^4?5Nt}=^HdCh;|vilW7GloF+4+1PtC-Vie7f4IWN5pc9ZF&(Rqq)0Q z>hZBpMTI=RALykyjj^m5zh>Sa=;{z#|+{D03=Zb4FCWD delta 646 zcmZ3)Ih~U)z?+#xmjMK})U-!UXMt4W5$1#dKh1~@PYpW4?n^xu+m?1_0Z+=Bgwu&Zrg#4e znr_z(**`P;o$Yd?c@ye#VYI9Li{j%IVfmWJ<}qyhA2_W?-b^w@rAF$O zzhU^CN0oW7Xobc**@+UKQax>^R=$JmmkPsa^Z+>4sBmoQVwgCs#6A)ib#( zGSqdcbt! z!G{A&*#eqlXE3h&!6(!1%)jWhWZQ=edI#ruExhM-OtxWV)!Bk~WmgQB&6+>ahL=O4 zlA*da+Q(JxKv}Yav&R9ChNuk!(H=5CF0EoTjN;FC=;+i3MkgbaE;AyvOs-@0h9{TF l7n$S198fe*wqS8lgT*O~4)A7W1I0Eo5Xu4LJ((HA0{}`p0$u}hQ)jceY&=7mAVV`#Ln~(kBdWO$yK0>#>oDrq zOEZD(Vt~;aTlN1YFi7_bFno*jmv>lgb7LFt875xurCNPTwZ{z}tg-Rme0uSIDLwvO z8yVdg+!gBy965GB${;_JbbP3ZoBPnTf&~U-$gklIr!k(F-|$PjL}p z=Kip_*>w#?^5*bDj4pj%t4gNlCn_vk0?elU~o8~WD7hKVNZ>0ayWEr!HaNSLP*ZMQ-X58D@$RO}UXR3*^aw|)Zg+ufS z1IAYo4ij8gK00yp?H!5Z)81#jVdFZtBKpX5ZG&F38P2ClR816e_>P3nU|g}Ftb_4t4xZ_cCy8GO4Bo+b$btQS`)l@z@4h)iF+S8bGgugVaNgQ` zp2uVvR!W_*FL+mW)o|Oa`4cU8IT$J#N?N0Px?&o1`x|)`8zx$8O%RBl`s2Xz{PWk#gW$qCHf@B}(}Gjjx(15RDSEVgQ}R0X30yjj^m>5Ul(1sE9^+L%E+ E0JB9cb^rhX delta 689 zcmZ3(`Hh1wz?+#xmjMK})U-!U!lYiFRtM7e& zw577(?6x-xCb4oe>?y8SP`Ibgn3~Ys!qmx}A6440Bct&lqeBa)4kN0$;;;4RPS#=6 zuYbx2wu=EqYi!m3o4_D`myhAtbPqX))iyV_@%FHFMem%nR-@apD{sAs>q&)Y-)B5N zw4T?V!I8n9fst9Yw(jX%9n;f?USz&+U)!=lVwvLX&-T30+Jy?)f%{8aEsT_VQ!IlZfVX8+=ASJa zM{-JIk7$me&Y~r|BhfRI+EdTH)jjk{e3fkhPLlVokZW8M-I&Oetto5PVkrL+Z_2^)>|)~my)~qCuMQ{ z`CL}d#t-+Z1HSOM=I53#ZfLjPEjcyKCzttr_1yh)&c$nYT=aWkFL0&(`nIa~=Obku zKR+tDa7^=|v`Klz;`>#pZVD4Tj(AMk#V9`IIRAmm+pij$F$A(#h_f73kzK_1z|1Ib z!!9|Ul)%u!CvU!G^;|w(F1wqt$+)b0#nY~37wg#$dnocdF&|pzAeAW1&`^}fAZFox zwDPgiO9qt|HH!|hGpS9}Q)KlF4@lf=m1p28dyrL;B(P&&8Z+-(j%zcu!t(Dh&RBJh z=XsvHZ1T#TlAMo>{#MlCuK^g&>i5w>Y diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package3-0.2.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package3-0.2.0-abc.conda index 47788894e25205ac60da417b68064095451de829..9d6897ba4b4e8c2c320e844939d8096064149a1b 100644 GIT binary patch delta 841 zcmeyyv5J!~z?+#xmjML6ROrM^~L<;CagZb-lk=BdZbM5TV2y>0y8du zNinQ@nc1Vt*Rt_XbbN=h+}+}L9w~D^K3_1IZ{oW<6D5`_@3>UYo*EzecWKuL-j3(G z-nM!UH=@Lf&Sc&Udv)l`N`Bw(s~W`A=bl|;xZKmfj&tGR*47WXg=`-}O`e%(g*WIH{afoI6jRz{IQLp245g!eay8v z;mcmHW=t$r*msD9pW5v7 zeMiZ5_DftG@f#aC-*R2MsU??xhjGHHgFJT6^TK75SO1jkyxhPrf!!f|$I%rhSZ{oi zxFNtK(HYFmwlTDmzsAb#nj`a!8B7uZ-i%DT%!t%GIf2<5o_r^7X11}0rCS({t^<_t r{zHL0g9tRWGcYV^l$@-^qNWB*hcG(8o0Scuh#3e47#SE^m_a-MH{MG^ delta 772 zcmZ3*`Hh1wz?+#xmjMK})U-!U}adxl0Q)7rYHb8T*>W}0j@KN4mX!F&1Q*`JE1 zuX)Lwh`O5J>mXBjGp5*mk^6jMGnJ}hcZDf^Pdufk^v-ytf4P2g;p)VzYlW18qwjYb zEMk(F5@N)?O^WU2tJ#zD3g`AnPHF5B%`x>^wJg2fp24jr!)iTIg+P#=7BeXr$4)9wQ6Y8mU|UhT(G_RUX>4i}R(7RmJik^A9L?tKB8n3)_5Sy<~XRRo!mt#89IPiFZUIEY*7^&NOsWXz)1ZF=-d0_>|-P2QF{F zYG}p~$o@fq<>_R;K=uM@N%M$Uez8p}R#_C4Rhu4r`Sd{P9CkKVMXl%aQ+?}eTW#Wa zId(G{9x`HJ_~&d&86BhIzVaY kKNQF_h(J>=1H+O=smXCHYFw}+^^|dPABz}U05eDh02+rTkpKVy diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package3-0.3.0-abc.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package3-0.3.0-abc.conda new file mode 100644 index 0000000000000000000000000000000000000000..c10d71a87969d282df44c46ec2635620804eb37f GIT binary patch literal 1196 zcmWIWW@gc40DUejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfTz|@f2{6OufQAG0=oTai4 zf;b;WLtHQ2E5Ptf(qGm-9R`^VZZpX_{h!bE~7bISK#M>}1hjc);_x z;?xh8`7aE+&i>|9&j~&ATX?ICB-55ZMTt36d9!$X1pI%lz1FRtySht1mPh7=%Z-05 z7dNgrKO@NWzSYy#xpGWh3m@ExcHEnMQ1Y_O$#fPbZ<|yH_PsA_v{ySSR>!h4D!nza zR!Pxzk-zF&zlrtS?B>4z{#EN{miV3QRC>|Od0+Os?-Zs0g$B1H9xg`w;#1zUKX^I) zm4x(yD~0ck6kkeQX5`XAXquyey4cWxau&20QLE)Y{V`@Tk%RZrc zgNc?6u`CA`FeD^0C7{~tl~8(bvN2;o{Wb}2IfvCYH@5NiuysZ6oVG@z+p_DwPx!Z`_rIE6v?_2oHL$`KyzC4?}=nX&o$hmPmkv-3;W8moIYK2VslEM24O^={c(i#t0>D4EgaxB@(IGB4(RNO$##s^lP9nUuoW_cBmjDkAF}`e delta 694 zcmZ3=xr~!9z?+#xmjMK})U-!UIAD_*0kgz>C#Z4#L@nX6L$NhaW({$&GRQ&oAR?EO1ICWhU zlSGekJ(pCDrB2l+caHeOVKtIHj5U%umN}=D^{BUpbvT~iO?A^C}er&#N;HbXuvfVoGmm)zw?S3rh zx4U|C`PF06H|3tN#sA%D|4Q!Q=ULnf-1nNvFK*`T>gD#Hyot%Bej3{+Z6Ag|$C?;p z9=y?dwDHXs<}C@*izaAQC>_Xi+woUs#}U@4H$?In9HZE0N{Xy6DtF*sqN|jnBQ!6Q zL;RNHYlagJd!P1NGc47b@$k;u70GY1(%c@ICHx+5e<)C6 c5P>E-28Jb#ii`}CZ5gd6_p=DF6)}S(0HWF(i~s-t diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package4-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package4-0.2.0-h9490d1a_0.conda index fc15aca8c5e01113288292a4080d3c47324fdf7f..f881e4ae98454a9629a7db7c2b5e03f20d57b880 100644 GIT binary patch delta 672 zcmZ3=xr~!9z?+#xmjML6ROrM^%MZ z<_Xv2fXRzqC%14%8|Q80Oj(n`lXWHZ?%&C#+jV31-!7JE$xF3S{VVjzgQG_^cO&B@ zyA+$Nuh$;EA$;LmaO%k!+azbYdH-G;lURF`rRUu27avX@D-`=09nJNgJG|>cz~(FI z;qx9b)iXA4`_TSk?X0z_t2c8deo&aRB3+{@d-vTMi!HMq(~n&?+pzfCM)A0IyB9M3 z@>hQuRRtaMu=}ttIfHrq-g76Sm;QdfbE37M-MhQfc|Y5EDl~X3@o>4qD?a5s|AEWu zR}IY=RwlDlFsiD|UBvgn%!q5pE>^oI8dpzbB=24FFk(i1{nWR|cLY?FbKkepmZ)$w zi{tG$yW{bW4Us?AvNG>DFjMQ@#y?+}XCz23x}o*MsUhFZ;rGmfliXSxHJ>mv-QX)q z4TyXCpg}Ar+T})sOT{$Bkc{*k#tAE#{Ex{ttgK42D7Stk5q$Q%$2>Nc9-D@}hjiUs z^$tuset=K0VItSo1OeIG6Mr~dGTg*(b>PU6g8|-*OuEd7bTqk<*&CjaCSPHWN2DEV c78f;Gnt{;)-mGk()Wi&ga=>&|#0=sA07N+-#sB~S delta 671 zcmZ3+xs;PHz?+#xmjMK})U-!UJFXd+li|~?jSZ#A-Tdqs--B&uk@l%e<9Ifxu^$sfh zcRlf{AiJ3pgA;=zL-*dsL!q^GPqWu8N^RV-b^DbFqlAFVlh6KKy25apg}||O_oW&w z9$m71-e+*G;<8J-!Mi&XC6+4hyu_BOtX2QZyVRJECu{mr5hefm?^oG>ocO9mP~^g* zIhP_$*i1Ed*}3i5VER}rRUz3mIbiX+SMTPp*_r$B*WG#50=uSuobtu{gtDT+v@Me= z^hZw*FJPwPv-266QgeBKjnITTJ6c_7lvl%7S&~YKdgP|B`B3O?bn-A z!7&O67wX0S3G5Bsyfx=5XQF`OoE7OBRoT1m)>v$r?U;V-ve|~k-!_WhYqNVH)h~bb zm){o|b+>cO@2%UsD&CeJ+j+I{zm55)W0w8Z-{*QSD3o+!StU8kwJ?>hpu=Zk#|mlj zDd+hgyqv5hA>9zte%jSFI5~%5+bN9(FEND+8m1{*PR32DFVOL*pL#XYOTzi60&vDF6IEQ8E-i%DT%!p((xrx~uo{lD8WsXNA9UB%G aHCU2?(E;A9Y@o!%41{vPWL3xv;sF4!!X3;2 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json index 1064f6a052..61db55e387 100644 --- a/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json @@ -1 +1 @@ -{"info":{"subdir":"win-64"},"packages":{},"packages.conda":{"package-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"5f8ac2fa494f43d1fa997c5b2b4b3ae0","name":"package","platform":"win","sha256":"d934869a2150bb312c3287d5fea7441af36b09279363877e079235c99a063ccc","size":1243,"subdir":"win-64","timestamp":1744040260209,"version":"0.1.0"},"package-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"e9f47e229b33eb2bc98740384a9ad95d","name":"package","platform":"win","sha256":"6c9bc1bb1ac3967f4cca4607ba8d784a161fa64dcc36ad711af6712de0ec6a72","size":1242,"subdir":"win-64","timestamp":1744040261744,"version":"0.2.0"},"package2-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"acd582909674e811db4814e7a817fc0c","name":"package2","platform":"win","sha256":"ffa9362101e996a45101a1289b30d764e29354a4540e0ed325dd8390c1adaca0","size":1174,"subdir":"win-64","timestamp":1744040260209,"version":"0.1.0"},"package2-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"ecbff7963e20f197451ba21ed80f1ce5","name":"package2","platform":"win","sha256":"a7f8110953e1fa1a9e75fcece387a23b74157a907bfa824a6f1f9c19084b4e3e","size":1175,"subdir":"win-64","timestamp":1744040261744,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"131227e9bc0870a7eef2c56347f4face","name":"package3","platform":"win","sha256":"834ef8452b2aa8504d0a72b35be77252e156a2b60a155cd4884a81a42023e73e","size":1142,"subdir":"win-64","timestamp":1744040260209,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"8fe3223275d8de585bf16da4da74aa74","name":"package3","platform":"win","sha256":"78b83f81793ad3aea18aa61d80c1f5ffa1b368f2234f73221730b87c3373107f","size":1142,"subdir":"win-64","timestamp":1744040261744,"version":"0.2.0"},"package4-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"23cb0bb9d37ecc5c1a51aad9897cbbaa","name":"package4","platform":"win","sha256":"3cc7ad640f1172ab6d3544ca162af7fad5a728d6c86a327d25511945068fc5b7","size":1190,"subdir":"win-64","timestamp":1744040260208,"version":"0.1.0"},"package4-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"2bfff3811baf6525e55a11e2cecc74e5","name":"package4","platform":"win","sha256":"01e6d940b6258c42f2a1366d6380c6e4b4a5f2988173311a79507ef872eea347","size":1189,"subdir":"win-64","timestamp":1744040261744,"version":"0.2.0"}},"repodata_version":2} +{"info":{"subdir":"win-64"},"packages":{},"packages.conda":{"package-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"a49643ed5a52ca5252a00c8796f4b886","name":"package","platform":"win","sha256":"d76d0ad3f4a8d01c78edad34a4a6bf78c4ac9265c6133a09e1bededb30d96276","size":1258,"subdir":"win-64","timestamp":1768230452809,"version":"0.1.0"},"package-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"a746125a495fd2ecd2cb22100749ee5d","name":"package","platform":"win","sha256":"bc363b7167c9923fb8c6d10c3ac7f3229fe3f6f88c114a00e54f9ef7366be4a2","size":1258,"subdir":"win-64","timestamp":1768230460145,"version":"0.2.0"},"package2-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"5cbe0c56438b2009770c64f7aa7550ed","name":"package2","platform":"win","sha256":"f5960fcfc6a159f1d4a483dba41320e606891bb4cc182430422b3acc3ac7f07a","size":1182,"subdir":"win-64","timestamp":1768230452809,"version":"0.1.0"},"package2-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":[],"md5":"4931ffa0196ad389e491ce61a04b1f01","name":"package2","platform":"win","sha256":"ce018dc26845759d706f86d735311812373c813377c0dc6755f1031981c75fd7","size":1186,"subdir":"win-64","timestamp":1768230460144,"version":"0.2.0"},"package3-0.1.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"c9f5f0d49bab6b69bb8ad53d1bbe474b","name":"package3","platform":"win","run_exports":{"weak":["package3 ==0.1.0 abc"]},"sha256":"c0943294fc7418ce23f7740f09f3de0b79d9fc264b41c4318f694cecd066f9a4","size":1196,"subdir":"win-64","timestamp":1768230452809,"version":"0.1.0"},"package3-0.2.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"7367bae5e38abd9f92a07ac2d0ef173a","name":"package3","platform":"win","run_exports":{"weak":["package3 ==0.2.0 abc"]},"sha256":"716841772bf81b079d6847f5fab157472470e4dea38b0c9f741fe7a8a324219b","size":1194,"subdir":"win-64","timestamp":1768230460144,"version":"0.2.0"},"package3-0.3.0-abc.conda":{"arch":"x86_64","build":"abc","build_number":1,"depends":[],"md5":"e120f9df9e33cea2d6efbe230f5b7410","name":"package3","platform":"win","run_exports":{"weak":["package3 ==0.3.0 abc"]},"sha256":"b75650d38d0ca14b6d2a61520009092e786be3fc46129e29aff0cd9ad77d3e38","size":1196,"subdir":"win-64","timestamp":1768230467479,"version":"0.3.0"},"package4-0.1.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":["package3 ==0.1.0"],"md5":"2a551d40819308772a2a9ca4ef14dd45","name":"package4","platform":"win","sha256":"b4fe3fc4d9bdc8c82aa5ffcd60eb0203ec28d112677cdf8c0ba753955d81abd8","size":1189,"subdir":"win-64","timestamp":1768230452807,"version":"0.1.0"},"package4-0.2.0-h9490d1a_0.conda":{"arch":"x86_64","build":"h9490d1a_0","build_number":0,"depends":["package3 ==0.2.0"],"md5":"fac70b2486448a96b328a50cf5fa76f1","name":"package4","platform":"win","sha256":"9c1759b29717523b419b7c4294dc41bb279fe442f210e8c51d58d2c182f68157","size":1190,"subdir":"win-64","timestamp":1768230460143,"version":"0.2.0"}},"repodata_version":2} \ No newline at end of file diff --git a/tests/data/channels/mappings.toml b/tests/data/channels/mappings.toml index b2597032c1..90830c0bcc 100644 --- a/tests/data/channels/mappings.toml +++ b/tests/data/channels/mappings.toml @@ -8,6 +8,7 @@ "global_prefix_ignore_channel/recipe.yaml" = "global_prefix_ignore_channel" "multiple_versions_channel_1_010.yaml" = "multiple_versions_channel_1" "multiple_versions_channel_1_020.yaml" = "multiple_versions_channel_1" +"multiple_versions_channel_1_030.yaml" = "multiple_versions_channel_1" "non_self_expose_channel_1.yaml" = "non_self_expose_channel_1" "non_self_expose_channel_2.yaml" = "non_self_expose_channel_2" "post_link_script_package/recipe.yaml" = "post_link_script_channel" diff --git a/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml b/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml index ce45b4e7ca..7f33da06d6 100644 --- a/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml +++ b/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml @@ -45,6 +45,10 @@ outputs: name: package3 version: ${{ version }} + requirements: + run_exports: + - ${{ pin_subpackage('package3', exact=True) }} + build: number: 1 string: abc diff --git a/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml b/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml index 4b7f852ffe..40ef2618cc 100644 --- a/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml +++ b/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml @@ -43,6 +43,10 @@ outputs: name: package3 version: ${{ version }} + requirements: + run_exports: + - ${{ pin_subpackage('package3', exact=True) }} + build: number: 1 string: abc diff --git a/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml b/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml new file mode 100644 index 0000000000..a633d4bca5 --- /dev/null +++ b/tests/data/channels/recipes/multiple_versions_channel_1_030.yaml @@ -0,0 +1,27 @@ +recipe: + name: multiple-versions-channel + version: 1.0.0 + +context: + version: 0.3.0 +outputs: + - package: + name: package3 + version: ${{ version }} + + requirements: + run_exports: + - ${{ pin_subpackage('package3', exact=True) }} + + build: + number: 1 + string: abc + script: + - mkdir -p $PREFIX/bin + - if: win + then: + - echo "echo package3$PKG_VERSION on windows" > $PREFIX/bin/package3.bat + else: + - echo '#!/bin/sh' > $PREFIX/bin/package3 + - echo "echo package3$PKG_VERSION on unix" >> $PREFIX/bin/package3 + - chmod +x $PREFIX/bin/package3 diff --git a/tests/integration_python/common.py b/tests/integration_python/common.py index 6e5ad8f37a..065082cd94 100644 --- a/tests/integration_python/common.py +++ b/tests/integration_python/common.py @@ -1,5 +1,6 @@ import os import platform +import re import subprocess import sys from collections.abc import Sequence @@ -9,6 +10,10 @@ from rattler import Platform + +# Regex pattern to match ANSI escape sequences +ANSI_ESCAPE_PATTERN = re.compile(r"\x1b\[[0-9;]*m") + PIXI_VERSION = "0.62.2" @@ -60,6 +65,7 @@ def verify_cli_command( env: dict[str, str] | None = None, cwd: str | Path | None = None, reset_env: bool = False, + strip_ansi: bool = False, ) -> Output: base_env = {} if reset_env else dict(os.environ) complete_env = base_env if env is None else base_env | env @@ -75,6 +81,11 @@ def verify_cli_command( # Decode stdout and stderr explicitly using UTF-8 stdout = process.stdout.decode("utf-8", errors="replace") stderr = process.stderr.decode("utf-8", errors="replace") + + # Optionally strip ANSI escape sequences for matching + stdout_for_matching = ANSI_ESCAPE_PATTERN.sub("", stdout) if strip_ansi else stdout + stderr_for_matching = ANSI_ESCAPE_PATTERN.sub("", stderr) if strip_ansi else stderr + returncode = process.returncode output = Output(command, stdout, stderr, returncode) print(f"command: {command}, stdout: {stdout}, stderr: {stderr}, code: {returncode}") @@ -86,13 +97,13 @@ def verify_cli_command( if isinstance(stdout_contains, str): stdout_contains = [stdout_contains] for substring in stdout_contains: - assert substring in stdout, f"'{substring}'\n not found in stdout:\n {stdout}" + assert substring in stdout_for_matching, f"'{substring}'\n not found in stdout:\n {stdout}" if stdout_excludes: if isinstance(stdout_excludes, str): stdout_excludes = [stdout_excludes] for substring in stdout_excludes: - assert substring not in stdout, ( + assert substring not in stdout_for_matching, ( f"'{substring}'\n unexpectedly found in stdout:\n {stdout}" ) @@ -100,13 +111,13 @@ def verify_cli_command( if isinstance(stderr_contains, str): stderr_contains = [stderr_contains] for substring in stderr_contains: - assert substring in stderr, f"'{substring}'\n not found in stderr:\n {stderr}" + assert substring in stderr_for_matching, f"'{substring}'\n not found in stderr:\n {stderr}" if stderr_excludes: if isinstance(stderr_excludes, str): stderr_excludes = [stderr_excludes] for substring in stderr_excludes: - assert substring not in stderr, ( + assert substring not in stderr_for_matching, ( f"'{substring}'\n unexpectedly found in stderr:\n {stderr}" ) diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index 3da60e35c3..be5ade832a 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -95,6 +95,11 @@ def multiple_versions_channel_1(channels: Path) -> str: return channels.joinpath("multiple_versions_channel_1").as_uri() +@pytest.fixture +def target_specific_channel_1(channels: Path) -> str: + return channels.joinpath("target_specific_channel_1").as_uri() + + @pytest.fixture def non_self_expose_channel_1(channels: Path) -> str: return channels.joinpath("non_self_expose_channel_1").as_uri() diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index 3040e3c8ff..727850fd5d 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -262,7 +262,7 @@ def test_build_using_rattler_build_backend( @pytest.mark.parametrize( ("backend", "non_incremental_evidence"), - [("pixi-build-rust", "Compiling simple-app"), ("pixi-build-cmake", "Configuring done")], + [("pixi-build-cmake", "Configuring done")], ) def test_incremental_builds( pixi: Path, diff --git a/tests/integration_python/test_upgrade.py b/tests/integration_python/test_upgrade.py index 9f8c72e273..5a8a623d11 100644 --- a/tests/integration_python/test_upgrade.py +++ b/tests/integration_python/test_upgrade.py @@ -320,26 +320,26 @@ def test_upgrade_keep_info( assert "ab*" in parsed_manifest["dependencies"]["package3"]["build"] assert multiple_versions_channel_1 in parsed_manifest["dependencies"]["package3"]["channel"] - # Upgrade all, it should now be at 0.2.0, with the build intact + # Upgrade all, it should now be at 0.3.0, with the build intact verify_cli_command( [pixi, "upgrade", "--manifest-path", manifest_path], - stderr_contains=["package3", "0.1.0", "0.2.0"], + stderr_contains=["package3", "0.1.0", "0.3.0"], ) parsed_manifest = tomllib.loads(manifest_path.read_text()) # Update version - assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.2.0,<0.3" + assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.3.0,<0.4" # Keep build assert "ab*" in parsed_manifest["dependencies"]["package3"]["build"] # Keep channel assert multiple_versions_channel_1 in parsed_manifest["dependencies"]["package3"]["channel"] - # Upgrade package3, it should now be at 0.2.0, with the build intact because it has a wildcard + # Upgrade package3, it should stay at 0.3.0, with the build intact because it has a wildcard verify_cli_command( [pixi, "upgrade", "--manifest-path", manifest_path, "package3"], ) parsed_manifest = tomllib.loads(manifest_path.read_text()) # Update version - assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.2.0,<0.3" + assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.3.0,<0.4" # Keep build assert "ab*" in parsed_manifest["dependencies"]["package3"]["build"] # Keep channel @@ -369,13 +369,13 @@ def test_upgrade_remove_info( assert "abc" in parsed_manifest["dependencies"]["package3"]["build"] assert multiple_versions_channel_1 in parsed_manifest["dependencies"]["package3"]["channel"] - # Upgrade package3, it should now be at 0.2.0, without the build but with the channel + # Upgrade package3, it should now be at 0.3.0, without the build but with the channel verify_cli_command( [pixi, "upgrade", "--manifest-path", manifest_path, "package3"], ) parsed_manifest = tomllib.loads(manifest_path.read_text()) # Update version - assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.2.0,<0.3" + assert parsed_manifest["dependencies"]["package3"]["version"] == ">=0.3.0,<0.4" # Keep channel assert multiple_versions_channel_1 in parsed_manifest["dependencies"]["package3"]["channel"] # Remove build @@ -482,13 +482,13 @@ def test_upgrade_features( verify_cli_command( [pixi, "upgrade", "--manifest-path", manifest_path, "--feature=foo"], stderr_excludes=["package2"], - stderr_contains=["package3", "0.1.0", "0.2.0"], + stderr_contains=["package3", "0.1.0", "0.3.0"], ) parsed_manifest = tomllib.loads(manifest_path.read_text()) package3 = parsed_manifest["feature"]["foo"]["dependencies"]["package3"] package2 = parsed_manifest["feature"]["bar"]["dependencies"]["package2"] assert package2["version"] == "==0.1.0" - assert package3["version"] == ">=0.2.0,<0.3" + assert package3["version"] == ">=0.3.0,<0.4" # Upgrading with no specified feature should upgrade all features (hence "package2" in feature "bar") verify_cli_command( From 6071a116bbd58214ec1227557acd8ad4259a142c Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 17:39:37 +0100 Subject: [PATCH 04/70] Add incremental rust test again --- tests/integration_python/pixi_build/test_build.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index 727850fd5d..10ca85e689 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -1,3 +1,4 @@ +import os from pathlib import Path import pytest @@ -262,7 +263,7 @@ def test_build_using_rattler_build_backend( @pytest.mark.parametrize( ("backend", "non_incremental_evidence"), - [("pixi-build-cmake", "Configuring done")], + [("pixi-build-rust", "Compiling simple-app"), ("pixi-build-cmake", "Configuring done")], ) def test_incremental_builds( pixi: Path, @@ -275,10 +276,14 @@ def test_incremental_builds( copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) manifest_path = tmp_pixi_workspace / "pixi.toml" + # Clear CARGO_TARGET_* settings from parent environment to avoid cross-compiler issues + env = {key: "" for key in os.environ if key.startswith("CARGO_TARGET_")} + verify_cli_command( [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], stderr_contains=non_incremental_evidence, strip_ansi=True, + env=env, ) # immediately repeating the build should give evidence of incremental compilation @@ -286,6 +291,7 @@ def test_incremental_builds( [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], stderr_excludes=non_incremental_evidence, strip_ansi=True, + env=env, ) From 6b12161aefd6fdae7d4e18a2378c6b839ae064ab Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 17:39:56 +0100 Subject: [PATCH 05/70] Replace empty [workspace] with exclude --- Cargo.toml | 6 ++++++ docs/source_files/pixi_workspaces/pixi_build/dev/Cargo.toml | 2 -- examples/geos-rs/Cargo.toml | 3 --- pixi-build-backends/py-pixi-build-backend/Cargo.toml | 4 ---- trampoline/Cargo.toml | 4 ---- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6217a40ab3..c86e25dde0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,12 @@ exclude = [ # Only pulled in when enabling certain features. We do not want to include # these crates when running workspace wide commands. "crates/pixi_allocator", + # Standalone projects that should not be part of the workspace + "docs", + "examples", + "pixi-build-backends", + "tests/data", + "trampoline", ] members = ["crates/*"] resolver = "3" diff --git a/docs/source_files/pixi_workspaces/pixi_build/dev/Cargo.toml b/docs/source_files/pixi_workspaces/pixi_build/dev/Cargo.toml index 0158551efe..cffc47e7db 100644 --- a/docs/source_files/pixi_workspaces/pixi_build/dev/Cargo.toml +++ b/docs/source_files/pixi_workspaces/pixi_build/dev/Cargo.toml @@ -3,6 +3,4 @@ edition = "2024" name = "dev-package" version = "0.1.0" -[workspace] - [dependencies] diff --git a/examples/geos-rs/Cargo.toml b/examples/geos-rs/Cargo.toml index 7de038bd40..5f3a9c53bf 100644 --- a/examples/geos-rs/Cargo.toml +++ b/examples/geos-rs/Cargo.toml @@ -1,6 +1,3 @@ -[workspace] -# Otherwise the example thinks it belongs to the workspace of the Pixi repository - [package] edition = "2024" name = "geos-rs" diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.toml b/pixi-build-backends/py-pixi-build-backend/Cargo.toml index cf8d10285d..8f0abef077 100644 --- a/pixi-build-backends/py-pixi-build-backend/Cargo.toml +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.toml @@ -62,10 +62,6 @@ lto = false opt-level = 0 strip = false -# Prevent package from thinking it's in the workspace -[workspace] - - [patch.crates-io] # This is a temporary patch to get `cargo vendor` to work with the `uv` and pep508_rs` crates. reqwest-middleware = { git = "https://github.com/astral-sh/reqwest-middleware", rev = "7650ed76215a962a96d94a79be71c27bffde7ab2" } diff --git a/trampoline/Cargo.toml b/trampoline/Cargo.toml index 1f77429eef..fb99123521 100644 --- a/trampoline/Cargo.toml +++ b/trampoline/Cargo.toml @@ -1,7 +1,3 @@ -[workspace] -# We don't use any workspace settings at the moment, -# but without it Cargo thinks this crate belongs to our top-level workspace - [package] authors = ["pixi contributors "] description = "Trampoline binary that is used to run binaries instaled by pixi global" From bde8adb02ddbb48a42b9a4ac4e908f376c525831 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 12 Jan 2026 17:43:46 +0100 Subject: [PATCH 06/70] Exclude pytest-temp --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index c86e25dde0..e362faed5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ exclude = [ "pixi-build-backends", "tests/data", "trampoline", + "pytest-temp" ] members = ["crates/*"] resolver = "3" From 0ab67c1064cf191986879503003d1f6c42e7e8a4 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 10:00:27 +0100 Subject: [PATCH 07/70] Move build to own env --- pixi.lock | 1389 +++++------------ pixi.toml | 11 +- .../pixi_build/test_build.py | 6 - 3 files changed, 385 insertions(+), 1021 deletions(-) diff --git a/pixi.lock b/pixi.lock index 1dca800b26..26d7cd3235 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,5 +1,382 @@ version: 6 environments: + build: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.6-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.6-default_h36abe19_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.6-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-hc876b51_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.6-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.6-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_26.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_26.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_26.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda + - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda + - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.6-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda default: channels: - url: https://prefix.dev/conda-forge/ @@ -13,13 +390,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda @@ -28,39 +402,22 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.6-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.6-default_h36abe19_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.6-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-hc876b51_14.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -70,7 +427,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.6-default_h99862b1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -79,11 +435,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.6-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda @@ -95,22 +448,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -136,14 +482,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -166,13 +510,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda @@ -181,39 +522,22 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -223,7 +547,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda @@ -232,12 +555,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda @@ -249,22 +568,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -290,14 +602,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml-0.18.16-py313h6194ac5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.14-py313h6194ac5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -315,7 +625,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda @@ -323,46 +632,26 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_26.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -371,47 +660,29 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -437,15 +708,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml-0.18.16-py313hf050af9_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py313hf050af9_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_3.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -460,11 +727,9 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda @@ -472,96 +737,56 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -587,15 +812,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -610,7 +831,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: @@ -620,7 +840,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda @@ -629,32 +848,21 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -662,25 +870,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.6-hc465015_0.conda - - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -705,7 +902,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -727,9 +923,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda - - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda @@ -1447,24 +1640,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-deny-0.18.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-shear-1.7.1-hb17b654_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.6-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.6-default_h36abe19_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.6-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1472,18 +1654,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/go-shfmt-3.12.0-hfc2019e_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-hc876b51_14.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -1491,45 +1663,26 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.6-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda - - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.6-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-24.9.0-heeeca48_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1537,9 +1690,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -1561,14 +1711,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.7-h813ae00_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/linux-64/shellcheck-0.10.0-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - conda: https://prefix.dev/conda-forge/linux-64/taplo-0.10.0-h2d22210_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -1591,24 +1739,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-deny-0.18.6-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-shear-1.7.1-h069e38c_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/dprint-0.49.1-ha3529ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1616,18 +1753,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/go-shfmt-3.12.0-h22914b5_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -1635,46 +1762,26 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.11-h22914b5_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/nodejs-24.9.0-hc854191_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1682,9 +1789,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -1706,14 +1810,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.7-h9564552_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/shellcheck-0.10.0-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/taplo-0.10.0-h3618846_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -1729,7 +1831,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zizmor-1.18.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.9-h8080635_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1737,27 +1838,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-deny-0.18.6-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-shear-1.7.1-h3c2ae71_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_26.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1765,11 +1850,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/osx-64/go-shfmt-3.12.0-hccc6df8_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda @@ -1777,52 +1857,24 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda - - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/nodejs-24.9.0-h09bb5a9_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -1844,14 +1896,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.7-hd9f4cfa_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_3.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-64/shellcheck-0.10.0-h7dd6a17_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/osx-64/taplo-0.10.0-hffa81eb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1866,10 +1914,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.18.0-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.9-h43f6c71_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1877,27 +1922,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-deny-0.18.6-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-shear-1.7.1-h8d80559_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1905,11 +1934,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/go-shfmt-3.12.0-h820172f_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda @@ -1917,53 +1941,24 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-24.9.0-h08a63db_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -1985,14 +1980,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.7-h382de68_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/shellcheck-0.10.0-hecfb573_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/taplo-0.10.0-h2b2570c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -2007,8 +1998,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.18.0-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.9-he477eed_0.conda @@ -2017,18 +2006,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-deny-0.18.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-shear-1.7.1-h18a1a76_1.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -2036,14 +2018,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/win-64/go-shfmt-3.12.0-h11686cb_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda @@ -2051,19 +2027,10 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.6-hc465015_0.conda - - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-24.9.0-he453025_0.conda @@ -2071,8 +2038,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -2093,7 +2058,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.7-h15e3a1f_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/win-64/shellcheck-0.10.0-h57928b3_0.conda @@ -2113,13 +2077,9 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda - - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zizmor-1.18.0-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda pypi-gen: channels: - url: https://prefix.dev/conda-forge/ @@ -2732,90 +2692,54 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/bcrypt-5.0.0-py314h2e6c369_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.7-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.7-default_h36abe19_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.7-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.7-hffcefe0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda - conda: https://prefix.dev/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-he6f32d1_14.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.7-default_h99862b1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.7-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.7-h4922eb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mkcert-1.4.4-he91c749_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pynacl-1.6.1-py314h5bd0f2a_0.conda @@ -2827,10 +2751,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2844,92 +2765,54 @@ environments: linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/bcrypt-5.0.0-py314h451b6cc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.7-default_he95a3c9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.7-default_h395f21b_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.7-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.7-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cryptography-46.0.3-py314h606d956_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-hef95cfa_14.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.7-default_he95a3c9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.7-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.7-he40846f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/mkcert-1.4.4-hd24410f_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pynacl-1.6.1-py314h51f160d_0.conda @@ -2941,10 +2824,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2956,89 +2836,49 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_5.conda osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bcrypt-5.0.0-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_27.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_27.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_27.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_27.conda - - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cryptography-46.0.3-py314h61e53f1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.7-h472b3d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/mkcert-1.4.4-hc7f0b10_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pynacl-1.6.1-py314h6482030_0.conda @@ -3050,11 +2890,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_4.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3063,93 +2899,51 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/wrapt-2.0.1-py314h6482030_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_5.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bcrypt-5.0.0-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cryptography-46.0.3-py314h7e8dc1c_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h8eac4d7_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-hba2cd1d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.7-h4a912ad_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mkcert-1.4.4-h87715bd_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pynacl-1.6.1-py314h0612a62_0.conda @@ -3161,11 +2955,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3174,31 +2964,19 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/wrapt-2.0.1-py314h0612a62_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_5.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/bcrypt-5.0.0-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda - - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/cryptography-46.0.3-py314hb42d478_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -3207,28 +2985,17 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.7-hc465015_0.conda - - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/mkcert-1.4.4-h36c15f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pynacl-1.6.1-py314h5a2d7ad_0.conda @@ -3240,7 +3007,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -3252,9 +3018,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda - - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/wrapt-2.0.1-py314h5a2d7ad_1.conda @@ -4673,19 +4436,6 @@ packages: license_family: Apache size: 24824 timestamp: 1763564160306 -- conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.7-default_h36abe19_0.conda - sha256: 93ac475a66f1f583c966516bac21b42a9354bdbf83ad4414a633d8ea8962f86d - md5: 78b073865ce71810e60af717a471854e - depends: - - binutils_impl_linux-64 - - clang-21 21.1.7 default_h99862b1_0 - - libgcc-devel_linux-64 - - llvm-openmp >=21.1.7 - - sysroot_linux-64 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 26831 - timestamp: 1764757992735 - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda sha256: 76892f833d16621156682ebb5daa66a8f8c178be9054d2d85a9bb617be9d9763 md5: 1d6411675359112a74562c33a7e1e186 @@ -4699,19 +4449,6 @@ packages: license_family: Apache size: 24836 timestamp: 1763565452191 -- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.7-default_h395f21b_0.conda - sha256: 0c091cef8c017ba569841ba0e2ce3a8a979cd182931703a98facad1f449735eb - md5: 7ef37a81b76fd15e2ddebbf5e1ed4c0e - depends: - - binutils_impl_linux-aarch64 - - clang-21 21.1.7 default_he95a3c9_0 - - libgcc-devel_linux-aarch64 - - llvm-openmp >=21.1.7 - - sysroot_linux-aarch64 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 26912 - timestamp: 1764760924289 - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda sha256: 5bcabcc3a5689bc47dbd6a58a3a785f8fe3f4e91410a299392d9cdf7ae7c16d6 md5: 5bd21a5ea37ab0fbe1d9cbba4e0e7c80 @@ -4795,20 +4532,6 @@ packages: license_family: Apache size: 829695 timestamp: 1763564111213 -- conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.7-default_h99862b1_0.conda - sha256: 8f87b14f7566ebf6a9bbb37e9b589f5daef82d6c2cc0b598e40d87169f492f4c - md5: a89cba834007a98dc1a95bde842c983d - depends: - - __glibc >=2.17,<3.0.a0 - - compiler-rt21 21.1.7.* - - libclang-cpp21.1 21.1.7 default_h99862b1_0 - - libgcc >=14 - - libllvm21 >=21.1.7,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 831939 - timestamp: 1764757923576 - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda sha256: ae8c604cb266f4c5a0b454ba3e5f7340c5c2f3aa001e8c41f72445c16863baa9 md5: f02ff8318aa5943b688e9e379ef22009 @@ -4822,19 +4545,6 @@ packages: license_family: Apache size: 832295 timestamp: 1763565384950 -- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.7-default_he95a3c9_0.conda - sha256: 23f479eb3257c102d127eb73fa20ba41f3cfe1e33ff7d0c76c856698387b0ff5 - md5: 8a63bf39ce211a6d0aae0fa541aec19c - depends: - - compiler-rt21 21.1.7.* - - libclang-cpp21.1 21.1.7 default_he95a3c9_0 - - libgcc >=14 - - libllvm21 >=21.1.7,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 829739 - timestamp: 1764760851143 - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda sha256: e44731639299f2ede1c6b944dcf3f06170350138f33904b82af6e1c566deec0c md5: 48781671bd9d72b3bbcba6c200c15098 @@ -4848,19 +4558,6 @@ packages: license_family: BSD size: 17772 timestamp: 1764359539536 -- conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_27.conda - sha256: 91949f054bea546c96ccd0a464fb971f55c147fcfcf1683c3d6df222fb2649df - md5: 0f5c599f789d15ddf11cb0e343588743 - depends: - - cctools_impl_osx-64 - - clang 19.1.7.* - - compiler-rt 19.1.7.* - - ld64_osx-64 - - llvm-tools 19.1.7.* - license: BSD-3-Clause - license_family: BSD - size: 17820 - timestamp: 1764625406755 - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda sha256: 880d73e66934839f2679c233c04756e600a7327218f8172986c70aaa0e1ee825 md5: f872a20e3b1d19aa054f113ae3804372 @@ -4885,17 +4582,6 @@ packages: license_family: BSD size: 20650 timestamp: 1764359547061 -- conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_27.conda - sha256: e29dd3ebc13e3e33e17c2ed1561eb52a1308c9c1a7b91c88038172427a158506 - md5: 81dff8cc175be65e604e3ccea6da31e5 - depends: - - cctools_osx-64 - - clang_impl_osx-64 19.1.7 hc73cdc9_27 - - sdkroot_env_osx-64 - license: BSD-3-Clause - license_family: BSD - size: 20676 - timestamp: 1764625412796 - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda sha256: dd20d2286f4d3d5d7a0a12d09d13d5c3b34dd025ecc62ca9798892080a629c46 md5: bae6f596e3ce534c6a23922711510228 @@ -4939,18 +4625,6 @@ packages: license_family: BSD size: 17923 timestamp: 1764359622898 -- conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_27.conda - sha256: a341859ba006115a3cfb317e965fa2d7e5a98cbe528243fc5d2cc4e332ffedfb - md5: 68725df746a09ac0e478257d428cacd4 - depends: - - clang_osx-64 19.1.7 h7e5c614_27 - - clangxx 19.1.7.* - - libcxx >=19 - - libllvm19 >=19.1.7,<19.2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 17941 - timestamp: 1764625475254 - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda sha256: f3a3f5396c19df103d72eef7fc20c8a480c9f3beee6bdb2a1c871625c7245418 md5: 7654ab743ef26bf8018f510f918665d4 @@ -4975,18 +4649,6 @@ packages: license_family: BSD size: 19520 timestamp: 1764359637398 -- conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_27.conda - sha256: 7dd3a43f5928d0142b5a20a8ea51a1890efe230aefd8a2626ebfdf1a9f3868c1 - md5: 5694e4751c86342d62ccf766c5113d8e - depends: - - cctools_osx-64 - - clang_osx-64 19.1.7 h7e5c614_27 - - clangxx_impl_osx-64 19.1.7 hb295874_27 - - sdkroot_env_osx-64 - license: BSD-3-Clause - license_family: BSD - size: 19513 - timestamp: 1764625479964 - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda sha256: 8af9233ce9d1f2bbdf05709756b3d5ea80206c55b821950403268ee4c9affce6 md5: 51cfb178328f60dbaad16fa06b0f20c2 @@ -5088,17 +4750,6 @@ packages: license_family: APACHE size: 113548 timestamp: 1763529895706 -- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.7-hb700be7_0.conda - sha256: 40d94a16674b7ff35d765fa4d2572c5061d6d26c87fe0636efa4a4e219819745 - md5: 1feb50fc3c348b9c2b1228c9e8591ab9 - depends: - - __glibc >=2.17,<3.0.a0 - - compiler-rt21_linux-64 21.1.7.* - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - size: 114042 - timestamp: 1764722702812 - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda sha256: 592d3edc23e74f6a1d11ad1442ef71e82bc962eb986a53dd0e411258c668ba1a md5: 5c8e0123bbecfdda58dff88b6bfaae3f @@ -5110,16 +4761,6 @@ packages: license_family: APACHE size: 114332 timestamp: 1763529762326 -- conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.7-hfefdfc9_0.conda - sha256: 4691c6fed3b88061b07c2e7b32f0a339666d55749e1468dce2cc745b9ba775dd - md5: c4824701efc432e2aa83d17f446f8964 - depends: - - compiler-rt21_linux-aarch64 21.1.7.* - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - size: 114435 - timestamp: 1764722766799 - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda sha256: 3fd96d0fd1da025cb8e6fc606293fd5e86659e3ccfb17399b8460c73ad44c92b md5: ec1df7fddacdefe2e8ab184ab560342c @@ -5129,14 +4770,6 @@ packages: license_family: APACHE size: 48412820 timestamp: 1763529771865 -- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.7-hffcefe0_0.conda - sha256: 055db902df4715261b123568f09af4311060f3810f340969064e0718e02d4966 - md5: 9b1c4f25cd8a99131fb19acd3b29e4f5 - constrains: - - compiler-rt >=9.0.1 - license: Apache-2.0 WITH LLVM-exception - size: 47702465 - timestamp: 1764722602 - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda sha256: ae904f20ddc9efd6ccbc97b0bb91384018e6f9730a9adbb9c99a3f232af83169 md5: a687dc2c466e19e1669e57fb87aaf7ca @@ -5146,14 +4779,6 @@ packages: license_family: APACHE size: 32909856 timestamp: 1763529676082 -- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.7-hfefdfc9_0.conda - sha256: cbe003d309b3abef584dc001f604b19a8adaf1de11be3d40781e155c8694149e - md5: 639b3f84c092136a0db7cf1d5e8d8d75 - constrains: - - compiler-rt >=9.0.1 - license: Apache-2.0 WITH LLVM-exception - size: 33209143 - timestamp: 1764722670889 - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda sha256: e6effe89523fc6143819f7a68372b28bf0c176af5b050fe6cf75b62e9f6c6157 md5: 32deecb68e11352deaa3235b709ddab2 @@ -6322,17 +5947,6 @@ packages: license_family: BSD size: 27073 timestamp: 1763757768301 -- conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-he6f32d1_14.conda - sha256: ae338fa6e156a79cf69db2e296ec862fd41e09ed42ab6c1cbab5fbf50a750307 - md5: 9c792be16fc0c2b5ed6d1f3b768876e8 - depends: - - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_14 - - binutils_linux-64 - - sysroot_linux-64 - license: BSD-3-Clause - size: 27404 - timestamp: 1764713544855 - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda sha256: 2b98b6f0c6a4065c7df3674288694a857aca46824d41cafe9552d5e58f48d9a1 md5: 617095c2eb35405af60572a45b319b83 @@ -6345,17 +5959,6 @@ packages: license_family: BSD size: 26871 timestamp: 1763757746592 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-hef95cfa_14.conda - sha256: 899e11c611d3bc315d88333be8547124f1e47092798065bb497e9a98d103d658 - md5: ba095fd345f927689347487a8020a598 - depends: - - gxx_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_14 - - binutils_linux-aarch64 - - sysroot_linux-aarch64 - license: BSD-3-Clause - size: 27162 - timestamp: 1764713836536 - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -6958,18 +6561,6 @@ packages: license_family: Apache size: 21054536 timestamp: 1763564022522 -- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.7-default_h99862b1_0.conda - sha256: 8408e8b7dc4ac90bc011f76732277e6567645258c201a67803afd4804e9b5cd5 - md5: e0015b7d1873038a184e073c0d87bdd5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libllvm21 >=21.1.7,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 21068618 - timestamp: 1764757807779 - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda sha256: 16ab2b2884ceededa62855680f9ee76f31881c0a4043506667c0ff7f7d2f842c md5: 6457ea18e8c2a534017aa7c7c88768eb @@ -6981,17 +6572,6 @@ packages: license_family: Apache size: 20647658 timestamp: 1763565272067 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.7-default_he95a3c9_0.conda - sha256: bf071279d588620693e985050c614e13541c01c953f1b2265b50ae85719caa4f - md5: e81d5669315525a0f67aafc621fe5b6d - depends: - - libgcc >=14 - - libllvm21 >=21.1.7,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 20660183 - timestamp: 1764760729269 - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 md5: 01e149d4a53185622dc2e788281961f2 @@ -7098,16 +6678,6 @@ packages: license_family: Apache size: 826706 timestamp: 1742451299167 -- conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - sha256: 760af3509e723d8ee5a9baa7f923a213a758b3a09e41ffdaf10f3a474898ab3f - md5: 52031c3ab8857ea8bcc96fe6f1b6d778 - depends: - - libcxx >=19.1.7 - - libcxx-headers >=19.1.7,<19.1.8.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 23069 - timestamp: 1764648572536 - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda sha256: 6dd08a65b8ef162b058dc931aba3bdb6274ba5f05b6c86fbd0c23f2eafc7cc47 md5: 1399af81db60d441e7c6577307d5cf82 @@ -7117,27 +6687,6 @@ packages: license_family: Apache size: 825628 timestamp: 1742451285589 -- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - sha256: ec07ebaa226792f4e2bf0f5dba50325632a7474d5f04b951d8291be70af215da - md5: 9f7810b7c0a731dbc84d46d6005890ef - depends: - - libcxx >=19.1.7 - - libcxx-headers >=19.1.7,<19.1.8.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 23000 - timestamp: 1764648270121 -- conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - sha256: 36485e6807e03a4f15a8018ec982457a9de0a1318b4b49a44c5da75849dbe24f - md5: de91b5ce46dc7968b6e311f9add055a2 - depends: - - __unix - constrains: - - libcxx-devel 19.1.7 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 830747 - timestamp: 1764647922410 - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -8084,21 +7633,6 @@ packages: license_family: Apache size: 44320002 timestamp: 1763523422320 -- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.7-hf7376ad_0.conda - sha256: afe5c5cfc90dc8b5b394e21cf02188394e36766119ad5d78a1d8619d011bbfb1 - md5: 27dc1a582b442f24979f2a28641fe478 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 44320825 - timestamp: 1764711528746 - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda sha256: 14faa9b266130aca81736d8551350d11c1ea2e0e16912a861d449cb9ace011b4 md5: 54e87a913eeaa2b27f2e7b491860f612 @@ -8113,20 +7647,6 @@ packages: license_family: Apache size: 43168385 timestamp: 1763518618696 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.7-hfd2ba90_0.conda - sha256: 218b58e4ebd1470d1b28ddf61849ea4a3e17e75332e075d24945c2ae375357fe - md5: 6627fdee03b7c7d943f70fd74a7c2ab0 - depends: - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 43155655 - timestamp: 1764703741821 - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc @@ -8940,38 +8460,6 @@ packages: license_family: MIT size: 40607 timestamp: 1761016108361 -- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-hba2cd1d_0.conda - sha256: fa01101fe7d95085846c16825f0e7dc0efe1f1c7438a96fe7395c885d6179495 - md5: a53d5f7fff38853ddb6bdc8fb609c039 - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h8eac4d7_0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - icu <0.0a0 - license: MIT - license_family: MIT - size: 40611 - timestamp: 1761016283558 -- conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - sha256: f507960adf64ee9c9c7b7833d8b11980765ebd2bf5345f73d5a3b21b259eaed5 - md5: 9176ee05643a1bfe7f2e7b4c921d2c3d - depends: - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h692994f_0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 - license: MIT - license_family: MIT - size: 43209 - timestamp: 1761016354235 - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda sha256: fb51b91a01eac9ee5e26c67f4e081f09f970c18a3da5231b8172919a1e1b3b6b md5: 87116b9de9c1825c3fd4ef92c984877b @@ -9080,21 +8568,6 @@ packages: license_family: MIT size: 464952 timestamp: 1761016087733 -- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h8eac4d7_0.conda - sha256: 3f3f9ba64a3fca15802d4eaf2a97696e6dcd916effa6a683756fd9f11245df5a - md5: cf7291a970b93fe3bb726879f2037af8 - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - libxml2 2.15.1 - - icu <0.0a0 - license: MIT - license_family: MIT - size: 464186 - timestamp: 1761016258891 - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda sha256: 3f65ea0f04c7738116e74ca87d6e40f8ba55b3df31ef42b8cb4d78dd96645e90 md5: 4a5ea6ec2055ab0dfd09fd0c498f834a @@ -9112,23 +8585,6 @@ packages: license_family: MIT size: 518616 timestamp: 1761016240185 -- conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda - sha256: 04129dc2df47a01c55e5ccf8a18caefab94caddec41b3b10fbc409e980239eb9 - md5: 70ca4626111579c3cd63a7108fe737f9 - depends: - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 - - libxml2 2.15.1 - license: MIT - license_family: MIT - size: 518135 - timestamp: 1761016320405 - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -9204,22 +8660,6 @@ packages: license_family: APACHE size: 135571207 timestamp: 1763550582191 -- conda: https://prefix.dev/conda-forge/win-64/lld-21.1.7-hc465015_0.conda - sha256: 04c7c92fc03977fca2a738abf1d52294c668f04240bf675a831d2128f675e0f1 - md5: 24ff91c37fad0c44d9402b31cb3bc873 - depends: - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - llvm ==21.1.7 - license: Apache-2.0 WITH LLVM-exception - size: 135758467 - timestamp: 1764723285782 - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda sha256: d7b534285d4abe0042ca985149df4888e808a5c1731f4a87c5552dc725d8a1d8 md5: 7a0b9ce502e0ed62195e02891dfcd704 @@ -9232,17 +8672,6 @@ packages: license_family: APACHE size: 3209134 timestamp: 1763529474187 -- conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.7-h4922eb0_0.conda - sha256: 6579325669ba27344be66f319c316396f09d9f1a054178df257009591b7d7f43 - md5: ec29f865968a81e1961b3c2f2765eebb - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - intel-openmp <0.0a0 - - openmp 21.1.7|21.1.7.* - license: Apache-2.0 WITH LLVM-exception - size: 6115936 - timestamp: 1764721254857 - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda sha256: 77aaf7585d3bad2e9e54b2532d2f7b27cac3e38b1d1514dc8ba6ba232f9cd452 md5: 87573180fdb2f22ac79f77b78751c87c @@ -9253,15 +8682,6 @@ packages: license_family: APACHE size: 3152998 timestamp: 1763529385828 -- conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.7-he40846f_0.conda - sha256: 1e1648067ae3ac69b4578152cdbe705daad9b80ae8faf89fb8db081089497b6c - md5: 897caeb8c274905eaf0c58ec1ec22a4c - constrains: - - openmp 21.1.7|21.1.7.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - size: 5889230 - timestamp: 1764721139563 - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda sha256: 589a5d1c7af859096e19acd7665534a63b6d9ead2684f5c906747052f56adb9c md5: d002bb48f35085405e90a62ffeebebfb @@ -9274,17 +8694,6 @@ packages: license_family: APACHE size: 310985 timestamp: 1763529609247 -- conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.7-h472b3d1_0.conda - sha256: 5ae51ca08ac19ce5504b8201820ba6387365662033f20af2150ae7949f3f308a - md5: c9f0fc88c8f46637392b95bef78dc036 - depends: - - __osx >=10.13 - constrains: - - openmp 21.1.7|21.1.7.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - size: 311027 - timestamp: 1764721464764 - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda sha256: 51ebeacae9225649e2c3bbfc9ed2ed690400b78ba79d0d3ee9ff428e8b951fed md5: 4a274d80967416bce3c7d89bf43923ec @@ -9297,17 +8706,6 @@ packages: license_family: APACHE size: 286206 timestamp: 1763529774822 -- conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.7-h4a912ad_0.conda - sha256: 002695e79b0e4c2d117a8bd190ffd62ef3d74a4cae002afa580bd1f98f9560a3 - md5: 05d475f50ddcc2173a6beece9960c6cb - depends: - - __osx >=11.0 - constrains: - - openmp 21.1.7|21.1.7.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - size: 286129 - timestamp: 1764721670250 - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda sha256: 8d042ee522bc9eb12c061f5f7e53052aeb4f13e576e624c8bebaf493725b95a0 md5: 0f79b23c03d80f22ce4fe0022d12f6d2 @@ -12012,28 +11410,6 @@ packages: license_family: MIT size: 4081987 timestamp: 1758351259295 -- conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-unix_0.conda - sha256: ef494bf8bf8ed31367389b5b64930b33ffd7c68aa80458883e6903eb775545b6 - md5: 2e6287a3f027f3e66e4b1ee14becf94d - depends: - - __unix - constrains: - - rust >=1.91.1,<1.91.2.0a0 - license: MIT - license_family: MIT - size: 4128715 - timestamp: 1762815756675 -- conda: https://prefix.dev/conda-forge/noarch/rust-src-1.91.1-win_0.conda - sha256: 4eb8a801a70ac0d1898eec1c7bd43c39175074499da95c0b550cff9a621314cf - md5: 0a5350c88ddb5072adfee35536673028 - depends: - - __win - constrains: - - rust >=1.91.1,<1.91.2.0a0 - license: MIT - license_family: MIT - size: 4117874 - timestamp: 1762817801869 - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda sha256: 3c39f49325d0335c24ded6c2944734bb1ca3b072255a0a20942e4a0970065ad2 md5: 051ab4f9607160ed71ad648cf0f222ab @@ -12106,13 +11482,6 @@ packages: license_family: BSD size: 8703 timestamp: 1764290395681 -- conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_4.conda - sha256: e0ec582a2ef7eca39fb40b17753e0a4006c02e794e3fc85ab598931d16ba28d5 - md5: bfc192e9093bd93e38185351be812157 - license: BSD-3-Clause - license_family: BSD - size: 8900 - timestamp: 1764616252089 - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda sha256: 553cb066814b77257104073d7b81c3038459bf4ec7f5c0c435c666887f642b0b md5: 3351af6c29661d56d7ef9ea9699d1314 diff --git a/pixi.toml b/pixi.toml index 19719cebeb..5aec1e6c28 100644 --- a/pixi.toml +++ b/pixi.toml @@ -21,8 +21,6 @@ git = ">=2.51.0,<3" python = ">=3.13.5,<3.15" [tasks] -build-debug = "cargo build" -build-release = "cargo build --release" bump = "tbump --only-patch $RELEASE_VERSION" generate-cli-docs = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml" insta = "cargo insta" @@ -205,6 +203,10 @@ scripts = ["scripts/activate.sh"] [feature.build.activation] env.CARGO_TARGET_DIR = "target/pixi" +[feature.build.tasks] +build-debug = "cargo build" +build-release = "cargo build --release" + [feature.docs.dependencies] cairosvg = ">=2.8.2,<3" git-cliff = ">=2.11.0,<3" @@ -288,12 +290,12 @@ test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CAR [environments] default = { features = [ - "build", "dev", "schema", "pytest", "rust", ], solve-group = "default" } +build = { features = ["build", "rust"], solve-group = "default" } dist = { features = ["dist"], no-default-feature = true } docs = { features = [ "docs", @@ -302,7 +304,6 @@ lint = { features = [ "lint", "rust", "pytest", - "build", "schema", "pypi-gen", ], no-default-feature = true, solve-group = "default" } @@ -313,7 +314,7 @@ schema = { features = [ "pytest", ], no-default-feature = true, solve-group = "default" } test-export = { features = ["micromamba"], no-default-feature = true } -test-native-certs = { features = ["native-certs-test", "build"] } +test-native-certs = { features = ["native-certs-test"] } trampoline = { features = ["trampoline"], no-default-feature = true } diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index 10ca85e689..3040e3c8ff 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -1,4 +1,3 @@ -import os from pathlib import Path import pytest @@ -276,14 +275,10 @@ def test_incremental_builds( copytree_with_local_backend(test_workspace, tmp_pixi_workspace, dirs_exist_ok=True) manifest_path = tmp_pixi_workspace / "pixi.toml" - # Clear CARGO_TARGET_* settings from parent environment to avoid cross-compiler issues - env = {key: "" for key in os.environ if key.startswith("CARGO_TARGET_")} - verify_cli_command( [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], stderr_contains=non_incremental_evidence, strip_ansi=True, - env=env, ) # immediately repeating the build should give evidence of incremental compilation @@ -291,7 +286,6 @@ def test_incremental_builds( [pixi, "build", "-v", "--path", manifest_path, "--output-dir", tmp_pixi_workspace], stderr_excludes=non_incremental_evidence, strip_ansi=True, - env=env, ) From 0576bca0d130284ab16fa1dc1cacc048ef89fc7c Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 10:12:18 +0100 Subject: [PATCH 08/70] Fix lints --- .../workflows/backends-python-bindings.yml | 3 +- .github/workflows/backends-ros.yml | 3 +- .github/workflows/backends-rust.yml | 54 -------- Cargo.lock | 42 ++----- Cargo.toml | 14 +-- crates/pixi-build-backend/Cargo.toml | 21 ++-- crates/pixi-build-cmake/Cargo.toml | 9 +- crates/pixi-build-cmake/pixi.toml | 4 +- crates/pixi-build-cmake/src/config.rs | 2 +- crates/pixi-build-mojo/Cargo.toml | 6 +- crates/pixi-build-mojo/pixi.toml | 4 +- crates/pixi-build-mojo/src/config.rs | 2 +- crates/pixi-build-python/Cargo.toml | 24 ++-- crates/pixi-build-python/pixi.toml | 4 +- crates/pixi-build-python/src/config.rs | 2 +- crates/pixi-build-rattler-build/Cargo.toml | 10 +- crates/pixi-build-rattler-build/pixi.toml | 4 +- crates/pixi-build-rattler-build/src/config.rs | 2 +- crates/pixi-build-rust/Cargo.toml | 19 ++- crates/pixi-build-rust/pixi.toml | 4 +- crates/pixi-build-rust/src/config.rs | 2 +- crates/pixi_build_frontend/Cargo.toml | 2 +- crates/recipe-stage0/Cargo.toml | 8 +- crates/xtask/Cargo.toml | 4 +- docs/build/backends.md | 2 +- examples/pixi-build/array-api-extra/pixi.toml | 2 +- .../backends/pixi-build-ros/pixi.toml | 26 ++-- .../backends/pixi-build-ros/pyproject.toml | 14 +-- .../src/pixi_build_ros/metadata_provider.py | 2 +- .../src/pixi_build_ros/ros_generator.py | 19 ++- .../templates/build_ament_cmake.sh | 18 +-- .../templates/build_ament_python.sh | 22 ++-- .../pixi-build-ros/templates/build_catkin.sh | 119 +++++++++--------- .../py-pixi-build-backend/Cargo.toml | 10 +- .../examples/pixi-build-python/pyproject.toml | 16 +-- .../py-pixi-build-backend/pixi.toml | 6 +- .../py-pixi-build-backend/pyproject.toml | 22 ++-- pixi.toml | 4 +- tests/data/channels/mappings.toml | 2 +- .../multi-output-recipe/001_initial/pixi.toml | 12 +- tests/integration_python/common.py | 8 +- .../integration_python/pixi_build/conftest.py | 8 +- typos.toml | 1 + 43 files changed, 243 insertions(+), 319 deletions(-) delete mode 100644 .github/workflows/backends-rust.yml diff --git a/.github/workflows/backends-python-bindings.yml b/.github/workflows/backends-python-bindings.yml index 09892ba737..77bc1185ea 100644 --- a/.github/workflows/backends-python-bindings.yml +++ b/.github/workflows/backends-python-bindings.yml @@ -34,7 +34,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - - uses: prefix-dev/setup-pixi@main + persist-credentials: false + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: manifest-path: pixi-build-backends/py-pixi-build-backend/pixi.toml environments: ci diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml index 41b78abd84..4337f75206 100644 --- a/.github/workflows/backends-ros.yml +++ b/.github/workflows/backends-ros.yml @@ -33,7 +33,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - - uses: prefix-dev/setup-pixi@main + persist-credentials: false + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: manifest-path: pixi-build-backends/backends/pixi-build-ros/pixi.toml - name: Run mypy diff --git a/.github/workflows/backends-rust.yml b/.github/workflows/backends-rust.yml deleted file mode 100644 index e027404af9..0000000000 --- a/.github/workflows/backends-rust.yml +++ /dev/null @@ -1,54 +0,0 @@ -on: - push: - branches: - - "main" - paths: - - crates/pixi-build-*/** - - crates/recipe-stage0/** - - .github/workflows/backends-rust.yml - pull_request: - paths: - - crates/pixi-build-*/** - - crates/recipe-stage0/** - - .github/workflows/backends-rust.yml - -name: Backends - Rust - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - RUST_LOG: info - RUST_BACKTRACE: 1 - RUSTFLAGS: "-D warnings" - CARGO_TERM_COLOR: always - -jobs: - test: - name: Test Backend Crates - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.os }} - timeout-minutes: 20 - steps: - - uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@main - with: - cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} - - uses: Swatinem/rust-cache@v2 - with: - workspaces: ". -> target/pixi" - key: ${{ hashFiles('pixi.lock') }} - save-if: ${{ github.ref == 'refs/heads/main' }} - - name: Run backend crate tests - run: | - pixi run cargo test -p pixi-build-backend - pixi run cargo test -p pixi-build-python - pixi run cargo test -p pixi-build-cmake - pixi run cargo test -p pixi-build-rust - pixi run cargo test -p pixi-build-mojo - pixi run cargo test -p pixi-build-rattler-build - pixi run cargo test -p recipe-stage0 diff --git a/Cargo.lock b/Cargo.lock index 3e87bfa0a8..65be646f27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5316,7 +5316,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit 0.23.9", + "toml_edit", "tracing", "tracing-subscriber", "typed-path", @@ -5361,7 +5361,6 @@ dependencies = [ "thiserror 2.0.17", "tokio", "toml", - "toml_edit 0.24.0+spec-1.1.0", "tracing", "tracing-subscriber", "url", @@ -5372,7 +5371,6 @@ name = "pixi-build-cmake" version = "0.3.7" dependencies = [ "async-trait", - "fs-err", "indexmap 2.12.1", "insta", "miette 7.6.0", @@ -5480,7 +5478,6 @@ dependencies = [ "rstest", "serde", "serde_json", - "temp-env", "tempfile", "thiserror 2.0.17", "tokio", @@ -5705,7 +5702,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tokio-util 0.7.17", - "toml_edit 0.23.9", + "toml_edit", "tracing", "tracing-subscriber", "typed-path", @@ -5810,7 +5807,7 @@ dependencies = [ "serde_ignored", "serde_json", "thiserror 2.0.17", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", ] @@ -5893,7 +5890,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit 0.23.9", + "toml_edit", "tracing", "tracing-test", "typed-path", @@ -6049,7 +6046,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "toml-span", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", "zstd", @@ -6157,7 +6154,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "toml-span", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", ] @@ -6206,7 +6203,7 @@ dependencies = [ "serde_json", "thiserror 2.0.17", "toml-span", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", ] @@ -6294,7 +6291,7 @@ dependencies = [ "serde_with", "thiserror 2.0.17", "toml-span", - "toml_edit 0.23.9", + "toml_edit", "tracing", "typed-path", "url", @@ -6670,7 +6667,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.9", + "toml_edit", ] [[package]] @@ -9725,19 +9722,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_edit" -version = "0.24.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c740b185920170a6d9191122cafef7010bd6270a3824594bff6784c04d7f09e" -dependencies = [ - "indexmap 2.12.1", - "toml_datetime", - "toml_parser", - "toml_writer", - "winnow", -] - [[package]] name = "toml_parser" version = "1.0.6+spec-1.1.0" @@ -10208,7 +10192,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml_edit 0.23.9", + "toml_edit", "tracing", "uv-cache-key", "uv-configuration", @@ -10885,7 +10869,7 @@ dependencies = [ "serde", "serde-untagged", "thiserror 2.0.17", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", "uv-cache-key", @@ -11058,7 +11042,7 @@ dependencies = [ "tokio", "tokio-stream", "toml", - "toml_edit 0.23.9", + "toml_edit", "tracing", "url", "uv-cache-key", @@ -11305,7 +11289,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "toml", - "toml_edit 0.23.9", + "toml_edit", "tracing", "uv-build-backend", "uv-cache-key", diff --git a/Cargo.toml b/Cargo.toml index e362faed5a..f8a96c0c1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ exclude = [ "pixi-build-backends", "tests/data", "trampoline", - "pytest-temp" + "pytest-temp", ] members = ["crates/*"] resolver = "3" @@ -31,13 +31,13 @@ assert_matches = "1.5.0" async-fd-lock = "0.2.0" async-once-cell = "0.5.4" async-trait = "0.1.86" -cargo_toml = "0.22.3" -clap-verbosity-flag = "3.0.2" axum = "0.8" barrier_cell = { path = "crates/barrier_cell" } base64 = "0.22.1" +cargo_toml = "0.22.3" chrono = "0.4.40" clap = { version = "4.5.31", default-features = false } +clap-verbosity-flag = "3.0.2" clap_complete = "4.5.46" clap_complete_nushell = "4.5.5" # Rattler crates @@ -45,7 +45,6 @@ coalesced_map = "0.1.2" comfy-table = "7.2.1" console = "0.16.1" # Force crc to 3.3.0 to satisfy both lzma-rs (^3.0.0) and lzma-rust2 (=3.3.0) -crc = "=3.3.0" console-subscriber = "0.5.0" crossbeam-channel = "0.5.14" csv = "1.3.1" @@ -132,16 +131,12 @@ pixi_uv_conversions = { path = "crates/pixi_uv_conversions" } pixi_variant = { path = "crates/pixi_variant" } # Pixi build backends pixi-build-backend = { path = "crates/pixi-build-backend" } -pixi-build-cmake = { path = "crates/pixi-build-cmake" } -pixi-build-mojo = { path = "crates/pixi-build-mojo" } -pixi-build-python = { path = "crates/pixi-build-python" } -pixi-build-rattler-build = { path = "crates/pixi-build-rattler-build" } -pixi-build-rust = { path = "crates/pixi-build-rust" } pypi_mapping = { path = "crates/pypi_mapping" } pypi_modifiers = { path = "crates/pypi_modifiers" } pyproject-toml = "0.13.7" rand = { version = "0.9.1", default-features = false } rattler = { version = "0.39.0", default-features = false } +rattler-build = { git = "https://github.com/prefix-dev/rattler-build", branch = "main", default-features = false } rattler_cache = { version = "0.6.2", default-features = false } rattler_conda_types = { version = "0.42.0", default-features = false, features = [ "rayon", @@ -161,7 +156,6 @@ rattler_upload = { version = "0.4.5", default-features = false, features = [ "s3", ] } rattler_virtual_packages = { version = "2.3.0", default-features = false } -rattler-build = { git = "https://github.com/prefix-dev/rattler-build", branch = "main", default-features = false } rayon = "1.10.0" recipe-stage0 = { path = "crates/recipe-stage0" } regex = "1.11.1" diff --git a/crates/pixi-build-backend/Cargo.toml b/crates/pixi-build-backend/Cargo.toml index abb9c2bc32..7ed5246d9d 100644 --- a/crates/pixi-build-backend/Cargo.toml +++ b/crates/pixi-build-backend/Cargo.toml @@ -1,7 +1,7 @@ [package] +edition.workspace = true name = "pixi-build-backend" version = "0.1.5" -edition.workspace = true [features] default = ["rustls-tls"] @@ -17,36 +17,35 @@ clap = { workspace = true, features = ["derive", "env"] } clap-verbosity-flag = { workspace = true } fs-err = { workspace = true } indexmap = { workspace = true } -ordermap = { workspace = true } itertools = { workspace = true } miette = { workspace = true } minijinja = { workspace = true } -rattler_conda_types = { workspace = true } -rattler_virtual_packages = { workspace = true } +ordermap = { workspace = true } +pathdiff = { workspace = true } rattler-build = { workspace = true } +rattler_conda_types = { workspace = true } rattler_digest = { workspace = true } +rattler_virtual_packages = { workspace = true } serde = { workspace = true, features = ["derive"] } -serde_yaml = { workspace = true } serde_json = { workspace = true } +serde_yaml = { workspace = true } tempfile = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, features = ["macros"] } -tracing-subscriber = { workspace = true } tracing = { workspace = true } +tracing-subscriber = { workspace = true } url = { workspace = true } -pathdiff = { workspace = true } -thiserror = { workspace = true } pixi_build_types = { workspace = true } -jsonrpc-stdio-server = { workspace = true } -jsonrpc-http-server = { workspace = true } jsonrpc-core = { workspace = true } +jsonrpc-http-server = { workspace = true } +jsonrpc-stdio-server = { workspace = true } recipe-stage0 = { workspace = true } [dev-dependencies] insta = { version = "1.42.1", features = ["yaml", "redactions", "filters"] } -toml_edit = { version = "0.24.0" } toml = { version = "0.9.0" } [package.metadata.cargo-shear] diff --git a/crates/pixi-build-cmake/Cargo.toml b/crates/pixi-build-cmake/Cargo.toml index 05555db21c..99427c75ef 100644 --- a/crates/pixi-build-cmake/Cargo.toml +++ b/crates/pixi-build-cmake/Cargo.toml @@ -1,13 +1,13 @@ [package] -name = "pixi-build-cmake" -version = "0.3.7" description = "CMake build backend for Pixi" edition.workspace = true +name = "pixi-build-cmake" +version = "0.3.7" [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] async-trait = { workspace = true } @@ -25,7 +25,6 @@ tokio = { workspace = true, features = ["macros"] } [dev-dependencies] insta = { workspace = true, features = ["yaml", "redactions", "filters"] } rstest = { workspace = true } +serde_json = { workspace = true } strum = { workspace = true } tempfile = { workspace = true } -fs-err = { workspace = true } -serde_json = { workspace = true } diff --git a/crates/pixi-build-cmake/pixi.toml b/crates/pixi-build-cmake/pixi.toml index db392f4861..82ccafe0ac 100644 --- a/crates/pixi-build-cmake/pixi.toml +++ b/crates/pixi-build-cmake/pixi.toml @@ -1,10 +1,10 @@ [package.build.backend] -name = "pixi-build-rust" -version = "*" channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] +name = "pixi-build-rust" +version = "*" [package.run-dependencies] pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-cmake/src/config.rs b/crates/pixi-build-cmake/src/config.rs index c1a5b73eb0..8014360898 100644 --- a/crates/pixi-build-cmake/src/config.rs +++ b/crates/pixi-build-cmake/src/config.rs @@ -76,7 +76,7 @@ mod tests { use super::CMakeBackendConfig; #[test] - fn test_ensure_deseralize_from_empty() { + fn test_ensure_deserialize_from_empty() { let json_data = json!({}); serde_json::from_value::(json_data).unwrap(); } diff --git a/crates/pixi-build-mojo/Cargo.toml b/crates/pixi-build-mojo/Cargo.toml index 7136e14e9b..e6cebac806 100644 --- a/crates/pixi-build-mojo/Cargo.toml +++ b/crates/pixi-build-mojo/Cargo.toml @@ -1,20 +1,20 @@ [package] +edition.workspace = true name = "pixi-build-mojo" version = "0.1.7" -edition.workspace = true [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] async-trait = { workspace = true } indexmap = { workspace = true } miette = { workspace = true } minijinja = { workspace = true } -rattler_conda_types = { workspace = true } rattler-build = { workspace = true } +rattler_conda_types = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } tempfile = { workspace = true } diff --git a/crates/pixi-build-mojo/pixi.toml b/crates/pixi-build-mojo/pixi.toml index db392f4861..82ccafe0ac 100644 --- a/crates/pixi-build-mojo/pixi.toml +++ b/crates/pixi-build-mojo/pixi.toml @@ -1,10 +1,10 @@ [package.build.backend] -name = "pixi-build-rust" -version = "*" channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] +name = "pixi-build-rust" +version = "*" [package.run-dependencies] pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-mojo/src/config.rs b/crates/pixi-build-mojo/src/config.rs index 458c0aec60..b3df070ac0 100644 --- a/crates/pixi-build-mojo/src/config.rs +++ b/crates/pixi-build-mojo/src/config.rs @@ -452,7 +452,7 @@ mod tests { use super::*; #[test] - fn test_ensure_deseralize_from_empty() { + fn test_ensure_deserialize_from_empty() { let json_data = json!({}); serde_json::from_value::(json_data).unwrap(); } diff --git a/crates/pixi-build-python/Cargo.toml b/crates/pixi-build-python/Cargo.toml index 8978114d4c..9b09fe0fb9 100644 --- a/crates/pixi-build-python/Cargo.toml +++ b/crates/pixi-build-python/Cargo.toml @@ -1,34 +1,34 @@ [package] +edition.workspace = true name = "pixi-build-python" version = "0.4.4" -edition.workspace = true [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls"] native-tls = ["pixi-build-backend/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls"] [dependencies] async-trait = { workspace = true } +fs-err = { workspace = true } indexmap = { workspace = true } miette = { workspace = true } minijinja = { workspace = true } +once_cell = { workspace = true } +pep508_rs = { workspace = true } +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } +pyproject-toml = { workspace = true } rattler_conda_types = { workspace = true } +recipe-stage0 = { workspace = true } reqwest = { workspace = true, features = ["json"] } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } -toml = { workspace = true } +spdx = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, features = ["macros"] } +toml = { workspace = true } tracing = { workspace = true } -pyproject-toml = { workspace = true } -pep508_rs = { workspace = true } -fs-err = { workspace = true } -once_cell = { workspace = true } -thiserror = { workspace = true } -pixi-build-backend = { workspace = true } -pixi_build_types = { workspace = true } -recipe-stage0 = { workspace = true } -spdx = { workspace = true } [dev-dependencies] insta = { workspace = true, features = ["yaml", "redactions", "filters"] } diff --git a/crates/pixi-build-python/pixi.toml b/crates/pixi-build-python/pixi.toml index db392f4861..82ccafe0ac 100644 --- a/crates/pixi-build-python/pixi.toml +++ b/crates/pixi-build-python/pixi.toml @@ -1,10 +1,10 @@ [package.build.backend] -name = "pixi-build-rust" -version = "*" channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] +name = "pixi-build-rust" +version = "*" [package.run-dependencies] pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-python/src/config.rs b/crates/pixi-build-python/src/config.rs index e81d62bdf0..1bb51e65c0 100644 --- a/crates/pixi-build-python/src/config.rs +++ b/crates/pixi-build-python/src/config.rs @@ -116,7 +116,7 @@ mod tests { use std::path::PathBuf; #[test] - fn test_ensure_deseralize_from_empty() { + fn test_ensure_deserialize_from_empty() { let json_data = json!({}); serde_json::from_value::(json_data).unwrap(); } diff --git a/crates/pixi-build-rattler-build/Cargo.toml b/crates/pixi-build-rattler-build/Cargo.toml index 27bb956881..fc8c49adc4 100644 --- a/crates/pixi-build-rattler-build/Cargo.toml +++ b/crates/pixi-build-rattler-build/Cargo.toml @@ -1,28 +1,28 @@ [package] +edition.workspace = true name = "pixi-build-rattler-build" version = "0.3.6" -edition.workspace = true [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] async-trait = { workspace = true } miette = { workspace = true } -rattler_conda_types = { workspace = true } +pathdiff = { workspace = true } rattler-build = { workspace = true } +rattler_conda_types = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } tempfile = { workspace = true } tokio = { workspace = true, features = ["macros"] } -pathdiff = { workspace = true } pixi-build-backend = { workspace = true } -pixi_build_types = { workspace = true } chrono = "0.4.41" +pixi_build_types = { workspace = true } tracing.workspace = true [dev-dependencies] diff --git a/crates/pixi-build-rattler-build/pixi.toml b/crates/pixi-build-rattler-build/pixi.toml index db392f4861..82ccafe0ac 100644 --- a/crates/pixi-build-rattler-build/pixi.toml +++ b/crates/pixi-build-rattler-build/pixi.toml @@ -1,10 +1,10 @@ [package.build.backend] -name = "pixi-build-rust" -version = "*" channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] +name = "pixi-build-rust" +version = "*" [package.run-dependencies] pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-rattler-build/src/config.rs b/crates/pixi-build-rattler-build/src/config.rs index acd321fd60..61983515a3 100644 --- a/crates/pixi-build-rattler-build/src/config.rs +++ b/crates/pixi-build-rattler-build/src/config.rs @@ -56,7 +56,7 @@ mod tests { use std::path::PathBuf; #[test] - fn test_ensure_deseralize_from_empty() { + fn test_ensure_deserialize_from_empty() { let json_data = json!({}); serde_json::from_value::(json_data).unwrap(); } diff --git a/crates/pixi-build-rust/Cargo.toml b/crates/pixi-build-rust/Cargo.toml index bb02152758..ba1c5131b2 100644 --- a/crates/pixi-build-rust/Cargo.toml +++ b/crates/pixi-build-rust/Cargo.toml @@ -1,38 +1,37 @@ [package] -name = "pixi-build-rust" -version = "0.4.4" description = "A Rust build backend for Pixi" documentation = "https://prefix-dev.github.io/pixi-build-backends/backends/pixi-build-rust/" -repository.workspace = true -license.workspace = true edition.workspace = true +license.workspace = true +name = "pixi-build-rust" +repository.workspace = true +version = "0.4.4" [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls"] native-tls = ["pixi-build-backend/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls"] [dependencies] async-trait = { workspace = true } +cargo_toml = { workspace = true } fs-err = { workspace = true } indexmap = { workspace = true } miette = { workspace = true } minijinja = { workspace = true, features = ["json"] } once_cell = { workspace = true } +pathdiff = { workspace = true } +pixi-build-backend = { workspace = true } +pixi_build_types = { workspace = true } rattler_conda_types = { workspace = true } serde = { workspace = true, features = ["derive"] } thiserror = { workspace = true } tokio = { workspace = true, features = ["macros"] } -cargo_toml = { workspace = true } -pathdiff = { workspace = true } -pixi-build-backend = { workspace = true } -pixi_build_types = { workspace = true } recipe-stage0 = { workspace = true } [dev-dependencies] insta = { workspace = true, features = ["yaml", "redactions", "filters"] } rstest = { workspace = true } -temp-env = { workspace = true } serde_json = { workspace = true } tempfile = { workspace = true } diff --git a/crates/pixi-build-rust/pixi.toml b/crates/pixi-build-rust/pixi.toml index db392f4861..82ccafe0ac 100644 --- a/crates/pixi-build-rust/pixi.toml +++ b/crates/pixi-build-rust/pixi.toml @@ -1,10 +1,10 @@ [package.build.backend] -name = "pixi-build-rust" -version = "*" channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] +name = "pixi-build-rust" +version = "*" [package.run-dependencies] pixi-build-api-version = ">=4,<5" diff --git a/crates/pixi-build-rust/src/config.rs b/crates/pixi-build-rust/src/config.rs index 0ff26867b4..2f4acd3afd 100644 --- a/crates/pixi-build-rust/src/config.rs +++ b/crates/pixi-build-rust/src/config.rs @@ -92,7 +92,7 @@ mod tests { use std::path::PathBuf; #[test] - fn test_ensure_deseralize_from_empty() { + fn test_ensure_deserialize_from_empty() { let json_data = json!({}); serde_json::from_value::(json_data).unwrap(); } diff --git a/crates/pixi_build_frontend/Cargo.toml b/crates/pixi_build_frontend/Cargo.toml index daa0f5d9f6..383b271e6c 100644 --- a/crates/pixi_build_frontend/Cargo.toml +++ b/crates/pixi_build_frontend/Cargo.toml @@ -18,13 +18,13 @@ ordermap = { workspace = true } pixi_build_discovery = { workspace = true } pixi_build_types = { workspace = true } rattler_conda_types = { workspace = true } +schemars = { workspace = true, optional = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true, features = ["process", "io-std"] } tokio-util = { workspace = true, features = ["codec"] } tracing = { workspace = true } -schemars = { workspace = true, optional = true } [dev-dependencies] diff --git a/crates/recipe-stage0/Cargo.toml b/crates/recipe-stage0/Cargo.toml index b927e60959..70b5dbf771 100644 --- a/crates/recipe-stage0/Cargo.toml +++ b/crates/recipe-stage0/Cargo.toml @@ -1,17 +1,17 @@ [package] +edition.workspace = true name = "recipe-stage0" version = "0.1.1" -edition.workspace = true [dependencies] -itertools = { workspace = true } hashlink = { workspace = true } +indexmap = { workspace = true } +itertools = { workspace = true } marked-yaml = { workspace = true } +rattler-build = { workspace = true } rattler_conda_types = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_yaml = { workspace = true } -rattler-build = { workspace = true } -indexmap = { workspace = true } url = { workspace = true } [dev-dependencies] diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index 8e633f057e..f9542da882 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -1,8 +1,8 @@ [package] -name = "xtask" -version = "0.1.0" edition.workspace = true +name = "xtask" publish = false +version = "0.1.0" [dependencies] clap = { workspace = true, features = ["derive", "std"] } diff --git a/docs/build/backends.md b/docs/build/backends.md index 350c959a92..5d58951455 100644 --- a/docs/build/backends.md +++ b/docs/build/backends.md @@ -14,7 +14,7 @@ This also allows for decoupling of the build backend from Pixi and it's manifest | [**`pixi-build-mojo`**](./backends/pixi-build-mojo.md) | Mojo applications and packages | All backends are available through the [conda-forge](https://prefix.dev/channels/conda-forge) conda channel and work across multiple platforms (Linux, macOS, Windows). -For the latest backend versions, you can preprend the channel list with the [prefix.dev/pixi-build-backends](https://prefix.dev/channels/pixi-build-backends) conda channel. +For the latest backend versions, you can prepend the channel list with the [prefix.dev/pixi-build-backends](https://prefix.dev/channels/pixi-build-backends) conda channel. ## Key Concepts diff --git a/examples/pixi-build/array-api-extra/pixi.toml b/examples/pixi-build/array-api-extra/pixi.toml index b225e576b5..7183afe563 100644 --- a/examples/pixi-build/array-api-extra/pixi.toml +++ b/examples/pixi-build/array-api-extra/pixi.toml @@ -1,5 +1,5 @@ [workspace] -channels = [ "https://prefix.dev/conda-forge" ] +channels = ["https://prefix.dev/conda-forge"] name = "array-api-extra-build" platforms = ["osx-arm64", "linux-64", "osx-64", "win-64"] preview = ["pixi-build"] diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index df6eff1a2e..5057722324 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -21,26 +21,26 @@ patchelf = "==0.18.0" scripts = ["../../scripts/activate.sh"] [dependencies] -pydantic = ">=2.8.2,<3" -py_rattler = ">=0.20,<0.21" py-pixi-build-backend = "*" +py_rattler = ">=0.20,<0.21" +pydantic = ">=2.8.2,<3" [pypi-dependencies] pixi-build-ros = { path = ".", editable = true } [environments] default = { features = ["test", "lint"], solve-group = "default" } -test = { features = ["test"], solve-group = "default" } lint = { features = ["lint"], no-default-feature = true } +test = { features = ["test"], solve-group = "default" } [feature.test.tasks] -test = "pytest tests" lint-mypy = "mypy" +test = "pytest tests" [feature.test.dependencies] +mypy = ">=1.18.2,<2" pixi-pycharm = ">=0.0.8,<0.1" pytest = "*" -mypy = ">=1.18.2,<2" syrupy = ">=5,<6" types-pyyaml = "*" # You can skip this as it's a long build, uncomment this when developing only in this package @@ -48,14 +48,14 @@ types-pyyaml = "*" py-pixi-build-backend = { path = "../../py-pixi-build-backend" } [feature.lint.dependencies] -ruff = "*" pyupgrade = ">=3.20.0,<4" +ruff = "*" [feature.lint.tasks] -lint-ruff = "ruff check ." +fmt = { depends-on = ["fmt-pyupgrade", "fmt-ruff"] } fmt-pyupgrade = "pyupgrade --py310-plus **/**/*.py" fmt-ruff = "ruff format src tests" -fmt = { depends-on = ["fmt-pyupgrade", "fmt-ruff"] } +lint-ruff = "ruff check ." ## Package section [package.build.backend] @@ -70,13 +70,13 @@ hatchling = "*" python = ">=3.10" [package.run-dependencies] -python = ">=3.10" -rosdistro = "*" -pydantic = ">=2.8.2,<3" -py_rattler = ">=0.15.0,<0.16" catkin_pkg = "*" -pyyaml = "*" pixi-build-api-version = ">=4,<5" +py_rattler = ">=0.15.0,<0.16" +pydantic = ">=2.8.2,<3" +python = ">=3.10" +pyyaml = "*" +rosdistro = "*" # should be added to `py-pixi-build-backend` typing-extensions = "*" # this depends has to match the test dependency, so switch comments if needed diff --git a/pixi-build-backends/backends/pixi-build-ros/pyproject.toml b/pixi-build-backends/backends/pixi-build-ros/pyproject.toml index 3037796644..bb1e418ba6 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pyproject.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pyproject.toml @@ -24,25 +24,25 @@ pixi-build-ros = "pixi_build_ros.main:main" packages = ["src/pixi_build_ros"] [tool.hatch.build.targets.wheel.shared-data] -"templates" = "site-packages/pixi_build_ros/templates" "robostack.yaml" = "site-packages/pixi_build_ros/robostack.yaml" +"templates" = "site-packages/pixi_build_ros/templates" [tool.hatch.build.targets.editable] packages = ["src/pixi_build_ros"] [tool.hatch.build.targets.editable.shared-data] -"templates" = "site-packages/pixi_build_ros/templates" "robostack.yaml" = "site-packages/pixi_build_ros/robostack.yaml" +"templates" = "site-packages/pixi_build_ros/templates" [tool.ruff] +fix = true line-length = 120 target-version = "py310" -fix = true [tool.mypy] -python_version = "3.10" +disable_error_code = ["empty-body", "no-untyped-call"] +enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] files = ["src/pixi_build_ros"] -strict = true ignore_missing_imports = true -enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] -disable_error_code = ["empty-body", "no-untyped-call"] +python_version = "3.10" +strict = true diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py index 14e2f40f2d..c9f699e2fd 100644 --- a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/metadata_provider.py @@ -36,7 +36,7 @@ def __init__( self.repository = repository -class PackageXmlMetadataProvider(MetadataProvider): # type: ignore[misc] # MetadatProvider is not typed +class PackageXmlMetadataProvider(MetadataProvider): # type: ignore[misc] # MetadataProvider is not typed """ Metadata provider that extracts metadata from ROS package.xml files. diff --git a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py index 40ade33b19..03757fa862 100644 --- a/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py +++ b/pixi-build-backends/backends/pixi-build-ros/src/pixi_build_ros/ros_generator.py @@ -3,36 +3,35 @@ """ import os -from pathlib import Path from importlib.resources import files +from pathlib import Path +from typing import Any from unittest.mock import patch -from typing import Any from pixi_build_backend.types.generated_recipe import ( - GenerateRecipeProtocol, GeneratedRecipe, + GenerateRecipeProtocol, ) -from .metadata_provider import ROSPackageXmlMetadataProvider from pixi_build_backend.types.intermediate_recipe import Script - from pixi_build_backend.types.item import ItemPackageDependency from pixi_build_backend.types.platform import Platform from pixi_build_backend.types.project_model import ProjectModel from pixi_build_backend.types.python_params import PythonParams -from .build_script import BuildScriptContext, BuildPlatform +from .build_script import BuildPlatform, BuildScriptContext +from .config import PackageMappingSource, ROSBackendConfig +from .metadata_provider import ROSPackageXmlMetadataProvider from .utils import ( - get_build_input_globs, - package_xml_to_conda_requirements, convert_package_xml_to_catkin_package, + get_build_input_globs, get_package_xml_content, load_package_map_data, merge_requirements, + package_xml_to_conda_requirements, ) -from .config import ROSBackendConfig, PackageMappingSource -class ROSGenerator(GenerateRecipeProtocol): # type: ignore[misc] # MetadatProvider is not typed +class ROSGenerator(GenerateRecipeProtocol): # type: ignore[misc] # MetadataProvider is not typed """ROS recipe generator using Python bindings.""" def generate_recipe( diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh index 0625260280..50e5f33879 100644 --- a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_cmake.sh @@ -5,7 +5,7 @@ set -eo pipefail BUILD_DIR=@BUILD_DIR@ if [ ! -d "$BUILD_DIR" ]; then - mkdir -p "$BUILD_DIR" + mkdir -p "$BUILD_DIR" fi pushd $BUILD_DIR @@ -14,14 +14,14 @@ BUILD_TYPE=@BUILD_TYPE@ # necessary for correctly linking SIP files (from python_qt_bindings) export LINK=$CXX -if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then - PYTHON_EXECUTABLE=$PREFIX/bin/python - PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config - export QT_HOST_PATH="$PREFIX" +if [[ $CONDA_BUILD_CROSS_COMPILATION != "1" ]]; then + PYTHON_EXECUTABLE=$PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config + export QT_HOST_PATH="$PREFIX" else - PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python - PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config - export QT_HOST_PATH="$BUILD_PREFIX" + PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config + export QT_HOST_PATH="$BUILD_PREFIX" fi # Only support 11.0+ for now @@ -31,7 +31,7 @@ OSX_DEPLOYMENT_TARGET="11.0" if [[ $target_platform =~ linux.* ]]; then export CFLAGS="${CFLAGS} -D__STDC_FORMAT_MACROS=1" export CXXFLAGS="${CXXFLAGS} -D__STDC_FORMAT_MACROS=1" -fi; +fi echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}" diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh index 65f9ffc40d..98a8ca9337 100644 --- a/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_ament_python.sh @@ -10,16 +10,16 @@ pushd $SRC_DIR # If there is a setup.cfg that contains install-scripts then we should not set it here if [ -f setup.cfg ] && grep -q "install[-_]scripts" setup.cfg; then - # Remove e.g. ros-humble- from PKG_NAME - PKG_NAME_SHORT=${PKG_NAME#*ros-@DISTRO@-} - # Substitute "-" with "_" - PKG_NAME_SHORT=${PKG_NAME_SHORT//-/_} - INSTALL_SCRIPTS_ARG="--install-scripts=$PREFIX/lib/$PKG_NAME_SHORT" - echo "WARNING: setup.cfg not set, will set INSTALL_SCRIPTS_ARG to: $INSTALL_SCRIPTS_ARG" - $PYTHON setup.py install --prefix="$PREFIX" --install-lib="$SP_DIR" $INSTALL_SCRIPTS_ARG --single-version-externally-managed --record=files.txt - # Remove build artifacts from setup.py install - rm -rf *.egg-info 2>/dev/null || true - rm -rf build/ 2>/dev/null || true + # Remove e.g. ros-humble- from PKG_NAME + PKG_NAME_SHORT=${PKG_NAME#*ros-@DISTRO@-} + # Substitute "-" with "_" + PKG_NAME_SHORT=${PKG_NAME_SHORT//-/_} + INSTALL_SCRIPTS_ARG="--install-scripts=$PREFIX/lib/$PKG_NAME_SHORT" + echo "WARNING: setup.cfg not set, will set INSTALL_SCRIPTS_ARG to: $INSTALL_SCRIPTS_ARG" + $PYTHON setup.py install --prefix="$PREFIX" --install-lib="$SP_DIR" $INSTALL_SCRIPTS_ARG --single-version-externally-managed --record=files.txt + # Remove build artifacts from setup.py install + rm -rf *.egg-info 2>/dev/null || true + rm -rf build/ 2>/dev/null || true else - $PYTHON -m pip install . --no-deps -vvv + $PYTHON -m pip install . --no-deps -vvv fi diff --git a/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh b/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh index 4f6044f07c..e164c1a187 100644 --- a/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh +++ b/pixi-build-backends/backends/pixi-build-ros/templates/build_catkin.sh @@ -20,41 +20,41 @@ cd build # necessary for correctly linking SIP files (from python_qt_bindings) export LINK=$CXX -if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then - PYTHON_EXECUTABLE=$PREFIX/bin/python - PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config - OSX_DEPLOYMENT_TARGET="10.15" +if [[ $CONDA_BUILD_CROSS_COMPILATION != "1" ]]; then + PYTHON_EXECUTABLE=$PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config + OSX_DEPLOYMENT_TARGET="10.15" else - PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python - PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config - OSX_DEPLOYMENT_TARGET="11.0" + PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python + PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config + OSX_DEPLOYMENT_TARGET="11.0" fi -if [[ "${CONDA_BUILD_CROSS_COMPILATION:-}" == "1" ]]; then - export QT_HOST_PATH="$BUILD_PREFIX" +if [[ ${CONDA_BUILD_CROSS_COMPILATION:-} == "1" ]]; then + export QT_HOST_PATH="$BUILD_PREFIX" else - export QT_HOST_PATH="$PREFIX" + export QT_HOST_PATH="$PREFIX" fi echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}" -export ROS_PYTHON_VERSION=`$PYTHON_EXECUTABLE -c "import sys; print('%i.%i' % (sys.version_info[0:2]))"` +export ROS_PYTHON_VERSION=$($PYTHON_EXECUTABLE -c "import sys; print('%i.%i' % (sys.version_info[0:2]))") echo "Using Python $ROS_PYTHON_VERSION" # Fix up SP_DIR which for some reason might contain a path to a wrong Python version FIXED_SP_DIR=$(echo $SP_DIR | sed -E "s/python[0-9]+\.[0-9]+/python$ROS_PYTHON_VERSION/") echo "Using site-package dir ${FIXED_SP_DIR}" # see https://github.com/conda-forge/cross-python-feedstock/issues/24 -if [[ "$CONDA_BUILD_CROSS_COMPILATION" == "1" ]]; then - find $PREFIX/lib/cmake -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true - find $PREFIX/share/rosidl* -type f -exec sed -i "s~$PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true - find $PREFIX/share/rosidl* -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true - find $PREFIX/lib/cmake -type f -exec sed -i "s~message(FATAL_ERROR \"The imported target~message(WARNING \"The imported target~g" {} + || true - # way around bad CPU type issues - # rm $PREFIX/bin/doxygen || echo "doxygen not found" - # rm $PREFIX/bin/dia || echo "dia not found" - # rm $PREFIX/bin/dot || echo "dot not found" +if [[ $CONDA_BUILD_CROSS_COMPILATION == "1" ]]; then + find $PREFIX/lib/cmake -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/share/rosidl* -type f -exec sed -i "s~$PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/share/rosidl* -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python$ROS_PYTHON_VERSION/site-packages~$BUILD_PREFIX/lib/python$ROS_PYTHON_VERSION/site-packages~g" {} + || true + find $PREFIX/lib/cmake -type f -exec sed -i 's~message(FATAL_ERROR "The imported target~message(WARNING "The imported target~g' {} + || true + # way around bad CPU type issues + # rm $PREFIX/bin/doxygen || echo "doxygen not found" + # rm $PREFIX/bin/dia || echo "dia not found" + # rm $PREFIX/bin/dot || echo "dot not found" fi # NOTE: there might be undefined references occurring @@ -64,8 +64,8 @@ fi export CXXFLAGS="$CXXFLAGS -DBOOST_ERROR_CODE_HEADER_ONLY" if [[ $target_platform =~ linux.* ]]; then - export CFLAGS="$CFLAGS -D__STDC_FORMAT_MACROS=1"; - export CXXFLAGS="$CXXFLAGS -D__STDC_FORMAT_MACROS=1"; + export CFLAGS="$CFLAGS -D__STDC_FORMAT_MACROS=1" + export CXXFLAGS="$CXXFLAGS -D__STDC_FORMAT_MACROS=1" # I am too scared to turn this on for now ... # export LDFLAGS="$LDFLAGS -lrt"; # Some qt stuff uses g++ directly - fix these use cases @@ -73,11 +73,11 @@ if [[ $target_platform =~ linux.* ]]; then fi if [[ $target_platform =~ emscripten.* ]]; then - export CONDA_BUILD_CROSS_COMPILATION="1" - echo "set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)"> $SRC_DIR/__vinca_shared_lib_patch.cmake - echo "set(CMAKE_STRIP FALSE) # used by default in pybind11 on .so modules">> $SRC_DIR/__vinca_shared_lib_patch.cmake - echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) # fixes an error where numpy header files are not found correctly">> $SRC_DIR/__vinca_shared_lib_patch.cmake - export EXTRA_CMAKE_ARGS=" \ + export CONDA_BUILD_CROSS_COMPILATION="1" + echo "set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)" >$SRC_DIR/__vinca_shared_lib_patch.cmake + echo "set(CMAKE_STRIP FALSE) # used by default in pybind11 on .so modules" >>$SRC_DIR/__vinca_shared_lib_patch.cmake + echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) # fixes an error where numpy header files are not found correctly" >>$SRC_DIR/__vinca_shared_lib_patch.cmake + export EXTRA_CMAKE_ARGS=" \ -DCMAKE_FIND_ROOT_PATH=$PREFIX \ -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ -DCMAKE_PROJECT_INCLUDE=$SRC_DIR/__vinca_shared_lib_patch.cmake \ @@ -87,38 +87,38 @@ fi export SKIP_TESTING=true if [ "${PKG_NAME}" == "ros-noetic-euslisp" ] || [ "${PKG_NAME}" = "ros-noetic-jskeus" ] || [ "${PKG_NAME}" = "ros-noetic-roseus" ]; then - GENERATOR="Unix Makefiles" + GENERATOR="Unix Makefiles" else - GENERATOR="Ninja" + GENERATOR="Ninja" fi cmake ${CMAKE_ARGS} --compile-no-warning-as-error \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \ - -DCMAKE_FIND_FRAMEWORK=LAST \ - -DCMAKE_AUTOMOC_EXECUTABLE=$CMAKE_AUTOMOC_EXECUTABLE \ - -DBUILD_SHARED_LIBS=ON \ - -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \ - -DPython_EXECUTABLE=$PYTHON_EXECUTABLE \ - -DPython3_EXECUTABLE=$PYTHON_EXECUTABLE \ - -DPython3_FIND_STRATEGY=LOCATION \ - -DPYTHON_INSTALL_DIR=$FIXED_SP_DIR \ - -DPKG_CONFIG_EXECUTABLE=$PKG_CONFIG_EXECUTABLE \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DCATKIN_SKIP_TESTING=$SKIP_TESTING \ - -DCATKIN_BUILD_BINARY_PACKAGE=$CATKIN_BUILD_BINARY_PACKAGE \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=$OSX_DEPLOYMENT_TARGET \ - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ - $EXTRA_CMAKE_ARGS \ - -G "$GENERATOR" \ - $SRC_DIR + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \ + -DCMAKE_FIND_FRAMEWORK=LAST \ + -DCMAKE_AUTOMOC_EXECUTABLE=$CMAKE_AUTOMOC_EXECUTABLE \ + -DBUILD_SHARED_LIBS=ON \ + -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_EXECUTABLE=$PYTHON_EXECUTABLE \ + -DPython3_FIND_STRATEGY=LOCATION \ + -DPYTHON_INSTALL_DIR=$FIXED_SP_DIR \ + -DPKG_CONFIG_EXECUTABLE=$PKG_CONFIG_EXECUTABLE \ + -DSETUPTOOLS_DEB_LAYOUT=OFF \ + -DCATKIN_SKIP_TESTING=$SKIP_TESTING \ + -DCATKIN_BUILD_BINARY_PACKAGE=$CATKIN_BUILD_BINARY_PACKAGE \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=$OSX_DEPLOYMENT_TARGET \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + $EXTRA_CMAKE_ARGS \ + -G "$GENERATOR" \ + $SRC_DIR cmake --build . --config Release --target all -if [[ "$SKIP_TESTING" == "OFF" ]]; then +if [[ $SKIP_TESTING == "OFF" ]]; then cmake --build . --config Release --target run_tests fi @@ -127,26 +127,23 @@ cmake --build . --config Release --target install if [ "${PKG_NAME}" == "ros-noetic-catkin" ]; then # Copy the [de]activate scripts to $PREFIX/etc/conda/[de]activate.d. # This will allow them to be run on environment activation. - for CHANGE in "activate" "deactivate" - do + for CHANGE in "activate" "deactivate"; do mkdir -p "${PREFIX}/etc/conda/${CHANGE}.d" cp "${RECIPE_DIR}/${CHANGE}.sh" "${PREFIX}/etc/conda/${CHANGE}.d/${PKG_NAME}_${CHANGE}.sh" done fi if [ "${PKG_NAME}" == "ros-noetic-environment" ]; then - for SCRIPT in "1.ros_distro.sh" "1.ros_etc_dir.sh" "1.ros_package_path.sh" "1.ros_python_version.sh" "1.ros_version.sh" - do - mkdir -p "${PREFIX}/etc/conda/activate.d" - cp "${PREFIX}/etc/catkin/profile.d/${SCRIPT}" "${PREFIX}/etc/conda/activate.d/${SCRIPT}" - done + for SCRIPT in "1.ros_distro.sh" "1.ros_etc_dir.sh" "1.ros_package_path.sh" "1.ros_python_version.sh" "1.ros_version.sh"; do + mkdir -p "${PREFIX}/etc/conda/activate.d" + cp "${PREFIX}/etc/catkin/profile.d/${SCRIPT}" "${PREFIX}/etc/conda/activate.d/${SCRIPT}" + done fi if [ "${PKG_NAME}" == "ros-noetic-ros-workspace" ]; then # Copy the [de]activate scripts to $PREFIX/etc/conda/[de]activate.d. # This will allow them to be run on environment activation. - for CHANGE in "activate" "deactivate" - do + for CHANGE in "activate" "deactivate"; do mkdir -p "${PREFIX}/etc/conda/${CHANGE}.d" cp "${RECIPE_DIR}/${CHANGE}.sh" "${PREFIX}/etc/conda/${CHANGE}.d/${PKG_NAME}_${CHANGE}.sh" done diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.toml b/pixi-build-backends/py-pixi-build-backend/Cargo.toml index 8f0abef077..b4d13c1e7b 100644 --- a/pixi-build-backends/py-pixi-build-backend/Cargo.toml +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.toml @@ -1,16 +1,16 @@ [package] +edition = "2024" name = "py-pixi-build-backend" version = "0.4.1" -edition = "2024" [lib] -name = "pixi_build_backend" crate-type = ["cdylib"] +name = "pixi_build_backend" [features] default = ["rustls-tls"] -rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] +rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] # PyO3 for Python bindings @@ -34,11 +34,11 @@ pixi_build_types = { git = "https://github.com/prefix-dev/pixi", branch = "main" async-trait = "0.1" # Core serialization and async support +rattler_conda_types = { version = "0.42.0", default-features = false } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.9" tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread", "rt"] } -rattler_conda_types = { version = "0.42.0", default-features = false } # Rattler-build rattler-build = { git = "https://github.com/prefix-dev/rattler-build", branch = "main", default-features = false } @@ -49,8 +49,8 @@ thiserror = "2.0.12" # Utilities indexmap = "2.7.1" -pythonize = "0.26" paste = "1.0.15" +pythonize = "0.26" [build-dependencies] pyo3-build-config = "0.26" diff --git a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml index 937b6226f0..bee1870ebd 100644 --- a/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml +++ b/pixi-build-backends/py-pixi-build-backend/examples/pixi-build-python/pyproject.toml @@ -1,12 +1,8 @@ [build-system] -requires = ["hatchling"] build-backend = "hatchling.build" +requires = ["hatchling"] [project] -name = "pixi-build-python" -description = "Python bindings for pixi-build-backends" -requires-python = ">=3.8" -license = { text = "MIT OR Apache-2.0" } authors = [{ name = "pixi contributors" }] classifiers = [ "Development Status :: 3 - Alpha", @@ -22,23 +18,27 @@ classifiers = [ "Programming Language :: Rust", "Topic :: Software Development :: Build Tools", ] -keywords = ["build", "conda", "package", "python", "rust"] -version = "0.0.1" dependencies = [ "py-rattler", "asyncio", "toml", # "py-pixi-build-backend @ file:../../" ] +description = "Python bindings for pixi-build-backends" +keywords = ["build", "conda", "package", "python", "rust"] +license = { text = "MIT OR Apache-2.0" } +name = "pixi-build-python" +requires-python = ">=3.8" +version = "0.0.1" [project.scripts] pixi-build-python = "pixi_build_python.main:main" [project.urls] +"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" Homepage = "https://github.com/prefix-dev/pixi-build-backends" Repository = "https://github.com/prefix-dev/pixi-build-backends" -"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" [tool.hatch.metadata] allow-direct-references = true diff --git a/pixi-build-backends/py-pixi-build-backend/pixi.toml b/pixi-build-backends/py-pixi-build-backend/pixi.toml index 4a37e8f379..905277a6b8 100644 --- a/pixi-build-backends/py-pixi-build-backend/pixi.toml +++ b/pixi-build-backends/py-pixi-build-backend/pixi.toml @@ -4,8 +4,8 @@ channels = [ "https://prefix.dev/pixi-build-backends", "https://prefix.dev/conda-forge", ] -platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] license = "BSD-3-Clause" +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] preview = ["pixi-build"] [package] @@ -25,16 +25,16 @@ rust = ">=1.90.0,<1.91" maturin = "*" [package.run-dependencies] -typing-extensions = "*" pixi-build-api-version = ">=4,<5" +typing-extensions = "*" [activation.env] PIP_REQUIRE_VIRTUALENV = "false" [feature.build.dependencies] -python = "*" maturin = "~=1.10.2" pip = "~=25.3.0" +python = "*" rust = ">=1.90.0,<1.91" [feature.build.target.linux-64.dependencies] diff --git a/pixi-build-backends/py-pixi-build-backend/pyproject.toml b/pixi-build-backends/py-pixi-build-backend/pyproject.toml index 506c1fe256..88b66c8f03 100644 --- a/pixi-build-backends/py-pixi-build-backend/pyproject.toml +++ b/pixi-build-backends/py-pixi-build-backend/pyproject.toml @@ -1,12 +1,8 @@ [build-system] -requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" +requires = ["maturin>=1.0,<2.0"] [project] -name = "py-pixi-build-backend" -description = "Python bindings for pixi-build-backends" -requires-python = ">=3.8" -license = { text = "BSD-3-Clause" } authors = [{ name = "pixi contributors" }] classifiers = [ "Development Status :: 3 - Alpha", @@ -21,14 +17,18 @@ classifiers = [ "Programming Language :: Rust", "Topic :: Software Development :: Build Tools", ] -keywords = ["build", "conda", "package", "python", "rust"] +description = "Python bindings for pixi-build-backends" dynamic = ["version"] +keywords = ["build", "conda", "package", "python", "rust"] +license = { text = "BSD-3-Clause" } +name = "py-pixi-build-backend" +requires-python = ">=3.8" [project.urls] +"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" Homepage = "https://github.com/prefix-dev/pixi-build-backends" Repository = "https://github.com/prefix-dev/pixi-build-backends" -"Bug Tracker" = "https://github.com/prefix-dev/pixi-build-backends/issues" [tool.maturin] features = ["pyo3/extension-module"] @@ -38,15 +38,15 @@ line-length = 120 target-version = "py38" [tool.mypy] -python_version = "3.8" +disable_error_code = ["empty-body"] +enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] files = ["pixi_build_backend", "tests", "examples"] +python_version = "3.8" strict = true -enable_error_code = ["redundant-expr", "truthy-bool", "ignore-without-code"] -disable_error_code = ["empty-body"] [[tool.mypy.overrides]] -module = ["pixi_build_backend.pixi_build_backend"] ignore_missing_imports = true +module = ["pixi_build_backend.pixi_build_backend"] [[tool.mypy.overrides]] module = ["pixi_build_backend.*"] diff --git a/pixi.toml b/pixi.toml index 5aec1e6c28..74ba12b038 100644 --- a/pixi.toml +++ b/pixi.toml @@ -215,8 +215,8 @@ mike = ">=2.1.3,<3" mkdocs-llmstxt = ">=0.4.0,<0.5" mkdocs-material = ">=9.6.21,<10" mkdocs-redirects = ">=1.2.1,<2" -pillow = ">=12,<13" nushell = ">=0.109.1,<0.110" +pillow = ">=12,<13" [feature.docs.tasks] build-docs = { cmd = "mkdocs build --strict", depends-on = ["download-font"] } @@ -289,13 +289,13 @@ test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CAR # [environments] +build = { features = ["build", "rust"], solve-group = "default" } default = { features = [ "dev", "schema", "pytest", "rust", ], solve-group = "default" } -build = { features = ["build", "rust"], solve-group = "default" } dist = { features = ["dist"], no-default-feature = true } docs = { features = [ "docs", diff --git a/tests/data/channels/mappings.toml b/tests/data/channels/mappings.toml index 90830c0bcc..c1e89ca252 100644 --- a/tests/data/channels/mappings.toml +++ b/tests/data/channels/mappings.toml @@ -14,10 +14,10 @@ "post_link_script_package/recipe.yaml" = "post_link_script_channel" "shortcuts_channel_1/1/recipe.yaml" = "shortcuts_channel_1" "shortcuts_channel_1/2/recipe.yaml" = "shortcuts_channel_1" +"target_specific_channel_1.yaml" = "target_specific_channel_1" "trampoline/trampoline_1.yaml" = "trampoline_channel" "trampoline/trampoline_2.yaml" = "trampoline_channel" "trampoline/trampoline_path.yaml" = "trampoline_path_channel" "virtual_packages/cuda.yaml" = "virtual_packages" "virtual_packages/no-deps.yaml" = "virtual_packages" "virtual_packages/noarch_package.yaml" = "virtual_packages" -"target_specific_channel_1.yaml" = "target_specific_channel_1" diff --git a/tests/data/git-fixtures/multi-output-recipe/001_initial/pixi.toml b/tests/data/git-fixtures/multi-output-recipe/001_initial/pixi.toml index 2cad54942f..9b47ab2c5e 100644 --- a/tests/data/git-fixtures/multi-output-recipe/001_initial/pixi.toml +++ b/tests/data/git-fixtures/multi-output-recipe/001_initial/pixi.toml @@ -1,6 +1,6 @@ -[workspace] -channels = [ - "https://prefix.dev/pixi-build-backends", - "https://prefix.dev/conda-forge", -] -platforms = [] \ No newline at end of file +[workspace] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +platforms = [] diff --git a/tests/integration_python/common.py b/tests/integration_python/common.py index 065082cd94..81716107b4 100644 --- a/tests/integration_python/common.py +++ b/tests/integration_python/common.py @@ -97,7 +97,9 @@ def verify_cli_command( if isinstance(stdout_contains, str): stdout_contains = [stdout_contains] for substring in stdout_contains: - assert substring in stdout_for_matching, f"'{substring}'\n not found in stdout:\n {stdout}" + assert substring in stdout_for_matching, ( + f"'{substring}'\n not found in stdout:\n {stdout}" + ) if stdout_excludes: if isinstance(stdout_excludes, str): @@ -111,7 +113,9 @@ def verify_cli_command( if isinstance(stderr_contains, str): stderr_contains = [stderr_contains] for substring in stderr_contains: - assert substring in stderr_for_matching, f"'{substring}'\n not found in stderr:\n {stderr}" + assert substring in stderr_for_matching, ( + f"'{substring}'\n not found in stderr:\n {stderr}" + ) if stderr_excludes: if isinstance(stderr_excludes, str): diff --git a/tests/integration_python/pixi_build/conftest.py b/tests/integration_python/pixi_build/conftest.py index 5c06b3d51f..98bcb38446 100644 --- a/tests/integration_python/pixi_build/conftest.py +++ b/tests/integration_python/pixi_build/conftest.py @@ -10,8 +10,8 @@ def get_local_backend_channel() -> str: """Get the local backend channel from the test data directory.""" - channel_dir = Path(__file__).parents[2].joinpath( - "data", "channels", "channels", "pixi_build_backends" + channel_dir = ( + Path(__file__).parents[2].joinpath("data", "channels", "channels", "pixi_build_backends") ) if channel_dir.is_dir() and any(channel_dir.rglob("repodata.json")): return channel_dir.as_uri() @@ -24,8 +24,8 @@ def get_local_backend_channel() -> str: @pytest.fixture(scope="session") def local_backend_channel_dir() -> Path: """Return the path to the local backend channel directory.""" - channel_dir = Path(__file__).parents[2].joinpath( - "data", "channels", "channels", "pixi_build_backends" + channel_dir = ( + Path(__file__).parents[2].joinpath("data", "channels", "channels", "pixi_build_backends") ) if not channel_dir.is_dir() or not any(channel_dir.rglob("repodata.json")): pytest.skip( diff --git a/typos.toml b/typos.toml index 657b8c4b6b..51924b50ec 100644 --- a/typos.toml +++ b/typos.toml @@ -5,6 +5,7 @@ extend-exclude = [ "**/*.snap", "tests/data/mapping_files/*", "examples/**/**.ipynb", + "robostack.yaml", ] ignore-hidden = false From 61cf7ae03c5a64c0958563efb91ffaec95fb75a5 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 10:19:31 +0100 Subject: [PATCH 09/70] Update CLI docs --- docs/reference/cli/pixi/upload/prefix.md | 2 ++ pixi.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/reference/cli/pixi/upload/prefix.md b/docs/reference/cli/pixi/upload/prefix.md index a31780fb4d..b37855f99d 100644 --- a/docs/reference/cli/pixi/upload/prefix.md +++ b/docs/reference/cli/pixi/upload/prefix.md @@ -29,6 +29,8 @@ pixi upload prefix [OPTIONS] --channel : Upload an attestation file alongside the package. Note: if you add an attestation, you can _only_ upload a single package. Mutually exclusive with --generate-attestation - `--generate-attestation` : Automatically generate attestation using cosign in CI. Mutually exclusive with --attestation +- `--store-github-attestation` +: Also store the generated attestation to GitHub's attestation API. Requires `GITHUB_TOKEN` environment variable and only works in GitHub Actions. The attestation will be associated with the current repository - `--skip-existing (-s)` : Skip upload if package already exists - `--force` diff --git a/pixi.toml b/pixi.toml index 74ba12b038..067334e762 100644 --- a/pixi.toml +++ b/pixi.toml @@ -22,7 +22,6 @@ python = ">=3.13.5,<3.15" [tasks] bump = "tbump --only-patch $RELEASE_VERSION" -generate-cli-docs = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml" insta = "cargo insta" install = { cmd = "cargo install --path crates/pixi --locked", description = "Install pixi itself locally using cargo" } install-as = { cmd = "python scripts/install.py", depends-on = [ @@ -206,6 +205,7 @@ env.CARGO_TARGET_DIR = "target/pixi" [feature.build.tasks] build-debug = "cargo build" build-release = "cargo build --release" +generate-cli-docs = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml" [feature.docs.dependencies] cairosvg = ">=2.8.2,<3" From 08ee584058b8025b131ffb42d478b9c141e6afe2 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 10:20:21 +0100 Subject: [PATCH 10/70] This is already enforced by zizmor --- .github/workflows/enforce-sha.yaml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .github/workflows/enforce-sha.yaml diff --git a/.github/workflows/enforce-sha.yaml b/.github/workflows/enforce-sha.yaml deleted file mode 100644 index 5ef3de2bf4..0000000000 --- a/.github/workflows/enforce-sha.yaml +++ /dev/null @@ -1,23 +0,0 @@ -on: - push: - branches: [main] - pull_request: - -name: Security - -permissions: - contents: read - -jobs: - ensure-pinned-actions: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - with: - persist-credentials: false - - name: Ensure SHA pinned actions - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@6124774845927d14c601359ab8138699fa5b70c3 # v4 - with: - allowlist: | - prefix-dev/ From b665414420c7b71c248ec03c61e6dd7c86d5fcfa Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 10:24:19 +0100 Subject: [PATCH 11/70] Update Cargo.toml --- pixi-build-backends/py-pixi-build-backend/Cargo.toml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.toml b/pixi-build-backends/py-pixi-build-backend/Cargo.toml index b4d13c1e7b..804e94edcc 100644 --- a/pixi-build-backends/py-pixi-build-backend/Cargo.toml +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.toml @@ -65,13 +65,3 @@ strip = false [patch.crates-io] # This is a temporary patch to get `cargo vendor` to work with the `uv` and pep508_rs` crates. reqwest-middleware = { git = "https://github.com/astral-sh/reqwest-middleware", rev = "7650ed76215a962a96d94a79be71c27bffde7ab2" } - -[patch."https://github.com/prefix-dev/pixi"] -#pixi_build_types = { git = "https://github.com/prefix-dev/pixi", branch = "main" } - -# Local path overrides for development -#pixi_build_types = { path = "../../pixi_build_types/crates/pixi_build_types" } -#pixi_consts = { path = "../../pixi/crates/pixi_consts" } -#pixi_manifest = { path = "../../pixi/crates/pixi_manifest" } -#pixi_spec = { path = "../../pixi/crates/pixi_spec" } -#pixi_build_type_conversions = { path = "../../pixi/crates/pixi_build_type_conversions" } From 22a81f0ab4a8b0947f1f19a475eb1f1ac9970a41 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 11:18:44 +0100 Subject: [PATCH 12/70] Filter `PIXI_` env vars --- Cargo.lock | 16 +- pixi.lock | 3532 ++++++++++------- pixi.toml | 9 +- tests/integration_python/common.py | 3 +- .../test_specified_build_source/conftest.py | 4 + 5 files changed, 2055 insertions(+), 1509 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 755cbdcc05..b2efec5f5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5338,7 +5338,7 @@ dependencies = [ "clap", "clap-verbosity-flag", "fs-err", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "itertools 0.14.0", "jsonrpc-core", @@ -5371,7 +5371,7 @@ name = "pixi-build-cmake" version = "0.3.7" dependencies = [ "async-trait", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "miette 7.6.0", "minijinja", @@ -5393,7 +5393,7 @@ name = "pixi-build-mojo" version = "0.1.7" dependencies = [ "async-trait", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "miette 7.6.0", "minijinja", @@ -5415,7 +5415,7 @@ version = "0.4.4" dependencies = [ "async-trait", "fs-err", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "miette 7.6.0", "minijinja", @@ -5465,7 +5465,7 @@ dependencies = [ "async-trait", "cargo_toml", "fs-err", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "miette 7.6.0", "minijinja", @@ -7116,7 +7116,7 @@ dependencies = [ "hex", "http-range-client", "ignore", - "indexmap 2.12.1", + "indexmap 2.13.0", "indicatif", "itertools 0.14.0", "lazy_static", @@ -7310,7 +7310,7 @@ dependencies = [ "console 0.16.2", "fs-err", "futures", - "indexmap 2.12.1", + "indexmap 2.13.0", "indicatif", "opendal", "rattler_conda_types", @@ -7696,7 +7696,7 @@ name = "recipe-stage0" version = "0.1.1" dependencies = [ "hashlink", - "indexmap 2.12.1", + "indexmap 2.13.0", "insta", "itertools 0.14.0", "marked-yaml", diff --git a/pixi.lock b/pixi.lock index 60ee96ce11..e79402ca28 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,6 +1,6 @@ version: 6 environments: - build: + default: channels: - url: https://prefix.dev/conda-forge/ options: @@ -9,38 +9,61 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.6-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.6-default_h36abe19_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.6-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-hc876b51_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.6-default_h99862b1_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -49,11 +72,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.6-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda @@ -68,60 +91,108 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda @@ -130,12 +201,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda @@ -150,82 +221,129 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml-0.18.16-py313h6194ac5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.14-py313h6194ac5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_26.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_26.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda @@ -235,63 +353,109 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml-0.18.16-py313hf050af9_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py313hf050af9_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda @@ -299,12 +463,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda @@ -314,36 +479,81 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: + - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda @@ -357,578 +567,53 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.6-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda - default: - channels: - - url: https://prefix.dev/conda-forge/ - options: - pypi-prerelease-mode: if-necessary-or-explicit - packages: - linux-64: - - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.0-he64ecbb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda - linux-aarch64: - - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml-0.18.16-py313h6194ac5_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.14-py313h6194ac5_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda - osx-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml-0.18.16-py313hf050af9_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py313hf050af9_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda - osx-arm64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda - win-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda - - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda - dist: + dist: channels: - url: https://prefix.dev/conda-forge/ options: @@ -1634,10 +1319,8 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.9-h965158b_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda @@ -1646,21 +1329,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/cargo-deny-0.19.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-shear-1.7.1-hb17b654_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - conda: https://prefix.dev/conda-forge/linux-64/go-shfmt-3.12.0-hfc2019e_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda @@ -1681,34 +1356,22 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-24.9.0-heeeca48_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.0-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.7-h813ae00_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda @@ -1719,9 +1382,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/taplo-0.10.0-h2d22210_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1733,10 +1394,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/actionlint-1.7.9-h23c61c7_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda @@ -1745,21 +1404,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-deny-0.19.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-shear-1.7.1-h069e38c_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/dprint-0.49.1-ha3529ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/go-shfmt-3.12.0-h22914b5_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda @@ -1780,34 +1431,22 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/nodejs-24.9.0-hc854191_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.7-h9564552_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda @@ -1818,9 +1457,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/taplo-0.10.0-h3618846_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1831,10 +1468,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zizmor-1.18.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.9-h8080635_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda @@ -1842,21 +1477,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/cargo-deny-0.19.0-ha9c3995_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-shear-1.7.1-h3c2ae71_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/osx-64/go-shfmt-3.12.0-hccc6df8_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda @@ -1867,8 +1494,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/nodejs-24.9.0-h09bb5a9_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1876,24 +1501,15 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.7-hd9f4cfa_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda @@ -1903,9 +1519,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/taplo-0.10.0-hffa81eb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1915,10 +1529,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.18.0-h3c2ae71_0.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.9-h43f6c71_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda @@ -1926,21 +1538,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-deny-0.19.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-shear-1.7.1-h8d80559_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/go-shfmt-3.12.0-h820172f_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda @@ -1951,8 +1555,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-24.9.0-h08a63db_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1960,24 +1562,15 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.7-h382de68_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda @@ -1987,9 +1580,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/taplo-0.10.0-h2b2570c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1999,10 +1590,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.18.0-h8d80559_0.conda win-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.9-he477eed_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda @@ -2010,19 +1599,11 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/cargo-deny-0.19.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-shear-1.7.1-h18a1a76_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/go-shfmt-3.12.0-h11686cb_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -2031,31 +1612,20 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-24.9.0-he453025_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.7-h15e3a1f_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda @@ -2065,9 +1635,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/taplo-0.10.0-h63977a8_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2151,58 +1719,330 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda + - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda + pytest: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda @@ -2212,40 +2052,58 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.11-h17c18a5_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda @@ -2255,60 +2113,87 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda win-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda recipes: channels: - url: https://prefix.dev/conda-forge/ @@ -2353,22 +2238,11 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda @@ -2378,38 +2252,20 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.0-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2419,22 +2275,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda @@ -2444,38 +2289,20 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2484,23 +2311,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda @@ -2508,34 +2324,18 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2543,22 +2343,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda @@ -2566,34 +2355,18 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2601,22 +2374,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda win-64: - - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda @@ -2624,32 +2386,16 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -3399,24 +3145,24 @@ packages: license_family: MIT size: 90399 timestamp: 1764520638652 -- conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda - sha256: 1625ea421e0f44dbdde01e3e7d2c4958bea6c55731e6ac6954ba912d339982c2 - md5: d351e4894d6c4d9d8775bf169a97089d +- conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + sha256: fe2580dfa3711d7de59ae7e044f7eea6bfdd969cc5c36d814a569225d7f7f243 + md5: 1bc3e6c577a1a206c36456bdeae406de depends: - binutils_impl_linux-64 >=2.45,<2.46.0a0 license: GPL-3.0-only license_family: GPL - size: 35316 - timestamp: 1764007880473 -- conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda - sha256: 9bc583e5f93353723d7889ec18b9bca2c1cecf6fec14ea27ae5f758a28258cf9 - md5: c8a3dbfe30387152a796e2d1d4196131 + size: 35432 + timestamp: 1766513140840 +- conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + sha256: 6925e0b95ac229c95da12fc6624e07238bf58ae5ce82b90e4f5bb60e6c5db9d8 + md5: 9a1a19fdd691e3a100a00c9a83303863 depends: - binutils_impl_linux-aarch64 >=2.45,<2.46.0a0 license: GPL-3.0-only license_family: GPL - size: 35396 - timestamp: 1764007964053 + size: 35382 + timestamp: 1766513231847 - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda sha256: 054a77ccab631071a803737ea8e5d04b5b18e57db5b0826a04495bd3fdf39a7c md5: a7a67bf132a4a2dea92a7cb498cdc5b1 @@ -3663,6 +3409,16 @@ packages: license_family: MIT size: 206884 timestamp: 1744127994291 +- conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + size: 207882 + timestamp: 1765214722852 - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda sha256: ccae98c665d86723993d4cb0b456bd23804af5b0645052c09a31c9634eebc8df md5: 5deaa903d46d62a1f8077ad359c3062e @@ -3672,6 +3428,15 @@ packages: license_family: MIT size: 215950 timestamp: 1744127972012 +- conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda + sha256: 7ec8a68efe479e2e298558cbc2e79d29430d5c7508254268818c0ae19b206519 + md5: 1dfbec0d08f112103405756181304c16 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + size: 217215 + timestamp: 1765214743735 - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda sha256: b37f5dacfe1c59e0a207c1d65489b760dff9ddb97b8df7126ceda01692ba6e97 md5: eafe5d9f1a8c514afe41e6e833f66dfd @@ -3681,6 +3446,15 @@ packages: license_family: MIT size: 184824 timestamp: 1744128064511 +- conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea + md5: fc9a153c57c9f070bebaa7eef30a8f17 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 186122 + timestamp: 1765215100384 - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b md5: f8cd1beb98240c7edb1a95883360ccfa @@ -3690,6 +3464,15 @@ packages: license_family: MIT size: 179696 timestamp: 1744128058734 +- conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 180327 + timestamp: 1765215064054 - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 md5: abd85120de1187b0d1ec305c2173c71b @@ -3761,6 +3544,22 @@ packages: license: ISC size: 152432 timestamp: 1762967197890 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + sha256: 4ddcb01be03f85d3db9d881407fb13a673372f1b9fac9c836ea441893390e049 + md5: 84d389c9eee640dda3d26fc5335c67d8 + depends: + - __win + license: ISC + size: 147139 + timestamp: 1767500904211 +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + size: 146519 + timestamp: 1767500828366 - conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 md5: 09262e66b19567aff4f592fb53b28760 @@ -4169,31 +3968,31 @@ packages: license: MIT size: 731469 timestamp: 1764939352598 -- conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_1.conda - sha256: 022d1510394e6f87f9c0f5e4093f7def220b4f73b9c4082a5032600983f43e90 - md5: c49fac70cb3983cdc72b73e065818547 +- conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + sha256: b07dfc5023c9bfa0abb6e77e1bed86a7c6bde6b737addedb85129e808173ff29 + md5: acdbe6dbefafb1eba531160c68328456 depends: - - cctools_impl_osx-64 1030.6.3 llvm19_1_h3b512aa_1 - - ld64 956.6 llvm19_1_hc3792c1_1 + - cctools_impl_osx-64 1030.6.3 llvm19_1_h3b512aa_3 + - ld64 956.6 llvm19_1_hc3792c1_3 - libllvm19 >=19.1.7,<19.2.0a0 license: APSL-2.0 license_family: Other - size: 23796 - timestamp: 1764352039846 -- conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_1.conda - sha256: 033496e014776d9898b328d09a5416056d88698ffe404b460f595fca4708cdb2 - md5: 4df7fec2dac84a966f9de8addd561561 - depends: - - cctools_impl_osx-arm64 1030.6.3 llvm19_1_h8c76c84_1 - - ld64 956.6 llvm19_1_he86490a_1 + size: 24286 + timestamp: 1767114529119 +- conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + sha256: c9898187bde5b71ae6cdef15ff61f38ef29efe149221209e495f770fa78cffce + md5: 7b0ea95f0288f1a25f692800b407daf2 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm19_1_h8c76c84_3 + - ld64 956.6 llvm19_1_he86490a_3 - libllvm19 >=19.1.7,<19.2.0a0 license: APSL-2.0 license_family: Other - size: 23893 - timestamp: 1764351984540 -- conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_1.conda - sha256: ed7298e419b36aed5c8d915dc79936f0a95603666bf4e57c5df7022bad524462 - md5: 83c976080e0875efe1592a01de00f529 + size: 24272 + timestamp: 1767114575161 +- conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + sha256: 60dfb2c7b685aeb867c7b359ae0c7e2147b90cc15b0397040f256d17e62c4d5b + md5: a52bbde5581ef42bdcbf050ca8c83646 depends: - __osx >=10.13 - ld64_osx-64 >=956.6,<956.7.0a0 @@ -4201,18 +4000,18 @@ packages: - libllvm19 >=19.1.7,<19.2.0a0 - libzlib >=1.3.1,<2.0a0 - llvm-tools 19.1.* - - sigtool + - sigtool-codesign constrains: + - ld64 956.6.* - cctools 1030.6.3.* - clang 19.1.* - - ld64 956.6.* license: APSL-2.0 license_family: Other - size: 742502 - timestamp: 1764351982024 -- conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_1.conda - sha256: 5e05ba274cc02999ba55b18707f569ae989001990c9224f1cb5d24e5e41abab1 - md5: 296de61644a3372f5cf13f266eb6ad88 + size: 742929 + timestamp: 1767114490312 +- conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + sha256: e38b688aab21055a7d5f2e23b74122bf47c56accdcfbcc65e452cd4ec8665062 + md5: 972e9ed0155a9f563d1bd7a0a4ffeb28 depends: - __osx >=11.0 - ld64_osx-arm64 >=956.6,<956.7.0a0 @@ -4220,39 +4019,39 @@ packages: - libllvm19 >=19.1.7,<19.2.0a0 - libzlib >=1.3.1,<2.0a0 - llvm-tools 19.1.* - - sigtool + - sigtool-codesign constrains: - - clang 19.1.* - ld64 956.6.* + - clang 19.1.* - cctools 1030.6.3.* license: APSL-2.0 license_family: Other - size: 748995 - timestamp: 1764351939668 -- conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_1.conda - sha256: c7d38c684bee7fd107a8da6fc1729d39708f20d8d281f987f20584827effc8e5 - md5: faa9269cd8b17ee3d3721ddabfb72af2 + size: 748469 + timestamp: 1767114519888 +- conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + sha256: 060b807b306f0e3476db009a2b218f419977740d8708975fabceb138d135aec3 + md5: 09ff64ce958395c9dd58c847d709d28d depends: - - cctools_impl_osx-64 1030.6.3 llvm19_1_h3b512aa_1 - - ld64_osx-64 956.6 llvm19_1_h466f870_1 + - cctools_impl_osx-64 1030.6.3 llvm19_1_h3b512aa_3 + - ld64_osx-64 956.6 llvm19_1_h466f870_3 constrains: - cctools 1030.6.3.* license: APSL-2.0 license_family: Other - size: 22806 - timestamp: 1764352046500 -- conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_1.conda - sha256: afd2a39a526a5a80abb4315e427afa18db33cf4ae82bd8d1437f2effb8d816dd - md5: e9d1109b5313ca4969210c3bedec6f0b + size: 23229 + timestamp: 1767114532748 +- conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + sha256: 66306d2fb3583c65dee165dd90cf96849500eae956a4dbd57601ac8423a5f127 + md5: d197a4b2169c054aa91252e1f95d7b08 depends: - - cctools_impl_osx-arm64 1030.6.3 llvm19_1_h8c76c84_1 - - ld64_osx-arm64 956.6 llvm19_1_h6922315_1 + - cctools_impl_osx-arm64 1030.6.3 llvm19_1_h8c76c84_3 + - ld64_osx-arm64 956.6 llvm19_1_h6922315_3 constrains: - cctools 1030.6.3.* license: APSL-2.0 license_family: Other - size: 22887 - timestamp: 1764351991415 + size: 23246 + timestamp: 1767114587653 - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda sha256: 083a2bdad892ccf02b352ecab38ee86c3e610ba9a4b11b073ea769d55a115d32 md5: 96a02a5c1a65470a7e4eedb644c872fd @@ -4420,55 +4219,59 @@ packages: license_family: MIT size: 50965 timestamp: 1760437331772 -- conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.6-default_h36abe19_0.conda - sha256: 28f53eb9b0cff811d95c7ee10575d31db6a408254457194e67d09b3ef5dadfae - md5: 4d9194fe41f38b65c89abdbea9b43ecc +- conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + sha256: f84d01b3e2d11fcc74391293ab1413ba3b7b4e5a0a7e8806df3b64215ab9d096 + md5: 874576ab1ba6029b04cca2e0d826002f depends: - - binutils_impl_linux-64 - - clang-21 21.1.6 default_h99862b1_0 + - binutils + - clang-21 21.1.8 default_h99862b1_1 + - clang_impl_linux-64 21.1.8 default_h0a60c25_1 - libgcc-devel_linux-64 - - llvm-openmp >=21.1.6 + - llvm-openmp >=21.1.8 - sysroot_linux-64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24824 - timestamp: 1763564160306 -- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.6-default_h395f21b_0.conda - sha256: 76892f833d16621156682ebb5daa66a8f8c178be9054d2d85a9bb617be9d9763 - md5: 1d6411675359112a74562c33a7e1e186 + size: 28232 + timestamp: 1767834681829 +- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + sha256: 6cd8d18152c0f6f3c31d80bf6802e1e777a5ce47ca7e857b3241e6a5edd9d029 + md5: 3f6d93cb53236b964d573ccc40471abd depends: - - binutils_impl_linux-aarch64 - - clang-21 21.1.6 default_he95a3c9_0 + - binutils + - clang-21 21.1.8 default_he95a3c9_1 + - clang_impl_linux-aarch64 21.1.8 default_h1168dbd_1 - libgcc-devel_linux-aarch64 - - llvm-openmp >=21.1.6 + - llvm-openmp >=21.1.8 - sysroot_linux-aarch64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24836 - timestamp: 1763565452191 -- conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_5.conda - sha256: 5bcabcc3a5689bc47dbd6a58a3a785f8fe3f4e91410a299392d9cdf7ae7c16d6 - md5: 5bd21a5ea37ab0fbe1d9cbba4e0e7c80 - depends: - - clang-19 19.1.7 default_hc369343_5 + size: 28355 + timestamp: 1767835836458 +- conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + sha256: 820d65cc9f0b44fdc088d4e7f6a154cfb323bbdeb29c6405b4794680e7e7ac18 + md5: 138b0781aea27a845b18e7c1cd34f2fb + depends: + - clang-19 19.1.7 default_hd70426c_7 + - clang_impl_osx-64 19.1.7 default_ha1a018a_7 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24455 - timestamp: 1759436889569 -- conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_5.conda - sha256: 6e9cb7e80a41dbbfd95e86d87c8e5dafc3171aadda16ca33a1e2136748267318 - md5: 6773a2b7d7d1b0a8d0e0f3bf4e928936 - depends: - - clang-19 19.1.7 default_h73dfc95_5 + size: 24316 + timestamp: 1767959435159 +- conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + sha256: e170fa45ea1a6c30348b05a474bfad58bcb7316ee278fd1051f1f7af105db2cd + md5: 13150cdd8e6bc61aa68b55d1a2a69083 + depends: + - clang-19 19.1.7 default_hf3020a7_7 + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_7 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24502 - timestamp: 1759435412103 -- conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_5.conda - sha256: 05aaf18e0ecdff80dcf865354fafe39c713350b948bd7378b00c8ecbf3c97755 - md5: 57f4b8f3549fec0be4c674a269e507b9 + size: 24474 + timestamp: 1767957953998 +- conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda + sha256: a1d02a927d05997e8a4fef000c11512baeb87dde5dda16aa871dfb0cb1bb0c9f + md5: 5552cab7d5b866172bdc3d2cdf4df88e depends: - - clang-19 19.1.7 default_hac490eb_5 + - clang-19 19.1.7 default_hac490eb_7 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -4476,35 +4279,35 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 102209660 - timestamp: 1759440377684 -- conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hc369343_5.conda - sha256: 2631c79a027ee8b9c2d4d0a458f0588e8fe03fe1dfb3e3bcd47e7b0f4d0d2175 - md5: b37d33a750251c79214c812eca726241 + size: 102229765 + timestamp: 1767967552586 +- conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + sha256: d1625b4896fa597e0f5fdcd4b7cbeea7c120728e0ef43fc641dd7e8fa6d4eabe + md5: c117b3fc6406027a2ca344aee4e1382a depends: - __osx >=10.13 - - libclang-cpp19.1 19.1.7 default_hc369343_5 + - libclang-cpp19.1 19.1.7 default_hd70426c_7 - libcxx >=19.1.7 - libllvm19 >=19.1.7,<19.2.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 765727 - timestamp: 1759436729883 -- conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_h73dfc95_5.conda - sha256: f1c8f4e8735918aacd7cab058fff389fc639d4537221753f0e9b44e120892f9a - md5: 561b822bdb2c1bb41e16e59a090f1e36 + size: 764031 + timestamp: 1767959120208 +- conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + sha256: d59286e188f4922f9812d8412358f98e98b187840c7256d9c143f4e9cc02847e + md5: 3b992d143f0008588ca26df8a324eee9 depends: - __osx >=11.0 - - libclang-cpp19.1 19.1.7 default_h73dfc95_5 + - libclang-cpp19.1 19.1.7 default_hf3020a7_7 - libcxx >=19.1.7 - libllvm19 >=19.1.7,<19.2.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 763853 - timestamp: 1759435247449 -- conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_5.conda - sha256: e0053285b5685634c77b17f8ef13130b44042fe5fa56f1f95c3c8278149aa084 - md5: 27ad94721c72e5118f9c498b1b83ab08 + size: 764520 + timestamp: 1767957577398 +- conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + sha256: 34a99767bcc5435db5540224a6dc4e19ec0ab75af269364e6212512abbad62e2 + md5: 9ec76da1182f9986c3d814be0af28499 depends: - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -4513,151 +4316,189 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 68854476 - timestamp: 1759440102943 -- conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.6-default_h99862b1_0.conda - sha256: b10d29501c26312a84f2aad189a010308bbabcf4fb15a641cfee8e59eca76fe2 - md5: b4479aaaf31abab3e37b8ae979049f9d + size: 68887804 + timestamp: 1767967055576 +- conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + sha256: bd6057e1174aa26d2c111038a96a2e427aa68af674af5c17d382eb914d77516f + md5: b693d3a92282776c7a84171825379a37 depends: - __glibc >=2.17,<3.0.a0 - - compiler-rt21 21.1.6.* - - libclang-cpp21.1 21.1.6 default_h99862b1_0 + - compiler-rt21 21.1.8.* + - libclang-cpp21.1 21.1.8 default_h99862b1_1 - libgcc >=14 - - libllvm21 >=21.1.6,<21.2.0a0 + - libllvm21 >=21.1.8,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 829695 - timestamp: 1763564111213 -- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.6-default_he95a3c9_0.conda - sha256: ae8c604cb266f4c5a0b454ba3e5f7340c5c2f3aa001e8c41f72445c16863baa9 - md5: f02ff8318aa5943b688e9e379ef22009 + size: 833967 + timestamp: 1767834581327 +- conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + sha256: c18c0f244a1777ed614ef44cdfa6c3dd8cc86855de383f2d8e381c822df47624 + md5: 7e2a268ebadccffb2aeda2826b0165eb depends: - - compiler-rt21 21.1.6.* - - libclang-cpp21.1 21.1.6 default_he95a3c9_0 + - compiler-rt21 21.1.8.* + - libclang-cpp21.1 21.1.8 default_he95a3c9_1 - libgcc >=14 - - libllvm21 >=21.1.6,<21.2.0a0 + - libllvm21 >=21.1.8,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 832295 - timestamp: 1763565384950 -- conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-hc73cdc9_26.conda - sha256: e44731639299f2ede1c6b944dcf3f06170350138f33904b82af6e1c566deec0c - md5: 48781671bd9d72b3bbcba6c200c15098 + size: 836391 + timestamp: 1767835737528 +- conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda + sha256: 7bf3601d0185532ed0381634b6651e59d6b6f773a9fb5e3ca96c663817e647ee + md5: 46b9d18cf87f1c317a3d1115f45d06f1 + depends: + - binutils_impl_linux-64 + - clang-21 21.1.8 default_h99862b1_1 + - compiler-rt 21.1.8.* + - compiler-rt_linux-64 + - libgcc-devel_linux-64 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 27730 + timestamp: 1767834654181 +- conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda + sha256: b8404a27546b25ca22e46cea2a28fad6c7cf5b6f748293d2813eba59c531e785 + md5: 5976d35e347c180d01cdbb0a5509c36a + depends: + - binutils_impl_linux-aarch64 + - clang-21 21.1.8 default_he95a3c9_1 + - compiler-rt 21.1.8.* + - compiler-rt_linux-aarch64 + - libgcc-devel_linux-aarch64 + - sysroot_linux-aarch64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 27756 + timestamp: 1767835790284 +- conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + sha256: bd9e569f9848d7fdcc963eecbc2cb75201213a751440a207956e1d670c174835 + md5: 61a2644a24a32277abae7a234f73b13d depends: - cctools_impl_osx-64 - - clang 19.1.7.* + - clang-19 19.1.7 default_hd70426c_7 - compiler-rt 19.1.7.* - - ld64_osx-64 + - compiler-rt_osx-64 + - ld64 + - ld64_osx-64 * llvm19_1_* + - llvm-openmp >=19.1.7 - llvm-tools 19.1.7.* - license: BSD-3-Clause - license_family: BSD - size: 17772 - timestamp: 1764359539536 -- conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-h76e6a08_26.conda - sha256: 880d73e66934839f2679c233c04756e600a7327218f8172986c70aaa0e1ee825 - md5: f872a20e3b1d19aa054f113ae3804372 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 24417 + timestamp: 1767959402626 +- conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + sha256: faffb31c43afb4360d6545bd20590fbed5b344a77daeabdea39164d72c943d21 + md5: bde6fcb6b1fcefb687a7fb95675c6ec8 depends: - cctools_impl_osx-arm64 - - clang 19.1.7.* + - clang-19 19.1.7 default_hf3020a7_7 - compiler-rt 19.1.7.* - - ld64_osx-arm64 + - compiler-rt_osx-arm64 + - ld64 + - ld64_osx-arm64 * llvm19_1_* + - llvm-openmp >=19.1.7 - llvm-tools 19.1.7.* - license: BSD-3-Clause - license_family: BSD - size: 17816 - timestamp: 1764359521645 -- conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h7e5c614_26.conda - sha256: 02480139b73893b439d24816150e43df40fb74c1e14e8edc378cc5beef93731a - md5: a93fc2b6b9ea580548a26196ea986e99 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 24459 + timestamp: 1767957934083 +- conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + sha256: 8aa3901a0aca2f1bb14e3d85ac0dbaa1f1777eb8bd5fbfee66dd9d5b5ceafadd + md5: bdabbe4e5b3eb2e97366c85beb3c3ad5 depends: - cctools_osx-64 - - clang_impl_osx-64 19.1.7 hc73cdc9_26 + - clang 19.* + - clang_impl_osx-64 19.1.7.* - sdkroot_env_osx-64 license: BSD-3-Clause license_family: BSD - size: 20650 - timestamp: 1764359547061 -- conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h07b0088_26.conda - sha256: dd20d2286f4d3d5d7a0a12d09d13d5c3b34dd025ecc62ca9798892080a629c46 - md5: bae6f596e3ce534c6a23922711510228 + size: 20713 + timestamp: 1768238991354 +- conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + sha256: 8da35ab0467cc5cc4bf0fd7cb1e04c9d4e83a0625eee833a97bf4341898f74f6 + md5: c4084c97eb4a40f93efc3844c552d895 depends: - cctools_osx-arm64 - - clang_impl_osx-arm64 19.1.7 h76e6a08_26 + - clang 19.* + - clang_impl_osx-arm64 19.1.7.* - sdkroot_env_osx-arm64 license: BSD-3-Clause license_family: BSD - size: 20605 - timestamp: 1764359528206 -- conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h1c12a56_5.conda - sha256: 6553c7b6a898bd00c218656d3438dc3a70f2bb79f795ce461792c55304558af2 - md5: 6b6f3133d60b448c0f12885f53d5ed09 + size: 20690 + timestamp: 1768238866964 +- conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + sha256: cfa79093c73f831c9df7892989e59cd25244eaf45a8d476be21871834b260c18 + md5: 85ed31bf1c61812adb2492a0745db172 depends: - - clang 19.1.7 default_h1323312_5 + - clang 19.1.7 default_h1323312_7 + - clangxx_impl_osx-64 19.1.7.* default_*_7 - libcxx-devel 19.1.* license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24505 - timestamp: 1759436910517 -- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_h36137df_5.conda - sha256: f8f94321aee9ad83cb1cdf90660885fccb482c34c82ba84c2c167d452376834f - md5: c11a3a5a0cdb74d8ce58c6eac8d1f662 - depends: - - clang 19.1.7 default_hf9bcbb7_5 + size: 24380 + timestamp: 1767959626598 +- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + sha256: ac9f83722cfd336298b97e30c3746a8f0d9d6289a3e0383275f531dc03b2f88a + md5: 0c1f688616da9aac0ce556d74a24f740 + depends: + - clang 19.1.7 default_hf9bcbb7_7 + - clangxx_impl_osx-arm64 19.1.7.* default_*_7 - libcxx-devel 19.1.* license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 24587 - timestamp: 1759435427954 -- conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-hb295874_26.conda - sha256: bdc6d5b394099ebdaf3e586133ed580519c3b7e5a4db293c14b92de33ac6e569 - md5: 644ddbed9e57310a238ffff63a58dc77 - depends: - - clang_osx-64 19.1.7 h7e5c614_26 - - clangxx 19.1.7.* - - libcxx >=19 - - libllvm19 >=19.1.7,<19.2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 17923 - timestamp: 1764359622898 -- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-h276745f_26.conda - sha256: f3a3f5396c19df103d72eef7fc20c8a480c9f3beee6bdb2a1c871625c7245418 - md5: 7654ab743ef26bf8018f510f918665d4 - depends: - - clang_osx-arm64 19.1.7 h07b0088_26 - - clangxx 19.1.7.* - - libcxx >=19 - - libllvm19 >=19.1.7,<19.2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 17979 - timestamp: 1764359611219 -- conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h7e5c614_26.conda - sha256: 53ba98724eb5b0edf9145c5dd5262714f1dd235562235ad48fc4a3fa23e2abd4 - md5: a52f0930c0cf6aec4010aa3fcc15e105 + size: 24443 + timestamp: 1767958120218 +- conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + sha256: 56147cce5439c1543703dc0fb95a68793c3154f7987faf027c7159a850883298 + md5: b37f21ec0f7e5a279d51b3b692303ff6 + depends: + - clang-19 19.1.7 default_hd70426c_7 + - clang_impl_osx-64 19.1.7 default_ha1a018a_7 + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 24322 + timestamp: 1767959603633 +- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + sha256: 56ec5bf095253eb7ff33b0e64f33c608d760f790f1ff0cb30480a797bffbb2fd + md5: 4fa4a9227c428372847c534a9bffd698 + depends: + - clang-19 19.1.7 default_hf3020a7_7 + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_7 + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 24364 + timestamp: 1767958102690 +- conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda + sha256: f3338015a63d244d31c96aec5b1d9544c394462ba2ad0992d4f4b25489018dcd + md5: e9891e8461074033f4eb049adac4f5f9 depends: - cctools_osx-64 - - clang_osx-64 19.1.7 h7e5c614_26 - - clangxx_impl_osx-64 19.1.7 hb295874_26 + - clang_osx-64 19.1.7 h8a78ed7_30 + - clangxx 19.* + - clangxx_impl_osx-64 19.1.7.* - sdkroot_env_osx-64 license: BSD-3-Clause license_family: BSD - size: 19520 - timestamp: 1764359637398 -- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h07b0088_26.conda - sha256: 8af9233ce9d1f2bbdf05709756b3d5ea80206c55b821950403268ee4c9affce6 - md5: 51cfb178328f60dbaad16fa06b0f20c2 + size: 19530 + timestamp: 1768238994854 +- conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda + sha256: aeb19eee297092feac4021af2b98ee0cffdda0f9fc1d3bffb4d954285c67aad4 + md5: ad0ecddf92544c4be2e431e1b720f9ed depends: - cctools_osx-arm64 - - clang_osx-arm64 19.1.7 h07b0088_26 - - clangxx_impl_osx-arm64 19.1.7 h276745f_26 + - clang_osx-arm64 19.1.7 h75f8d18_30 + - clangxx 19.* + - clangxx_impl_osx-arm64 19.1.7.* - sdkroot_env_osx-arm64 license: BSD-3-Clause license_family: BSD - size: 19468 - timestamp: 1764359619507 + size: 19513 + timestamp: 1768238872340 - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 sha256: 86a2428e5738c65a4cbb5468810024eb589753255e7f1ebf10a65804ce9372a2 md5: e210df0dfab7781247c2a7ba09673400 @@ -4700,6 +4541,28 @@ packages: license_family: BSD size: 27011 timestamp: 1733218222191 +- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + sha256: f64336959429404a763e04c14e04f76dbc325d24a25139e6f93f659cb22c83c3 + md5: 6d3723f76cef4a9fe56da659a35b94f4 + depends: + - compiler-rt21 21.1.8 hb700be7_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 15903 + timestamp: 1765964516247 +- conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + sha256: b90661aebf405de38b19c180baeb5cf9fde60482c06179c2e656ed06b91cf28e + md5: 79f5e0cc6013c9e5e0635628e792af9a + depends: + - compiler-rt21 21.1.8 hfefdfc9_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 16009 + timestamp: 1765964617279 - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda sha256: 28e5f0a6293acba68ebc54694a2fc40b1897202735e8e8cbaaa0e975ba7b235b md5: e6b9e71e5cb08f9ed0185d31d33a074b @@ -4735,47 +4598,69 @@ packages: license_family: APACHE size: 4688306 timestamp: 1757412257734 -- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.6-hb700be7_0.conda - sha256: 0e25801c1aede11f699545e45e5d80daae1a3548632ed0376f18cad863c87231 - md5: af0fc9f3903f08dda338a6e6a0120ad1 +- conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + sha256: 36b1eea589ba2491a73edc493ff94f3f8bc72c10558d6aa232b735d72526fb16 + md5: 2605a7b74e3e1704a0ee354dfca4698f depends: - __glibc >=2.17,<3.0.a0 - - compiler-rt21_linux-64 21.1.6.* + - compiler-rt21_linux-64 21.1.8.* - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 113548 - timestamp: 1763529895706 -- conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.6-hfefdfc9_0.conda - sha256: 592d3edc23e74f6a1d11ad1442ef71e82bc962eb986a53dd0e411258c668ba1a - md5: 5c8e0123bbecfdda58dff88b6bfaae3f + size: 113924 + timestamp: 1765964515117 +- conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + sha256: 265a8ca41e8167acb36566fb7d136a71624f005216d8104fa83076a2acf24882 + md5: d5fc68f0827fca5d2628b5f5a1f17c55 depends: - - compiler-rt21_linux-aarch64 21.1.6.* + - compiler-rt21_linux-aarch64 21.1.8.* - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 114332 - timestamp: 1763529762326 -- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.6-hffcefe0_0.conda - sha256: 3fd96d0fd1da025cb8e6fc606293fd5e86659e3ccfb17399b8460c73ad44c92b - md5: ec1df7fddacdefe2e8ab184ab560342c + size: 114302 + timestamp: 1765964615658 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + sha256: 517732d3d4418ad2e1c98275665e51af3c97156cd08576e446723f01476e14aa + md5: b57b330b71eaad89b12e1b37db8aede8 constrains: - compiler-rt >=9.0.1 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 48412820 - timestamp: 1763529771865 -- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.6-hfefdfc9_0.conda - sha256: ae904f20ddc9efd6ccbc97b0bb91384018e6f9730a9adbb9c99a3f232af83169 - md5: a687dc2c466e19e1669e57fb87aaf7ca + size: 46093098 + timestamp: 1765964436590 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + sha256: 854c242cd7d244332caa8cbadd7848b1646d7745b4f981ff198c70cfb6a61053 + md5: 2982ef226df9e05649f84d99306620eb constrains: - compiler-rt >=9.0.1 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 32909856 - timestamp: 1763529676082 + size: 34186895 + timestamp: 1765964491269 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + sha256: 97927b118d1666c81f8d512863e7c6d34a701bf5943d0d3f4b53b3d32eb3ec67 + md5: c6a239a22f4adad76e5c0f0a96697cc9 + depends: + - compiler-rt21_linux-64 21.1.8 hffcefe0_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 15953 + timestamp: 1765964515874 +- conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + sha256: f4344340e90537185aee93ad7007927d337445cc1ddc57318fa145f13e94878e + md5: a822ae3eb3a0c8d2d2609b0316a31a90 + depends: + - compiler-rt21_linux-aarch64 21.1.8 hfefdfc9_0 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 16068 + timestamp: 1765964616860 - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda sha256: e6effe89523fc6143819f7a68372b28bf0c176af5b050fe6cf75b62e9f6c6157 md5: 32deecb68e11352deaa3235b709ddab2 @@ -4867,24 +4752,24 @@ packages: license_family: BSD size: 7886 timestamp: 1753098810030 -- conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_14.conda - sha256: cf0818a3d54f83b4e35906f857f7bd1315d854b6229998b828fec5f075736428 - md5: 906dcdccfd6d4b023ac8b4b485268f20 +- conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + sha256: 387cd20bc18c9cabae357fec1b73f691b8b6a6bafbf843b8ff17241eae0dd1d5 + md5: 77e54ea3bd0888e65ed821f19f5d23ad depends: - gcc_impl_linux-64 >=14.3.0,<14.3.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 31110 - timestamp: 1764276548006 -- conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_14.conda - sha256: ec983bb7d3c396f8e48140a7480fc881c966efe74a1c68b5c81f2f9953874450 - md5: 52167e7df37694c728526813eea228c5 + size: 31314 + timestamp: 1765256147792 +- conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + sha256: b63926b9041527ca4f2d196483e8e2368860f66f6bc9866fb443a5325f5ec207 + md5: 5b4371e8c3e0245dd41c76fce4314e13 depends: - gcc_impl_linux-aarch64 >=14.3.0,<14.3.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 30892 - timestamp: 1764276308086 + size: 31165 + timestamp: 1765256726234 - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda sha256: 90e12ef22f91937e723116b79cb42f3ab38c407970398a843b1eac358ca68c45 md5: 4de17d73a4afd4ce03b370fe4480100f @@ -4894,16 +4779,16 @@ packages: license_family: PSF size: 18056 timestamp: 1734475348772 -- conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda +- conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda noarch: generic - sha256: 31da683e8a15e2062adfb29c9fb23d4253550a0b3c9be1cd45530f88796b4644 - md5: 367133808e89325690562099851529c8 + sha256: 63f677762304e6f8dc55e11dff6aafe71129cbbd0a77d176b99ba1f6a5053b77 + md5: 5bf347916a543bcb290c780fa449bf73 depends: - python >=3.13,<3.14.0a0 - python_abi * *_cp313 license: Python-2.0 - size: 48397 - timestamp: 1761175097707 + size: 48369 + timestamp: 1765019689213 - conda: https://prefix.dev/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 md5: f291630db5dc438b6ce37c2bb1a96516 @@ -5180,14 +5065,14 @@ packages: license_family: MIT size: 30753 timestamp: 1756729456476 -- conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - sha256: 19025a4078ff3940d97eb0da29983d5e0deac9c3e09b0eabf897daeaf9d1114e - md5: 66b8b26023b8efdf8fcb23bac4b6325d +- conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + sha256: 8b90dc21f00167a7e58abb5141a140bdb31a7c5734fe1361b5f98f4a4183fd32 + md5: 2cfaaccf085c133a477f0a7a8657afe9 depends: - python >=3.10 license: Unlicense - size: 17976 - timestamp: 1759948208140 + size: 18661 + timestamp: 1768022315929 - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda sha256: 36cff091f0dc82c022225e51ebd1d2eba6269144c0c19580d3b313e430a70740 md5: a00b1ff46537989d170dda28dd99975f @@ -5497,28 +5382,28 @@ packages: license_family: GPL size: 68987573 timestamp: 1764276158144 -- conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_14.conda - sha256: 4e99d5903113dfbb36a0a1510450c6a6e3ffc4a4c69d2d1e03c3efa1f1ba4e8f - md5: fe0c2ac970a0b10835f3432a3dfd4542 +- conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + sha256: 7b9585c201c175c024c56b46658d9e4b5db85a32df54517798109281a90d03bb + md5: 50dc15ac993bb5859f923979c81fafc8 depends: - gcc_impl_linux-64 14.3.0.* - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD - size: 27980 - timestamp: 1763757768300 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_14.conda - sha256: 7ef2b23a2a2453d23afaf0b5878d0afd7c80654a8a49e6070404a34f6cac7735 - md5: 640d2d54860f54ca66eb4aa5cd243fca + size: 28913 + timestamp: 1766347929374 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + sha256: 471f7af664ebb24de29707c16dd482ca6531cc9cd3c33eb6dcb8cc37e820783f + md5: 13ecb1936d6531fb8f031ecbf0cde7ba depends: - gcc_impl_linux-aarch64 14.3.0.* - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD - size: 27754 - timestamp: 1763757746591 + size: 28654 + timestamp: 1766347983463 - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda sha256: 7ab008dd3dc5e6ca0de2614771019a1d35480d51df6216c96b1cf6a5e660ee40 md5: 94394acdc56dcb4d55dddf0393134966 @@ -5563,9 +5448,9 @@ packages: license_family: GPL size: 32740 timestamp: 1751220440768 -- conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_14.conda - sha256: 40ff520c51c762275dfc09a92f21e2dd2a4bafcf8faf7c5a2bbb35a077ed9c64 - md5: 4f780ca1ee70dee1c9acbe1932305cb2 +- conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + sha256: c27c7860eaf7043f7a1a6e518b7c741c830d0734dfe00bea3804e799c2bf0556 + md5: 3065346248242b288fd4f73fe34f833e depends: - gcc_impl_linux-64 >=14.3.0 - libgcc >=14.3.0 @@ -5574,11 +5459,11 @@ packages: - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 18558179 - timestamp: 1764276619897 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_14.conda - sha256: af7eb480b2589f0e67b2e16c1c5b7f6675fe50d3fdbd44602bde34406ecc3c91 - md5: e5e742e8e71bbf2b12ffb0f3680c63e4 + size: 18569038 + timestamp: 1765256219467 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + sha256: 40d77a46da742c0dc65b83a48051945f6044cf1bf551486ed3af88dfa8bcdeec + md5: e2f823c56c3979c98050e57addb29b2c depends: - gcc_impl_linux-aarch64 >=14.3.0 - libgcc >=14.3.0 @@ -5587,8 +5472,8 @@ packages: - sysroot_linux-aarch64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 14865283 - timestamp: 1764276376220 + size: 14817477 + timestamp: 1765256788001 - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda sha256: 7a2a952ffee0349147768c1d6482cb0933349017056210118ebd5f0fb688f5d5 md5: 1a81d1a0cb7f241144d9f10e55a66379 @@ -5631,30 +5516,30 @@ packages: license_family: GPL size: 20286770 timestamp: 1759712171482 -- conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h1e4d427_14.conda - sha256: 33b26b606dafa8cc3f0219a49c7aea6f0909845513de2b1468e49d1a93b64038 - md5: 5d81121caf70d8799d90dabbf98e5d3d +- conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda + sha256: 5365f44d03ff752b82e8f73fe96c54457ad2cb5522d5c5fb0782cc4ae78ceaf7 + md5: d5db7829d4b9b1676419fca2c63909b3 depends: - gfortran_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_14 + - gcc_linux-64 ==14.3.0 h298d278_17 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD - size: 26783 - timestamp: 1763757768301 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-he99419a_14.conda - sha256: dc284fff5fa9b09cd847e1244f870b2fa1cee8d8ceabcaee76d1d6f8ef0a7539 - md5: 4063105c3afb840aebc0bd14aa0aaabf + size: 27097 + timestamp: 1766347929375 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda + sha256: 1e92e7f0de1c3865dd3c43734fd59596a43fd693ea5402f0cf07fa0b04be0c69 + md5: 31bdc0f9a65007b5e09e3e368858f539 depends: - gfortran_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_14 + - gcc_linux-aarch64 ==14.3.0 h118592a_17 - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD - size: 26537 - timestamp: 1763757746592 + size: 26833 + timestamp: 1766347983463 - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda sha256: 14014ad4d46e894645979cbad42dd509482172095c756bdb5474918e0638bd57 md5: 979b3c36c57d31e1112fa1b1aec28e02 @@ -5932,30 +5817,30 @@ packages: license_family: GPL size: 13727340 timestamp: 1764276426320 -- conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-hc876b51_14.conda - sha256: d8d6fe7ddd4aa55307ee4fa41860abd0365c29312878f5fb392cd7b50d303711 - md5: 1852de0052b0d6af4294b3ae25a4a450 +- conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda + sha256: 90ccb0df50254feb5b4e539b06e3d2c3baf5c37e40579224a277ab164566a6a0 + md5: 94474857477981fedf74cf7c47c88ba5 depends: - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_14 + - gcc_linux-64 ==14.3.0 h298d278_17 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD - size: 27073 - timestamp: 1763757768301 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h44e8445_14.conda - sha256: 2b98b6f0c6a4065c7df3674288694a857aca46824d41cafe9552d5e58f48d9a1 - md5: 617095c2eb35405af60572a45b319b83 + size: 27464 + timestamp: 1766347929379 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda + sha256: d8934358913c36e58273b09e3e81d74b78e7dfb41157717ce7b9fbb1bf6da538 + md5: 8b396fba15df31abf963a948e3e5af50 depends: - gxx_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_14 + - gcc_linux-aarch64 ==14.3.0 h118592a_17 - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD - size: 26871 - timestamp: 1763757746592 + size: 27209 + timestamp: 1766347983467 - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -6014,6 +5899,17 @@ packages: license_family: MIT size: 12129203 timestamp: 1720853576813 +- conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 + md5: 186a18e3ba246eccfc7cff00cd19a870 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 12728445 + timestamp: 1767969922681 - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 md5: 268203e8b983fddb6412b36f2024e75c @@ -6024,6 +5920,16 @@ packages: license_family: MIT size: 12282786 timestamp: 1720853454991 +- conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + sha256: 09f7f9213eb68e7e4291cd476e72b37f3ded99ed957528567f32f5ba6b611043 + md5: 15b35dc33e185e7d2aac1cfcd6778627 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 12852963 + timestamp: 1767975394622 - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda sha256: 2e64307532f482a0929412976c8450c719d558ba20c0962832132fd0d07ba7a7 md5: d68d48a3060eb5abdc1cdc8e2a3a5966 @@ -6042,6 +5948,15 @@ packages: license_family: MIT size: 11857802 timestamp: 1720853997952 +- conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + sha256: d4cefbca587429d1192509edc52c88de52bc96c2447771ddc1f8bee928aed5ef + md5: 1e93aca311da0210e660d2247812fa02 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 12358010 + timestamp: 1767970350308 - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda sha256: 1d04369a1860a1e9e371b9fc82dd0092b616adcf057d6c88371856669280e920 md5: 8579b6bb8d18be7c0b27fb08adeeeb40 @@ -6321,68 +6236,68 @@ packages: license_family: MIT size: 510641 timestamp: 1739161381270 -- conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_1.conda - sha256: caccb3177db88f2d66d3a079528d28dc6ad82e2564bbd0c1415ddf2b1ff323d2 - md5: c677bba21929007216a36f8dbe1bc9c5 +- conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + sha256: fc720deee55e62a21c7b3a86041acce201472731f9db826099f4060e8a92ad78 + md5: 2a1c17d828bd3916f871d9a49432e0a1 depends: - - ld64_osx-64 956.6 llvm19_1_h466f870_1 + - ld64_osx-64 956.6 llvm19_1_h466f870_3 - libllvm19 >=19.1.7,<19.2.0a0 constrains: - - cctools_osx-64 1030.6.3.* - cctools 1030.6.3.* + - cctools_osx-64 1030.6.3.* license: APSL-2.0 license_family: Other - size: 21141 - timestamp: 1764352011885 -- conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_1.conda - sha256: 5e5a9ad51ee0e05e2887c08c4ffc0dbe0ec9ab4d672aa5f63b5525c52a163506 - md5: 3a3ff7c8991ea2807eb13425733491c2 + size: 21562 + timestamp: 1767114511590 +- conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + sha256: 11d2766a994b07faf761e569bbf4d43908539fba576fb3b00d5b210497b0ac8b + md5: fac8bcc3f72041318061b92c1f269aa4 depends: - - ld64_osx-arm64 956.6 llvm19_1_h6922315_1 + - ld64_osx-arm64 956.6 llvm19_1_h6922315_3 - libllvm19 >=19.1.7,<19.2.0a0 constrains: - cctools_osx-arm64 1030.6.3.* - cctools 1030.6.3.* license: APSL-2.0 license_family: Other - size: 21195 - timestamp: 1764351962956 -- conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_1.conda - sha256: c4d208c1d3bddbcb792447567a7e62a9c36432abcbcddeb0bca25733145a01ca - md5: 83e4d60f77f239bf9a861343994af010 + size: 21608 + timestamp: 1767114550571 +- conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + sha256: f3d3eb60f756f9eda6ef9ca89bca372e2785762b31b42f2967253a6a17b1eac8 + md5: 5998e06528c03076d645c5d5c3479b81 depends: - __osx >=10.13 - libcxx - libllvm19 >=19.1.7,<19.2.0a0 - - sigtool + - sigtool-codesign - tapi >=1600.0.11.8,<1601.0a0 constrains: - - clang 19.1.* + - ld64 956.6.* - cctools_impl_osx-64 1030.6.3.* - cctools 1030.6.3.* - - ld64 956.6.* + - clang 19.1.* license: APSL-2.0 license_family: Other - size: 1113573 - timestamp: 1764351891537 -- conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_1.conda - sha256: 53c2332de431c79dd536765a6c8e91a5667157025d075e1188ec4fa8ea1811fa - md5: 66697cc97d32afa29c17855b3d56680e + size: 1115701 + timestamp: 1767114433927 +- conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + sha256: 82ddd2c8faae34f6e7128ae55b8432560454842401a987f31c1f83c3908594d9 + md5: a9527064ed0ed4514de7a7d35ab28c97 depends: - __osx >=11.0 - libcxx - libllvm19 >=19.1.7,<19.2.0a0 - - sigtool + - sigtool-codesign - tapi >=1600.0.11.8,<1601.0a0 constrains: - - clang 19.1.* - ld64 956.6.* + - clang 19.1.* - cctools_impl_osx-arm64 1030.6.3.* - cctools 1030.6.3.* license: APSL-2.0 license_family: Other - size: 1037455 - timestamp: 1764351880391 + size: 1038328 + timestamp: 1767114455958 - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda sha256: 9e191baf2426a19507f1d0a17be0fdb7aa155cdf0f61d5a09c808e0a69464312 md5: a6abd2796fc332536735f68ba23f7901 @@ -6395,6 +6310,18 @@ packages: license_family: GPL size: 725545 timestamp: 1764007826689 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca + md5: 3ec0aa5037d39b06554109a01e6fb0c6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + license_family: GPL + size: 730831 + timestamp: 1766513089214 - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda sha256: 7a13072581fa23f658a04f62f62c4677c57d3c9696fbc01cc954a88fc354b44d md5: 28035705fe0c977ea33963489cd008ad @@ -6406,6 +6333,17 @@ packages: license_family: GPL size: 875534 timestamp: 1764007911054 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + sha256: 12e7341b89e9ea319a3b4de03d02cd988fa02b8a678f4e46779515009b5e475c + md5: 849c4cbbf8dd1d71e66c13afed1d2f12 + depends: + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-aarch64 2.45 + license: GPL-3.0-only + license_family: GPL + size: 876257 + timestamp: 1766513180236 - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda sha256: 7b3388ab7f557e05262f6cce8e42ed1a063929e6f73584a25df3cb138529df0c md5: 0707fe20430462e7b8398b2f9b0ed04c @@ -6490,28 +6428,28 @@ packages: license_family: Apache size: 164701 timestamp: 1745264384716 -- conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - sha256: 16ff6eea7319f5e7a8091028e6ed66a33b0ea5a859075354b93674e6f0a1087a - md5: 51c684dbc10be31478e7fc0e85d27bfe +- conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda + sha256: 3e8588828d2586722328ea39a7cf48c50a32f7661b55299075741ef7c8875ad5 + md5: b671ac86f33848f3bc3a6066d21c37dd depends: - __osx >=10.13 - libcxx >=19.1.7 - libllvm19 >=19.1.7,<19.2.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 14856234 - timestamp: 1759436552121 -- conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - sha256: 6e62da7915a4a8b8bcd9a646e23c8a2180015d85a606c2a64e2385e6d0618949 - md5: 0b1110de04b80ea62e93fef6f8056fbb + size: 14856190 + timestamp: 1767958815491 +- conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda + sha256: 89b8aed26ef89c9e56939d1acefa91ecf2e198923bfcc41f116c0de42ce869cb + md5: 5600ae1b88144099572939e773f4b20b depends: - __osx >=11.0 - libcxx >=19.1.7 - libllvm19 >=19.1.7,<19.2.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 14064272 - timestamp: 1759435091038 + size: 14062741 + timestamp: 1767957389675 - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_h99862b1_5.conda sha256: b9f0e167cdf5cbe076231788fcb3affe25914534d84ab249258161b693c4cfd2 md5: 33acc83688f092f96ea2ead08e3b4dcd @@ -6546,29 +6484,29 @@ packages: license_family: Apache size: 14727395 timestamp: 1764391109309 -- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.6-default_h99862b1_0.conda - sha256: 314f4c4980c18138659fdd0c75385c1a88ff6bef2ac7890d1df76f9b2d5e1a5f - md5: 0fcc9b4d3fc5e5010a7098318d9b7971 +- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda + sha256: fd494cb13a139067a00dab2a641347c692abc149bcae6872502640b14e12dc4d + md5: e933f92cedca212eb2916f24823cf90b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm21 >=21.1.6,<21.2.0a0 + - libllvm21 >=21.1.8,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 21054536 - timestamp: 1763564022522 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.6-default_he95a3c9_0.conda - sha256: 16ab2b2884ceededa62855680f9ee76f31881c0a4043506667c0ff7f7d2f842c - md5: 6457ea18e8c2a534017aa7c7c88768eb + size: 21054217 + timestamp: 1767834505759 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda + sha256: a36903e48ccffde2e17be59e4868605aa2571b34b552d2699219f1bcd6691a89 + md5: 3c89c40c8bc018db02008a0a7d1981de depends: - libgcc >=14 - - libllvm21 >=21.1.6,<21.2.0a0 + - libllvm21 >=21.1.8,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 20647658 - timestamp: 1763565272067 + size: 20653007 + timestamp: 1767835657350 - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 md5: 01e149d4a53185622dc2e788281961f2 @@ -6585,6 +6523,22 @@ packages: license_family: MIT size: 460366 timestamp: 1762333743748 +- conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + sha256: 5454709d9fb6e9c3dd6423bc284fa7835a7823bfa8323f6e8786cdd555101fab + md5: 0a5563efed19ca4461cf927419b6eb73 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 462942 + timestamp: 1767821743793 - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda sha256: 100443d6cc03bd31f07082190d151fc84734a64624a79778e792b9b70754ffe5 md5: 468c392e41a0cfc30aed58139fc8d58f @@ -6600,6 +6554,21 @@ packages: license_family: MIT size: 478880 timestamp: 1762333723924 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda + sha256: bf9d50e78df63b807c5cc98f44dc06a6555ab499edcd2949e9a07a5a785a11ee + md5: dc4f2007c6a30a45dfcf1c3a97b6aba6 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 482649 + timestamp: 1767821674919 - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda sha256: a58ca5a28c1cb481f65800781cee9411bd68e8bda43a69817aaeb635d25f7d75 md5: b3985ef7ca4cd2db59756bae2963283a @@ -6615,6 +6584,21 @@ packages: license_family: MIT size: 412858 timestamp: 1762334472915 +- conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + sha256: 1a0af3b7929af3c5893ebf50161978f54ae0256abb9532d4efba2735a0688325 + md5: de1910529f64ba4a9ac9005e0be78601 + depends: + - __osx >=10.13 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 419089 + timestamp: 1767822218800 - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda sha256: 2980c5de44ac3ca2ecbd4a00756da1648ea2945d9e4a2ad9f216c7787df57f10 md5: 791003efe92c17ed5949b309c61a5ab1 @@ -6630,6 +6614,21 @@ packages: license_family: MIT size: 394183 timestamp: 1762334288445 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + sha256: 11c78b3e89bc332933386f0a11ac60d9200afb7a811b9e3bec98aef8d4a6389b + md5: 36190179a799f3aee3c2d20a8a2b970d + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 402681 + timestamp: 1767822693908 - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda sha256: 91335ef5f9d228399550937628fc8739c914f106a116b89da1580c4412902ac4 md5: 866af4d7269cd8c9b70f5b49ad6173aa @@ -6648,6 +6647,15 @@ packages: license_family: Apache size: 571564 timestamp: 1764676139160 +- conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda + sha256: cbd8e821e97436d8fc126c24b50df838b05ba4c80494fbb93ccaf2e3b2d109fb + md5: 9f8a60a77ecafb7966ca961c94f33bd1 + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569777 + timestamp: 1765919624323 - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda sha256: 6c8d5c50f398035c39f118a6decf91b11d2461c88aef99f81e5c5de200d2a7fa md5: 3ea79e55a64bff6c3cbd4588c89a527a @@ -6666,24 +6674,46 @@ packages: license_family: Apache size: 568715 timestamp: 1764676451068 -- conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_1.conda - sha256: d1ee08b0614d8f9bca84aa91b4015c5efa96162fd865590a126544243699dfc6 - md5: 0f3f15e69e98ce9b3307c1d8309d1659 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda + sha256: 82e228975fd491bcf1071ecd0a6ec2a0fcc5f57eb0bd1d52cb13a18d57c67786 + md5: 780f0251b757564e062187044232c2b7 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569118 + timestamp: 1765919724254 +- conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + sha256: 760af3509e723d8ee5a9baa7f923a213a758b3a09e41ffdaf10f3a474898ab3f + md5: 52031c3ab8857ea8bcc96fe6f1b6d778 depends: - libcxx >=19.1.7 + - libcxx-headers >=19.1.7,<19.1.8.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 826706 - timestamp: 1742451299167 -- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_1.conda - sha256: 6dd08a65b8ef162b058dc931aba3bdb6274ba5f05b6c86fbd0c23f2eafc7cc47 - md5: 1399af81db60d441e7c6577307d5cf82 + size: 23069 + timestamp: 1764648572536 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + sha256: ec07ebaa226792f4e2bf0f5dba50325632a7474d5f04b951d8291be70af215da + md5: 9f7810b7c0a731dbc84d46d6005890ef depends: - libcxx >=19.1.7 + - libcxx-headers >=19.1.7,<19.1.8.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 23000 + timestamp: 1764648270121 +- conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + sha256: 36485e6807e03a4f15a8018ec982457a9de0a1318b4b49a44c5da75849dbe24f + md5: de91b5ce46dc7968b6e311f9add055a2 + depends: + - __unix + constrains: + - libcxx-devel 19.1.7 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 825628 - timestamp: 1742451285589 + size: 830747 + timestamp: 1764647922410 - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -7042,6 +7072,19 @@ packages: license_family: GPL size: 1041047 timestamp: 1764277103389 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 + md5: 6d0363467e6ed84f11435eb309f2ff06 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1042798 + timestamp: 1765256792743 - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda sha256: 827a0848aa93221e078522a933b6de498aad0c52ab568f935bcc19060b995dbb md5: 43ff19fcf6f6737770018bb20bb2a9f9 @@ -7054,30 +7097,42 @@ packages: license_family: GPL size: 620723 timestamp: 1764276398571 -- conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_14.conda - sha256: e300407b7f24d320e1e16277949db9d10cc8577004f839fe21e195933f8e3028 - md5: ad31de7df92caf04a70d0d8dc48d9ecd +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + sha256: 44bfc6fe16236babb271e0c693fe7fd978f336542e23c9c30e700483796ed30b + md5: cf9cd6739a3b694dcf551d898e112331 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 h8acb6b2_16 + - libgcc-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 620637 + timestamp: 1765256938043 +- conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + sha256: e04b115ae32f8cbf95905971856ff557b296511735f4e1587b88abf519ff6fb8 + md5: c816665789d1e47cdfd6da8a81e1af64 depends: - _openmp_mutex constrains: - - libgcc-ng ==15.2.0=*_14 - - libgomp 15.2.0 14 + - libgomp 15.2.0 15 + - libgcc-ng ==15.2.0=*_15 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 423498 - timestamp: 1764281235772 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_14.conda - sha256: 6ff7172e6102ed87faa5478b9c828afd79aeca33e91038ab6b6bd6f8581e63f9 - md5: 1b3fb17dd26afdafe0bf30fafcb900a2 + size: 422960 + timestamp: 1764839601296 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + sha256: 646c91dbc422fe92a5f8a3a5409c9aac66549f4ce8f8d1cab7c2aa5db789bb69 + md5: 8b216bac0de7a9d60f3ddeba2515545c depends: - _openmp_mutex constrains: - - libgcc-ng ==15.2.0=*_14 - - libgomp 15.2.0 14 + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 16 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 402289 - timestamp: 1764279453305 + size: 402197 + timestamp: 1765258985740 - conda: https://prefix.dev/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_14.conda sha256: 53faec88576b469e0800830f5da07072478398c3ed69a8ca2b96d41e7c45ec73 md5: b39b17a9f5ec5f3a395dbf0f5ee13b66 @@ -7119,6 +7174,15 @@ packages: license_family: GPL size: 27157 timestamp: 1764277114484 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 + md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b + depends: + - libgcc 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 27256 + timestamp: 1765256804124 - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda sha256: 7b25d20e9cf637520e71b3382db89d8457aec38bf0d1f8ed20d50eb2457f0131 md5: acd92c808b9f95f5b28db20054306ba7 @@ -7128,28 +7192,37 @@ packages: license_family: GPL size: 27086 timestamp: 1764276407434 -- conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_14.conda - sha256: 59d0eb2198e703949c4b59cffa5f7b8936447531bd96d69799b80441a4139418 - md5: c11e0acbe6ba3df9a30dbe7f839cbd99 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + sha256: 22d7e63a00c880bd14fbbc514ec6f553b9325d705f08582e9076c7e73c93a2e1 + md5: 3e54a6d0f2ff0172903c0acfda9efc0e + depends: + - libgcc 15.2.0 h8acb6b2_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 27356 + timestamp: 1765256948637 +- conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + sha256: 7bb4d51348e8f7c1a565df95f4fc2a2021229d42300aab8366eda0ea1af90587 + md5: a089323fefeeaba2ae60e1ccebf86ddc depends: - - libgfortran5 15.2.0 hd16e46c_14 + - libgfortran5 15.2.0 hd16e46c_15 constrains: - - libgfortran-ng ==15.2.0=*_14 + - libgfortran-ng ==15.2.0=*_15 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 139129 - timestamp: 1764281552890 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_14.conda - sha256: 1864a3639b46c625ecc6fe1acd0da8962e7db15d898576156147caa796b22fdd - md5: 3187356c87594c3ebc3b8c0bd72a7e9f + size: 139002 + timestamp: 1764839892631 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + sha256: 68a6c1384d209f8654112c4c57c68c540540dd8e09e17dd1facf6cf3467798b5 + md5: 11e09edf0dde4c288508501fe621bab4 depends: - - libgfortran5 15.2.0 hdae7583_14 + - libgfortran5 15.2.0 hdae7583_16 constrains: - - libgfortran-ng ==15.2.0=*_14 + - libgfortran-ng ==15.2.0=*_16 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 138906 - timestamp: 1764279720039 + size: 138630 + timestamp: 1765259217400 - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda sha256: b60e918409b71302ee61b61080b1b254a902c03fbcbb415c81925dc016c5990e md5: 731190552d91ade042ddf897cfb361aa @@ -7164,9 +7237,9 @@ packages: license_family: GPL size: 2035634 timestamp: 1756233109102 -- conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda - sha256: a32c45c9652dfd832fb860898f818fb34e6ad47933fcce24cf323bf0b6914f24 - md5: 3078a2a9a58566a54e579b41b9e88c84 +- conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda + sha256: d0e974ebc937c67ae37f07a28edace978e01dc0f44ee02f29ab8a16004b8148b + md5: 39183d4e0c05609fd65f130633194e37 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -7174,41 +7247,41 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 2480588 - timestamp: 1764277129524 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_14.conda - sha256: 9f0a87045dd2d5fbd60e06dba6c447a4d17929f46c6a542b3a7da132cf2d4491 - md5: a35c50126e425ee8b5bb3e504ed23b8a + size: 2480559 + timestamp: 1765256819588 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + sha256: bde541944566254147aab746e66014682e37a259c9a57a0516cf5d05ec343d14 + md5: 87b4ffedaba8b4d675479313af74f612 depends: - libgcc >=15.2.0 constrains: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1485735 - timestamp: 1764276419978 -- conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_14.conda - sha256: eb78e8270859ba927d11db2f4f0f05b8e83fca82ff039e4236a4cef97fda16ec - md5: 0f4173df0120daf2b2084a55960048e8 + size: 1485817 + timestamp: 1765256963205 +- conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda + sha256: 456385a7d3357d5fdfc8e11bf18dcdf71753c4016c440f92a2486057524dd59a + md5: c2a6149bf7f82774a0118b9efef966dd depends: - libgcc >=15.2.0 constrains: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1062933 - timestamp: 1764281243846 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_14.conda - sha256: e40c74862b0f1496b1014472e13dc08a9d156f45a8d434f3513ba741fb03f052 - md5: 4fa9de90ec33234997aed5871d20f14e + size: 1061950 + timestamp: 1764839609607 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + sha256: 9fb7f4ff219e3fb5decbd0ee90a950f4078c90a86f5d8d61ca608c913062f9b0 + md5: 265a9d03461da24884ecc8eb58396d57 depends: - libgcc >=15.2.0 constrains: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 598642 - timestamp: 1764279461200 + size: 598291 + timestamp: 1765258993165 - conda: https://prefix.dev/conda-forge/linux-64/libgit2-1.9.2-hc20babb_0.conda sha256: 80d81a3d15c10f1fad867dfc9132e61d67c688af6adfd7ed76a139a25bfdfd53 md5: 81da8986dad4d7fc47aec424098a8a54 @@ -7366,6 +7439,15 @@ packages: license_family: GPL size: 604220 timestamp: 1764277020855 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 + md5: 26c46f90d0e727e95c6c9498a33a09f3 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 603284 + timestamp: 1765256703881 - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda sha256: 230da4c881c7af77644cac52648da2a7799c7bf7c250983bbb64c1d793e42215 md5: f08c95adda42a8f04c2ce888a36be575 @@ -7373,6 +7455,13 @@ packages: license_family: GPL size: 587557 timestamp: 1764276303166 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + sha256: 0a9d77c920db691eb42b78c734d70c5a1d00b3110c0867cfff18e9dd69bc3c29 + md5: 4d2f224e8186e7881d53e3aead912f6c + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 587924 + timestamp: 1765256821307 - conda: https://prefix.dev/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_14.conda sha256: 83fba01426c23fa20aefbfd05138b20df0b07cec51a72bd0a15868ce11443029 md5: c21643058895b399fd413e6ba17f587f @@ -7384,9 +7473,9 @@ packages: license_family: GPL size: 663690 timestamp: 1764280815241 -- conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.1-default_h7f8ec31_1002.conda - sha256: f7fbc792dbcd04bf27219c765c10c239937b34c6c1a1f77a5827724753e02da1 - md5: c01021ae525a76fe62720c7346212d74 +- conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda + sha256: 2cf160794dda62cf93539adf16d26cfd31092829f2a2757dbdd562984c1b110a + md5: 0ed3aa3e3e6bc85050d38881673a692f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -7395,11 +7484,11 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD - size: 2450642 - timestamp: 1757624375958 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.1-default_h7949937_1002.conda - sha256: 8cc272e76e06411ba1b9edf55a3049b010461c6f80b00e33baba1d168106287f - md5: b94fcabb2d99e4372a59c6c600c9d1b7 + size: 2449916 + timestamp: 1765103845133 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda + sha256: e87cf64d87c7706403507df7329f5b597c3b487f4c72ef53ef899e38983ea70e + md5: c8b05c85ae962a993d9b7d6c9d10571e depends: - libgcc >=14 - libstdcxx >=14 @@ -7407,8 +7496,8 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD - size: 2468149 - timestamp: 1757623945604 + size: 2467105 + timestamp: 1765103804193 - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -7615,9 +7704,9 @@ packages: license_family: Apache size: 30758108 timestamp: 1757354844443 -- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.6-hf7376ad_0.conda - sha256: 23010386efb545d68acbc4f9216c45f2b70a2f5398a6f389d70c9fee103648c4 - md5: 8aa154f30e0bc616cbde9794710e0be2 +- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + sha256: 91bb4f5be1601b40b4995911d785e29387970f0b3c80f33f7f9028f95335399f + md5: 1a2708a460884d6861425b7f9a7bef99 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -7628,11 +7717,11 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 44320002 - timestamp: 1763523422320 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.6-hfd2ba90_0.conda - sha256: 14faa9b266130aca81736d8551350d11c1ea2e0e16912a861d449cb9ace011b4 - md5: 54e87a913eeaa2b27f2e7b491860f612 + size: 44333366 + timestamp: 1765959132513 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda + sha256: 5af18365698a9093a81490de16c97a0af5318e20086b74998718f1e5d7566e74 + md5: de59c5148c2a8347c02e437e3ed242a0 depends: - libgcc >=14 - libstdcxx >=14 @@ -7642,8 +7731,8 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 43168385 - timestamp: 1763518618696 + size: 43148553 + timestamp: 1765930975162 - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc @@ -7878,6 +7967,26 @@ packages: license_family: GPL size: 7286927 timestamp: 1764276087848 +- conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda + sha256: f87b743d5ab11c1a8ddd800dd9357fc0fabe47686068232ddc1d1eed0d7321ec + md5: 3576aba85ce5e9ab15aa0ea376ab864b + depends: + - __osx >=10.13 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + size: 38085 + timestamp: 1767044977731 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 + md5: c08557d00807785decafb932b5be7ef5 + depends: + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + size: 36416 + timestamp: 1767045062496 - conda: https://prefix.dev/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 md5: a587892d3c13b6621a6091be690dbca2 @@ -7930,6 +8039,17 @@ packages: license: blessing size: 938979 timestamp: 1764359444435 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 + md5: da5be73701eecd0e8454423fd6ffcf30 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 942808 + timestamp: 1768147973361 - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda sha256: e394dd772b71dbcd653d078f3aacf6e26e3478bd6736a687ab86e463a2f153a8 md5: 233efdd411317d2dc5fde72464b3df7a @@ -7939,6 +8059,16 @@ packages: license: blessing size: 939207 timestamp: 1764359457549 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + sha256: 5f8230ccaf9ffaab369adc894ef530699e96111dac0a8ff9b735a871f8ba8f8b + md5: 4e3ba0d5d192f99217b85f07a0761e64 + depends: + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 944688 + timestamp: 1768147991301 - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda sha256: 8460901daff15749354f0de143e766febf0682fe9201bf307ea84837707644d1 md5: f71213ed0c51030cb17a77fc60a757f1 @@ -7949,6 +8079,15 @@ packages: license: blessing size: 991350 timestamp: 1764359781222 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + sha256: 710a7ea27744199023c92e66ad005de7f8db9cf83f10d5a943d786f0dac53b7c + md5: d910105ce2b14dfb2b32e92ec7653420 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 987506 + timestamp: 1768148247615 - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda sha256: a46b167447e2a9e38586320c30b29e3b68b6f7e6b873c18d6b1aa2efd2626917 md5: 67e50e5bd4e5e2310d66b88c4da50096 @@ -7958,6 +8097,16 @@ packages: license: blessing size: 906292 timestamp: 1764359907797 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 + md5: 4b0bf313c53c3e89692f020fb55d5f2c + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 909777 + timestamp: 1768148320535 - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda sha256: a976c8b455d9023b83878609bd68c3b035b9839d592bd6c7be7552c523773b62 md5: f92bef2f8e523bb0eabe60099683617a @@ -7968,6 +8117,16 @@ packages: license: blessing size: 1291059 timestamp: 1764359545703 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + sha256: 756478128e3e104bd7e7c3ce6c1b0efad7e08c7320c69fdc726e039323c63fbb + md5: 903979414b47d777d548e5f0165e6cd8 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1291616 + timestamp: 1768148278261 - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -8037,6 +8196,18 @@ packages: license_family: GPL size: 5856715 timestamp: 1764277148231 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 + md5: 68f68355000ec3f1d6f26ea13e8f525f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 5856456 + timestamp: 1765256838573 - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda sha256: 21fd0d4381167fc625e7ab4bf4839934fe9b79290a1684c90c8eb0f3a4d77c25 md5: 83f466be64f6bc1f7ece406c009e0586 @@ -8048,6 +8219,17 @@ packages: license_family: GPL size: 5542572 timestamp: 1764276435572 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + sha256: 4db11a903707068ae37aa6909511c68e9af6a2e97890d1b73b0a8d87cb74aba9 + md5: 52d9df8055af3f1665ba471cce77da48 + depends: + - libgcc 15.2.0 h8acb6b2_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 5541149 + timestamp: 1765256980783 - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda sha256: 229b17ecf0014cc92deef6b2abd76e089e969336de04ed7674f0491be9b6e053 md5: c88929e13f56dac9233cdf615502e5f3 @@ -8075,6 +8257,15 @@ packages: license_family: GPL size: 27200 timestamp: 1764277193585 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + sha256: 81f2f246c7533b41c5e0c274172d607829019621c4a0823b5c0b4a8c7028ee84 + md5: 1b3152694d236cf233b76b8c56bf0eae + depends: + - libstdcxx 15.2.0 h934c35e_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 27300 + timestamp: 1765256885128 - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda sha256: 16c15e293306429b6a014ac0106145c397f022e734a2a60bebd27a3d8166593e md5: 410b06d8a2f7dd0cc1b6acdfbcf101c6 @@ -8084,6 +8275,15 @@ packages: license_family: GPL size: 27126 timestamp: 1764276483709 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + sha256: dd5c813ae5a4dac6fa946352674e0c21b1847994a717ef67bd6cc77bc15920be + md5: 20b7f96f58ccbe8931c3a20778fb3b32 + depends: + - libstdcxx 15.2.0 hef695bb_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 27376 + timestamp: 1765257033344 - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -8175,6 +8375,16 @@ packages: license_family: BSD size: 37135 timestamp: 1758626800002 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 40311 + timestamp: 1766271528534 - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda sha256: 7aed28ac04e0298bf8f7ad44a23d6f8ee000aa0445807344b16fceedc67cce0f md5: 3a68e44fdf2a2811672520fdd62996bd @@ -8184,6 +8394,15 @@ packages: license_family: BSD size: 39172 timestamp: 1758626850999 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 + md5: cf2861212053d05f27ec49c3784ff8bb + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 43453 + timestamp: 1766271546875 - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b md5: 0f03292cc56bf91a077a134ea8747118 @@ -8640,9 +8859,9 @@ packages: license_family: Other size: 55476 timestamp: 1727963768015 -- conda: https://prefix.dev/conda-forge/win-64/lld-21.1.6-hc465015_0.conda - sha256: 219cc02b236605486425a0c8a1e7fa5b10c115551c083d6e50c4692a7dd31977 - md5: 7ca162c8ed16a3871fb6a0a9ad62b3f2 +- conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + sha256: 8a859c2656700bfe9962c1a3a8305012d7651d072df58aac2fb4cb1572c46534 + md5: c865e6b367f929ef10df8818b6ac4d65 depends: - libxml2 - libxml2-16 >=2.14.6 @@ -8652,57 +8871,57 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - - llvm ==21.1.6 + - llvm ==21.1.8 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 135571207 - timestamp: 1763550582191 -- conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.6-h4922eb0_0.conda - sha256: d7b534285d4abe0042ca985149df4888e808a5c1731f4a87c5552dc725d8a1d8 - md5: 7a0b9ce502e0ed62195e02891dfcd704 + size: 135573221 + timestamp: 1765965375863 +- conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + sha256: a5a7ad16eecbe35cac63e529ea9c261bef4ccdd68cb1db247409f04529423989 + md5: f8640b709b37dc7758ddce45ea18d000 depends: - __glibc >=2.17,<3.0.a0 constrains: - - openmp 21.1.6|21.1.6.* - intel-openmp <0.0a0 + - openmp 21.1.8|21.1.8.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 3209134 - timestamp: 1763529474187 -- conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.6-he40846f_0.conda - sha256: 77aaf7585d3bad2e9e54b2532d2f7b27cac3e38b1d1514dc8ba6ba232f9cd452 - md5: 87573180fdb2f22ac79f77b78751c87c + size: 6127279 + timestamp: 1765964409311 +- conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + sha256: bc2e3c8b9f3c115e0fe4162182b219fd6c44238ae5f18d7f57e724bc6b99f52d + md5: 028273c4b977ab88424464cc36f45cc9 constrains: - intel-openmp <0.0a0 - - openmp 21.1.6|21.1.6.* + - openmp 21.1.8|21.1.8.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 3152998 - timestamp: 1763529385828 -- conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda - sha256: 589a5d1c7af859096e19acd7665534a63b6d9ead2684f5c906747052f56adb9c - md5: d002bb48f35085405e90a62ffeebebfb + size: 5891216 + timestamp: 1765964435730 +- conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6 + md5: e2d811e9f464dd67398b4ce1f9c7c872 depends: - __osx >=10.13 constrains: - - openmp 21.1.6|21.1.6.* + - openmp 21.1.8|21.1.8.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 310985 - timestamp: 1763529609247 -- conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda - sha256: 51ebeacae9225649e2c3bbfc9ed2ed690400b78ba79d0d3ee9ff428e8b951fed - md5: 4a274d80967416bce3c7d89bf43923ec + size: 311405 + timestamp: 1765965194247 +- conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + sha256: 56bcd20a0a44ddd143b6ce605700fdf876bcf5c509adc50bf27e76673407a070 + md5: 206ad2df1b5550526e386087bef543c7 depends: - __osx >=11.0 constrains: - - openmp 21.1.6|21.1.6.* + - openmp 21.1.8|21.1.8.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 286206 - timestamp: 1763529774822 + size: 285974 + timestamp: 1765964756583 - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda sha256: 8d042ee522bc9eb12c061f5f7e53052aeb4f13e576e624c8bebaf493725b95a0 md5: 0f79b23c03d80f22ce4fe0022d12f6d2 @@ -9030,28 +9249,27 @@ packages: license_family: BSD size: 32866 timestamp: 1736381474362 -- conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.1.5-h54a6638_0.conda - sha256: c3ea2cc85167c5c14145d59c7b861818b9fa5461ef24f8bc1f277d5d3997b0e6 - md5: dfa4c299d528a457ae3b47ba7ff5f1fd +- conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + sha256: b8d5642c7c49b47282d81582eb9655e19b843af3062e091ef398ea53eb9701d6 + md5: 81ce5795bae33ad542866f2e0a5d42f8 depends: + - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT - size: 103866 - timestamp: 1752824520127 -- conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.1.5-h7ac5ae9_0.conda - sha256: a2eb1f8ba4cc9a2851e1cf29cb831de771b00624c4ae175525c5a89e3da879d1 - md5: 23681cb531ed71ecc8c6029a0610ce7e + size: 118386 + timestamp: 1767967130935 +- conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + sha256: 9eab175528cb4eb657756ac785967027334a7528c8760e03b8ef2513e9d097ad + md5: 26aea4077d83c7c414f74cc9cf7548fa depends: - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 license: MIT license_family: MIT - size: 111744 - timestamp: 1752824532240 + size: 123352 + timestamp: 1767967149990 - conda: https://prefix.dev/conda-forge/linux-64/mkcert-1.4.4-he91c749_1.conda sha256: 9e05a996946b9226e46ff01f39d597326e49e2efbcd952bf889e58b45b310ec3 md5: a389910704b677d1dd9aa75441edde5b @@ -9193,37 +9411,37 @@ packages: license_family: MIT size: 11774 timestamp: 1735382041439 -- conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha883d09_0.conda - sha256: 02d7057353e96b798e5fbbaab6067842d6db8c20f0a4ab1c52c326a066c5df68 - md5: 2b636dd7d2f0642e1e7262dc0525a2e9 +- conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda + sha256: 37ef013f4412ef2207b59ddec1f91f5c8bdf2a6735ef16797bf1133b6da03b42 + md5: 53b18b4966b356d174d92b6e1ab4e629 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - mimalloc >=3.1.5,<3.1.6.0a0 + - mimalloc >=3.2.6,<3.2.7.0a0 - openssl >=3.5.4,<4.0a0 - - tbb >=2021.13.0 + - tbb >=2022.3.0 - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT - size: 3062163 - timestamp: 1761233094843 -- conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-h9e03d01_0.conda - sha256: 98f8e4b6b1fd07e15e67a9dcc36d1cf5f22cc65b1137592a9030a50253fcb2c4 - md5: c88ce1b9e3f01e1d4cb7b2f493368073 + size: 3088382 + timestamp: 1768239437983 +- conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda + sha256: 5a65150fdf5e85227f79b6b0aa91adf27a8718d1f4df76a0de559696c5f12563 + md5: 111ddd9407318db9cf871a3993bdbb07 depends: - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - mimalloc >=3.1.5,<3.1.6.0a0 + - mimalloc >=3.2.6,<3.2.7.0a0 - openssl >=3.5.4,<4.0a0 - - tbb >=2021.13.0 + - tbb >=2022.3.0 - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT - size: 2885361 - timestamp: 1761232742989 + size: 2895818 + timestamp: 1768239493303 - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda sha256: dcf91571da6c2f0db96d43a1b639047def05a0e1b6436d42c9129ab14af47b10 md5: 0520855aaae268ea413d6bc913f1384c @@ -9964,6 +10182,16 @@ packages: license_family: MIT size: 24246 timestamp: 1747339794916 +- conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 25877 + timestamp: 1764896838868 - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e @@ -10463,6 +10691,32 @@ packages: license_family: MIT size: 39300 timestamp: 1751452761594 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda + build_number: 100 + sha256: 9cf014cf28e93ee242bacfbf664e8b45ae06e50b04291e640abeaeb0cba0364c + md5: 0cbb0010f1d8ecb64a428a8d4214609e + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 37226336 + timestamp: 1765021889577 + python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda build_number: 101 sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 @@ -10543,6 +10797,31 @@ packages: size: 36768932 timestamp: 1764758363259 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda + build_number: 100 + sha256: bbb0b341c3ce460d02087e1c5e0d3bb814c270f4ae61f82c0e2996ec3902d301 + md5: a6e2b5b263090516ec36efdd51dcc35b + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 33896215 + timestamp: 1765020450426 + python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda build_number: 101 sha256: 95f11d8f8e8007ead0927ff15401a9a48a28df92b284f41a08824955c009e974 @@ -10620,6 +10899,29 @@ packages: size: 37149339 timestamp: 1764757159033 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.11-h17c18a5_100_cp313.conda + build_number: 100 + sha256: 58e23beaf3174a809c785900477c37df9f88993b5a3ccd0d76d57d6688a1be37 + md5: 6ffffd784fe1126b73329e29c80ddf53 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 17360881 + timestamp: 1765022591905 + python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda build_number: 101 sha256: b56484229cf83f6c84e8b138dc53f7f2fa9ee850f42bf1f6d6fa1c03c044c2d3 @@ -10691,6 +10993,29 @@ packages: size: 13010651 timestamp: 1764759848428 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda + build_number: 100 + sha256: c476f4e9b6d97c46b496b442878924868a54e5727251549ebfc82027aa52af68 + md5: 18a8c69608151098a8fb75eea64cc266 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12920650 + timestamp: 1765020887340 + python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda build_number: 101 sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 @@ -10762,6 +11087,29 @@ packages: size: 13623264 timestamp: 1764758008135 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda + build_number: 100 + sha256: 0ee0402368783e1fad10025719530499c517a3dbbdfbe18351841d9b7aef1d6a + md5: 9e4c9a7ee9c4ab5b3778ab73e583283e + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Python-2.0 + size: 16617922 + timestamp: 1765019627175 + python_site_packages_path: Lib/site-packages - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda build_number: 101 sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 @@ -10870,15 +11218,15 @@ packages: license_family: BSD size: 26922 timestamp: 1761503229008 -- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - sha256: 7535b9cb2414e34c73ed4a97a90bcadcc76b9d47d0bb8ef5002c592d85fe022d - md5: f41e3c1125e292e6bfcea8392a3de3d8 +- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + sha256: 4b08d4c2c4b956d306b4868d3faf724eebb5d6e6b170fad2eb0f2d4eb227f1af + md5: d1461b2e63b1909f4f5b41c823bd90ae depends: - - cpython 3.13.9.* + - cpython 3.13.11.* - python_abi * *_cp313 license: Python-2.0 - size: 48385 - timestamp: 1761175154112 + size: 48352 + timestamp: 1765019767640 - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda build_number: 8 sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 @@ -11032,6 +11380,20 @@ packages: license: BSD-3-Clause size: 17660226 timestamp: 1766154507554 +- conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + sha256: d4115e45191c507e70c15d4fc0cf4bd283c64214c05f0ee6e35811b2d76a2348 + md5: b6a10478e09eedf17c5a9f2a1e334c00 + depends: + - patchelf + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + size: 17663929 + timestamp: 1767788793229 - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda sha256: d77fa1002ab0d526e017f2f4ee82971ca8361afbf32bb14021fa3dafe2ae784f md5: 116524d577556d5f847bc5ec1860a38e @@ -11044,6 +11406,19 @@ packages: license: BSD-3-Clause size: 18377191 timestamp: 1766140335979 +- conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + sha256: 7f1948a71643927bca82149a3b23335920d1c76a0fe7094d99eefcdf2504fbcf + md5: 4868f77a820e8156bc744d8f09649437 + depends: + - patchelf + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + size: 18377556 + timestamp: 1767788834221 - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda sha256: 641378066f6bf94156d6cac4656fb09e915d106f011e73d2f25f2b817adf830b md5: 8bdec9934155ec538f4d1687e753f387 @@ -11054,6 +11429,17 @@ packages: license: BSD-3-Clause size: 16060629 timestamp: 1766140351883 +- conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda + sha256: 3dbef844ccb2fb28fe6c2b5e315155274e1aac5afff2a368452f4dd365442c2c + md5: 1ca76f21400eff10be29693ec70e2e23 + depends: + - __osx >=10.13 + constrains: + - __osx >=10.13 + license: BSD-3-Clause + license_family: BSD + size: 16062039 + timestamp: 1767788815088 - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda sha256: 3131bbb52d67096e49813f0615214443a4215ccfc587e34a24c03ed3f0bcde06 md5: 4f6d4b933cf8d4eb2d032339b25933d1 @@ -11064,6 +11450,17 @@ packages: license: BSD-3-Clause size: 15108916 timestamp: 1766140324162 +- conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + sha256: 7d31a25e45823fc4fda6281b019c7875d2626ea8b1522cd58c56c6035b92e5c5 + md5: 6b38c4d55fbdf0f06d3c08674d2a9379 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 15105783 + timestamp: 1767788828061 - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda sha256: ddf9dfd34aff3a1d4dc32a6b4588ac98a847f6cccf83f2c8aabcb11c421dbfde md5: 74f2ec0323390d11d586cfb009982223 @@ -11074,6 +11471,17 @@ packages: license: BSD-3-Clause size: 18822422 timestamp: 1766140367367 +- conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + sha256: ce2792c2da048b8898ecc6f121db28eb0168c1bf783af923ee2dc0b001a4343a + md5: e1d4cda695daca6661259fcd098f7d7b + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + size: 18827337 + timestamp: 1767788806259 - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c md5: 283b96675859b20a825f8fa30f311446 @@ -11084,6 +11492,17 @@ packages: license_family: GPL size: 282480 timestamp: 1740379431762 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 345073 + timestamp: 1765813471974 - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 md5: c0f08fc2737967edde1a272d4bf41ed9 @@ -11094,6 +11513,16 @@ packages: license_family: GPL size: 291806 timestamp: 1740380591358 +- conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 + md5: 3d49cad61f829f4f0e0611547a9cda12 + depends: + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 357597 + timestamp: 1765815673644 - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 md5: 342570f8e02f2f022147a7f841475784 @@ -11103,6 +11532,16 @@ packages: license_family: GPL size: 256712 timestamp: 1740379577668 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 + md5: eefd65452dfe7cce476a519bece46704 + depends: + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 317819 + timestamp: 1765813692798 - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 md5: 63ef3f6e6d6d5c589e64f11263dc5676 @@ -11112,6 +11551,16 @@ packages: license_family: GPL size: 252359 timestamp: 1740379663071 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 313930 + timestamp: 1765813902568 - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b md5: db0c6b99149880c8ba515cf4abe93ee4 @@ -11472,20 +11921,20 @@ packages: license_family: MIT size: 23534 timestamp: 1714829277138 -- conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-14.5-hbf94ba6_3.conda - sha256: a15d9117b0b5eb77f6c58cc513647ac4db67f5852cb4c411bc00904387ca0b7f - md5: e29ebcda12553e4b432fb59989232143 +- conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + sha256: a8f7b6bec6772b9100713cc6e0f8d3d22b601e3a722be13ccf2465c2cab6cb3c + md5: 9ba4c4f68b9817b7c81954cdc425a50d license: BSD-3-Clause license_family: BSD - size: 8703 - timestamp: 1764290395681 -- conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-14.5-hfa17104_3.conda - sha256: 553cb066814b77257104073d7b81c3038459bf4ec7f5c0c435c666887f642b0b - md5: 3351af6c29661d56d7ef9ea9699d1314 + size: 8921 + timestamp: 1767712379283 +- conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + sha256: cb62f3616f61b75e3e68e232df74bdfd6dfdb03809bd0a00ccd3a55879fce550 + md5: a3d76f9e9e3f49dc8bf03f1ef8d4757e license: BSD-3-Clause license_family: BSD - size: 8790 - timestamp: 1764290423498 + size: 8957 + timestamp: 1767712435127 - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 md5: 4de79c071274a53dcaf2a8c749d1499e @@ -11534,24 +11983,28 @@ packages: license_family: GPL size: 2904381 timestamp: 1713721121438 -- conda: https://prefix.dev/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - sha256: 46fdeadf8f8d725819c4306838cdfd1099cd8fe3e17bd78862a5dfdcd6de61cf - md5: fbfb84b9de9a6939cb165c02c69b1865 +- conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + sha256: b89d89d0b62e0a84093205607d071932cca228d4d6982a5b073eec7e765b146d + md5: 1261fc730f1d8af7eeea8a0024b23493 depends: - - openssl >=3.0.0,<4.0a0 + - __osx >=10.13 + - libsigtool 0.1.3 hc0f2934_0 + - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT - size: 213817 - timestamp: 1643442169866 -- conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff - md5: 4a2cac04f86a4540b8c9b8d8f597848f + size: 123083 + timestamp: 1767045007433 +- conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc + md5: ade77ad7513177297b1d75e351e136ce depends: - - openssl >=3.0.0,<4.0a0 + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_0 + - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT - size: 210264 - timestamp: 1643442231687 + size: 114331 + timestamp: 1767045086274 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -11685,29 +12138,29 @@ packages: license_family: MIT size: 4441127 timestamp: 1748302918824 -- conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda - sha256: 2e3238234ae094d5a5f7c559410ea8875351b6bac0d9d0e576bf64b732b8029e - md5: e3259be3341da4bc06c5b7a78c8bf1bd +- conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda + sha256: 975710e4b7f1b13c3c30b7fbf21e22f50abe0463b6b47a231582fdedcc45c961 + md5: 8f7278ca5f7456a974992a8b34284737 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libhwloc >=2.12.1,<2.12.2.0a0 + - libhwloc >=2.12.2,<2.12.3.0a0 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE - size: 181262 - timestamp: 1762509955687 -- conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda - sha256: 3fd3d1ba6b81c5edee8d8fa0d2757f7ba3bf4d4a8ecc68f515c90e737eaa02e4 - md5: eda1e9439d903e3fdd7ff9e086da2018 + size: 181329 + timestamp: 1767886632911 +- conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda + sha256: 2e875ba342c2cde6301b088cd6471f67e44d961bd292abcdfa6ba3fc32506935 + md5: 4d424acd246a5ba42512c097139ed0a0 depends: - libgcc >=14 - - libhwloc >=2.12.1,<2.12.2.0a0 + - libhwloc >=2.12.2,<2.12.3.0a0 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE - size: 144223 - timestamp: 1762511489745 + size: 144746 + timestamp: 1767888618836 - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 sha256: 831d28b05f5a28a8c1e50c2a1ff574d3d49b4d8b34c30a6fd0528514e6028985 md5: 7dc2c1dae131bf141ceac251848bd6b4 @@ -11812,6 +12265,16 @@ packages: license_family: MIT size: 20973 timestamp: 1760014679845 +- conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 + md5: 72e780e9aa2d0a3295f59b1874e3768b + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 21453 + timestamp: 1768146676791 - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda sha256: 304834f2438017921d69f05b3f5a6394b42dc89a90a6128a46acbf8160d377f6 md5: 32e37e8fe9ef45c637ee38ad51377769 @@ -11938,6 +12401,12 @@ packages: license: LicenseRef-Public-Domain size: 122968 timestamp: 1742727099393 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + size: 119135 + timestamp: 1767016325805 - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 md5: 71b24316859acd00bdb8b38f5e2ce328 @@ -11981,6 +12450,17 @@ packages: license_family: BSD size: 18861 timestamp: 1760418772353 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 19356 + timestamp: 1767320221521 - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd md5: 378d5dcec45eaea8d303da6f00447ac0 @@ -11993,6 +12473,18 @@ packages: license_family: Proprietary size: 682706 timestamp: 1760418629729 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_34 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 683233 + timestamp: 1767320219644 - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 md5: 58f67b437acbf2764317ba273d731f1d @@ -12004,6 +12496,17 @@ packages: license_family: Proprietary size: 114846 timestamp: 1760418593847 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 115235 + timestamp: 1767320173250 - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda sha256: 723351de1d7cee8bd22f8ea64b169f36f5c625c315c59c0267fab4bad837d503 md5: 9c71dfe38494dd49c2547a3842b86fa7 @@ -12027,9 +12530,9 @@ packages: license_family: BSD size: 19764 timestamp: 1716231224784 -- conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda - sha256: 0694683d118d0d8448cd997fe776dbe33858c0f3957d9886b2b855220babe895 - md5: c61ef6a81142ee3bd6c3b0c9a0c91e35 +- conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + sha256: 05bc657625b58159bcea039a35cc89d1f8baf54bf4060019c2b559a03ba4a45e + md5: 1d699ffd41c140b98e199ddd9787e1e1 depends: - vswhere constrains: @@ -12038,8 +12541,8 @@ packages: - vc14 license: BSD-3-Clause license_family: BSD - size: 22206 - timestamp: 1760418596437 + size: 23060 + timestamp: 1767320175868 - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda sha256: b72270395326dc56de9bd6ca82f63791b3c8c9e2b98e25242a9869a4ca821895 md5: f622897afff347b715d046178ad745a5 @@ -12831,6 +13334,25 @@ packages: license_family: BSD size: 550303 timestamp: 1764566784586 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 601375 + timestamp: 1764777111296 +- conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 + md5: c3655f82dcea2aa179b291e7099c1fcc + depends: + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 614429 + timestamp: 1764777145593 - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda sha256: a01724931d47d49264bea98cbc5c8e747f55d323361b2389509bc2db45e5d9bf md5: 68a63e1ba896c15344e33eacb11e1311 @@ -12869,6 +13391,26 @@ packages: license_family: BSD size: 476249 timestamp: 1764567098876 +- conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f + md5: 727109b184d680772e3122f40136d5ca + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 528148 + timestamp: 1764777156963 +- conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 433413 + timestamp: 1764777166076 - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda sha256: 3bfc4928755b76a0bbf364f9c042d89f2e60dea7325802f62e75e3345d1ed4f7 md5: 93345396269a7f456f2e80de6bda540d diff --git a/pixi.toml b/pixi.toml index 0c6cb0c510..a7e4aba349 100644 --- a/pixi.toml +++ b/pixi.toml @@ -12,7 +12,6 @@ preview = ["pixi-build"] requires-pixi = ">=0.45" [workspace.target.linux-64.build-variants] -#c_stdlib = ["sysroot"] c_stdlib_version = ["2.17"] [dependencies] @@ -60,6 +59,8 @@ rattler-build = ">=0.55,<0.56" rich = ">=14.1.0,<15" tomli-w = ">=1.2.0,<2" types-pyyaml = ">=6.0.12.20250915,<7" +git = ">=2.51.0,<3" + [feature.pytest.tasks] test-common-wheels = { cmd = "pytest -s --numprocesses=auto tests/wheel_tests/", depends-on = [ @@ -289,13 +290,13 @@ test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CAR # [environments] -build = { features = ["build", "rust"], solve-group = "default" } default = { features = [ + "build", "dev", "schema", - "pytest", "rust", ], solve-group = "default" } +pytest = { features = ["pytest"], no-default-feature = true } dist = { features = ["dist"], no-default-feature = true } docs = { features = [ "docs", @@ -303,7 +304,6 @@ docs = { features = [ lint = { features = [ "lint", "rust", - "pytest", "schema", "pypi-gen", ], no-default-feature = true, solve-group = "default" } @@ -311,7 +311,6 @@ pypi-gen = { features = ["pypi-gen"] } recipes = { features = ["recipes"], no-default-feature = true } schema = { features = [ "schema", - "pytest", ], no-default-feature = true, solve-group = "default" } test-export = { features = ["micromamba"], no-default-feature = true } test-native-certs = { features = ["native-certs-test"] } diff --git a/tests/integration_python/common.py b/tests/integration_python/common.py index 81716107b4..ae52493df7 100644 --- a/tests/integration_python/common.py +++ b/tests/integration_python/common.py @@ -10,7 +10,6 @@ from rattler import Platform - # Regex pattern to match ANSI escape sequences ANSI_ESCAPE_PATTERN = re.compile(r"\x1b\[[0-9;]*m") @@ -68,6 +67,8 @@ def verify_cli_command( strip_ansi: bool = False, ) -> Output: base_env = {} if reset_env else dict(os.environ) + # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment + base_env = {k: v for k, v in base_env.items() if not k.startswith("PIXI_")} complete_env = base_env if env is None else base_env | env # Set `PIXI_NO_WRAP` to avoid to have miette wrapping lines complete_env |= {"PIXI_NO_WRAP": "1"} diff --git a/tests/integration_python/pixi_build/test_specified_build_source/conftest.py b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py index d200a887d5..872e03b14a 100644 --- a/tests/integration_python/pixi_build/test_specified_build_source/conftest.py +++ b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py @@ -1,3 +1,4 @@ +import os import subprocess from dataclasses import dataclass from pathlib import Path @@ -38,11 +39,14 @@ def local_cpp_git_repo( original_source = main_source_path.read_text(encoding="utf-8") def run_git(*args: str) -> str: + # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment + env = {k: v for k, v in os.environ.items() if not k.startswith("PIXI_")} result = subprocess.run( [str(pixi), "run", "git", *args], cwd=repo_path, capture_output=True, text=True, + env=env, ) if result.returncode != 0: raise RuntimeError( From 5b05ed123a849ab310d54654bf58642ded287803 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 11:43:30 +0100 Subject: [PATCH 13/70] Fix remaining env var problems --- tests/integration_python/test_run_cli.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/integration_python/test_run_cli.py b/tests/integration_python/test_run_cli.py index 2b86110f20..4315ac1933 100644 --- a/tests/integration_python/test_run_cli.py +++ b/tests/integration_python/test_run_cli.py @@ -92,10 +92,7 @@ def test_run_in_shell_project(pixi: Path) -> None: """ manifest_2.write_text(toml) - base_env = dict(os.environ) - base_env.pop("PIXI_IN_SHELL", None) - base_env.pop("PIXI_PROJECT_MANIFEST", None) - extended_env = base_env | { + env = { "PIXI_IN_SHELL": "true", "PIXI_PROJECT_MANIFEST": str(manifest_2), } @@ -104,18 +101,15 @@ def test_run_in_shell_project(pixi: Path) -> None: verify_cli_command( [pixi, "run", "task"], stdout_contains="manifest_2", - env=extended_env, + env=env, cwd=tmp_pixi_workspace, - reset_env=True, ) # Run with working directory at manifest_1_dir verify_cli_command( [pixi, "run", "task"], stdout_contains="manifest_1", - env=base_env, cwd=manifest_1_dir, - reset_env=True, ) # Run task with PIXI_PROJECT_MANIFEST set to manifest_2 and working directory at manifest_1_dir @@ -125,7 +119,7 @@ def test_run_in_shell_project(pixi: Path) -> None: [pixi, "run", "task"], stdout_contains="manifest_1", stderr_contains="manifest_2", - env=extended_env, + env=env, cwd=manifest_1_dir, reset_env=True, ) @@ -1683,11 +1677,14 @@ def test_signal_forwarding(pixi: Path, tmp_pixi_workspace: Path) -> None: # Use the manifest from the copied run_signals directory manifest = tmp_data_path.joinpath("pixi.toml") + # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment + env = {k: v for k, v in os.environ.items() if not k.startswith("PIXI_")} + # install the dependencies - subprocess.check_call([pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path) + subprocess.check_call([pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path, env=env) # run the `start` task in the background and send some signals to it process = subprocess.Popen( - [pixi, "run", "--manifest-path", manifest, "start"], cwd=tmp_data_path + [pixi, "run", "--manifest-path", manifest, "start"], cwd=tmp_data_path, env=env ) time.sleep(1) # wait for the process to start From d06cec0e6f096832f610b99972ef008ab101b5fa Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 11:49:03 +0100 Subject: [PATCH 14/70] Format --- pixi.toml | 4 ++-- tests/integration_python/test_run_cli.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pixi.toml b/pixi.toml index a7e4aba349..8ef017e92b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -48,6 +48,7 @@ test-slow = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all [feature.pytest.dependencies] dirty-equals = ">=0.11,<0.12" filelock = ">=3.19.1,<4" +git = ">=2.51.0,<3" inline-snapshot = ">=0.31.1,<0.32" py-rattler = ">=0.20,<0.21" pytest = ">=9.0.2,<10" @@ -59,7 +60,6 @@ rattler-build = ">=0.55,<0.56" rich = ">=14.1.0,<15" tomli-w = ">=1.2.0,<2" types-pyyaml = ">=6.0.12.20250915,<7" -git = ">=2.51.0,<3" [feature.pytest.tasks] @@ -296,7 +296,6 @@ default = { features = [ "schema", "rust", ], solve-group = "default" } -pytest = { features = ["pytest"], no-default-feature = true } dist = { features = ["dist"], no-default-feature = true } docs = { features = [ "docs", @@ -308,6 +307,7 @@ lint = { features = [ "pypi-gen", ], no-default-feature = true, solve-group = "default" } pypi-gen = { features = ["pypi-gen"] } +pytest = { features = ["pytest"], no-default-feature = true } recipes = { features = ["recipes"], no-default-feature = true } schema = { features = [ "schema", diff --git a/tests/integration_python/test_run_cli.py b/tests/integration_python/test_run_cli.py index 4315ac1933..6394db5146 100644 --- a/tests/integration_python/test_run_cli.py +++ b/tests/integration_python/test_run_cli.py @@ -1681,7 +1681,9 @@ def test_signal_forwarding(pixi: Path, tmp_pixi_workspace: Path) -> None: env = {k: v for k, v in os.environ.items() if not k.startswith("PIXI_")} # install the dependencies - subprocess.check_call([pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path, env=env) + subprocess.check_call( + [pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path, env=env + ) # run the `start` task in the background and send some signals to it process = subprocess.Popen( [pixi, "run", "--manifest-path", manifest, "start"], cwd=tmp_data_path, env=env From 91a77e1033525083d9d695261013838c5530eb71 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 12:12:43 +0100 Subject: [PATCH 15/70] Set upper bound --- pixi-build-backends/recipe/pixi-build-ros/recipe.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml b/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml index 27cc059b18..ca9ec519ee 100644 --- a/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml +++ b/pixi-build-backends/recipe/pixi-build-ros/recipe.yaml @@ -23,7 +23,7 @@ requirements: - pyyaml - py-rattler - typing-extensions - - py-pixi-build-backend >=0.4.1 + - py-pixi-build-backend >=0.4.1,<0.5 build: number: 0 From 590ba5d24f8a7afae442b2f6f3bab607e3d7091c Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:18:07 +0100 Subject: [PATCH 16/70] Remove dedicated pixi build jobs --- .github/workflows/ci.yml | 105 +-------------------------------------- 1 file changed, 1 insertion(+), 104 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 484e9ef0a4..76e7a9f699 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -969,107 +969,4 @@ jobs: - name: "After Install" run: $USERPROFILE/.pixi/bin/pixi.exe --version - shell: msys2 {0} - - test-build-linux-x86_64: - timeout-minutes: 10 - name: Test pixi-build Linux x86_64 - runs-on: ubuntu-latest - needs: build-binary-linux-x86_64 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - with: - repository: prefix-dev/pixi-build-testsuite - persist-credentials: false - - - name: Set up pixi - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 - with: - cache-write: ${{ github.ref == 'refs/heads/main' }} - - - name: Download pixi artifacts - run: pixi run download-artifacts --repo pixi --run-id ${{ github.run_id }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Download pixi-build-backends artifacts - run: pixi run download-artifacts --repo pixi-build-backends - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Setup binary permissions - run: chmod a+x artifacts/pixi* - - - name: Run integration tests - run: pixi run --locked test-slow - - test-build-windows-x86_64: - timeout-minutes: 15 - name: Test pixi-build Windows x86_64 - runs-on: windows-latest - needs: build-binary-windows-x86_64 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - with: - repository: prefix-dev/pixi-build-testsuite - persist-credentials: false - - - name: Create Dev Drive - run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1 - - - name: Copy Git Repo to Dev Drive - run: Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.PIXI_WORKSPACE }}" -Recurse - - - name: Set up pixi - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 - with: - manifest-path: ${{ env.PIXI_WORKSPACE }}/pixi.toml - cache-write: ${{ github.ref == 'refs/heads/main' }} - - - name: Download pixi artifacts - working-directory: ${{ env.PIXI_WORKSPACE }} - run: pixi run download-artifacts --repo pixi --run-id ${{ github.run_id }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Download pixi-build-backends artifacts - working-directory: ${{ env.PIXI_WORKSPACE }} - run: pixi run download-artifacts --repo pixi-build-backends - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Run integration tests - run: pixi run --locked test-slow - working-directory: ${{ env.PIXI_WORKSPACE }} - - test-build-macos-aarch64: - timeout-minutes: 10 - name: Test pixi-build macOS aarch64 - runs-on: macos-15 - needs: build-binary-macos-aarch64 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - with: - repository: prefix-dev/pixi-build-testsuite - persist-credentials: false - - - name: Set up pixi - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 - with: - cache-write: ${{ github.ref == 'refs/heads/main' }} - - - name: Download pixi artifacts - run: pixi run download-artifacts --repo pixi --run-id ${{ github.run_id }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Download pixi-build-backends artifacts - run: pixi run download-artifacts --repo pixi-build-backends - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Setup binary permissions - run: chmod a+x artifacts/pixi* - - - name: Run integration tests - run: pixi run --locked test-slow + shell: msys2 {0} \ No newline at end of file From 5a9bb5ebc698a7eef4a2fc37c91f67f99ae51b26 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:19:17 +0100 Subject: [PATCH 17/70] Fix schema test --- pixi.lock | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ pixi.toml | 2 ++ 2 files changed, 97 insertions(+) diff --git a/pixi.lock b/pixi.lock index e79402ca28..7748c9fc6c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -41,6 +41,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda @@ -58,6 +59,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -97,15 +99,19 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -125,6 +131,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -170,6 +177,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda @@ -187,6 +195,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda @@ -227,15 +236,19 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -255,6 +268,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -301,6 +315,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda @@ -313,6 +328,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -350,15 +366,19 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -379,6 +399,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -426,6 +447,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda @@ -438,6 +460,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -476,15 +499,19 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -505,6 +532,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -542,6 +570,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda @@ -553,6 +582,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda @@ -570,14 +600,18 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -594,6 +628,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -1331,11 +1366,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - conda: https://prefix.dev/conda-forge/linux-64/go-shfmt-3.12.0-hfc2019e_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda @@ -1365,8 +1402,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -1406,11 +1445,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/dprint-0.49.1-ha3529ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/go-shfmt-3.12.0-h22914b5_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda @@ -1440,8 +1481,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -1479,11 +1522,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/osx-64/go-shfmt-3.12.0-hccc6df8_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda @@ -1503,8 +1548,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -1540,11 +1587,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/go-shfmt-3.12.0-h820172f_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda @@ -1564,8 +1613,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -1601,9 +1652,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/go-shfmt-3.12.0-h11686cb_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -1620,8 +1673,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda @@ -2242,7 +2297,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda @@ -2256,9 +2314,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda @@ -2266,6 +2328,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2279,7 +2342,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda @@ -2293,9 +2359,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda @@ -2303,6 +2373,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2315,8 +2386,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda @@ -2326,9 +2400,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda @@ -2336,6 +2414,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2347,7 +2426,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda @@ -2357,9 +2439,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda @@ -2367,6 +2453,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2378,7 +2465,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda @@ -2387,15 +2477,20 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda diff --git a/pixi.toml b/pixi.toml index 8ef017e92b..e92ff61124 100644 --- a/pixi.toml +++ b/pixi.toml @@ -238,6 +238,8 @@ test-schema = { cmd = "pytest -s", depends-on = "generate-schema", cwd = "schema jsonschema = ">=3.2.0,<4" pydantic = ">=2.11.10,<3" pyyaml = ">=6.0.3,<7" +pytest = ">=9.0.2,<10" + [feature.pypi-gen.dependencies] hatchling = ">=1.27.0,<2" From 27e6d886a7ad2bda645a6c8a4845a6aa748afcf1 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:38:27 +0100 Subject: [PATCH 18/70] Fix clippy error --- pixi-build-backends/py-pixi-build-backend/Cargo.lock | 3 +-- pixi-build-backends/py-pixi-build-backend/Cargo.toml | 7 ++++--- .../py-pixi-build-backend/src/types/project_model.rs | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.lock b/pixi-build-backends/py-pixi-build-backend/Cargo.lock index ff075feb8a..c088657f9c 100644 --- a/pixi-build-backends/py-pixi-build-backend/Cargo.lock +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.lock @@ -3705,7 +3705,6 @@ dependencies = [ [[package]] name = "pixi_build_types" version = "0.1.0" -source = "git+https://github.com/prefix-dev/pixi?branch=main#b2eae1791c2ddbc465ebc4b83a1a409fa0cd3649" dependencies = [ "ordermap", "pixi_stable_hash", @@ -3720,7 +3719,6 @@ dependencies = [ [[package]] name = "pixi_stable_hash" version = "0.1.0" -source = "git+https://github.com/prefix-dev/pixi?branch=main#b2eae1791c2ddbc465ebc4b83a1a409fa0cd3649" dependencies = [ "ordermap", "rattler_conda_types", @@ -3876,6 +3874,7 @@ name = "py-pixi-build-backend" version = "0.4.1" dependencies = [ "async-trait", + "fs-err", "indexmap 2.12.1", "miette", "paste", diff --git a/pixi-build-backends/py-pixi-build-backend/Cargo.toml b/pixi-build-backends/py-pixi-build-backend/Cargo.toml index 804e94edcc..a159283e73 100644 --- a/pixi-build-backends/py-pixi-build-backend/Cargo.toml +++ b/pixi-build-backends/py-pixi-build-backend/Cargo.toml @@ -24,11 +24,11 @@ pyo3 = { version = "0.26", features = [ pyo3-async-runtimes = { version = "0.26.0", features = ["tokio-runtime"] } # Core pixi-build dependencies (local crates) -pixi-build-backend = { path = "../crates/pixi-build-backend" } -recipe-stage0 = { path = "../crates/recipe-stage0" } +pixi-build-backend = { path = "../../crates/pixi-build-backend" } +recipe-stage0 = { path = "../../crates/recipe-stage0" } # Pixi types -pixi_build_types = { git = "https://github.com/prefix-dev/pixi", branch = "main" } +pixi_build_types = { path = "../../crates/pixi_build_types" } # Async support async-trait = "0.1" @@ -48,6 +48,7 @@ miette = "7.5.0" thiserror = "2.0.12" # Utilities +fs-err = "3.1.0" indexmap = "2.7.1" paste = "1.0.15" pythonize = "0.26" diff --git a/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs b/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs index 5ea9f00845..e4de8adc08 100644 --- a/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs +++ b/pixi-build-backends/py-pixi-build-backend/src/types/project_model.rs @@ -1,4 +1,6 @@ -use std::{fs, str::FromStr}; +use std::str::FromStr; + +use fs_err as fs; use pixi_build_types::ProjectModel; use pyo3::{exceptions::PyValueError, prelude::*}; From afef66c0ae8e8989e35b0b369d791b960ef6a8a2 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:46:43 +0100 Subject: [PATCH 19/70] Fix ros pixi toml --- .../backends/pixi-build-ros/pixi.lock | 12 ++++++------ .../backends/pixi-build-ros/pixi.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.lock b/pixi-build-backends/backends/pixi-build-ros/pixi.lock index a8993dfcf9..095d3baf3d 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.lock +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.lock @@ -1804,8 +1804,8 @@ packages: timestamp: 1767791335095 - pypi: ./ name: pixi-build-ros - version: 0.3.2 - sha256: 2baf955d1db02bfbf21b4a14fd11b7b76081ebbe9d1420653740cf937e01617c + version: 0.3.3 + sha256: 0fa837fe1562ae8003160a20e040d8a7198c0f8a3fa9855c1ff6327e7c9f5296 requires_dist: - rosdistro - catkin-pkg @@ -1913,8 +1913,8 @@ packages: variants: target_platform: osx-arm64 depends: - - typing-extensions - pixi-build-api-version >=4,<5 + - typing-extensions - python >=3.8 - python_abi 3.12.* *_cp312 license: BSD-3-Clause @@ -1926,8 +1926,8 @@ packages: variants: target_platform: win-64 depends: - - typing-extensions - pixi-build-api-version >=4,<5 + - typing-extensions - python >=3.8 - python_abi 3.14.* *_cp314 license: BSD-3-Clause @@ -1939,8 +1939,8 @@ packages: variants: target_platform: linux-64 depends: - - typing-extensions - pixi-build-api-version >=4,<5 + - typing-extensions - python >=3.8 - python_abi 3.14.* *_cp314 constrains: @@ -1954,8 +1954,8 @@ packages: variants: target_platform: linux-aarch64 depends: - - typing-extensions - pixi-build-api-version >=4,<5 + - typing-extensions - python >=3.8 - python_abi 3.12.* *_cp312 constrains: diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 5057722324..6effd46bc3 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -18,7 +18,7 @@ mold = ">=2.33.0,<3.0" patchelf = "==0.18.0" [target.linux-64.activation] -scripts = ["../../scripts/activate.sh"] +scripts = ["../../../scripts/activate.sh"] [dependencies] py-pixi-build-backend = "*" From a22a2e1dc0bd9b424fc6f4923b8e9c4a33b5cea5 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:49:53 +0100 Subject: [PATCH 20/70] Lint --- .github/workflows/ci.yml | 2 +- pixi.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76e7a9f699..e0013a8c7f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -969,4 +969,4 @@ jobs: - name: "After Install" run: $USERPROFILE/.pixi/bin/pixi.exe --version - shell: msys2 {0} \ No newline at end of file + shell: msys2 {0} diff --git a/pixi.toml b/pixi.toml index e92ff61124..273aea4b62 100644 --- a/pixi.toml +++ b/pixi.toml @@ -237,8 +237,8 @@ test-schema = { cmd = "pytest -s", depends-on = "generate-schema", cwd = "schema [feature.schema.dependencies] jsonschema = ">=3.2.0,<4" pydantic = ">=2.11.10,<3" -pyyaml = ">=6.0.3,<7" pytest = ">=9.0.2,<10" +pyyaml = ">=6.0.3,<7" [feature.pypi-gen.dependencies] From a0e28093605e1903da8f24bbe39a658717f89295 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 13:54:55 +0100 Subject: [PATCH 21/70] Fix rustdoc --- crates/pixi-build-backend/src/generated_recipe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pixi-build-backend/src/generated_recipe.rs b/crates/pixi-build-backend/src/generated_recipe.rs index 63180a0e8a..2d5773ba60 100644 --- a/crates/pixi-build-backend/src/generated_recipe.rs +++ b/crates/pixi-build-backend/src/generated_recipe.rs @@ -30,7 +30,7 @@ pub struct PythonParams { /// options. /// /// -/// An instance of this trait is used by the [`IntermediateBackend`] +/// An instance of this trait is used by the [`crate::intermediate_backend::IntermediateBackend`] /// in order to generate the recipe. #[async_trait::async_trait] pub trait GenerateRecipe { From 8e0f8c06b3993e37e1aa98e71f3dd43cab376ef3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 16:21:12 +0100 Subject: [PATCH 22/70] Add backend tests and more more to slow --- .github/workflows/backends-ros.yml | 51 +++++ .github/workflows/ci.yml | 5 + .gitignore | 3 + Cargo.toml | 9 +- crates/pixi-build-python/Cargo.toml | 1 + crates/pixi-build-python/src/pypi_mapping.rs | 1 + .../pixi/tests/integration_rust/add_tests.rs | 1 + .../backends/pixi-build-ros/pixi.lock | 178 ++++++++++++++++++ .../backends/pixi-build-ros/pixi.toml | 25 +++ .../tests/integration/__init__.py | 1 + .../tests/integration/common.py | 140 ++++++++++++++ .../tests/integration/conftest.py | 50 +++++ .../integration/data}/ros-workspace/pixi.lock | 0 .../integration/data}/ros-workspace/pixi.toml | 0 .../distro_less_package/__init__.py | 0 .../distro_less_package.py | 0 .../src/distro_less_package/package.xml | 0 .../src/distro_less_package/pixi.toml | 0 .../resource/distro_less_package | 0 .../src/distro_less_package/setup.cfg | 0 .../src/distro_less_package/setup.py | 0 .../src/navigator/CMakeLists.txt | 0 .../ros-workspace/src/navigator/package.xml | 0 .../ros-workspace/src/navigator/pixi.toml | 0 .../src/navigator/src/navigator.cpp | 0 .../src/navigator_implicit/CMakeLists.txt | 0 .../src/navigator_implicit/package.xml | 0 .../src/navigator_implicit/src/navigator.cpp | 0 .../src/navigator_py/navigator_py/__init__.py | 0 .../navigator_py/navigator_py/navigator.py | 0 .../src/navigator_py/package.xml | 0 .../ros-workspace/src/navigator_py/pixi.toml | 0 .../src/navigator_py/resource/navigator_py | 0 .../ros-workspace/src/navigator_py/setup.cfg | 0 .../ros-workspace/src/navigator_py/setup.py | 0 .../tests/integration}/test_ros.py | 0 .../integration_python/pixi_build/conftest.py | 82 ++++---- .../pixi_build/test_build.py | 5 + .../pixi_build/test_global.py | 2 + .../pixi_build/test_variants.py | 4 + tests/integration_python/test_main_cli.py | 1 + tests/integration_python/test_run_cli.py | 6 + tests/integration_python/test_upgrade.py | 5 + 43 files changed, 528 insertions(+), 42 deletions(-) create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/integration/__init__.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py create mode 100644 pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/pixi.lock (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/pixi.toml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/distro_less_package/__init__.py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/package.xml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/pixi.toml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/resource/distro_less_package (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/setup.cfg (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/distro_less_package/setup.py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator/CMakeLists.txt (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator/package.xml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator/pixi.toml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator/src/navigator.cpp (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_implicit/CMakeLists.txt (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_implicit/package.xml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_implicit/src/navigator.cpp (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/navigator_py/__init__.py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/navigator_py/navigator.py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/package.xml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/pixi.toml (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/resource/navigator_py (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/setup.cfg (100%) rename {tests/data/pixi-build => pixi-build-backends/backends/pixi-build-ros/tests/integration/data}/ros-workspace/src/navigator_py/setup.py (100%) rename {tests/integration_python/pixi_build => pixi-build-backends/backends/pixi-build-ros/tests/integration}/test_ros.py (100%) diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml index 4337f75206..355045a25a 100644 --- a/.github/workflows/backends-ros.yml +++ b/.github/workflows/backends-ros.yml @@ -5,6 +5,7 @@ on: branches: [main] paths: - crates/pixi-build-backend/** + - crates/pixi/** - Cargo.* - pixi-build-backends/py-pixi-build-backend/** - pixi-build-backends/backends/pixi-build-ros/** @@ -12,6 +13,7 @@ on: pull_request: paths: - crates/pixi-build-backend/** + - crates/pixi/** - Cargo.* - pixi-build-backends/py-pixi-build-backend/** - pixi-build-backends/backends/pixi-build-ros/** @@ -45,3 +47,52 @@ jobs: run: | cd pixi-build-backends/backends/pixi-build-ros pixi run test --color=yes + + integration-test: + name: Integration tests + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-musl + - os: macos-14 + target: aarch64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + runs-on: ${{ matrix.os }} + env: + TARGET_RELEASE: target/pixi/release + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 + with: + manifest-path: pixi-build-backends/backends/pixi-build-ros/pixi.toml + + - name: Build pixi binary + run: pixi run build-release + + - name: Add pixi binary to PATH (Unix) + if: runner.os != 'Windows' + run: | + chmod a+x ${{ github.workspace }}/${{ env.TARGET_RELEASE }}/pixi + echo "${{ github.workspace }}/${{ env.TARGET_RELEASE }}" >> $GITHUB_PATH + + - name: Add pixi binary to PATH (Windows) + if: runner.os == 'Windows' + run: | + echo "${{ github.workspace }}/${{ env.TARGET_RELEASE }}" | Out-File -Append -Encoding utf8 -FilePath $env:GITHUB_PATH + + - name: Verify pixi installation + run: pixi info + + - name: Build ROS backend channel + working-directory: pixi-build-backends/backends/pixi-build-ros + run: pixi run --locked create-channel + + - name: Run ROS integration tests + working-directory: pixi-build-backends/backends/pixi-build-ros + run: pixi run --locked pytest tests/integration -v diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0013a8c7f..1391742381 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -296,6 +296,7 @@ jobs: - name: "Build" run: > cargo build + -p pixi --locked --target x86_64-unknown-linux-musl --profile $CARGO_BUILD_PROFILE @@ -322,6 +323,7 @@ jobs: - name: "Build" run: > cargo build + -p pixi --locked --profile $CARGO_BUILD_PROFILE --features self_update @@ -347,6 +349,7 @@ jobs: - name: "Build" run: > cargo build + -p pixi --locked --profile $CARGO_BUILD_PROFILE --features self_update @@ -379,6 +382,7 @@ jobs: working-directory: ${{ env.PIXI_WORKSPACE }} run: > cargo build + -p pixi --locked --profile $env:CARGO_BUILD_PROFILE --features self_update @@ -414,6 +418,7 @@ jobs: working-directory: ${{ env.PIXI_WORKSPACE }} run: > cargo build + -p pixi --locked --target aarch64-pc-windows-msvc --profile $env:CARGO_BUILD_PROFILE diff --git a/.gitignore b/.gitignore index dfc0959f2e..f3a75ee0e2 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,9 @@ target/ # Backend build debug output crates/pixi-build-*/debug/ +# Backend test artifacts channel +pixi-build-backends/backends/pixi-build-ros/tests/integration/artifacts-channel/ + # IDE and editor files .idea/ .vscode/ diff --git a/Cargo.toml b/Cargo.toml index f8a96c0c1c..311ffe76e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,12 @@ [workspace] -default-members = ["crates/pixi"] +default-members = [ + "crates/pixi", + "crates/pixi-build-cmake", + "crates/pixi-build-mojo", + "crates/pixi-build-python", + "crates/pixi-build-rattler-build", + "crates/pixi-build-rust", +] exclude = [ # Only pulled in when enabling certain features. We do not want to include # these crates when running workspace wide commands. diff --git a/crates/pixi-build-python/Cargo.toml b/crates/pixi-build-python/Cargo.toml index 9b09fe0fb9..7d36cb2489 100644 --- a/crates/pixi-build-python/Cargo.toml +++ b/crates/pixi-build-python/Cargo.toml @@ -7,6 +7,7 @@ version = "0.4.4" default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls"] rustls-tls = ["pixi-build-backend/rustls-tls"] +slow_integration_tests = [] [dependencies] async-trait = { workspace = true } diff --git a/crates/pixi-build-python/src/pypi_mapping.rs b/crates/pixi-build-python/src/pypi_mapping.rs index da45bca7d3..a197433ad8 100644 --- a/crates/pixi-build-python/src/pypi_mapping.rs +++ b/crates/pixi-build-python/src/pypi_mapping.rs @@ -980,6 +980,7 @@ mod tests { } #[tokio::test] + #[cfg_attr(not(feature = "slow_integration_tests"), ignore)] async fn test_all_system_marker_styles() { // Test all supported system marker types in a compact table-driven test let mappings = IndexMap::from([( diff --git a/crates/pixi/tests/integration_rust/add_tests.rs b/crates/pixi/tests/integration_rust/add_tests.rs index 64599a9b8f..80f1c75655 100644 --- a/crates/pixi/tests/integration_rust/add_tests.rs +++ b/crates/pixi/tests/integration_rust/add_tests.rs @@ -256,6 +256,7 @@ async fn add_functionality_os() { /// Test the `pixi add --pypi` functionality (using local mocks) #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr(not(feature = "slow_integration_tests"), ignore)] async fn add_pypi_functionality() { use crate::common::pypi_index::{Database as PyPIDatabase, PyPIPackage}; diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.lock b/pixi-build-backends/backends/pixi-build-ros/pixi.lock index 095d3baf3d..1e8b599663 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.lock +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.lock @@ -74,6 +74,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-index-0.25.2-h942d4a7_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.10-h4196e79_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda @@ -119,6 +121,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda @@ -131,6 +134,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda @@ -147,6 +151,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-index-0.25.2-h782aefe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda @@ -184,6 +190,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -208,6 +215,8 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-index-0.25.2-h515db0c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda @@ -244,6 +253,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda @@ -268,6 +278,8 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-index-0.25.2-h9fbdfe2_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -474,6 +486,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-index-0.25.2-h942d4a7_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda @@ -517,6 +531,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda @@ -529,6 +544,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/pixi-build-backends/noarch/pixi-build-api-version-4-h4616a5c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pixi-pycharm-0.0.10-unix_hf108a03_0.conda @@ -544,6 +560,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-index-0.25.2-h782aefe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda @@ -579,6 +597,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -602,6 +621,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-index-0.25.2-h515db0c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda @@ -636,6 +657,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda @@ -659,6 +681,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-index-0.25.2-h9fbdfe2_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1259,6 +1283,35 @@ packages: purls: [] size: 790176 timestamp: 1754908768807 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 + md5: 5a86bf847b9b926f3a4f203339748d78 + depends: + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 791226 + timestamp: 1754910975665 +- conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + purls: [] + size: 750379 + timestamp: 1754909073836 +- conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 696926 + timestamp: 1754909290005 - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda sha256: 91bb4f5be1601b40b4995911d785e29387970f0b3c80f33f7f9028f95335399f md5: 1a2708a460884d6861425b7f9a7bef99 @@ -1787,6 +1840,18 @@ packages: purls: [] size: 136130 timestamp: 1745559387060 +- conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda + sha256: 73bcdc03ac2777986e5dbd35bf08bd6f2b683d26bd6650e6ef76e6d536eb17c3 + md5: 70223d112f70a91834f3708c079dea86 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 135165 + timestamp: 1745559421024 - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda sha256: c2d058ffe4f8caae71793a6e6f52bcbd0be660f11958ed2349b6476287117714 md5: 9873e55afc3f873196da6ac80382918b @@ -2461,6 +2526,119 @@ packages: version: 6.0.3 sha256: 9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 requires_python: '>=3.8' +- conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + sha256: d4115e45191c507e70c15d4fc0cf4bd283c64214c05f0ee6e35811b2d76a2348 + md5: b6a10478e09eedf17c5a9f2a1e334c00 + depends: + - patchelf + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17663929 + timestamp: 1767788793229 +- conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + sha256: 7f1948a71643927bca82149a3b23335920d1c76a0fe7094d99eefcdf2504fbcf + md5: 4868f77a820e8156bc744d8f09649437 + depends: + - patchelf + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18377556 + timestamp: 1767788834221 +- conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + sha256: 7d31a25e45823fc4fda6281b019c7875d2626ea8b1522cd58c56c6035b92e5c5 + md5: 6b38c4d55fbdf0f06d3c08674d2a9379 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15105783 + timestamp: 1767788828061 +- conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + sha256: ce2792c2da048b8898ecc6f121db28eb0168c1bf783af923ee2dc0b001a4343a + md5: e1d4cda695daca6661259fcd098f7d7b + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18827337 + timestamp: 1767788806259 +- conda: https://prefix.dev/conda-forge/linux-64/rattler-index-0.25.2-h942d4a7_0.conda + sha256: 9bca0c0c524ed7c22ef4aeb5bbffd4651bfddbdd6f923c8bb60244f2ced6f78b + md5: 5c56590e337223b1d84115aa1ec6323b + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libiconv >=1.18,<2.0a0 + - openssl >=3.5.3,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5917154 + timestamp: 1758728636169 +- conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-index-0.25.2-h782aefe_0.conda + sha256: 8d9297b66dff0ddeb0fe0e8aaa12445e0b3127dd1d4457b2185409395dd5d44c + md5: c0009688b2551228a7194ac240481a5e + depends: + - libgcc >=14 + - openssl >=3.5.3,<4.0a0 + - libiconv >=1.18,<2.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5931739 + timestamp: 1758728680417 +- conda: https://prefix.dev/conda-forge/osx-arm64/rattler-index-0.25.2-h515db0c_0.conda + sha256: d16a89353c062de22623f397c267b887ef64b829a46c6c712ff91228c32f3420 + md5: 957487e1b8ea54286e4cdbfc87b9821a + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - openssl >=3.5.3,<4.0a0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4617466 + timestamp: 1758728716469 +- conda: https://prefix.dev/conda-forge/win-64/rattler-index-0.25.2-h9fbdfe2_0.conda + sha256: 525de3ad43552e21191b859a8e7129e13cf6b202adb44ced16aad1a43c321351 + md5: 7c74531a240376ed250c80c7b2763f36 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libiconv >=1.18,<2.0a0 + - openssl >=3.5.3,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5209907 + timestamp: 1758728682250 - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 6effd46bc3..963f67cc39 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -36,11 +36,36 @@ test = { features = ["test"], solve-group = "default" } [feature.test.tasks] lint-mypy = "mypy" test = "pytest tests" +test-integration = { cmd = "pytest tests/integration", depends-on = ["create-channel"] } + +[feature.test.tasks.build-ros-channel] +cmd = """ +rattler-build build \ + --experimental \ + --no-build-id \ + --recipe ../../recipe/pixi-build-ros \ + --variant-config ../../recipe/variants.yaml \ + --channel https://prefix.dev/pixi-build-backends \ + --channel https://prefix.dev/conda-forge \ + --output-dir tests/integration/artifacts-channel +""" +description = "Build pixi-build-ros into local test channel" + +[feature.test.tasks.index-ros-channel] +depends-on = ["build-ros-channel"] +cmd = "rattler-index fs --force --write-shards false --write-zst false tests/integration/artifacts-channel" +description = "Index the local ROS backend channel" + +[feature.test.tasks.create-channel] +depends-on = ["build-ros-channel", "index-ros-channel"] +description = "Build and index local ROS backend channel for integration tests" [feature.test.dependencies] mypy = ">=1.18.2,<2" pixi-pycharm = ">=0.0.8,<0.1" pytest = "*" +rattler-build = ">=0.55.0,<0.56" +rattler-index = ">=0.25.2,<0.26" syrupy = ">=5,<6" types-pyyaml = "*" # You can skip this as it's a long build, uncomment this when developing only in this package diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/__init__.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/__init__.py new file mode 100644 index 0000000000..d0a3dff6d5 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/__init__.py @@ -0,0 +1 @@ +"""Integration tests for pixi-build-ros.""" diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py new file mode 100644 index 0000000000..805f53a816 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py @@ -0,0 +1,140 @@ +"""Common utilities for pixi-build-ros integration tests.""" + +import os +import platform +import re +import shutil +import subprocess +from collections.abc import Sequence +from enum import IntEnum +from pathlib import Path +from typing import Any + + +# Regex pattern to match ANSI escape sequences +ANSI_ESCAPE_PATTERN = re.compile(r"\x1b\[[0-9;]*m") + + +class ExitCode(IntEnum): + SUCCESS = 0 + FAILURE = 1 + INCORRECT_USAGE = 2 + COMMAND_NOT_FOUND = 127 + + +class Output: + command: Sequence[Path | str] + stdout: str + stderr: str + returncode: int + + def __init__(self, command: Sequence[Path | str], stdout: str, stderr: str, returncode: int): + self.command = command + self.stdout = stdout + self.stderr = stderr + self.returncode = returncode + + def __str__(self) -> str: + return f"command: {self.command}" + + +def verify_cli_command( + command: Sequence[Path | str], + expected_exit_code: ExitCode = ExitCode.SUCCESS, + stdout_contains: str | list[str] | None = None, + stdout_excludes: str | list[str] | None = None, + stderr_contains: str | list[str] | None = None, + stderr_excludes: str | list[str] | None = None, + env: dict[str, str] | None = None, + cwd: str | Path | None = None, + reset_env: bool = False, + strip_ansi: bool = False, +) -> Output: + base_env = {} if reset_env else dict(os.environ) + # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment + base_env = {k: v for k, v in base_env.items() if not k.startswith("PIXI_")} + complete_env = base_env if env is None else base_env | env + # Set `PIXI_NO_WRAP` to avoid to have miette wrapping lines + complete_env |= {"PIXI_NO_WRAP": "1"} + + process = subprocess.run( + command, + capture_output=True, + env=complete_env, + cwd=cwd, + ) + # Decode stdout and stderr explicitly using UTF-8 + stdout = process.stdout.decode("utf-8", errors="replace") + stderr = process.stderr.decode("utf-8", errors="replace") + + # Optionally strip ANSI escape sequences for matching + stdout_for_matching = ANSI_ESCAPE_PATTERN.sub("", stdout) if strip_ansi else stdout + stderr_for_matching = ANSI_ESCAPE_PATTERN.sub("", stderr) if strip_ansi else stderr + + returncode = process.returncode + output = Output(command, stdout, stderr, returncode) + print(f"command: {command}, stdout: {stdout}, stderr: {stderr}, code: {returncode}") + assert returncode == expected_exit_code, ( + f"Return code was {returncode}, expected {expected_exit_code}, stderr: {stderr}" + ) + + if stdout_contains: + if isinstance(stdout_contains, str): + stdout_contains = [stdout_contains] + for substring in stdout_contains: + assert substring in stdout_for_matching, ( + f"'{substring}'\n not found in stdout:\n {stdout}" + ) + + if stdout_excludes: + if isinstance(stdout_excludes, str): + stdout_excludes = [stdout_excludes] + for substring in stdout_excludes: + assert substring not in stdout_for_matching, ( + f"'{substring}'\n unexpectedly found in stdout:\n {stdout}" + ) + + if stderr_contains: + if isinstance(stderr_contains, str): + stderr_contains = [stderr_contains] + for substring in stderr_contains: + assert substring in stderr_for_matching, ( + f"'{substring}'\n not found in stderr:\n {stderr}" + ) + + if stderr_excludes: + if isinstance(stderr_excludes, str): + stderr_excludes = [stderr_excludes] + for substring in stderr_excludes: + assert substring not in stderr_for_matching, ( + f"'{substring}'\n unexpectedly found in stderr:\n {stderr}" + ) + + return output + + +def exec_extension(exe_name: str) -> str: + if platform.system() == "Windows": + return exe_name + ".exe" + return exe_name + + +def copy_manifest( + src: os.PathLike[str], + dst: os.PathLike[str], +) -> Path: + """Copy file (simple copy).""" + return Path(shutil.copy(src, dst)) + + +def copytree_with_local_backend( + src: os.PathLike[str], + dst: os.PathLike[str], + **kwargs: Any, +) -> Path: + """Copy tree while ignoring .pixi directories and .conda files.""" + kwargs.setdefault("copy_function", copy_manifest) + + return Path( + shutil.copytree(src, dst, ignore=shutil.ignore_patterns(".pixi", "*.conda"), **kwargs) + ) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py new file mode 100644 index 0000000000..c673d168a1 --- /dev/null +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py @@ -0,0 +1,50 @@ +"""Pytest fixtures for pixi-build-ros integration tests.""" + +from pathlib import Path + +import pytest + +from .common import exec_extension + + +def repo_root() -> Path: + """Return the root of the pixi repository.""" + # integration/ -> tests/ -> pixi-build-ros/ -> backends/ -> pixi-build-backends/ -> pixi/ + return Path(__file__).parents[5] + + +@pytest.fixture(scope="session") +def local_backend_channel_uri() -> str: + """Return file URI to the local ROS backend channel.""" + channel_dir = Path(__file__).parent / "artifacts-channel" + if not channel_dir.is_dir() or not any(channel_dir.rglob("repodata.json")): + raise RuntimeError( + f"Local backend channel not found at {channel_dir}. " + "Run 'pixi run create-channel' to generate it." + ) + return channel_dir.as_uri() + + +@pytest.fixture +def build_data() -> Path: + """Return the integration test data directory.""" + return Path(__file__).parent / "data" + + +@pytest.fixture +def pixi() -> Path: + """Return path to the pixi executable.""" + # Use the pixi from target/pixi/release + pixi_bin = repo_root() / "target" / "pixi" / "release" / exec_extension("pixi") + if not pixi_bin.is_file(): + raise RuntimeError( + f"pixi binary not found at {pixi_bin}. " + "This is a bug with the test setup: make sure the task depends on 'build-release'." + ) + return pixi_bin + + +@pytest.fixture +def tmp_pixi_workspace(tmp_path: Path) -> Path: + """Create a temporary workspace for tests.""" + return tmp_path diff --git a/tests/data/pixi-build/ros-workspace/pixi.lock b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/pixi.lock similarity index 100% rename from tests/data/pixi-build/ros-workspace/pixi.lock rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/pixi.lock diff --git a/tests/data/pixi-build/ros-workspace/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/pixi.toml similarity index 100% rename from tests/data/pixi-build/ros-workspace/pixi.toml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/pixi.toml diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/__init__.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/distro_less_package/__init__.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/__init__.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/distro_less_package/__init__.py diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/distro_less_package/distro_less_package.py diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/package.xml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/package.xml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/package.xml diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/pixi.toml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/pixi.toml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/pixi.toml diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/resource/distro_less_package b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/resource/distro_less_package similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/resource/distro_less_package rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/resource/distro_less_package diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/setup.cfg similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.cfg rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/setup.cfg diff --git a/tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/setup.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/distro_less_package/setup.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/distro_less_package/setup.py diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/CMakeLists.txt similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator/CMakeLists.txt rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/CMakeLists.txt diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/package.xml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/package.xml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator/package.xml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/package.xml diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/pixi.toml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator/pixi.toml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/pixi.toml diff --git a/tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/src/navigator.cpp similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator/src/navigator.cpp rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator/src/navigator.cpp diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/CMakeLists.txt similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_implicit/CMakeLists.txt rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/CMakeLists.txt diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/package.xml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_implicit/package.xml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/package.xml diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/src/navigator.cpp similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_implicit/src/navigator.cpp rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_implicit/src/navigator.cpp diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/__init__.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/__init__.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/__init__.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/__init__.py diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/navigator_py/navigator.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/package.xml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/package.xml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/package.xml diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/pixi.toml similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/pixi.toml rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/pixi.toml diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/resource/navigator_py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/resource/navigator_py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/resource/navigator_py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/resource/navigator_py diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/setup.cfg similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/setup.cfg rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/setup.cfg diff --git a/tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/setup.py similarity index 100% rename from tests/data/pixi-build/ros-workspace/src/navigator_py/setup.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/setup.py diff --git a/tests/integration_python/pixi_build/test_ros.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py similarity index 100% rename from tests/integration_python/pixi_build/test_ros.py rename to pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py diff --git a/tests/integration_python/pixi_build/conftest.py b/tests/integration_python/pixi_build/conftest.py index 98bcb38446..77208a23ed 100644 --- a/tests/integration_python/pixi_build/conftest.py +++ b/tests/integration_python/pixi_build/conftest.py @@ -1,44 +1,52 @@ """Pytest fixtures for pixi-build integration tests.""" +import os import shutil from pathlib import Path import pytest -from .common import CURRENT_PLATFORM, Workspace - - -def get_local_backend_channel() -> str: - """Get the local backend channel from the test data directory.""" - channel_dir = ( - Path(__file__).parents[2].joinpath("data", "channels", "channels", "pixi_build_backends") - ) - if channel_dir.is_dir() and any(channel_dir.rglob("repodata.json")): - return channel_dir.as_uri() - raise RuntimeError( - f"Local backend channel not found at {channel_dir}. " - "Run 'pixi run update-backends-channel' to generate it." - ) - - -@pytest.fixture(scope="session") -def local_backend_channel_dir() -> Path: - """Return the path to the local backend channel directory.""" - channel_dir = ( - Path(__file__).parents[2].joinpath("data", "channels", "channels", "pixi_build_backends") - ) - if not channel_dir.is_dir() or not any(channel_dir.rglob("repodata.json")): - pytest.skip( - f"Local backend channel not found at {channel_dir}. " - "Run 'pixi run update-backends-channel' to generate it." +from .common import CURRENT_PLATFORM, Workspace, exec_extension, repo_root + + +@pytest.fixture(scope="session", autouse=True) +def setup_build_backend_override(request: pytest.FixtureRequest) -> None: + """ + Sets up PIXI_BUILD_BACKEND_OVERRIDE for Rust backends. + + Points to binaries in target/pixi/{build_type}/ based on --pixi-build option. + """ + build_type = request.config.getoption("--pixi-build") + backends_bin_dir = repo_root() / "target" / "pixi" / build_type + + if not backends_bin_dir.is_dir(): + return # Skip if not built yet + + backends = [ + "pixi-build-cmake", + "pixi-build-python", + "pixi-build-rattler-build", + "pixi-build-rust", + ] + + override_parts = [] + missing_files = [] + for backend in backends: + backend_path = backends_bin_dir / exec_extension(backend) + if backend_path.is_file(): + override_parts.append(f"{backend}={backend_path}") + else: + missing_files.append(backend_path) + + if missing_files: + missing_list = "\n ".join(str(p) for p in missing_files) + build_cmd = "build-debug" if build_type == "debug" else "build-release" + raise RuntimeError( + f"Missing backend binaries:\n {missing_list}\n" + f"Run 'pixi run {build_cmd}' to build them." ) - return channel_dir - -@pytest.fixture(scope="session") -def local_backend_channel_uri(local_backend_channel_dir: Path) -> str: - """Return the file URI of the local backend channel.""" - return local_backend_channel_dir.as_uri() + os.environ["PIXI_BUILD_BACKEND_OVERRIDE"] = ",".join(override_parts) @pytest.fixture @@ -51,7 +59,6 @@ def build_data(test_data: Path) -> Path: def simple_workspace( tmp_pixi_workspace: Path, request: pytest.FixtureRequest, - local_backend_channel_uri: str, ) -> Workspace: """Create a simple workspace for build tests.""" name = request.node.name @@ -69,10 +76,7 @@ def simple_workspace( workspace_manifest = { "workspace": { - "channels": [ - local_backend_channel_uri, - "https://prefix.dev/conda-forge", - ], + "channels": ["https://prefix.dev/conda-forge"], "preview": ["pixi-build"], "platforms": [CURRENT_PLATFORM], }, @@ -87,10 +91,6 @@ def simple_workspace( "backend": { "name": "pixi-build-rattler-build", "version": "*", - "channels": [ - local_backend_channel_uri, - "https://prefix.dev/conda-forge", - ], }, }, }, diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index 3040e3c8ff..eda05761f1 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -42,6 +42,7 @@ def test_build_conda_package( assert len(built_packages) == 1 +@pytest.mark.slow def test_no_change_should_be_fully_cached(pixi: Path, simple_workspace: Workspace) -> None: simple_workspace.write_files() verify_cli_command( @@ -77,6 +78,7 @@ def test_no_change_should_be_fully_cached(pixi: Path, simple_workspace: Workspac assert simple_workspace.find_debug_file("conda_build_v1_params.json") is None +@pytest.mark.slow def test_recipe_change_trigger_metadata_invalidation( pixi: Path, simple_workspace: Workspace ) -> None: @@ -108,6 +110,7 @@ def test_recipe_change_trigger_metadata_invalidation( ) +@pytest.mark.slow def test_project_model_change_trigger_rebuild( pixi: Path, simple_workspace: Workspace, dummy_channel_1: Path ) -> None: @@ -260,6 +263,7 @@ def test_build_using_rattler_build_backend( ) +@pytest.mark.slow @pytest.mark.parametrize( ("backend", "non_incremental_evidence"), [("pixi-build-rust", "Compiling simple-app"), ("pixi-build-cmake", "Configuring done")], @@ -593,6 +597,7 @@ def test_extra_args(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> N assert target_dir.joinpath("src", "mybuilddir", "build.ninja").is_file() +@pytest.mark.slow def test_target_specific_dependency( pixi: Path, build_data: Path, tmp_pixi_workspace: Path, target_specific_channel_1: str ) -> None: diff --git a/tests/integration_python/pixi_build/test_global.py b/tests/integration_python/pixi_build/test_global.py index 88755f57cb..257edfa798 100644 --- a/tests/integration_python/pixi_build/test_global.py +++ b/tests/integration_python/pixi_build/test_global.py @@ -179,6 +179,7 @@ def test_add_git_repository_to_existing_environment( verify_cli_command([simple_package], env=env, stdout_contains="hello from simple-package") +@pytest.mark.slow def test_update(pixi: Path, tmp_path: Path, build_data: Path) -> None: """Test that pixi global update works with path dependencies.""" pixi_home = tmp_path / "pixi_home" @@ -299,6 +300,7 @@ def test_install_multi_output_multiple( verify_cli_command([bizbar], env=env, stdout_contains="Hello from bizbar") +@pytest.mark.slow def test_install_recursive_source_run_dependencies( pixi: Path, tmp_path: Path, diff --git a/tests/integration_python/pixi_build/test_variants.py b/tests/integration_python/pixi_build/test_variants.py index 24fb404579..9207287e47 100644 --- a/tests/integration_python/pixi_build/test_variants.py +++ b/tests/integration_python/pixi_build/test_variants.py @@ -8,6 +8,7 @@ from .common import CURRENT_PLATFORM, copytree_with_local_backend, verify_cli_command +@pytest.mark.slow @pytest.mark.parametrize( "workspace_dirname", ["build-variant-manifest-rattler-build", "build-variant-manifest-python"], @@ -51,6 +52,7 @@ def test_inline_variants_produce_multiple_outputs( assert package.exists() +@pytest.mark.slow @pytest.mark.parametrize( "workspace_dirname", ["build-variant-manifest-rattler-build", "build-variant-manifest-python"], @@ -95,6 +97,7 @@ def test_inline_variants_change_triggers_rebuild( ) +@pytest.mark.slow @pytest.mark.parametrize( "workspace_dirname", [ @@ -141,6 +144,7 @@ def test_variant_files_produce_multiple_outputs( assert len(built_packages) == 2 +@pytest.mark.slow @pytest.mark.parametrize( "workspace_dirname", [ diff --git a/tests/integration_python/test_main_cli.py b/tests/integration_python/test_main_cli.py index 3e3d4eba5b..780ca468c4 100644 --- a/tests/integration_python/test_main_cli.py +++ b/tests/integration_python/test_main_cli.py @@ -366,6 +366,7 @@ def test_concurrency_flags( ) +@pytest.mark.slow def test_cli_config_options( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: diff --git a/tests/integration_python/test_run_cli.py b/tests/integration_python/test_run_cli.py index 6394db5146..5ba6112a23 100644 --- a/tests/integration_python/test_run_cli.py +++ b/tests/integration_python/test_run_cli.py @@ -125,6 +125,7 @@ def test_run_in_shell_project(pixi: Path) -> None: ) +@pytest.mark.slow def test_using_prefix_validation( pixi: Path, tmp_pixi_workspace: Path, dummy_channel_1: str ) -> None: @@ -319,6 +320,7 @@ def test_run_help(pixi: Path, tmp_pixi_workspace: Path) -> None: ) +@pytest.mark.slow def test_run_deno(pixi: Path, tmp_pixi_workspace: Path, deno_channel: str) -> None: """Ensure that `pixi run deno` will just be forwarded instead of calling pixi""" manifest = tmp_pixi_workspace.joinpath("pixi.toml") @@ -965,6 +967,7 @@ def test_task_args_multiple_inputs(pixi: Path, tmp_pixi_workspace: Path) -> None ) +@pytest.mark.slow def test_task_environment( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -1015,6 +1018,7 @@ def test_task_environment( ) +@pytest.mark.slow def test_task_environment_precedence( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -1082,6 +1086,7 @@ def test_task_environment_precedence( ) +@pytest.mark.slow def test_multiple_dependencies_with_environments( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -1661,6 +1666,7 @@ def test_run_with_environment_variable_priority( ) +@pytest.mark.slow @pytest.mark.skipif( sys.platform == "win32", reason="Signal handling is different on Windows", diff --git a/tests/integration_python/test_upgrade.py b/tests/integration_python/test_upgrade.py index 5a8a623d11..4ad4190387 100644 --- a/tests/integration_python/test_upgrade.py +++ b/tests/integration_python/test_upgrade.py @@ -12,6 +12,7 @@ ) +@pytest.mark.slow def test_upgrade_package_does_not_exist( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -78,6 +79,7 @@ def test_upgrade_conda_package( assert "build-number" not in package +@pytest.mark.slow def test_upgrade_exclude( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -132,6 +134,7 @@ def test_upgrade_json_output( assert data["environment"]["default"] +@pytest.mark.slow def test_upgrade_dryrun( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -297,6 +300,7 @@ def test_upgrade_dependency_location_pixi(pixi: Path, tmp_path: Path) -> None: assert "numpy" not in pypi_dependencies +@pytest.mark.slow def test_upgrade_keep_info( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: @@ -382,6 +386,7 @@ def test_upgrade_remove_info( assert "build" not in parsed_manifest["dependencies"]["package3"] +@pytest.mark.slow def test_upgrade_features( pixi: Path, tmp_pixi_workspace: Path, multiple_versions_channel_1: str ) -> None: From 523cd66071d7f33435ad950ae470a860b78df7fd Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 16:27:12 +0100 Subject: [PATCH 23/70] Format --- .../backends/pixi-build-ros/pixi.toml | 6 ++++-- .../tests/integration/common.py | 20 +++++-------------- .../tests/integration/conftest.py | 3 +-- .../navigator_py/navigator_py/navigator.py | 8 ++------ .../tests/integration/test_ros.py | 7 ++----- 5 files changed, 14 insertions(+), 30 deletions(-) diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 963f67cc39..38e84020e2 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -36,7 +36,9 @@ test = { features = ["test"], solve-group = "default" } [feature.test.tasks] lint-mypy = "mypy" test = "pytest tests" -test-integration = { cmd = "pytest tests/integration", depends-on = ["create-channel"] } +test-integration = { cmd = "pytest tests/integration", depends-on = [ + "create-channel", +] } [feature.test.tasks.build-ros-channel] cmd = """ @@ -52,8 +54,8 @@ rattler-build build \ description = "Build pixi-build-ros into local test channel" [feature.test.tasks.index-ros-channel] -depends-on = ["build-ros-channel"] cmd = "rattler-index fs --force --write-shards false --write-zst false tests/integration/artifacts-channel" +depends-on = ["build-ros-channel"] description = "Index the local ROS backend channel" [feature.test.tasks.create-channel] diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py index 805f53a816..ebcda81598 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/common.py @@ -82,33 +82,25 @@ def verify_cli_command( if isinstance(stdout_contains, str): stdout_contains = [stdout_contains] for substring in stdout_contains: - assert substring in stdout_for_matching, ( - f"'{substring}'\n not found in stdout:\n {stdout}" - ) + assert substring in stdout_for_matching, f"'{substring}'\n not found in stdout:\n {stdout}" if stdout_excludes: if isinstance(stdout_excludes, str): stdout_excludes = [stdout_excludes] for substring in stdout_excludes: - assert substring not in stdout_for_matching, ( - f"'{substring}'\n unexpectedly found in stdout:\n {stdout}" - ) + assert substring not in stdout_for_matching, f"'{substring}'\n unexpectedly found in stdout:\n {stdout}" if stderr_contains: if isinstance(stderr_contains, str): stderr_contains = [stderr_contains] for substring in stderr_contains: - assert substring in stderr_for_matching, ( - f"'{substring}'\n not found in stderr:\n {stderr}" - ) + assert substring in stderr_for_matching, f"'{substring}'\n not found in stderr:\n {stderr}" if stderr_excludes: if isinstance(stderr_excludes, str): stderr_excludes = [stderr_excludes] for substring in stderr_excludes: - assert substring not in stderr_for_matching, ( - f"'{substring}'\n unexpectedly found in stderr:\n {stderr}" - ) + assert substring not in stderr_for_matching, f"'{substring}'\n unexpectedly found in stderr:\n {stderr}" return output @@ -135,6 +127,4 @@ def copytree_with_local_backend( """Copy tree while ignoring .pixi directories and .conda files.""" kwargs.setdefault("copy_function", copy_manifest) - return Path( - shutil.copytree(src, dst, ignore=shutil.ignore_patterns(".pixi", "*.conda"), **kwargs) - ) + return Path(shutil.copytree(src, dst, ignore=shutil.ignore_patterns(".pixi", "*.conda"), **kwargs)) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py index c673d168a1..7ae4f7bd33 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py @@ -19,8 +19,7 @@ def local_backend_channel_uri() -> str: channel_dir = Path(__file__).parent / "artifacts-channel" if not channel_dir.is_dir() or not any(channel_dir.rglob("repodata.json")): raise RuntimeError( - f"Local backend channel not found at {channel_dir}. " - "Run 'pixi run create-channel' to generate it." + f"Local backend channel not found at {channel_dir}. Run 'pixi run create-channel' to generate it." ) return channel_dir.as_uri() diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py index 2aed04fde3..51b32915c4 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/data/ros-workspace/src/navigator_py/navigator_py/navigator.py @@ -19,9 +19,7 @@ def __init__(self) -> None: self.integral = 0.0 self.subscription = self.create_subscription(Point, "coordinates", self.goal_callback, 10) - self.pose_subscription = self.create_subscription( - Pose, "turtle1/pose", self.pose_callback, 10 - ) + self.pose_subscription = self.create_subscription(Pose, "turtle1/pose", self.pose_callback, 10) self.publisher = self.create_publisher(Twist, "turtle1/cmd_vel", 10) self.timer = self.create_timer(0.1, self.control_loop) @@ -56,9 +54,7 @@ def control_loop(self) -> None: # PID control control_signal = ( - self.kp * distance_error - + self.ki * self.integral - + self.kd * (distance_error - self.prev_error) + self.kp * distance_error + self.ki * self.integral + self.kd * (distance_error - self.prev_error) ) self.integral += distance_error self.prev_error = distance_error diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py index 43876e0c9e..d3a6ca9037 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/test_ros.py @@ -32,8 +32,7 @@ def _load_package_metadata(project_root: Path, package_name: str) -> dict[str, A metadata = json.loads(metadata_file.read_text()) outputs = metadata.get("outputs", []) if any( - isinstance(output, dict) and output.get("metadata", {}).get("name") == package_name - for output in outputs + isinstance(output, dict) and output.get("metadata", {}).get("name") == package_name for output in outputs ): mtime = metadata_file.stat().st_mtime if mtime > selected_mtime: @@ -46,9 +45,7 @@ def _load_package_metadata(project_root: Path, package_name: str) -> dict[str, A @pytest.mark.slow @pytest.mark.parametrize("package_dir", ROS_PACKAGE_DIRS, ids=ROS_PACKAGE_DIRS) -def test_ros_packages_build( - package_dir: str, pixi: Path, build_data: Path, tmp_pixi_workspace: Path -) -> None: +def test_ros_packages_build(package_dir: str, pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: workspace = _prepare_ros_workspace(build_data, tmp_pixi_workspace) output_dir = workspace.joinpath("dist") output_dir.mkdir(parents=True, exist_ok=True) From 3e596ea5ca95bda71d4fbbcf32dbea8a73dc206e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 16:31:52 +0100 Subject: [PATCH 24/70] Fix rustdoc --- crates/pixi-build-mojo/src/config.rs | 2 +- crates/pixi-build-python/src/pypi_mapping.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/pixi-build-mojo/src/config.rs b/crates/pixi-build-mojo/src/config.rs index b3df070ac0..5331ca89da 100644 --- a/crates/pixi-build-mojo/src/config.rs +++ b/crates/pixi-build-mojo/src/config.rs @@ -436,7 +436,7 @@ impl MojoPkgConfig { } } -/// Clean the package name for use in [`MojoPkgConfig`] and [`MojoBinconfig`]. +/// Clean the package name for use in [`MojoPkgConfig`] and [`MojoBinConfig`]. /// /// This just entails converting - to _. pub fn clean_project_name(s: &str) -> String { diff --git a/crates/pixi-build-python/src/pypi_mapping.rs b/crates/pixi-build-python/src/pypi_mapping.rs index a197433ad8..4a6496c109 100644 --- a/crates/pixi-build-python/src/pypi_mapping.rs +++ b/crates/pixi-build-python/src/pypi_mapping.rs @@ -502,7 +502,7 @@ pub fn filter_mapped_pypi_deps( /// Extract the channel name from a channel URL. /// /// Returns the last path segment (e.g., "conda-forge" from -/// "https://prefix.dev/conda-forge"). +/// ""). pub fn extract_channel_name(channel: &ChannelUrl) -> Option<&str> { channel.as_str().trim_end_matches('/').rsplit('/').next() } From c9916a799b4010b731a221b4b9dcdc9797165e53 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 13 Jan 2026 17:04:56 +0100 Subject: [PATCH 25/70] Fix typehints --- pixi.lock | 150 ++++++++++++++++++ pixi.toml | 1 + pyproject.toml | 2 +- tests/integration_python/pixi_build/common.py | 3 +- .../integration_python/pixi_build/conftest.py | 15 +- .../pixi_build/test_build.py | 2 +- .../test_specified_build_source/test_git.py | 17 +- 7 files changed, 174 insertions(+), 16 deletions(-) diff --git a/pixi.lock b/pixi.lock index 7748c9fc6c..7505a97c38 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1354,63 +1354,94 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.9-h965158b_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-deny-0.19.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-shear-1.7.1-hb17b654_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/go-shfmt-3.12.0-hfc2019e_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-24.9.0-heeeca48_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.7-h813ae00_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda @@ -1421,7 +1452,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/taplo-0.10.0-h2d22210_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1433,63 +1466,94 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/actionlint-1.7.9-h23c61c7_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-deny-0.19.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-shear-1.7.1-h069e38c_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/dprint-0.49.1-ha3529ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/go-shfmt-3.12.0-h22914b5_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.11-h22914b5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/nodejs-24.9.0-hc854191_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.7-h9564552_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda @@ -1500,7 +1564,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/taplo-0.10.0-h3618846_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1511,52 +1577,81 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zizmor-1.18.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.9-h8080635_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-deny-0.19.0-ha9c3995_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-shear-1.7.1-h3c2ae71_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/osx-64/go-shfmt-3.12.0-hccc6df8_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/nodejs-24.9.0-h09bb5a9_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.7-hd9f4cfa_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda @@ -1566,7 +1661,9 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/taplo-0.10.0-hffa81eb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1575,53 +1672,83 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.18.0-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.9-h43f6c71_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-deny-0.19.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-shear-1.7.1-h8d80559_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/go-shfmt-3.12.0-h820172f_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-24.9.0-h08a63db_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.7-h382de68_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda @@ -1631,7 +1758,9 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/taplo-0.10.0-h2b2570c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1640,9 +1769,12 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.18.0-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: + - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.9-he477eed_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda @@ -1650,13 +1782,20 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/cargo-deny-0.19.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-shear-1.7.1-h18a1a76_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/win-64/go-shfmt-3.12.0-h11686cb_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -1665,22 +1804,31 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-24.9.0-he453025_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.7-h15e3a1f_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda @@ -1690,7 +1838,9 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/taplo-0.10.0-h63977a8_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda diff --git a/pixi.toml b/pixi.toml index 273aea4b62..91fddfb884 100644 --- a/pixi.toml +++ b/pixi.toml @@ -304,6 +304,7 @@ docs = { features = [ ], no-default-feature = true, solve-group = "default" } lint = { features = [ "lint", + "pytest", "rust", "schema", "pypi-gen", diff --git a/pyproject.toml b/pyproject.toml index 703ed2b3fc..bb6da72c8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ format-command = "pixi run -e lint ruff format --stdin-filename {filename}" [tool.basedpyright] -ignore = ["**/*.ipynb", "**/docs_hooks.py", "scripts/test_native_certs.py"] +ignore = ["**/*.ipynb", "**/docs_hooks.py", "scripts/test_native_certs.py", "pixi-build-backends", "tests/data"] pythonPlatform = "All" pythonVersion = "3.13" typeCheckingMode = "all" diff --git a/tests/integration_python/pixi_build/common.py b/tests/integration_python/pixi_build/common.py index bc3ea4e748..0d67d10ee0 100644 --- a/tests/integration_python/pixi_build/common.py +++ b/tests/integration_python/pixi_build/common.py @@ -6,7 +6,8 @@ from contextlib import contextmanager from dataclasses import dataclass from pathlib import Path -from typing import Any, Generator +from collections.abc import Generator +from typing import Any import tomli_w import yaml diff --git a/tests/integration_python/pixi_build/conftest.py b/tests/integration_python/pixi_build/conftest.py index 77208a23ed..da02b8de8f 100644 --- a/tests/integration_python/pixi_build/conftest.py +++ b/tests/integration_python/pixi_build/conftest.py @@ -3,6 +3,7 @@ import os import shutil from pathlib import Path +from typing import Any import pytest @@ -29,8 +30,8 @@ def setup_build_backend_override(request: pytest.FixtureRequest) -> None: "pixi-build-rust", ] - override_parts = [] - missing_files = [] + override_parts: list[str] = [] + missing_files: list[Path] = [] for backend in backends: backend_path = backends_bin_dir / exec_extension(backend) if backend_path.is_file(): @@ -43,7 +44,7 @@ def setup_build_backend_override(request: pytest.FixtureRequest) -> None: build_cmd = "build-debug" if build_type == "debug" else "build-release" raise RuntimeError( f"Missing backend binaries:\n {missing_list}\n" - f"Run 'pixi run {build_cmd}' to build them." + + f"Run 'pixi run {build_cmd}' to build them." ) os.environ["PIXI_BUILD_BACKEND_OVERRIDE"] = ",".join(override_parts) @@ -61,7 +62,7 @@ def simple_workspace( request: pytest.FixtureRequest, ) -> Workspace: """Create a simple workspace for build tests.""" - name = request.node.name + name: str = request.node.name # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType] workspace_dir = tmp_pixi_workspace.joinpath("workspace") workspace_dir.mkdir() @@ -70,11 +71,11 @@ def simple_workspace( debug_dir = tmp_pixi_workspace.joinpath("debug_dir") debug_dir.mkdir() - recipe = {"package": {"name": name, "version": "1.0.0"}} + recipe: dict[str, Any] = {"package": {"name": name, "version": "1.0.0"}} package_rel_dir = "package" - workspace_manifest = { + workspace_manifest: dict[str, Any] = { "workspace": { "channels": ["https://prefix.dev/conda-forge"], "preview": ["pixi-build"], @@ -83,7 +84,7 @@ def simple_workspace( "dependencies": {name: {"path": package_rel_dir}}, } - package_manifest = { + package_manifest: dict[str, Any] = { "package": { "name": name, "version": "1.0.0", diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index eda05761f1..1526bdd218 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -112,7 +112,7 @@ def test_recipe_change_trigger_metadata_invalidation( @pytest.mark.slow def test_project_model_change_trigger_rebuild( - pixi: Path, simple_workspace: Workspace, dummy_channel_1: Path + pixi: Path, simple_workspace: Workspace ) -> None: simple_workspace.write_files() verify_cli_command( diff --git a/tests/integration_python/pixi_build/test_specified_build_source/test_git.py b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py index 5b1dc7478b..9c4ee95bfd 100644 --- a/tests/integration_python/pixi_build/test_specified_build_source/test_git.py +++ b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py @@ -1,7 +1,8 @@ import json import shutil from pathlib import Path -from typing import Any, Iterator +from collections.abc import Iterator +from typing import Any, cast import pytest import tomli_w @@ -27,10 +28,12 @@ def iter_entries() -> Any: serialized_sources: list[dict[str, Any]] = [] for entry in iter_entries(): - if isinstance(entry, dict) and entry.get("conda") == ".": - package_build_source = entry.get("package_build_source") - if package_build_source is not None: - serialized_sources.append(package_build_source) + if isinstance(entry, dict): + entry = cast(dict[str, Any], entry) + if entry.get("conda") == ".": + package_build_source = entry.get("package_build_source") + if package_build_source is not None: + serialized_sources.append(package_build_source) assert serialized_sources, ( "expected at least one git package with package_build_source in pixi.lock" @@ -299,7 +302,7 @@ def iter_candidate_files() -> Iterator[Path]: if path.suffix in {".o", ".bin", ".txt", ".json"} or "simple-app" in path.name: yield path - found = [] + found: list[Path] = [] for candidate in iter_candidate_files(): try: data = candidate.read_bytes() @@ -400,11 +403,13 @@ def test_git_path_lock_detects_manual_rev_change( def mutate(node: Any) -> None: if isinstance(node, dict): + node = cast(dict[str, Any], node) if node.get("conda") == "." and "package_build_source" in node: node["package_build_source"]["rev"] = local_cpp_git_repo.other_feature_rev for value in node.values(): mutate(value) elif isinstance(node, list): + node = cast(list[Any], node) for item in node: mutate(item) From 7bf736d3d584b6af2e05b6a53c89d3d1dce87011 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 09:24:30 +0100 Subject: [PATCH 26/70] Update deno_task shell --- Cargo.lock | 73 ++++++++++++++++++++++++------------------------------ Cargo.toml | 2 +- 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2efec5f5f..26914ba18d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2015,9 +2015,9 @@ dependencies = [ [[package]] name = "deno_task_shell" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb3527b0dc64fb6c1cb19023ef92a949b54c735c37af9bfb9fe4095922278da" +checksum = "d6c8906a44dee412f17bf3ec79da41548612c5da3741fd0023c718408d6fe685" dependencies = [ "anyhow", "deno_path_util", @@ -2025,7 +2025,6 @@ dependencies = [ "glob", "monch", "nix 0.29.0", - "os_pipe", "path-dedot", "sys_traits", "thiserror 2.0.17", @@ -2179,7 +2178,7 @@ checksum = "6738d2e996274e499bc7b0d693c858b7720b9cd2543a0643a3087e6cb0a4fa16" dependencies = [ "cfg-if 1.0.4", "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2429,7 +2428,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3456,7 +3455,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -3536,9 +3535,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -3550,9 +3549,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -3776,7 +3775,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4154,9 +4153,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.178" +version = "0.2.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f" [[package]] name = "libdbus-sys" @@ -4959,16 +4958,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "os_str_bytes" version = "6.6.1" @@ -6672,9 +6661,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" dependencies = [ "unicode-ident", ] @@ -6896,7 +6885,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.1", + "socket2 0.5.10", "thiserror 2.0.17", "tokio", "tracing", @@ -6933,9 +6922,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.5.10", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.52.0", ] [[package]] @@ -8296,7 +8285,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -8309,7 +8298,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -8376,7 +8365,7 @@ dependencies = [ "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs 0.26.11", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -8952,10 +8941,11 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -9240,9 +9230,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.111" +version = "2.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "678faa00651c9eb72dd2020cbdf275d92eccb2400d568e419efdd64838145cb4" dependencies = [ "proc-macro2", "quote", @@ -9403,7 +9393,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.3", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -9585,9 +9575,9 @@ source = "git+https://github.com/astral-sh/tl.git?rev=6e25b2ee2513d75385101a8ff9 [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -10051,14 +10041,15 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -11592,7 +11583,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 311ffe76e5..7df7a60313 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,7 +57,7 @@ crossbeam-channel = "0.5.14" csv = "1.3.1" ctrlc = "3.4.5" dashmap = "6.1.0" -deno_task_shell = "0.26.0" +deno_task_shell = "0.26.2" derive_more = "2.0.1" dialoguer = "0.12.0" digest = "0.10" From 41f0dacd75719efc8893bdfc7fd4c2408b2d4a3c Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 09:39:09 +0100 Subject: [PATCH 27/70] Revert "Update deno_task shell" This reverts commit 7bf736d3d584b6af2e05b6a53c89d3d1dce87011. --- Cargo.lock | 73 ++++++++++++++++++++++++++++++------------------------ Cargo.toml | 2 +- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26914ba18d..b2efec5f5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2015,9 +2015,9 @@ dependencies = [ [[package]] name = "deno_task_shell" -version = "0.26.2" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c8906a44dee412f17bf3ec79da41548612c5da3741fd0023c718408d6fe685" +checksum = "dcb3527b0dc64fb6c1cb19023ef92a949b54c735c37af9bfb9fe4095922278da" dependencies = [ "anyhow", "deno_path_util", @@ -2025,6 +2025,7 @@ dependencies = [ "glob", "monch", "nix 0.29.0", + "os_pipe", "path-dedot", "sys_traits", "thiserror 2.0.17", @@ -2178,7 +2179,7 @@ checksum = "6738d2e996274e499bc7b0d693c858b7720b9cd2543a0643a3087e6cb0a4fa16" dependencies = [ "cfg-if 1.0.4", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2428,7 +2429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3455,7 +3456,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.1", "system-configuration", "tokio", "tower-service", @@ -3535,9 +3536,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ "icu_collections", "icu_locale_core", @@ -3549,9 +3550,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" @@ -3775,7 +3776,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4153,9 +4154,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.179" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libdbus-sys" @@ -4958,6 +4959,16 @@ dependencies = [ "serde_core", ] +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "os_str_bytes" version = "6.6.1" @@ -6661,9 +6672,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.104" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -6885,7 +6896,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", + "socket2 0.6.1", "thiserror 2.0.17", "tokio", "tracing", @@ -6922,9 +6933,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.1", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -8285,7 +8296,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8298,7 +8309,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -8365,7 +8376,7 @@ dependencies = [ "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs 0.26.11", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8941,11 +8952,10 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.8" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ - "errno", "libc", ] @@ -9230,9 +9240,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.113" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678faa00651c9eb72dd2020cbdf275d92eccb2400d568e419efdd64838145cb4" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -9393,7 +9403,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.3", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9575,9 +9585,9 @@ source = "git+https://github.com/astral-sh/tl.git?rev=6e25b2ee2513d75385101a8ff9 [[package]] name = "tokio" -version = "1.49.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ "bytes", "libc", @@ -10041,15 +10051,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.8" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", - "serde_derive", ] [[package]] @@ -11583,7 +11592,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7df7a60313..311ffe76e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,7 +57,7 @@ crossbeam-channel = "0.5.14" csv = "1.3.1" ctrlc = "3.4.5" dashmap = "6.1.0" -deno_task_shell = "0.26.2" +deno_task_shell = "0.26.0" derive_more = "2.0.1" dialoguer = "0.12.0" digest = "0.10" From d76aa9a300ce596b9a0e23d3b03b66023f3b030a Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 10:00:58 +0100 Subject: [PATCH 28/70] Fix pixi build ros test setup --- .github/workflows/backends-ros.yml | 49 ++++++++++--------- .github/workflows/ci.yml | 14 ++++++ .../backends/pixi-build-ros/pixi.toml | 7 ++- .../tests/integration/conftest.py | 12 ++--- 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml index 355045a25a..85ccd758a9 100644 --- a/.github/workflows/backends-ros.yml +++ b/.github/workflows/backends-ros.yml @@ -1,23 +1,12 @@ name: Backends - ROS on: - push: - branches: [main] - paths: - - crates/pixi-build-backend/** - - crates/pixi/** - - Cargo.* - - pixi-build-backends/py-pixi-build-backend/** - - pixi-build-backends/backends/pixi-build-ros/** - - .github/workflows/backends-ros.yml - pull_request: - paths: - - crates/pixi-build-backend/** - - crates/pixi/** - - Cargo.* - - pixi-build-backends/py-pixi-build-backend/** - - pixi-build-backends/backends/pixi-build-ros/** - - .github/workflows/backends-ros.yml + workflow_call: + inputs: + sha: + type: string + description: "The commit sha for artifact lookup" + required: true workflow_dispatch: concurrency: @@ -31,6 +20,8 @@ jobs: test: name: Test the pixi-build-ros package runs-on: ubuntu-latest + env: + TARGET_RELEASE: target/pixi/release steps: - uses: actions/checkout@v4 with: @@ -39,6 +30,15 @@ jobs: - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: manifest-path: pixi-build-backends/backends/pixi-build-ros/pixi.toml + - name: Download pixi binary + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4 + with: + name: pixi-linux-x86_64-${{ inputs.sha }} + path: ${{ env.TARGET_RELEASE }} + - name: Add pixi binary to PATH + run: | + chmod a+x ${{ github.workspace }}/${{ env.TARGET_RELEASE }}/pixi + echo "${{ github.workspace }}/${{ env.TARGET_RELEASE }}" >> $GITHUB_PATH - name: Run mypy run: | cd pixi-build-backends/backends/pixi-build-ros @@ -46,7 +46,7 @@ jobs: - name: Run tests run: | cd pixi-build-backends/backends/pixi-build-ros - pixi run test --color=yes + pixi run test-ci --color=yes integration-test: name: Integration tests @@ -55,11 +55,11 @@ jobs: matrix: include: - os: ubuntu-latest - target: x86_64-unknown-linux-musl + artifact: pixi-linux-x86_64 - os: macos-14 - target: aarch64-apple-darwin + artifact: pixi-macos-aarch64 - os: windows-latest - target: x86_64-pc-windows-msvc + artifact: pixi-windows-x86_64 runs-on: ${{ matrix.os }} env: TARGET_RELEASE: target/pixi/release @@ -72,8 +72,11 @@ jobs: with: manifest-path: pixi-build-backends/backends/pixi-build-ros/pixi.toml - - name: Build pixi binary - run: pixi run build-release + - name: Download pixi binary + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4 + with: + name: ${{ matrix.artifact }}-${{ inputs.sha }} + path: ${{ env.TARGET_RELEASE }} - name: Add pixi binary to PATH (Unix) if: runner.os != 'Windows' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1391742381..9b9ebef89a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -835,6 +835,20 @@ jobs: arch: macos-aarch64 runs-on: macos-15 + # + # Test pixi-build-ros backend + # + + test-backends-ros: + name: Backends - ROS + needs: + - build-binary-linux-x86_64 + - build-binary-macos-aarch64 + - build-binary-windows-x86_64 + uses: ./.github/workflows/backends-ros.yml + with: + sha: ${{ github.sha }} + # # Test unix installer on some platforms # diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 38e84020e2..b0c529b5a5 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -33,12 +33,15 @@ default = { features = ["test", "lint"], solve-group = "default" } lint = { features = ["lint"], no-default-feature = true } test = { features = ["test"], solve-group = "default" } + [feature.test.tasks] lint-mypy = "mypy" -test = "pytest tests" -test-integration = { cmd = "pytest tests/integration", depends-on = [ +test = { cmd = "pytest tests", depends-on = [ + "build-pixi-release", "create-channel", ] } +test-ci = { cmd = "pytest tests", depends-on = ["create-channel"] } +build-pixi-release = "pixi run --manifest-path ../../../pixi.toml build-release" [feature.test.tasks.build-ros-channel] cmd = """ diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py index 7ae4f7bd33..fe762877dd 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py @@ -32,14 +32,14 @@ def build_data() -> Path: @pytest.fixture def pixi() -> Path: - """Return path to the pixi executable.""" - # Use the pixi from target/pixi/release + """Return path to the pixi executable. + + Locally, use the built binary in target/pixi/release. + In CI, the pre-built binary is downloaded to target/pixi/release. + """ pixi_bin = repo_root() / "target" / "pixi" / "release" / exec_extension("pixi") if not pixi_bin.is_file(): - raise RuntimeError( - f"pixi binary not found at {pixi_bin}. " - "This is a bug with the test setup: make sure the task depends on 'build-release'." - ) + raise RuntimeError(f"pixi binary not found at {pixi_bin}. ") return pixi_bin From c9270f234fe144e13b7d21dae28600ee098a002d Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 10:22:40 +0100 Subject: [PATCH 29/70] Move python deps in separate feature --- pixi.toml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pixi.toml b/pixi.toml index 91fddfb884..21d55ec617 100644 --- a/pixi.toml +++ b/pixi.toml @@ -45,7 +45,7 @@ test-fast = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all test-slow = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets --features slow_integration_tests,online_tests --status-level skip --failure-output immediate-final --no-fail-fast --final-status-level slow""" -[feature.pytest.dependencies] +[feature.python-test-deps.dependencies] dirty-equals = ">=0.11,<0.12" filelock = ">=3.19.1,<4" git = ">=2.51.0,<3" @@ -61,7 +61,6 @@ rich = ">=14.1.0,<15" tomli-w = ">=1.2.0,<2" types-pyyaml = ">=6.0.12.20250915,<7" - [feature.pytest.tasks] test-common-wheels = { cmd = "pytest -s --numprocesses=auto tests/wheel_tests/", depends-on = [ "build-release", @@ -304,13 +303,13 @@ docs = { features = [ ], no-default-feature = true, solve-group = "default" } lint = { features = [ "lint", - "pytest", + "python-test-deps", "rust", "schema", "pypi-gen", ], no-default-feature = true, solve-group = "default" } pypi-gen = { features = ["pypi-gen"] } -pytest = { features = ["pytest"], no-default-feature = true } +pytest = { features = ["pytest", "python-test-deps"], no-default-feature = true } recipes = { features = ["recipes"], no-default-feature = true } schema = { features = [ "schema", From 8f86a8a80f73d1edc49a8da264508a4377ffd241 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 10:33:57 +0100 Subject: [PATCH 30/70] Format --- pixi-build-backends/backends/pixi-build-ros/pixi.toml | 2 +- pixi.toml | 5 ++++- pyproject.toml | 8 +++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index b0c529b5a5..613df4970b 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -35,13 +35,13 @@ test = { features = ["test"], solve-group = "default" } [feature.test.tasks] +build-pixi-release = "pixi run --manifest-path ../../../pixi.toml build-release" lint-mypy = "mypy" test = { cmd = "pytest tests", depends-on = [ "build-pixi-release", "create-channel", ] } test-ci = { cmd = "pytest tests", depends-on = ["create-channel"] } -build-pixi-release = "pixi run --manifest-path ../../../pixi.toml build-release" [feature.test.tasks.build-ros-channel] cmd = """ diff --git a/pixi.toml b/pixi.toml index 21d55ec617..cef76e922c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -309,7 +309,10 @@ lint = { features = [ "pypi-gen", ], no-default-feature = true, solve-group = "default" } pypi-gen = { features = ["pypi-gen"] } -pytest = { features = ["pytest", "python-test-deps"], no-default-feature = true } +pytest = { features = [ + "pytest", + "python-test-deps", +], no-default-feature = true } recipes = { features = ["recipes"], no-default-feature = true } schema = { features = [ "schema", diff --git a/pyproject.toml b/pyproject.toml index bb6da72c8b..9df365494f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,13 @@ format-command = "pixi run -e lint ruff format --stdin-filename {filename}" [tool.basedpyright] -ignore = ["**/*.ipynb", "**/docs_hooks.py", "scripts/test_native_certs.py", "pixi-build-backends", "tests/data"] +ignore = [ + "**/*.ipynb", + "**/docs_hooks.py", + "scripts/test_native_certs.py", + "pixi-build-backends", + "tests/data", +] pythonPlatform = "All" pythonVersion = "3.13" typeCheckingMode = "all" From 9ea2e2434d6341e87756edd55361f62db575cd67 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 10:34:01 +0100 Subject: [PATCH 31/70] Format --- tests/integration_python/pixi_build/test_build.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index 1526bdd218..1f261e9c22 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -111,9 +111,7 @@ def test_recipe_change_trigger_metadata_invalidation( @pytest.mark.slow -def test_project_model_change_trigger_rebuild( - pixi: Path, simple_workspace: Workspace -) -> None: +def test_project_model_change_trigger_rebuild(pixi: Path, simple_workspace: Workspace) -> None: simple_workspace.write_files() verify_cli_command( [ From aead019a34f61a699830d469e63a20dfe9c9aa59 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 10:44:05 +0100 Subject: [PATCH 32/70] Fix mojo snapshots on windows --- crates/pixi-build-mojo/src/build_script.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/pixi-build-mojo/src/build_script.rs b/crates/pixi-build-mojo/src/build_script.rs index 0b6ebdf9b0..37abb20e57 100644 --- a/crates/pixi-build-mojo/src/build_script.rs +++ b/crates/pixi-build-mojo/src/build_script.rs @@ -18,6 +18,12 @@ impl BuildScriptContext { let template = env .template_from_str(include_str!("build_script.j2")) .unwrap(); - template.render(self).unwrap().trim().to_string() + // Normalize line endings to Unix-style for consistent output across platforms + template + .render(self) + .unwrap() + .trim() + .replace("\r\n", "\n") + .to_string() } } From 6f8114cf27ac5c6ce30a57cab8e35e51c01ca3e3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 11:10:01 +0100 Subject: [PATCH 33/70] Fix clippy errors --- Cargo.lock | 2 ++ .../src/utils/temporary_recipe.rs | 6 ++-- .../tests/integration/common/model.rs | 3 +- crates/pixi-build-mojo/Cargo.toml | 1 + crates/pixi-build-mojo/src/config.rs | 7 +++-- crates/pixi-build-mojo/src/main.rs | 13 +++++---- crates/pixi-build-python/src/main.rs | 3 +- crates/pixi-build-python/src/metadata.rs | 3 +- crates/pixi-build-python/src/pypi_mapping.rs | 10 ++++--- crates/pixi-build-rattler-build/Cargo.toml | 1 + .../pixi-build-rattler-build/src/protocol.rs | 29 +++++-------------- crates/pixi-build-rust/src/metadata.rs | 3 +- 12 files changed, 40 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2efec5f5f..fd36ca24b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5393,6 +5393,7 @@ name = "pixi-build-mojo" version = "0.1.7" dependencies = [ "async-trait", + "fs-err", "indexmap 2.13.0", "insta", "miette 7.6.0", @@ -5444,6 +5445,7 @@ version = "0.3.6" dependencies = [ "async-trait", "chrono", + "fs-err", "insta", "miette 7.6.0", "pathdiff", diff --git a/crates/pixi-build-backend/src/utils/temporary_recipe.rs b/crates/pixi-build-backend/src/utils/temporary_recipe.rs index cd2dba6db6..1e8292e5a2 100644 --- a/crates/pixi-build-backend/src/utils/temporary_recipe.rs +++ b/crates/pixi-build-backend/src/utils/temporary_recipe.rs @@ -4,6 +4,8 @@ use std::future::Future; use std::io::BufWriter; use std::path::PathBuf; +use fs_err as fs; + /// A helper struct that owns a temporary file containing a rendered recipe. /// If `finish` is not called, the temporary file will stay on disk for /// debugging purposes. @@ -14,7 +16,7 @@ pub struct TemporaryRenderedRecipe { impl TemporaryRenderedRecipe { pub fn from_output(output: &Output) -> miette::Result { // Ensure that the output directory exists - std::fs::create_dir_all(&output.build_configuration.directories.output_dir) + fs::create_dir_all(&output.build_configuration.directories.output_dir) .into_diagnostic() .context("failed to create output directory")?; @@ -45,7 +47,7 @@ impl TemporaryRenderedRecipe { operation: F, ) -> miette::Result { let result = operation().await?; - std::fs::remove_file(self.file) + fs::remove_file(self.file) .into_diagnostic() .context("failed to remove temporary recipe file")?; Ok(result) diff --git a/crates/pixi-build-backend/tests/integration/common/model.rs b/crates/pixi-build-backend/tests/integration/common/model.rs index d7ac78a1b6..51eefb3b5c 100644 --- a/crates/pixi-build-backend/tests/integration/common/model.rs +++ b/crates/pixi-build-backend/tests/integration/common/model.rs @@ -7,6 +7,7 @@ use pixi_build_types::{ use rattler_conda_types::{ParseStrictness, Version, VersionSpec}; +use fs_err as fs; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, path::PathBuf}; @@ -87,7 +88,7 @@ pub(crate) fn load_project_model_from_json(filename: &str) -> TestProjectModel { .join("fixtures") .join(filename); - let json_content = std::fs::read_to_string(&fixture_path) + let json_content = fs::read_to_string(&fixture_path) .unwrap_or_else(|e| panic!("Failed to read JSON fixture '{filename}': {e}")); serde_json::from_str(&json_content) diff --git a/crates/pixi-build-mojo/Cargo.toml b/crates/pixi-build-mojo/Cargo.toml index e6cebac806..fbafdcb260 100644 --- a/crates/pixi-build-mojo/Cargo.toml +++ b/crates/pixi-build-mojo/Cargo.toml @@ -10,6 +10,7 @@ rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] async-trait = { workspace = true } +fs-err = { workspace = true } indexmap = { workspace = true } miette = { workspace = true } minijinja = { workspace = true } diff --git a/crates/pixi-build-mojo/src/config.rs b/crates/pixi-build-mojo/src/config.rs index 5331ca89da..ad1db8d754 100644 --- a/crates/pixi-build-mojo/src/config.rs +++ b/crates/pixi-build-mojo/src/config.rs @@ -445,6 +445,7 @@ pub fn clean_project_name(s: &str) -> String { #[cfg(test)] mod tests { + use fs_err as fs; use rstest::rstest; use serde_json::json; use tempfile::TempDir; @@ -539,7 +540,7 @@ mod tests { // Write the main.mojo file specified by test case, if present if let Some(filename) = test_case.main_file { - std::fs::write(manifest_root.join(filename), "def main():\n pass").unwrap(); + fs::write(manifest_root.join(filename), "def main():\n pass").unwrap(); } let result = @@ -642,8 +643,8 @@ mod tests { if let Some((dir, filename)) = test_case.init_file { let init_dir = manifest_root.join(dir); - std::fs::create_dir_all(&init_dir).unwrap(); - std::fs::write(init_dir.join(filename), "").unwrap(); + fs::create_dir_all(&init_dir).unwrap(); + fs::write(init_dir.join(filename), "").unwrap(); } let result = diff --git a/crates/pixi-build-mojo/src/main.rs b/crates/pixi-build-mojo/src/main.rs index d1fafc6db3..e5fe99029b 100644 --- a/crates/pixi-build-mojo/src/main.rs +++ b/crates/pixi-build-mojo/src/main.rs @@ -170,6 +170,7 @@ mod tests { use std::path::PathBuf; use crate::config::{MojoBinConfig, MojoPkgConfig}; + use fs_err as fs; use indexmap::IndexMap; use recipe_stage0::recipe::{Item, Value}; @@ -311,7 +312,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( @@ -355,7 +356,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( @@ -407,7 +408,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( @@ -449,7 +450,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( @@ -524,7 +525,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( @@ -583,7 +584,7 @@ mod tests { // Create a temporary directory with a main.mojo file so the test has something to build let temp = tempfile::TempDir::new().unwrap(); - std::fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); + fs::write(temp.path().join("main.mojo"), "def main():\n pass").unwrap(); let generated_recipe = MojoGenerator::default() .generate_recipe( diff --git a/crates/pixi-build-python/src/main.rs b/crates/pixi-build-python/src/main.rs index eb48a15511..3e45435dd4 100644 --- a/crates/pixi-build-python/src/main.rs +++ b/crates/pixi-build-python/src/main.rs @@ -5,6 +5,7 @@ mod pypi_mapping; use build_script::{BuildPlatform, BuildScriptContext, Installer}; use config::PythonBackendConfig; +use fs_err as fs; use miette::IntoDiagnostic; use pixi_build_backend::variants::NormalizedKey; use pixi_build_backend::{ @@ -278,7 +279,7 @@ impl GenerateRecipe for PythonGenerator { // read pyproject.toml content if it exists let pyproject_manifest_path = manifest_root.join("pyproject.toml"); let pyproject_manifest = if pyproject_manifest_path.exists() { - let contents = std::fs::read_to_string(&pyproject_manifest_path).into_diagnostic()?; + let contents = fs::read_to_string(&pyproject_manifest_path).into_diagnostic()?; generated_recipe.build_input_globs = BTreeSet::from([pyproject_manifest_path.to_string_lossy().to_string()]); Some(toml::from_str(&contents).into_diagnostic()?) diff --git a/crates/pixi-build-python/src/metadata.rs b/crates/pixi-build-python/src/metadata.rs index 52d2b55d58..91ae38d0a7 100644 --- a/crates/pixi-build-python/src/metadata.rs +++ b/crates/pixi-build-python/src/metadata.rs @@ -344,8 +344,9 @@ impl PyprojectMetadataProvider { #[cfg(test)] mod tests { - use std::{collections::HashSet, fs}; + use std::collections::HashSet; + use fs_err as fs; use pixi_build_backend::generated_recipe::{GenerateRecipe, MetadataProvider}; use rattler_conda_types::Platform; use tempfile::TempDir; diff --git a/crates/pixi-build-python/src/pypi_mapping.rs b/crates/pixi-build-python/src/pypi_mapping.rs index 4a6496c109..752fbf3599 100644 --- a/crates/pixi-build-python/src/pypi_mapping.rs +++ b/crates/pixi-build-python/src/pypi_mapping.rs @@ -10,6 +10,8 @@ use std::{ time::{Duration, SystemTime}, }; +use fs_err as fs; + use indexmap::IndexMap; use miette::Diagnostic; @@ -143,7 +145,7 @@ impl PyPiToCondaMapper { /// Check if a cached file is still valid. fn is_cache_valid(path: &Path) -> bool { - if let Ok(metadata) = std::fs::metadata(path) + if let Ok(metadata) = fs::metadata(path) && let Ok(modified) = metadata.modified() && let Ok(elapsed) = SystemTime::now().duration_since(modified) { @@ -161,7 +163,7 @@ impl PyPiToCondaMapper { return None; } - let content = std::fs::read_to_string(&cache_path).ok()?; + let content = fs::read_to_string(&cache_path).ok()?; serde_json::from_str(&content).ok() } @@ -172,11 +174,11 @@ impl PyPiToCondaMapper { }; if let Some(parent) = cache_path.parent() { - let _ = std::fs::create_dir_all(parent); + let _ = fs::create_dir_all(parent); } if let Ok(content) = serde_json::to_string(lookup) { - let _ = std::fs::write(cache_path, content); + let _ = fs::write(cache_path, content); } } diff --git a/crates/pixi-build-rattler-build/Cargo.toml b/crates/pixi-build-rattler-build/Cargo.toml index fc8c49adc4..771cb38ef1 100644 --- a/crates/pixi-build-rattler-build/Cargo.toml +++ b/crates/pixi-build-rattler-build/Cargo.toml @@ -10,6 +10,7 @@ rustls-tls = ["pixi-build-backend/rustls-tls", "rattler-build/rustls-tls"] [dependencies] async-trait = { workspace = true } +fs-err = { workspace = true } miette = { workspace = true } pathdiff = { workspace = true } rattler-build = { workspace = true } diff --git a/crates/pixi-build-rattler-build/src/protocol.rs b/crates/pixi-build-rattler-build/src/protocol.rs index ab956320c6..63518955d8 100644 --- a/crates/pixi-build-rattler-build/src/protocol.rs +++ b/crates/pixi-build-rattler-build/src/protocol.rs @@ -616,6 +616,7 @@ pub(crate) fn default_capabilities() -> BackendCapabilities { mod tests { use std::collections::BTreeMap; + use fs_err as fs; use pixi_build_backend::utils::test::conda_outputs_snapshot; use pixi_build_types::{VariantValue, procedures::initialize::InitializeParams}; use rattler_build::console_utils::LoggingOutputHandler; @@ -939,7 +940,7 @@ numpy: async fn test_recipe_discovery() { let tmp = tempdir().unwrap(); let recipe = tmp.path().join("recipe.yaml"); - std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + fs::write(&recipe, FAKE_RECIPE).unwrap(); assert_eq!( try_initialize(&tmp.path().join("pixi.toml")) .await @@ -955,7 +956,7 @@ numpy: let tmp = tempdir().unwrap(); let recipe = tmp.path().join("recipe.yml"); - std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + fs::write(&recipe, FAKE_RECIPE).unwrap(); assert_eq!( try_initialize(&tmp.path().join("pixi.toml")) .await @@ -972,8 +973,8 @@ numpy: let tmp = tempdir().unwrap(); let recipe_dir = tmp.path().join("recipe"); let recipe = recipe_dir.join("recipe.yaml"); - std::fs::create_dir(recipe_dir).unwrap(); - std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + fs::create_dir(&recipe_dir).unwrap(); + fs::write(&recipe, FAKE_RECIPE).unwrap(); assert_eq!( try_initialize(&tmp.path().join("pixi.toml")) .await @@ -986,8 +987,8 @@ numpy: let tmp = tempdir().unwrap(); let recipe_dir = tmp.path().join("recipe"); let recipe = recipe_dir.join("recipe.yml"); - std::fs::create_dir(recipe_dir).unwrap(); - std::fs::write(&recipe, FAKE_RECIPE).unwrap(); + fs::create_dir(&recipe_dir).unwrap(); + fs::write(&recipe, FAKE_RECIPE).unwrap(); assert_eq!( try_initialize(&tmp.path().join("pixi.toml")) .await @@ -1042,10 +1043,6 @@ numpy: #[test] fn test_build_input_globs_with_tempdirs() { - use std::fs; - - use tempfile::tempdir; - // Create a temp directory to act as the base let base_dir = tempdir().unwrap(); let base_path = base_dir.path(); @@ -1081,10 +1078,6 @@ numpy: #[test] fn test_build_input_globs_two_folders_in_tempdir() { - use std::fs; - - use tempfile::tempdir; - // Create a temp directory let temp = tempdir().unwrap(); let temp_path = temp.path(); @@ -1112,9 +1105,7 @@ numpy: #[test] fn test_build_input_globs_relative_source() { - use std::{fs, path::PathBuf}; - - use tempfile::tempdir; + use std::path::PathBuf; // Create a temp directory to act as the base let base_dir = tempdir().unwrap(); @@ -1168,10 +1159,6 @@ numpy: #[test] fn test_build_input_globs_includes_extra_globs() { - use std::fs; - - use tempfile::tempdir; - // Create a temp directory to act as the base let base_dir = tempdir().unwrap(); let base_path = base_dir.path(); diff --git a/crates/pixi-build-rust/src/metadata.rs b/crates/pixi-build-rust/src/metadata.rs index fddd51cbe9..58b8aa8751 100644 --- a/crates/pixi-build-rust/src/metadata.rs +++ b/crates/pixi-build-rust/src/metadata.rs @@ -357,8 +357,7 @@ impl MetadataProvider for CargoMetadataProvider { #[cfg(test)] mod tests { - use std::fs; - + use fs_err as fs; use pixi_build_backend::generated_recipe::MetadataProvider; use tempfile::TempDir; From 077d2210c0e9f846ff5ea9a630c1b7d736cd3834 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 11:14:35 +0100 Subject: [PATCH 34/70] Fix cargo deny --- crates/pixi-build-backend/Cargo.toml | 1 + crates/pixi-build-cmake/Cargo.toml | 1 + crates/pixi-build-mojo/Cargo.toml | 1 + crates/pixi-build-python/Cargo.toml | 1 + crates/pixi-build-rattler-build/Cargo.toml | 1 + crates/recipe-stage0/Cargo.toml | 1 + 6 files changed, 6 insertions(+) diff --git a/crates/pixi-build-backend/Cargo.toml b/crates/pixi-build-backend/Cargo.toml index 7ed5246d9d..9c5e1c2684 100644 --- a/crates/pixi-build-backend/Cargo.toml +++ b/crates/pixi-build-backend/Cargo.toml @@ -1,5 +1,6 @@ [package] edition.workspace = true +license.workspace = true name = "pixi-build-backend" version = "0.1.5" diff --git a/crates/pixi-build-cmake/Cargo.toml b/crates/pixi-build-cmake/Cargo.toml index 99427c75ef..d7d67603ed 100644 --- a/crates/pixi-build-cmake/Cargo.toml +++ b/crates/pixi-build-cmake/Cargo.toml @@ -1,6 +1,7 @@ [package] description = "CMake build backend for Pixi" edition.workspace = true +license.workspace = true name = "pixi-build-cmake" version = "0.3.7" diff --git a/crates/pixi-build-mojo/Cargo.toml b/crates/pixi-build-mojo/Cargo.toml index fbafdcb260..c8dcdf8e56 100644 --- a/crates/pixi-build-mojo/Cargo.toml +++ b/crates/pixi-build-mojo/Cargo.toml @@ -1,5 +1,6 @@ [package] edition.workspace = true +license.workspace = true name = "pixi-build-mojo" version = "0.1.7" diff --git a/crates/pixi-build-python/Cargo.toml b/crates/pixi-build-python/Cargo.toml index 7d36cb2489..2788f3135d 100644 --- a/crates/pixi-build-python/Cargo.toml +++ b/crates/pixi-build-python/Cargo.toml @@ -1,5 +1,6 @@ [package] edition.workspace = true +license.workspace = true name = "pixi-build-python" version = "0.4.4" diff --git a/crates/pixi-build-rattler-build/Cargo.toml b/crates/pixi-build-rattler-build/Cargo.toml index 771cb38ef1..b718100c9e 100644 --- a/crates/pixi-build-rattler-build/Cargo.toml +++ b/crates/pixi-build-rattler-build/Cargo.toml @@ -1,5 +1,6 @@ [package] edition.workspace = true +license.workspace = true name = "pixi-build-rattler-build" version = "0.3.6" diff --git a/crates/recipe-stage0/Cargo.toml b/crates/recipe-stage0/Cargo.toml index 70b5dbf771..9cda9a60c8 100644 --- a/crates/recipe-stage0/Cargo.toml +++ b/crates/recipe-stage0/Cargo.toml @@ -1,5 +1,6 @@ [package] edition.workspace = true +license.workspace = true name = "recipe-stage0" version = "0.1.1" From d7845fa1b92c2aeb9f765aa1cc109ea14ccccee3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 12:15:05 +0100 Subject: [PATCH 35/70] Add backend release workflow --- .github/workflows/backends-release.yml | 185 ++++++++++++ .../scripts/generate-matrix.py | 270 ++++++++++++++++++ pixi.toml | 19 ++ 3 files changed, 474 insertions(+) create mode 100644 .github/workflows/backends-release.yml create mode 100644 pixi-build-backends/scripts/generate-matrix.py diff --git a/.github/workflows/backends-release.yml b/.github/workflows/backends-release.yml new file mode 100644 index 0000000000..1e20652242 --- /dev/null +++ b/.github/workflows/backends-release.yml @@ -0,0 +1,185 @@ +name: "Backends - Conda Packages" + +on: + workflow_dispatch: + inputs: + push_to_channel: + description: "Push packages to conda channel after build" + required: false + default: true + type: boolean + package_name: + description: "Build specific package only (optional)" + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: true + +permissions: + id-token: write + contents: read + attestations: write + +jobs: + generate-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set_version.outputs.matrix }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 + with: + environments: backends-release + - name: Extract versions + id: set_version + run: | + # extract names and versions from cargo metadata + # and generate a matrix entries for the build job + echo "Package name input: '${{ github.event.inputs.package_name }}'" + if [ -n "${{ github.event.inputs.package_name }}" ]; then + echo "Building specific package: ${{ github.event.inputs.package_name }}" + MATRIX_JSON=$(pixi run -e backends-release generate-matrix --package "${{ github.event.inputs.package_name }}") + else + echo "Building all packages" + MATRIX_JSON=$(pixi run -e backends-release generate-matrix) + fi + + echo "Generated matrix: $MATRIX_JSON" + echo "matrix=$MATRIX_JSON" >> $GITHUB_OUTPUT + + build: + needs: generate-matrix + env: + REPO_NAME: "prefix-dev/pixi" + strategy: + matrix: + bins: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }} + fail-fast: false + runs-on: ${{ matrix.bins.os }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 + with: + environments: backends-release + - name: Enable long paths (Windows) + if: ${{ matrix.bins.os == 'windows-latest' }} + run: | + git config --global core.longpaths true + shell: bash + - name: Set environment variable for recipe version + shell: bash + run: | + echo "${{ matrix.bins.env_name }}=${{ matrix.bins.version }}" >> $GITHUB_ENV + - name: Build ${{ matrix.bins.bin }} + shell: bash + env: + RATTLER_BUILD_ENABLE_GITHUB_INTEGRATION: "true" + RATTLER_BUILD_COLOR: "always" + run: | + pixi run -e backends-release build-recipe-ci $RUNNER_TEMP pixi-build-backends/recipe/${{ matrix.bins.bin }}/recipe.yaml ${{ matrix.bins.target }} + + - uses: actions/attest@daf44fb950173508f38bd2406030372c1d1162b1 # v3.0.0 + id: attest + with: + subject-path: "${{ runner.temp }}/**/*.conda" + predicate-type: "https://schemas.conda.org/attestations-publish-1.schema.json" + predicate: "{\"targetChannel\": \"https://prefix.dev/pixi-build-backends\"}" + + - name: Generate attestation for conda package + shell: bash + run: | + # Convert Windows paths to Unix-style for bash compatibility + RUNNER_TEMP_UNIX=$(echo "${{ runner.temp }}" | sed 's|\\|/|g') + BUNDLE_PATH_UNIX=$(echo "${{ steps.attest.outputs.bundle-path }}" | sed 's|\\|/|g') + + # Find the actual conda package file (search recursively) + CONDA_PACKAGE=$(find "$RUNNER_TEMP_UNIX" -name "*.conda" -type f | head -1) + if [ -n "$CONDA_PACKAGE" ]; then + # Extract just the filename without path + PACKAGE_NAME=$(basename "$CONDA_PACKAGE") + # Create signature filename by replacing .conda with .sig + SIG_NAME="${PACKAGE_NAME%.conda}.sig" + # Get the directory where the conda package is located + PACKAGE_DIR=$(dirname "$CONDA_PACKAGE") + # Move the attestation bundle to the same directory as the conda package + mv "$BUNDLE_PATH_UNIX" "$PACKAGE_DIR/$SIG_NAME" + echo "Created attestation: $PACKAGE_DIR/$SIG_NAME" + else + echo "Error: No conda package found in $RUNNER_TEMP_UNIX" + exit 1 + fi + + - name: Upload build artifacts + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 + with: + name: conda-packages-${{ matrix.bins.bin }}-${{ matrix.bins.target }} + path: | + ${{ runner.temp }}/**/*.conda + ${{ runner.temp }}/**/*.sig + + - name: Kill any lingering processes (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + # Kill any Python processes + Get-Process python* -ErrorAction SilentlyContinue | Stop-Process -Force + + # Kill any processes from the pixi environment + $pixiPath = "${{ github.workspace }}\.pixi\envs\backends-release\bin" + Get-Process | Where-Object { $_.Path -like "$pixiPath*" } | Stop-Process -Force + + # Wait a moment for handles to be released + Start-Sleep -Seconds 2 + + aggregate: + needs: build + runs-on: ubuntu-latest + strategy: + matrix: + target: [linux-64, linux-aarch64, linux-ppc64le, win-64, osx-64, osx-arm64] + steps: + - name: Download conda package artifacts for ${{ matrix.target }} + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + pattern: conda-packages-*-${{ matrix.target }} + path: conda-artifacts-${{ matrix.target }} + merge-multiple: true + - name: Upload aggregated conda packages for ${{ matrix.target }} + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 + with: + name: conda-packages-${{ matrix.target }} + path: conda-artifacts-${{ matrix.target }}/**/*.conda + + upload: + needs: aggregate + runs-on: ubuntu-latest + if: ${{ github.event.inputs.push_to_channel == 'true' && github.repository == 'prefix-dev/pixi' }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - name: Download all conda packages + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + pattern: conda-packages-* + path: conda-packages + merge-multiple: true + run-id: ${{ github.run_id }} + - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 + with: + environments: backends-release + - name: Upload packages + shell: bash + run: | + for file in conda-packages/**/*.conda; do + echo "Uploading ${file}" + # Find corresponding attestation file + ATTESTATION_FILE="${file%.conda}.sig" + if [ -f "$ATTESTATION_FILE" ]; then + echo "Found attestation: $ATTESTATION_FILE" + pixi run -e backends-release rattler-build upload prefix -c pixi-build-backends "$file" --attestation "$ATTESTATION_FILE" + else + echo "Warning: No attestation found for $file" + pixi run -e backends-release rattler-build upload prefix -c pixi-build-backends "$file" + fi + done diff --git a/pixi-build-backends/scripts/generate-matrix.py b/pixi-build-backends/scripts/generate-matrix.py new file mode 100644 index 0000000000..7abec061ef --- /dev/null +++ b/pixi-build-backends/scripts/generate-matrix.py @@ -0,0 +1,270 @@ +import subprocess +import json +import re +import sys +import tomllib +from datetime import datetime +from pathlib import Path + + +def get_git_tags(): + try: + result = subprocess.run( + ["git", "tag", "--points-at", "HEAD"], + capture_output=True, + text=True, + check=True, + ) + return result.stdout.strip().splitlines() + except subprocess.CalledProcessError: + # if no tags are found, return an empty list + return [] + + +def get_git_short_hash(): + """Get the short git hash of the current HEAD""" + result = subprocess.run( + ["git", "rev-parse", "--short=7", "HEAD"], + capture_output=True, + text=True, + check=True, + ) + return result.stdout.strip() + + +def get_current_date(): + """Get current date in yyyymmdd format""" + return datetime.now().strftime("%Y%m%d") + + +def extract_name_and_version_from_tag(tag): + # Handle both Rust packages and Python package + rust_match = re.match(r"(pixi-build-[a-zA-Z-]+)-v(\d+\.\d+\.\d+)", tag) + python_match = re.match(r"(py-pixi-build-backend)-v(\d+\.\d+\.\d+)", tag) + + if rust_match: + return rust_match.group(1), rust_match.group(2) + elif python_match: + return python_match.group(1), python_match.group(2) + + raise ValueError( + f"Invalid Git tag format: {tag}. Expected format: pixi-build-[name]-v[version]" + ) + + +def generate_matrix(filter_package_name=None): + # Find the repo root (where Cargo.toml is) + script_dir = Path(__file__).parent + repo_root = script_dir.parent.parent # pixi-build-backends/scripts -> pixi/ + + # Run cargo metadata from the repo root + result = subprocess.run( + ["cargo", "metadata", "--format-version=1", "--no-deps"], + capture_output=True, + text=True, + check=True, + cwd=repo_root, + ) + cargo_metadata = json.loads(result.stdout) + + # Get all packages with binary targets that are pixi-build backends + all_packages = [] + + if "packages" in cargo_metadata: + for package in cargo_metadata["packages"]: + # Only include pixi-build-* packages with binary targets + if not package["name"].startswith("pixi-build-"): + continue + + has_binary = any( + target["kind"][0] == "bin" for target in package.get("targets", []) + ) + + if has_binary: + all_packages.append( + {"name": package["name"], "version": package["version"], "type": "rust"} + ) + + # Add py-pixi-build-backend manually since it's in a separate directory + py_backend_cargo = repo_root / "pixi-build-backends" / "py-pixi-build-backend" / "Cargo.toml" + if py_backend_cargo.exists(): + with open(py_backend_cargo, "rb") as f: + cargo_toml = tomllib.load(f) + all_packages.append( + { + "name": "py-pixi-build-backend", + "version": cargo_toml["package"]["version"], + "type": "python", + } + ) + + # Add pixi-build-ros manually since it's a Python package in backends/ + ros_pyproject = repo_root / "pixi-build-backends" / "backends" / "pixi-build-ros" / "pyproject.toml" + if ros_pyproject.exists(): + with open(ros_pyproject, "rb") as f: + pyproject_toml = tomllib.load(f) + all_packages.append( + { + "name": "pixi-build-ros", + "version": pyproject_toml["project"]["version"], + "type": "python", + } + ) + + # Filter packages by name if specified + if filter_package_name: + available_packages = [pkg["name"] for pkg in all_packages] + filtered_packages = [ + pkg for pkg in all_packages if pkg["name"] == filter_package_name + ] + if not filtered_packages: + raise ValueError( + f"Package '{filter_package_name}' not found. Available packages: {', '.join(available_packages)}" + ) + all_packages = filtered_packages + print(f"Filtering to package: {filter_package_name}", file=sys.stderr) + + # this is to overcome the issue of matrix generation from github actions side + # https://github.com/orgs/community/discussions/67591 + targets = [ + {"target": "linux-64", "os": "ubuntu-latest"}, + {"target": "linux-aarch64", "os": "ubuntu-latest"}, + {"target": "linux-ppc64le", "os": "ubuntu-latest"}, + {"target": "win-64", "os": "windows-latest"}, + {"target": "osx-64", "os": "macos-15-intel"}, + {"target": "osx-arm64", "os": "macos-15"}, + ] + + def get_targets_for_package(package_name, all_targets): + """Get the appropriate targets for a package. Noarch packages only build on linux-64.""" + if package_name == "pixi-build-ros": + return [t for t in all_targets if t["target"] == "linux-64"] + else: + return all_targets + + git_tags = get_git_tags() + is_untagged_build = len(git_tags) == 0 + + # Extract bin names, versions, and generate env and recipe names + matrix = [] + + if not all_packages: + raise ValueError("No packages found") + + if is_untagged_build: + # Untagged build - include all packages with auto-versioning + date_suffix = get_current_date() + git_hash = get_git_short_hash() + + print( + f"Building all packages for untagged build with date suffix: {date_suffix}, git hash: {git_hash}", + file=sys.stderr, + ) + + package_names = [] + for package in all_packages: + package_names.append(package["name"]) + # Create auto-version: original_version.ddmmyyyy.git_hash + auto_version = f"{package['version']}.{date_suffix}.{git_hash}" + + # Generate environment variable name + if package["name"] == "py-pixi-build-backend": + env_name = "PY_PIXI_BUILD_BACKEND_VERSION" + elif package["name"] == "pixi-build-ros": + env_name = "PIXI_BUILD_ROS_VERSION" + else: + env_name = f"{package['name'].replace('-', '_').upper()}_VERSION" + + for target in get_targets_for_package(package["name"], targets): + matrix.append( + { + "bin": package["name"], + "target": target["target"], + "version": auto_version, + "env_name": env_name, + "os": target["os"], + } + ) + + if not package_names: + raise RuntimeError("No packages found for untagged build") + + print( + f"Found {len(package_names)} packages: {', '.join(package_names)}", + file=sys.stderr, + ) + else: + # Tag-based build - only include tagged packages + # verify that the tags match the package versions + tagged_packages = {tag: False for tag in git_tags} + + for package in all_packages: + package_tagged = False + for git_tag in git_tags: + # verify that the git tag matches the package version + tag_name, tag_version = extract_name_and_version_from_tag(git_tag) + if package["name"] != tag_name: + continue # Skip packages that do not match the tag + + if package["version"] != tag_version: + raise ValueError( + f"Version mismatch: Git tag version {tag_version} does not match package version {package['version']} for {package['name']}" + ) + + tagged_packages[git_tag] = package + package_tagged = True + + # verify that tags exist for this HEAD + # and that the package has been tagged + if tagged_packages and not package_tagged: + continue + + # Generate environment variable name + if package["name"] == "py-pixi-build-backend": + env_name = "PY_PIXI_BUILD_BACKEND_VERSION" + elif package["name"] == "pixi-build-ros": + env_name = "PIXI_BUILD_ROS_VERSION" + else: + env_name = f"{package['name'].replace('-', '_').upper()}_VERSION" + + for target in get_targets_for_package(package["name"], targets): + matrix.append( + { + "bin": package["name"], + "target": target["target"], + "version": package["version"], + "env_name": env_name, + "os": target["os"], + } + ) + + # Only validate tags for tag-based builds + if not is_untagged_build and git_tags: + for git_tag, has_a_package in tagged_packages.items(): + if not has_a_package: + raise ValueError( + f"Git tag {git_tag} does not match any package in Cargo.toml" + ) + + if not matrix: + if is_untagged_build: + raise RuntimeError("No packages found to build for untagged build") + else: + raise RuntimeError("No tagged packages found to build") + + matrix_json = json.dumps(matrix) + + # Debug output to stderr so it doesn't interfere with matrix JSON + print(f"Generated matrix with {len(matrix)} entries", file=sys.stderr) + + print(matrix_json) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description="Generate build matrix for packages") + parser.add_argument("--package", help="Filter to specific package name") + args = parser.parse_args() + + generate_matrix(args.package) diff --git a/pixi.toml b/pixi.toml index cef76e922c..8ad1a5b0ec 100644 --- a/pixi.toml +++ b/pixi.toml @@ -273,6 +273,24 @@ description = "Build build-backends used for testing purposes" [feature.dist.dependencies] zig = ">=0.15.1,<0.16" +# +# Feature for building and releasing pixi-build-backends +# +[feature.backends-release.dependencies] +rattler-build = ">=0.55.0,<0.56" +python = ">=3.12,<4" +sccache = ">=0.12,<0.13" + +[feature.backends-release.activation.env] +RUSTC_WRAPPER = "sccache" + +[feature.backends-release.tasks] +generate-matrix = { cmd = "python pixi-build-backends/scripts/generate-matrix.py", description = "Generate build matrix for backends release" } + +[feature.backends-release.tasks.build-recipe-ci] +cmd = "rattler-build build --test native --channel https://prefix.dev/pixi-build-backends --channel https://prefix.dev/conda-forge --variant-config pixi-build-backends/recipe/variants.yaml --output-dir={{ output_dir }} --recipe {{ recipe }}{% if target_platform is defined and target_platform %} --target-platform {{ target_platform }}{% endif %}" +args = ["output_dir", "recipe", { arg = "target_platform", default = "" }] +description = "Build a backend recipe for CI" # Feature for native-certs testing [feature.native-certs-test.dependencies] @@ -320,6 +338,7 @@ schema = { features = [ test-export = { features = ["micromamba"], no-default-feature = true } test-native-certs = { features = ["native-certs-test"] } trampoline = { features = ["trampoline"], no-default-feature = true } +backends-release = { features = ["backends-release"], no-default-feature = true } # From 7df280ccb24ef9314f1e306ab50043baef1a11d9 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:35:57 +0100 Subject: [PATCH 36/70] Build backends for testing but not release --- .github/workflows/ci.yml | 35 ++++++++++++---------- crates/pixi-build-cmake/Cargo.toml | 3 ++ crates/pixi-build-mojo/Cargo.toml | 3 ++ crates/pixi-build-python/Cargo.toml | 3 ++ crates/pixi-build-rattler-build/Cargo.toml | 3 ++ crates/pixi-build-rust/Cargo.toml | 3 ++ 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b9ebef89a..667e4e616c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -296,16 +296,17 @@ jobs: - name: "Build" run: > cargo build - -p pixi --locked --target x86_64-unknown-linux-musl --profile $CARGO_BUILD_PROFILE - --features self_update + --features pixi/self_update - name: "Upload binary" uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: pixi-linux-x86_64-${{ github.sha }} - path: ./target/x86_64-unknown-linux-musl/${{ env.CARGO_BUILD_PROFILE }}/pixi + path: | + ./target/x86_64-unknown-linux-musl/${{ env.CARGO_BUILD_PROFILE }}/pixi + ./target/x86_64-unknown-linux-musl/${{ env.CARGO_BUILD_PROFILE }}/pixi-build-* retention-days: 14 build-binary-macos-aarch64: @@ -323,15 +324,16 @@ jobs: - name: "Build" run: > cargo build - -p pixi --locked --profile $CARGO_BUILD_PROFILE - --features self_update + --features pixi/self_update - name: "Upload binary" uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: pixi-macos-aarch64-${{ github.sha }} - path: ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi + path: | + ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi + ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi-build-* retention-days: 14 build-binary-macos-x86_64: @@ -349,15 +351,16 @@ jobs: - name: "Build" run: > cargo build - -p pixi --locked --profile $CARGO_BUILD_PROFILE - --features self_update + --features pixi/self_update - name: "Upload binary" uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: pixi-macos-x86_64-${{ github.sha }} - path: ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi + path: | + ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi + ./target/${{ env.CARGO_BUILD_PROFILE }}/pixi-build-* retention-days: 14 build-binary-windows-x86_64: @@ -382,15 +385,16 @@ jobs: working-directory: ${{ env.PIXI_WORKSPACE }} run: > cargo build - -p pixi --locked --profile $env:CARGO_BUILD_PROFILE - --features self_update + --features pixi/self_update - name: "Upload binary" uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: pixi-windows-x86_64-${{ github.sha }} - path: ${{ env.PIXI_WORKSPACE }}/target/${{ env.CARGO_BUILD_PROFILE }}/pixi.exe + path: | + ${{ env.PIXI_WORKSPACE }}/target/${{ env.CARGO_BUILD_PROFILE }}/pixi.exe + ${{ env.PIXI_WORKSPACE }}/target/${{ env.CARGO_BUILD_PROFILE }}/pixi-build-*.exe retention-days: 14 build-binary-windows-aarch64: @@ -418,16 +422,17 @@ jobs: working-directory: ${{ env.PIXI_WORKSPACE }} run: > cargo build - -p pixi --locked --target aarch64-pc-windows-msvc --profile $env:CARGO_BUILD_PROFILE - --features self_update + --features pixi/self_update - name: "Upload binary" uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: pixi-windows-aarch64-${{ github.sha }} - path: ${{ env.PIXI_WORKSPACE }}/target/aarch64-pc-windows-msvc/${{ env.CARGO_BUILD_PROFILE }}/pixi.exe + path: | + ${{ env.PIXI_WORKSPACE }}/target/aarch64-pc-windows-msvc/${{ env.CARGO_BUILD_PROFILE }}/pixi.exe + ${{ env.PIXI_WORKSPACE }}/target/aarch64-pc-windows-msvc/${{ env.CARGO_BUILD_PROFILE }}/pixi-build-*.exe retention-days: 14 # diff --git a/crates/pixi-build-cmake/Cargo.toml b/crates/pixi-build-cmake/Cargo.toml index d7d67603ed..f6d0dcbf8f 100644 --- a/crates/pixi-build-cmake/Cargo.toml +++ b/crates/pixi-build-cmake/Cargo.toml @@ -5,6 +5,9 @@ license.workspace = true name = "pixi-build-cmake" version = "0.3.7" +[package.metadata.dist] +dist = false + [features] default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] diff --git a/crates/pixi-build-mojo/Cargo.toml b/crates/pixi-build-mojo/Cargo.toml index c8dcdf8e56..987d9525e9 100644 --- a/crates/pixi-build-mojo/Cargo.toml +++ b/crates/pixi-build-mojo/Cargo.toml @@ -4,6 +4,9 @@ license.workspace = true name = "pixi-build-mojo" version = "0.1.7" +[package.metadata.dist] +dist = false + [features] default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] diff --git a/crates/pixi-build-python/Cargo.toml b/crates/pixi-build-python/Cargo.toml index 2788f3135d..2905af279d 100644 --- a/crates/pixi-build-python/Cargo.toml +++ b/crates/pixi-build-python/Cargo.toml @@ -4,6 +4,9 @@ license.workspace = true name = "pixi-build-python" version = "0.4.4" +[package.metadata.dist] +dist = false + [features] default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls"] diff --git a/crates/pixi-build-rattler-build/Cargo.toml b/crates/pixi-build-rattler-build/Cargo.toml index b718100c9e..1b6dab2bd1 100644 --- a/crates/pixi-build-rattler-build/Cargo.toml +++ b/crates/pixi-build-rattler-build/Cargo.toml @@ -4,6 +4,9 @@ license.workspace = true name = "pixi-build-rattler-build" version = "0.3.6" +[package.metadata.dist] +dist = false + [features] default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls", "rattler-build/native-tls"] diff --git a/crates/pixi-build-rust/Cargo.toml b/crates/pixi-build-rust/Cargo.toml index ba1c5131b2..a184f3884d 100644 --- a/crates/pixi-build-rust/Cargo.toml +++ b/crates/pixi-build-rust/Cargo.toml @@ -7,6 +7,9 @@ name = "pixi-build-rust" repository.workspace = true version = "0.4.4" +[package.metadata.dist] +dist = false + [features] default = ["rustls-tls"] native-tls = ["pixi-build-backend/native-tls"] From 6e9e8003176e68dbc49a2983063ade288bbb906e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:37:04 +0100 Subject: [PATCH 37/70] Make sure Windows test failures are correctly displayed --- .github/workflows/backends-ros.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml index 85ccd758a9..8aed217313 100644 --- a/.github/workflows/backends-ros.yml +++ b/.github/workflows/backends-ros.yml @@ -16,6 +16,9 @@ concurrency: permissions: contents: read +env: + PYTHONIOENCODING: utf-8 + jobs: test: name: Test the pixi-build-ros package From 6c41b57b2f3bc5d73c1e69c124be55f62fbc9ac0 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:41:06 +0100 Subject: [PATCH 38/70] Update pixi.lock --- pixi.lock | 319 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) diff --git a/pixi.lock b/pixi.lock index 7505a97c38..a1aaaecea9 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,5 +1,126 @@ version: 6 environments: + backends-release: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/sccache-0.12.0-he64ecbb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/sccache-0.12.0-hb434046_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sccache-0.12.0-h9113d71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sccache-0.12.0-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sccache-0.12.0-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda default: channels: - url: https://prefix.dev/conda-forge/ @@ -11042,6 +11163,33 @@ packages: size: 36768932 timestamp: 1764758363259 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + build_number: 100 + sha256: a120fb2da4e4d51dd32918c149b04a08815fd2bd52099dad1334647984bb07f1 + md5: 1cef1236a05c3a98f68c33ae9425f656 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 36790521 + timestamp: 1765021515427 + python_site_packages_path: lib/python3.14/site-packages - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda build_number: 100 sha256: bbb0b341c3ce460d02087e1c5e0d3bb814c270f4ae61f82c0e2996ec3902d301 @@ -11144,6 +11292,32 @@ packages: size: 37149339 timestamp: 1764757159033 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + build_number: 100 + sha256: 41adf6ee7a953ef4f35551a4a910a196b0a75e1ded458df5e73ef321863cb3f2 + md5: 432459e6961a5bc4cfe7cd080aee721a + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 37217543 + timestamp: 1765020325291 + python_site_packages_path: lib/python3.14/site-packages - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.11-h17c18a5_100_cp313.conda build_number: 100 sha256: 58e23beaf3174a809c785900477c37df9f88993b5a3ccd0d76d57d6688a1be37 @@ -11238,6 +11412,30 @@ packages: size: 13010651 timestamp: 1764759848428 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda + build_number: 100 + sha256: cd9d41368cb7c531e82fbfdb01e274efbb176c464b59ec619538dd2580602191 + md5: 48921d5efb314c3e628089fc6e27e54a + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 14323056 + timestamp: 1765026108189 + python_site_packages_path: lib/python3.14/site-packages - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda build_number: 100 sha256: c476f4e9b6d97c46b496b442878924868a54e5727251549ebfc82027aa52af68 @@ -11332,6 +11530,30 @@ packages: size: 13623264 timestamp: 1764758008135 python_site_packages_path: lib/python3.14/site-packages +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + build_number: 100 + sha256: 1a93782e90b53e04c2b1a50a0f8bf0887936649d19dba6a05b05c4b44dae96b7 + md5: 14f15ab0d31a2ee5635aa56e77132594 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 13575758 + timestamp: 1765021280625 + python_site_packages_path: lib/python3.14/site-packages - conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda build_number: 100 sha256: 0ee0402368783e1fad10025719530499c517a3dbbdfbe18351841d9b7aef1d6a @@ -11426,6 +11648,30 @@ packages: size: 16934169 timestamp: 1764756783162 python_site_packages_path: Lib/site-packages +- conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + build_number: 100 + sha256: 6857d7c97cc71fe9ba298dcb1d3b66cc7df425132ab801babd655faa3df48f32 + md5: c3c73414d5ae3f543c531c978d9cc8b8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 16833248 + timestamp: 1765020224759 + python_site_packages_path: Lib/site-packages - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda sha256: b2df2264f0936b9f95e13ac79b596fac86d3b649812da03a61543e11e669714c md5: ed5d43e9ef92cc2a9872f9bdfe94b984 @@ -12156,6 +12402,67 @@ packages: license_family: MIT size: 38036262 timestamp: 1758350135017 +- conda: https://prefix.dev/conda-forge/linux-64/sccache-0.12.0-he64ecbb_0.conda + sha256: c2fb2cb9eb41ead52001079524fb4aa00dac89cbed2cb80e9db835cd56ff7cd4 + md5: 54f0b80bf39017285fdfa997b7426772 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + size: 6164069 + timestamp: 1761009066321 +- conda: https://prefix.dev/conda-forge/linux-aarch64/sccache-0.12.0-hb434046_0.conda + sha256: a442b109c84762303578645f61df2339c3df0715e51224bd35c71e486b8b3b2d + md5: a6e1d3d1cce788b667247554d01ddf4e + depends: + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + size: 6095971 + timestamp: 1761009205819 +- conda: https://prefix.dev/conda-forge/osx-64/sccache-0.12.0-h9113d71_0.conda + sha256: bbccef5e1f01018e9cd3d945d4087871b6c4671a1cc1c2b8029d8a0fae27652e + md5: 2e03719800e8fc3cb410713f9ead2bce + depends: + - __osx >=10.13 + constrains: + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + size: 6091637 + timestamp: 1761009098816 +- conda: https://prefix.dev/conda-forge/osx-arm64/sccache-0.12.0-h8d80559_0.conda + sha256: 8df01d91fb63976af4729bf73f69502faebdd00a9da263eb5b8abce5fcfca765 + md5: e2de1d1d6f88737de39383bb59a653a7 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + size: 5621989 + timestamp: 1761009099344 +- conda: https://prefix.dev/conda-forge/win-64/sccache-0.12.0-h18a1a76_0.conda + sha256: cbaceb4142289bb091530bf21636de18cd59348f6286dbf1c75e72cec680f07c + md5: 088add89deecd42db5b8aaf35708183c + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: Apache-2.0 + license_family: APACHE + size: 6628354 + timestamp: 1761009096808 - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda sha256: e2341ab1cf6128bde5037a6ba3c48ee33abc6bbe8d3db10f5f73f24b9f28b83c md5: 1add6f6b99191efab14f16e6aa9b6461 @@ -13700,3 +14007,15 @@ packages: license_family: BSD size: 359369 timestamp: 1764567098655 +- conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 388453 + timestamp: 1764777142545 From a8afc9092743c099f03b795e110f97fc0a6efc12 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:45:30 +0100 Subject: [PATCH 39/70] Fix windows long path issues --- .../tests/integration/conftest.py | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py index fe762877dd..5d42729277 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py @@ -1,5 +1,9 @@ """Pytest fixtures for pixi-build-ros integration tests.""" +import shutil +import sys +import tempfile +from collections.abc import Iterator from pathlib import Path import pytest @@ -44,6 +48,20 @@ def pixi() -> Path: @pytest.fixture -def tmp_pixi_workspace(tmp_path: Path) -> Path: - """Create a temporary workspace for tests.""" - return tmp_path +def tmp_pixi_workspace(tmp_path: Path) -> Iterator[Path]: + """Create a temporary workspace for tests. + + On Windows, uses a shorter path to avoid MAX_PATH (260 char) limitations. + The build process creates deeply nested paths that can exceed this limit. + """ + if sys.platform == "win32": + # Use a short base path on Windows to avoid MAX_PATH issues + short_base = Path(tempfile.gettempdir()) / "pxros" + short_base.mkdir(parents=True, exist_ok=True) + workspace = Path(tempfile.mkdtemp(dir=short_base)) + try: + yield workspace + finally: + shutil.rmtree(workspace, ignore_errors=True) + else: + yield tmp_path From 0ef640218a07cb452b7ccd58ce4a35c71e749b8f Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:48:10 +0100 Subject: [PATCH 40/70] Lint --- pixi-build-backends/scripts/generate-matrix.py | 16 ++++++---------- pixi.toml | 8 +++++--- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/pixi-build-backends/scripts/generate-matrix.py b/pixi-build-backends/scripts/generate-matrix.py index 7abec061ef..1ee42a1151 100644 --- a/pixi-build-backends/scripts/generate-matrix.py +++ b/pixi-build-backends/scripts/generate-matrix.py @@ -76,9 +76,7 @@ def generate_matrix(filter_package_name=None): if not package["name"].startswith("pixi-build-"): continue - has_binary = any( - target["kind"][0] == "bin" for target in package.get("targets", []) - ) + has_binary = any(target["kind"][0] == "bin" for target in package.get("targets", [])) if has_binary: all_packages.append( @@ -99,7 +97,9 @@ def generate_matrix(filter_package_name=None): ) # Add pixi-build-ros manually since it's a Python package in backends/ - ros_pyproject = repo_root / "pixi-build-backends" / "backends" / "pixi-build-ros" / "pyproject.toml" + ros_pyproject = ( + repo_root / "pixi-build-backends" / "backends" / "pixi-build-ros" / "pyproject.toml" + ) if ros_pyproject.exists(): with open(ros_pyproject, "rb") as f: pyproject_toml = tomllib.load(f) @@ -114,9 +114,7 @@ def generate_matrix(filter_package_name=None): # Filter packages by name if specified if filter_package_name: available_packages = [pkg["name"] for pkg in all_packages] - filtered_packages = [ - pkg for pkg in all_packages if pkg["name"] == filter_package_name - ] + filtered_packages = [pkg for pkg in all_packages if pkg["name"] == filter_package_name] if not filtered_packages: raise ValueError( f"Package '{filter_package_name}' not found. Available packages: {', '.join(available_packages)}" @@ -242,9 +240,7 @@ def get_targets_for_package(package_name, all_targets): if not is_untagged_build and git_tags: for git_tag, has_a_package in tagged_packages.items(): if not has_a_package: - raise ValueError( - f"Git tag {git_tag} does not match any package in Cargo.toml" - ) + raise ValueError(f"Git tag {git_tag} does not match any package in Cargo.toml") if not matrix: if is_untagged_build: diff --git a/pixi.toml b/pixi.toml index 8ad1a5b0ec..57b7e5bc73 100644 --- a/pixi.toml +++ b/pixi.toml @@ -277,8 +277,8 @@ zig = ">=0.15.1,<0.16" # Feature for building and releasing pixi-build-backends # [feature.backends-release.dependencies] -rattler-build = ">=0.55.0,<0.56" python = ">=3.12,<4" +rattler-build = ">=0.55.0,<0.56" sccache = ">=0.12,<0.13" [feature.backends-release.activation.env] @@ -288,8 +288,8 @@ RUSTC_WRAPPER = "sccache" generate-matrix = { cmd = "python pixi-build-backends/scripts/generate-matrix.py", description = "Generate build matrix for backends release" } [feature.backends-release.tasks.build-recipe-ci] -cmd = "rattler-build build --test native --channel https://prefix.dev/pixi-build-backends --channel https://prefix.dev/conda-forge --variant-config pixi-build-backends/recipe/variants.yaml --output-dir={{ output_dir }} --recipe {{ recipe }}{% if target_platform is defined and target_platform %} --target-platform {{ target_platform }}{% endif %}" args = ["output_dir", "recipe", { arg = "target_platform", default = "" }] +cmd = "rattler-build build --test native --channel https://prefix.dev/pixi-build-backends --channel https://prefix.dev/conda-forge --variant-config pixi-build-backends/recipe/variants.yaml --output-dir={{ output_dir }} --recipe {{ recipe }}{% if target_platform is defined and target_platform %} --target-platform {{ target_platform }}{% endif %}" description = "Build a backend recipe for CI" # Feature for native-certs testing @@ -309,6 +309,9 @@ test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CAR # [environments] +backends-release = { features = [ + "backends-release", +], no-default-feature = true } default = { features = [ "build", "dev", @@ -338,7 +341,6 @@ schema = { features = [ test-export = { features = ["micromamba"], no-default-feature = true } test-native-certs = { features = ["native-certs-test"] } trampoline = { features = ["trampoline"], no-default-feature = true } -backends-release = { features = ["backends-release"], no-default-feature = true } # From d3c4e7121b2a59a0424efe9f20a3fa3a3500717e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 13:54:40 +0100 Subject: [PATCH 41/70] Fix zizmor lints --- .github/workflows/backends-release.yml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/backends-release.yml b/.github/workflows/backends-release.yml index 1e20652242..0ea75c3b9f 100644 --- a/.github/workflows/backends-release.yml +++ b/.github/workflows/backends-release.yml @@ -18,9 +18,7 @@ concurrency: cancel-in-progress: true permissions: - id-token: write contents: read - attestations: write jobs: generate-matrix: @@ -29,6 +27,8 @@ jobs: matrix: ${{ steps.set_version.outputs.matrix }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + persist-credentials: false - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: environments: backends-release @@ -37,10 +37,10 @@ jobs: run: | # extract names and versions from cargo metadata # and generate a matrix entries for the build job - echo "Package name input: '${{ github.event.inputs.package_name }}'" - if [ -n "${{ github.event.inputs.package_name }}" ]; then - echo "Building specific package: ${{ github.event.inputs.package_name }}" - MATRIX_JSON=$(pixi run -e backends-release generate-matrix --package "${{ github.event.inputs.package_name }}") + echo "Package name input: '${GITHUB_EVENT_INPUTS_PACKAGE_NAME}'" + if [ -n "${GITHUB_EVENT_INPUTS_PACKAGE_NAME}" ]; then + echo "Building specific package: ${GITHUB_EVENT_INPUTS_PACKAGE_NAME}" + MATRIX_JSON=$(pixi run -e backends-release generate-matrix --package "${GITHUB_EVENT_INPUTS_PACKAGE_NAME}") else echo "Building all packages" MATRIX_JSON=$(pixi run -e backends-release generate-matrix) @@ -48,9 +48,15 @@ jobs: echo "Generated matrix: $MATRIX_JSON" echo "matrix=$MATRIX_JSON" >> $GITHUB_OUTPUT + env: + GITHUB_EVENT_INPUTS_PACKAGE_NAME: ${{ github.event.inputs.package_name }} build: needs: generate-matrix + permissions: + id-token: write + attestations: write + contents: read env: REPO_NAME: "prefix-dev/pixi" strategy: @@ -60,6 +66,8 @@ jobs: runs-on: ${{ matrix.bins.os }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + persist-credentials: false - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: environments: backends-release @@ -92,7 +100,7 @@ jobs: run: | # Convert Windows paths to Unix-style for bash compatibility RUNNER_TEMP_UNIX=$(echo "${{ runner.temp }}" | sed 's|\\|/|g') - BUNDLE_PATH_UNIX=$(echo "${{ steps.attest.outputs.bundle-path }}" | sed 's|\\|/|g') + BUNDLE_PATH_UNIX=$(echo "${STEPS_ATTEST_OUTPUTS_BUNDLE_PATH}" | sed 's|\\|/|g') # Find the actual conda package file (search recursively) CONDA_PACKAGE=$(find "$RUNNER_TEMP_UNIX" -name "*.conda" -type f | head -1) @@ -110,6 +118,8 @@ jobs: echo "Error: No conda package found in $RUNNER_TEMP_UNIX" exit 1 fi + env: + STEPS_ATTEST_OUTPUTS_BUNDLE_PATH: ${{ steps.attest.outputs.bundle-path }} - name: Upload build artifacts uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 @@ -158,6 +168,8 @@ jobs: if: ${{ github.event.inputs.push_to_channel == 'true' && github.repository == 'prefix-dev/pixi' }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + persist-credentials: false - name: Download all conda packages uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 with: From f9d044f10a053e9eb7e8856703e20f6767ba4a6e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 14:12:17 +0100 Subject: [PATCH 42/70] Fix lint --- .github/workflows/backends-release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/backends-release.yml b/.github/workflows/backends-release.yml index 0ea75c3b9f..d83b631bf7 100644 --- a/.github/workflows/backends-release.yml +++ b/.github/workflows/backends-release.yml @@ -99,8 +99,9 @@ jobs: shell: bash run: | # Convert Windows paths to Unix-style for bash compatibility - RUNNER_TEMP_UNIX=$(echo "${{ runner.temp }}" | sed 's|\\|/|g') - BUNDLE_PATH_UNIX=$(echo "${STEPS_ATTEST_OUTPUTS_BUNDLE_PATH}" | sed 's|\\|/|g') + RUNNER_TEMP_UNIX="${{ runner.temp }}" + RUNNER_TEMP_UNIX="${RUNNER_TEMP_UNIX//\\//}" + BUNDLE_PATH_UNIX="${STEPS_ATTEST_OUTPUTS_BUNDLE_PATH//\\//}" # Find the actual conda package file (search recursively) CONDA_PACKAGE=$(find "$RUNNER_TEMP_UNIX" -name "*.conda" -type f | head -1) From fd94b39dc0f303af05c709b045e9b6454edc2d15 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 14:40:41 +0100 Subject: [PATCH 43/70] Fix tests --- .../pixi_build/test_specified_build_source/test_git.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration_python/pixi_build/test_specified_build_source/test_git.py b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py index 9c4ee95bfd..4fee272636 100644 --- a/tests/integration_python/pixi_build/test_specified_build_source/test_git.py +++ b/tests/integration_python/pixi_build/test_specified_build_source/test_git.py @@ -1,12 +1,12 @@ import json import shutil -from pathlib import Path +import tomllib from collections.abc import Iterator +from pathlib import Path from typing import Any, cast import pytest import tomli_w -import tomllib import yaml from ..common import ( @@ -226,7 +226,7 @@ def test_git_path_lock_branch_records_branch_metadata( assert {entry.get("branch") for entry in entries} == {"other-feature"} assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.other_feature_rev} assert all("tag" not in entry for entry in entries) - assert {entry.get("subdir") for entry in entries} == {"."} + assert {entry.get("subdir") for entry in entries} == {None} verify_cli_command( [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], @@ -335,7 +335,7 @@ def test_git_path_lock_tag_records_tag_metadata( assert {entry.get("tag") for entry in entries} == {local_cpp_git_repo.tag} assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.main_rev} assert all("branch" not in entry for entry in entries) - assert {entry.get("subdir") for entry in entries} == {"."} + assert {entry.get("subdir") for entry in entries} == {None} verify_cli_command( [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], From 802cc108717b55273bdf656c64152a559beeccfa Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 15:03:48 +0100 Subject: [PATCH 44/70] Reorganize pixi.toml --- pixi.lock | 1795 +++++++++++++++++++++++++++++++++++++++-------------- pixi.toml | 518 ++++++++-------- 2 files changed, 1616 insertions(+), 697 deletions(-) diff --git a/pixi.lock b/pixi.lock index a1aaaecea9..be506f0889 100644 --- a/pixi.lock +++ b/pixi.lock @@ -135,17 +135,16 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda @@ -227,20 +226,20 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda @@ -262,7 +261,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 @@ -271,17 +270,16 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda @@ -364,20 +362,20 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml-0.18.16-py313h6194ac5_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.14-py313h6194ac5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.15-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda @@ -399,26 +397,25 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda @@ -457,7 +454,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -494,20 +491,20 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml-0.18.16-py313hf050af9_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py313hf050af9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314hd330473_1.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda @@ -531,26 +528,25 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda @@ -589,7 +585,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -627,20 +623,20 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314ha14b1ff_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda @@ -664,21 +660,20 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda + - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda @@ -727,19 +722,19 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda @@ -767,7 +762,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda dist: channels: @@ -1481,14 +1476,27 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-deny-0.19.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-shear-1.7.1-hb17b654_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1496,9 +1504,18 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/go-shfmt-3.12.0-hfc2019e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -1510,6 +1527,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -1518,8 +1536,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda @@ -1532,9 +1553,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-24.9.0-heeeca48_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1544,33 +1571,36 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/py-rattler-0.20.0-py310h70157a2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.7-h813ae00_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/linux-64/shellcheck-0.10.0-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - conda: https://prefix.dev/conda-forge/linux-64/taplo-0.10.0-h2d22210_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -1593,14 +1623,27 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-deny-0.19.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-shear-1.7.1-h069e38c_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/dprint-0.49.1-ha3529ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1608,9 +1651,18 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/go-shfmt-3.12.0-h22914b5_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -1622,6 +1674,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.11-h22914b5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda @@ -1630,8 +1683,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda @@ -1644,9 +1701,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/nodejs-24.9.0-hc854191_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1656,33 +1719,36 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/py-rattler-0.20.0-py310h48c5ec3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.7-h9564552_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/shellcheck-0.10.0-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/taplo-0.10.0-h3618846_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -1698,6 +1764,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zizmor-1.18.0-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.9-h8080635_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1706,11 +1773,26 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-deny-0.19.0-ha9c3995_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-shear-1.7.1-h3c2ae71_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1718,6 +1800,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/osx-64/go-shfmt-3.12.0-hccc6df8_1.conda @@ -1726,26 +1812,45 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/nodejs-24.9.0-h09bb5a9_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1754,31 +1859,36 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/py-rattler-0.20.0-py310h9420a0c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.14.7-hd9f4cfa_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-64/shellcheck-0.10.0-h7dd6a17_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/osx-64/taplo-0.10.0-hffa81eb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1793,8 +1903,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.18.0-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.9-h43f6c71_0.conda - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1803,11 +1915,26 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-deny-0.19.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-shear-1.7.1-h8d80559_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1815,6 +1942,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/go-shfmt-3.12.0-h820172f_1.conda @@ -1823,26 +1954,46 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-24.9.0-h08a63db_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda @@ -1851,31 +2002,36 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/py-rattler-0.20.0-py310h9bd0991_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.7-h382de68_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/shellcheck-0.10.0-hecfb573_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/taplo-0.10.0-h2b2570c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1890,6 +2046,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.18.0-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -1899,11 +2056,18 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.34.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-deny-0.19.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-shear-1.7.1-h18a1a76_1.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -1911,9 +2075,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/win-64/go-shfmt-3.12.0-h11686cb_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda @@ -1921,37 +2090,49 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-24.9.0-he453025_0.conda - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.11.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.7-h15e3a1f_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/win-64/shellcheck-0.10.0-h57928b3_0.conda @@ -1971,9 +2152,13 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zizmor-1.18.0-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda pypi-gen: channels: - url: https://prefix.dev/conda-forge/ @@ -1983,49 +2168,93 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2034,49 +2263,94 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2084,115 +2358,236 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2201,9 +2596,12 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda - pytest: + python-test: channels: - url: https://prefix.dev/conda-forge/ options: @@ -2218,7 +2616,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda @@ -2241,8 +2639,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda @@ -2265,10 +2663,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda @@ -2477,84 +2875,384 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda - - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + recipes: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.0-he64ecbb_0.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + rust-test: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.15-py314h2e8dab5_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + osx-64: + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314hd330473_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314ha14b1ff_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + win-64: + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://prefix.dev/conda-forge/win-64/py-rattler-0.20.0-py310hb39080a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - recipes: - channels: - - url: https://prefix.dev/conda-forge/ - options: - pypi-prerelease-mode: if-necessary-or-explicit - packages: - linux-64: - - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/patchelf-0.18.0-h3f2d84a_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.0-he64ecbb_0.conda - linux-aarch64: - - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/patchelf-0.18.0-h5ad3122_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.0-hb434046_0.conda - osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.0-h4728fb8_0.conda - osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.0-h6fdd925_0.conda - win-64: - - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.0-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda schema: channels: - url: https://prefix.dev/conda-forge/ @@ -2588,13 +3286,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2633,13 +3331,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2674,13 +3372,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2692,6 +3390,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda @@ -2713,13 +3412,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2731,6 +3430,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda @@ -2751,13 +3451,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -2772,6 +3472,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda test-export: channels: - url: https://prefix.dev/conda-forge/ @@ -2804,54 +3505,93 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/bcrypt-5.0.0-py314h2e6c369_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda - conda: https://prefix.dev/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mkcert-1.4.4-he91c749_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pynacl-1.6.1-py314h5bd0f2a_0.conda @@ -2863,7 +3603,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2873,58 +3618,98 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/wrapt-2.0.1-py314h5bd0f2a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/bcrypt-5.0.0-py314h451b6cc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cryptography-46.0.3-py314h606d956_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/mkcert-1.4.4-hd24410f_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pynacl-1.6.1-py314h51f160d_0.conda @@ -2936,7 +3721,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2946,51 +3736,91 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/wrapt-2.0.1-py314h51f160d_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bcrypt-5.0.0-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cryptography-46.0.3-py314h61e53f1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/mkcert-1.4.4-hc7f0b10_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pynacl-1.6.1-py314h6482030_0.conda @@ -3002,7 +3832,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3011,51 +3847,94 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/wrapt-2.0.1-py314h6482030_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bcrypt-5.0.0-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cryptography-46.0.3-py314h7e8dc1c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mkcert-1.4.4-h87715bd_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pynacl-1.6.1-py314h0612a62_0.conda @@ -3067,7 +3946,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3076,38 +3961,61 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/wrapt-2.0.1-py314h0612a62_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/bcrypt-5.0.0-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/cryptography-46.0.3-py314hb42d478_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/mkcert-1.4.4-h36c15f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pynacl-1.6.1-py314h5a2d7ad_0.conda @@ -3119,6 +4027,9 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -3130,11 +4041,14 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/wrapt-2.0.1-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_5.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda trampoline: channels: - url: https://prefix.dev/conda-forge/ @@ -5145,6 +6059,16 @@ packages: license_family: PSF size: 18056 timestamp: 1734475348772 +- conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + noarch: generic + sha256: b88c76a6d6b45378552ccfd9e88b2a073161fe83fd1294c8fa103ffd32f7934a + md5: 99d689ccc1a360639eec979fd7805be9 + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + size: 45767 + timestamp: 1761175217281 - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda noarch: generic sha256: 63f677762304e6f8dc55e11dff6aafe71129cbbd0a77d176b99ba1f6a5053b77 @@ -5155,6 +6079,16 @@ packages: license: Python-2.0 size: 48369 timestamp: 1765019689213 +- conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda + noarch: generic + sha256: 9e345f306446500956ffb1414b773f5476f497d7a2b5335a59edd2c335209dbb + md5: 30f999d06f347b0116f0434624b6e559 + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + size: 49298 + timestamp: 1765020324943 - conda: https://prefix.dev/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 md5: f291630db5dc438b6ce37c2bb1a96516 @@ -8261,6 +9195,16 @@ packages: license_family: MIT size: 575454 timestamp: 1756835746393 +- conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + size: 33731 + timestamp: 1750274110928 - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda sha256: 1eb769c0f2778d07428947f64272592cc2d3b9bce63b41600abe5dc2b683d829 md5: d8b81203d08435eb999baa249427884e @@ -10721,68 +11665,68 @@ packages: license_family: MIT size: 340482 timestamp: 1764434463101 -- conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - sha256: b15568ddc03bd33ea41610e5df951be4e245cd61957cbf8c2cfd12557f3d53b5 - md5: f27c39a1906771bbe56cd26a76bf0b8b +- conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f + md5: 432b0716a1dfac69b86aa38fdd59b7e6 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 1940186 - timestamp: 1762989000579 -- conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - sha256: df87d763c450ca0dc7a916987674fe1db153e6713cc488cedb0997ad5e807e96 - md5: dd7a9ffb9145ce5651b10b846d41b8ef + size: 1943088 + timestamp: 1762988995556 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda + sha256: f8acb2d03ebe80fed0032b9a989fc9acfb6735e3cd3f8c704b72728cb31868f6 + md5: 28f5027a1e04d67aa13fac1c5ba79693 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - python 3.13.* *_cp313 - libgcc >=14 - - python_abi 3.13.* *_cp313 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 1824747 - timestamp: 1762989007285 -- conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - sha256: 73de35081774d9b445dd807ac4d4e043846159b2de348b8e6a81f1b810210fe4 - md5: e12491c39d2ea259771ce4d80a91817f + size: 1828339 + timestamp: 1762989038561 +- conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda + sha256: 7cb259e46ecb9f19eeea4d96035546376ce9370b51ffd18d57eb7170b08bbbf4 + md5: 8a9a08b79d530f482c9439790db774e1 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - __osx >=10.13 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 constrains: - __osx >=10.13 license: MIT license_family: MIT - size: 1947011 - timestamp: 1762989008917 -- conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - sha256: 08398c0599084837ba89d69db00b3d0973dc86d6519957dc6c1b480e2571451a - md5: eaeed566f6d88c0a08d73700b34be4a2 + size: 1949458 + timestamp: 1762989007303 +- conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + sha256: dded9092d89f1d8c267d5ce8b5e21f935c51acb7a64330f507cdfb3b69a98116 + md5: 420a4b8024e9b22880f1e03b612afa7d depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - python 3.13.* *_cp313 - __osx >=11.0 - - python_abi 3.13.* *_cp313 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 1778337 - timestamp: 1762989007829 -- conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - sha256: fb9391dc09dd01574c85e2342b9aa3b8664cd713401ef8fd6267865cc28988d8 - md5: 0437f87004ad7c64c98a013d1611db97 + size: 1784478 + timestamp: 1762989019956 +- conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + sha256: 51773479d973c0b0b96cf581cb8444061eaac9b6c28f1cc6d33afc39201d5f13 + md5: c1f37669ed289c378f3193b35c9df2a7 depends: - python - typing-extensions >=4.6.0,!=4.7.0 @@ -10792,11 +11736,11 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 1973031 - timestamp: 1762989056610 + size: 1971476 + timestamp: 1762989023313 - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a md5: 6b6ece66ebcae2d5f326c77ef2c5a066 @@ -10924,65 +11868,65 @@ packages: license_family: MIT size: 15528 timestamp: 1733710122949 -- conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py313h07c4f96_2.conda - sha256: 7974490a0a5e8d0428679aba90bcee6d0d13a7b7a6bb0b23f92c877804df5de4 - md5: b09fa05e9f55ffbe67e124d88aeeb141 +- conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda + sha256: 08005adfb81ba0e23c184b58adbae89c4026c581fa31f408b765360c4b18730b + md5: 5ce72c08a2f56283cb6064a6c5806169 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 111509 - timestamp: 1759595934140 -- conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py313h6a51379_1.conda - sha256: 5d1efe7d18c3d3d74fbb5453c62118342d611084785149ed8641e24e8e7762a6 - md5: 060863a68af3390bc721571dfc531d47 + size: 112586 + timestamp: 1759595849577 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda + sha256: 92dbd876be10c0db4c55f4c5cc394a6f205511009b7bc23861284fd9d4f44b77 + md5: 4dec068d8959869e3418e54f2a2dd1f8 depends: - - libgcc >=13 - - python >=3.13.0rc1,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - libgcc >=14 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 125107 - timestamp: 1725356101306 -- conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py313h585f44e_2.conda - sha256: 1f12f13da3eae7ce4162e429376edf1c1a79b90364b1e2d76a0bf1feb067cd37 - md5: aae021a8361e7ce2df8c41e114a42fba + size: 112626 + timestamp: 1759597111574 +- conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda + sha256: 4bbfd768827cf075d44c77ebc8f73139a6b9a1d218574ee30ce2962f630c24c1 + md5: 93079d16c1304159bb23477dc190bf06 depends: - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 112430 - timestamp: 1759596112008 -- conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py313hcdf3177_2.conda - sha256: c46024c955b2761fd765e59589f09dcb40f3944b60a0130176b0b0d90af526c0 - md5: 113e311f3c969ef845701d3441613eba + size: 113281 + timestamp: 1759596190003 +- conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda + sha256: f815eb73c80a42d9a8acb6100a7f756f86eb25debfa61ab4eaf3e9560855da47 + md5: a7499aea41caba6cd8ed261afbc6e198 depends: - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14.0rc3,<3.15.0a0 + - python >=3.14.0rc3,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 112225 - timestamp: 1759596218935 -- conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py313h5ea7bf4_2.conda - sha256: 6f3cd2039a21763601e37365803f73eb162cfda2387f8fa8ef1047c3edc4bbf6 - md5: 77df246ef210787b8550e43be4ec75af + size: 113116 + timestamp: 1759596141767 +- conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda + sha256: 7c561a8be70c1164935ea1b04753ed1a6b1a48d0c207735bc0f77acbf8a87a18 + md5: 7efc684e0bb02765a9cbdc1222183c59 depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT - size: 117862 - timestamp: 1759596100429 + size: 118645 + timestamp: 1759596103244 - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca md5: e2fd202833c4a981ce8a65974fe4abd1 @@ -11057,32 +12001,33 @@ packages: license_family: MIT size: 39300 timestamp: 1751452761594 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.11-hc97d973_100_cp313.conda - build_number: 100 - sha256: 9cf014cf28e93ee242bacfbf664e8b45ae06e50b04291e640abeaeb0cba0364c - md5: 0cbb0010f1d8ecb64a428a8d4214609e +- conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda + build_number: 1 + sha256: 39898d24769a848c057ab861052e50bdc266310a7509efa3514b840e85a2ae98 + md5: 5c00c8cea14ee8d02941cab9121dce41 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 + - libexpat >=2.7.1,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.1,<4.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.4,<4.0a0 - libuuid >=2.41.2,<3.0a0 + - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + constrains: + - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 37226336 - timestamp: 1765021889577 - python_site_packages_path: lib/python3.13/site-packages + size: 31537229 + timestamp: 1761176876216 - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda build_number: 101 sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 @@ -11709,6 +12654,15 @@ packages: license_family: BSD size: 26922 timestamp: 1761503229008 +- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + sha256: 59f17182813f8b23709b7d4cfda82c33b72dd007cb729efa0033c609fbd92122 + md5: c20172b4c59fbe288fa50cdc1b693d73 + depends: + - cpython 3.12.12.* + - python_abi * *_cp312 + license: Python-2.0 + size: 45888 + timestamp: 1761175248278 - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda sha256: 4b08d4c2c4b956d306b4868d3faf724eebb5d6e6b170fad2eb0f2d4eb227f1af md5: d1461b2e63b1909f4f5b41c823bd90ae @@ -11718,6 +12672,25 @@ packages: license: Python-2.0 size: 48352 timestamp: 1765019767640 +- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + sha256: 8203dc90a5cb6687f5bfcf332eeaf494ec95d24ed13fca3c82ef840f0bb92a5d + md5: 0064ab66736c4814864e808169dc7497 + depends: + - cpython 3.14.2.* + - python_abi * *_cp314 + license: Python-2.0 + size: 49287 + timestamp: 1765020424843 +- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda + build_number: 8 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6958 + timestamp: 1752805918820 - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda build_number: 8 sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 @@ -11783,6 +12756,19 @@ packages: license_family: BSD size: 4856 timestamp: 1646866525560 +- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda + sha256: 1b3dc4c25c83093fff08b86a3574bc6b94ba355c8eba1f35d805c5e256455fc7 + md5: fba10c2007c8b06f77c5a23ce3a635ad + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 204539 + timestamp: 1758892248166 - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af md5: 4794ea0adaebd9f844414e594b142cb2 @@ -11809,6 +12795,18 @@ packages: license_family: MIT size: 198001 timestamp: 1758891959168 +- conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + sha256: 828af2fd7bb66afc9ab1c564c2046be391aaf66c0215f05afaf6d7a9a270fe2a + md5: b12f41c0d7fb5ab81709fcc86579688f + depends: + - python >=3.10.* + - yaml + track_features: + - pyyaml_no_compile + license: MIT + license_family: MIT + size: 45223 + timestamp: 1758891992558 - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda sha256: 8420815e10d455b012db39cb7dc0d86f0ac3a287d5a227892fa611fe3d467df9 md5: e0c9e257970870212c449106964a5ace @@ -12080,131 +13078,77 @@ packages: license_family: MIT size: 200840 timestamp: 1760026188268 -- conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - sha256: fa1667f1c61610191960d0f6c33a55f3afacfd9c43ff4c9b1507ba164eb3f28f - md5: 88717b72e54ee6ef081c9ecfafd728c8 +- conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + sha256: b48bebe297a63ae60f52e50be328262e880702db4d9b4e86731473ada459c2a1 + md5: 06ad944772941d5dae1e0d09848d8e49 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ruamel.yaml.clib >=0.1.2 + - python >=3.10 + - ruamel.yaml.clib >=0.2.15 + - python license: MIT license_family: MIT - size: 272227 - timestamp: 1761160797563 -- conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml-0.18.16-py313h6194ac5_0.conda - sha256: 9f48a4ddd3c1306bb3b2c5410e14880b6e74272a84ab63cfd7a03cc50a1edf40 - md5: 700c11f299dcf63ad8c413573bb2d8df + size: 98448 + timestamp: 1767538149184 +- conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda + sha256: 3bd8db7556e87c98933a47ff9f962af7b8e0dc3757a72180b27cbfcb1f98d2d9 + md5: 4f35ae1228a6c5d9df593367ffe8dda1 depends: + - python - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - ruamel.yaml.clib >=0.1.2 - license: MIT - license_family: MIT - size: 272844 - timestamp: 1761160759729 -- conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml-0.18.16-py313hf050af9_0.conda - sha256: 6bb3ba2b97523f465b8569e07280497e7cbddedf7b484b6bcd2ac031fc78844f - md5: f1b5d1d396f44968f6e6ade4fd597690 - depends: - - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ruamel.yaml.clib >=0.1.2 - license: MIT - license_family: MIT - size: 271623 - timestamp: 1761160899220 -- conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - sha256: ddd6eaaa278772b760dd3e3176b70db71b26a8e8f1f27d7619ec2a638bf872af - md5: d9915dc9a5b3ce03810bd0024b62afac - depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - ruamel.yaml.clib >=0.1.2 - license: MIT - license_family: MIT - size: 272094 - timestamp: 1761160998422 -- conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - sha256: b7325bc79a4b91c1b9f3f1aded5add5b277f65566502e6d78ef75a08bdf29496 - md5: d86a7e27eb75cbd0966ff66b807d4fe0 - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ruamel.yaml.clib >=0.1.2 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - size: 272290 - timestamp: 1761160849835 -- conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda - sha256: 1d5607b463001ed480aea45b7f3c1035151c0c44a3bf4f3539a00fe097c5e30a - md5: 3cff82488dd3935fdb3ba37911387fec - depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 140261 - timestamp: 1760564339468 -- conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.14-py313h6194ac5_0.conda - sha256: 3125da86c3ba464943046f7e1738312000b22f62bd86de1951977bfdf2a58d0f - md5: d07b239a573332ebba25758d32c4088d + size: 150041 + timestamp: 1766159514023 +- conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.15-py314h2e8dab5_1.conda + sha256: 18a34470b351fccfe6694215b01a9a68a0a9979336b0ea85709bbdeef0658e1c + md5: ca756356e2920f248a74cb42e0b4578d depends: + - python + - python 3.14.* *_cp314 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 132161 - timestamp: 1760564356308 -- conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py313hf050af9_0.conda - sha256: a55f4d43f4eb906a0737ecb30f9171cbd094159386c75af3bdba35d95b8e55b7 - md5: cd3007dc96ed063aafca50f04cd23122 + size: 148495 + timestamp: 1766159541094 +- conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314hd330473_1.conda + sha256: dbcc0ff6e902468314d10d9f59d289ad078e5eac02d72b9092fa96e88b91d5dd + md5: e41e8948899a09937c068f71fe65ebb6 depends: + - python - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 122265 - timestamp: 1760564927184 -- conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda - sha256: ade7d57e7c4b92bc4b003a59e9a40d8d241d113fc8e4c051ecb7dd689d9360f4 - md5: 844260acfdd85139049b9c806862e15c + size: 136902 + timestamp: 1766159517466 +- conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314ha14b1ff_1.conda + sha256: ad575cae7f662b2dafca88c4ce05120e322f825c0610e54b0a116550c817bbbe + md5: 5836fbf79e5f279ffbe4ba06066c51a3 depends: + - python + - python 3.14.* *_cp314 - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 116501 - timestamp: 1760564812152 -- conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda - sha256: 28af1c4e9f57a24ae6d71368b94caad33261b3d7063d06f70649bbdd77184ce3 - md5: 956b695fac4c5066bd05ecc63adad785 + size: 133016 + timestamp: 1766159585543 +- conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda + sha256: b719637ce71e533193cd2bcacbf6ba5c10deaafa1be90d96040ee2314c6b17d1 + md5: 496de351b0f9afe9e245229528304f25 depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ucrt >=10.0.20348.0 + - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 105450 - timestamp: 1760564606434 + size: 105668 + timestamp: 1766159584330 - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.7-h813ae00_0.conda noarch: python sha256: 6cac2a69751717d7a9d713d2037a4afb3bca29cb4d18a4eb3a38a50cc7c2797f @@ -13876,16 +14820,6 @@ packages: license_family: BSD size: 559888 timestamp: 1764431250718 -- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_5.conda - sha256: aac5f0258a051a842b6ffe0c20303d1ff6471bf45350d61351839044ccf5d8fd - md5: deab14816773ef8762baeec73bb0d456 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 550303 - timestamp: 1764566784586 - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -13914,15 +14848,6 @@ packages: license_family: BSD size: 552788 timestamp: 1764431387803 -- conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_5.conda - sha256: 775fe821aecce560cf964d208c772a10de40d4d96ae78380e3017fbb61226111 - md5: eb44180fd0e2862607428721771c8587 - depends: - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 542374 - timestamp: 1764566742150 - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda sha256: 9aa3fa14bf46a4610a82786028a946c975c7eeda08e5e2482af79929fd47bcfe md5: 40d8b69d4ab5b315e615ac0bdb650613 @@ -13933,16 +14858,6 @@ packages: license_family: BSD size: 485195 timestamp: 1764431430538 -- conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_5.conda - sha256: d4abaac202f6d59750def37b003c7645b3b7eba2e132717a3d88b1399b2bd298 - md5: de488ea4c951e8eb642e19d574e7414b - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 476249 - timestamp: 1764567098876 - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f md5: 727109b184d680772e3122f40136d5ca @@ -13973,16 +14888,6 @@ packages: license_family: BSD size: 400086 timestamp: 1764431655348 -- conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_5.conda - sha256: 99f3725e3c95573c3e38364a27b31320f918f856780f515d4996f6e66bfe7101 - md5: 6adec79779c11d1e938196c6eaf95921 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 389747 - timestamp: 1764566973420 - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda sha256: 501b08795c36ba675765627d40b0bfd7e8e4229174335fb2566fab93ab441c4a md5: 4fcccc053a113f5711dddf64401e9010 @@ -13995,18 +14900,6 @@ packages: license_family: BSD size: 359229 timestamp: 1764431496562 -- conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_5.conda - sha256: d4bfff25643c1925ad9cc3797de48905ae9cd6cff4de4693bc91629c58a0ca6e - md5: 41f557b6596aa2d7bc53c48430c8ab1e - depends: - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: BSD-3-Clause - license_family: BSD - size: 359369 - timestamp: 1764567098655 - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 md5: 053b84beec00b71ea8ff7a4f84b55207 diff --git a/pixi.toml b/pixi.toml index 57b7e5bc73..8864009154 100644 --- a/pixi.toml +++ b/pixi.toml @@ -4,6 +4,8 @@ authors = [ "Bas Zalmstra ", "Tim de Jager ", "Ruben Arts ", + "Nichita Morcotilo ", + "Julian Hofer ", ] channels = ["https://prefix.dev/conda-forge"] description = "Package management made easy!" @@ -14,127 +16,94 @@ requires-pixi = ">=0.45" [workspace.target.linux-64.build-variants] c_stdlib_version = ["2.17"] -[dependencies] -cargo-insta = "*" -git = ">=2.51.0,<3" -python = ">=3.13.5,<3.15" +# +# Feature for building and releasing pixi-build-backends +# +[feature.backends-release.activation.env] +RUSTC_WRAPPER = "sccache" -[tasks] -bump = "tbump --only-patch $RELEASE_VERSION" -insta = "cargo insta" -install = { cmd = "cargo install --path crates/pixi --locked", description = "Install pixi itself locally using cargo" } -install-as = { cmd = "python scripts/install.py", depends-on = [ - "build-release", -] } -install-debug-as = { cmd = "python scripts/install.py --debug", depends-on = [ - "build-debug", -] } -pypi-proxy = "python scripts/pypi-proxy.py" -release = "python scripts/release.py" -run-all-examples = { cmd = "python tests/scripts/run-all-examples.py --pixi-exec $CARGO_TARGET_DIR/release/pixi", depends-on = [ - "build-release", -] } -test = { depends-on = ["test-all-fast"], description = "Run all fast tests" } -test-all-extra-slow = { depends-on = [ - "test-slow", - "test-integration-extra-slow", -] } -test-all-fast = { depends-on = ["test-fast", "test-integration-fast"] } -test-all-slow = { depends-on = ["test-slow", "test-integration-slow"] } -test-fast = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets""" -test-slow = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets --features slow_integration_tests,online_tests - --status-level skip --failure-output immediate-final --no-fail-fast --final-status-level slow""" +[feature.backends-release.dependencies] +python = ">=3.12,<4" +rattler-build = ">=0.55.0,<0.56" +sccache = ">=0.12,<0.13" -[feature.python-test-deps.dependencies] -dirty-equals = ">=0.11,<0.12" -filelock = ">=3.19.1,<4" -git = ">=2.51.0,<3" -inline-snapshot = ">=0.31.1,<0.32" -py-rattler = ">=0.20,<0.21" -pytest = ">=9.0.2,<10" -pytest-rerunfailures = ">=16.0.1,<17" -pytest-timeout = ">=2.4.0,<3" -pytest-xdist = ">=3.8.0,<4" -pyyaml = ">=6.0.3,<7" -rattler-build = ">=0.55,<0.56" -rich = ">=14.1.0,<15" -tomli-w = ">=1.2.0,<2" -types-pyyaml = ">=6.0.12.20250915,<7" +[feature.backends-release.tasks] +generate-matrix = { cmd = "python pixi-build-backends/scripts/generate-matrix.py", description = "Generate build matrix for backends release" } -[feature.pytest.tasks] -test-common-wheels = { cmd = "pytest -s --numprocesses=auto tests/wheel_tests/", depends-on = [ - "build-release", -] } -test-common-wheels-ci = { cmd = "pytest --numprocesses=auto --verbose tests/wheel_tests/" } -test-integration-ci = "pytest --numprocesses=auto --durations=0 --timeout=100 --verbose -m 'not extra_slow' tests/integration_python" -test-integration-extra-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=600 tests/integration_python", depends-on = [ - "build-release", -] } -test-integration-extra-slow-ci = "pytest --numprocesses=auto --durations=0 --timeout=600 tests/integration_python" -test-integration-fast = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=100 -m 'not slow and not extra_slow' tests/integration_python", depends-on = [ - "build-debug", -] } -test-integration-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=100 -m 'not extra_slow' tests/integration_python", depends-on = [ - "build-release", -] } -# pass the file to run as an argument to the task -# you can also pass a specific test function, like this: -# /path/to/test.py::test_function -test-specific-test = { cmd = "pytest -k '{{ test_substring }}'", args = [ - "test_substring", -], depends-on = [ - "build-release", -] } -test-specific-test-debug = { cmd = "pytest --pixi-build=debug -k '{{ test_substring }}'", args = [ - "test_substring", -], depends-on = [ - "build-debug", -] } -# Update one test channel by passing on value of `mappings.toml` -# e.g. "multiple_versions_channel_1" -update-test-channel = { cmd = "python update-channels.py {{ channel }}", args = [ - "channel", -], cwd = "tests/data/channels" } -# Run pixi-build integration tests (requires backends channel to be built) -test-pixi-build = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ - "build-release", -], description = "Run pixi-build integration tests" } -test-pixi-build-debug = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ - "build-debug", -], description = "Run pixi-build integration tests with debug build" } +[feature.backends-release.tasks.build-recipe-ci] +args = ["output_dir", "recipe", { arg = "target_platform", default = "" }] +cmd = "rattler-build build --test native --channel https://prefix.dev/pixi-build-backends --channel https://prefix.dev/conda-forge --variant-config pixi-build-backends/recipe/variants.yaml --output-dir={{ output_dir }} --recipe {{ recipe }}{% if target_platform is defined and target_platform %} --target-platform {{ target_platform }}{% endif %}" +description = "Build a backend recipe for CI" +# +# Feature for development tools and utilities +# [feature.dev.dependencies] -# Needed for the citation cargo-edit = ">=0.13.7,<0.14" cargo-nextest = ">=0.9.105,<0.10" -cffconvert = ">=2.0.0,<3" +cffconvert = ">=2.0.0,<3" # Needed for the citation tbump = ">=6.9.0,<7" [feature.dev.tasks] -insta-review = "cargo insta review --workspace" -update-rattler = "cargo upgrade --incompatible allow -p rattler -p file_url -p rattler_cache -p rattler_conda_types -p rattler_digest -p rattler_lock -p rattler_networking -p rattler_repodata_gateway -p rattler_shell -p rattler_solve -p rattler_virtual_packages" -# UV dependency management +bump = { cmd = "tbump --only-patch $RELEASE_VERSION", description = "Bump the version using tbump" } +insta-review = { cmd = "cargo insta review --workspace", description = "Review cargo-insta snapshots" } +pypi-proxy = { cmd = "python scripts/pypi-proxy.py", description = "Run PyPI proxy server" } +release = { cmd = "python scripts/release.py", description = "Run the release script" } +switch-to-remote-rattler = { cmd = "python scripts/local_patch.py rattler remote", description = "Switch back to remote rattler dependencies" } switch-to-remote-uv = { cmd = "python scripts/local_patch.py uv remote", description = "Switch back to remote uv dependencies" } +update-rattler = { cmd = "cargo upgrade --incompatible allow -p rattler -p file_url -p rattler_cache -p rattler_conda_types -p rattler_digest -p rattler_lock -p rattler_networking -p rattler_repodata_gateway -p rattler_shell -p rattler_solve -p rattler_virtual_packages", description = "Update rattler dependencies to latest versions" } -[feature.dev.tasks.switch-to-local-uv] -args = [{ arg = "uv_path", default = "../uv" }] -cmd = "python scripts/local_patch.py uv local {{ uv_path }}" -description = "Switch to local uv development dependencies" +[feature.dev.tasks.snapshot-update] +args = [{ "arg" = "expression", "default" = "" }] +cmd = "pytest --inline-snapshot=fix -k '{{ expression }}'" +description = "Update inline snapshots for tests matching expression" -# Rattler dependency management [feature.dev.tasks.switch-to-local-rattler] args = [{ arg = "rattler_path", default = "../rattler" }] cmd = "python scripts/local_patch.py rattler local {{ rattler_path }}" description = "Switch to local rattler development dependencies" -[feature.dev.tasks.switch-to-remote-rattler] -cmd = "python scripts/local_patch.py rattler remote" -description = "Switch back to remote rattler dependencies" +[feature.dev.tasks.switch-to-local-uv] +args = [{ arg = "uv_path", default = "../uv" }] +cmd = "python scripts/local_patch.py uv local {{ uv_path }}" +description = "Switch to local uv development dependencies" -[feature.dev.tasks.snapshot-update] -args = [{ "arg" = "expression", "default" = "" }] -cmd = "pytest --inline-snapshot=fix -k '{{ expression }}'" +# +# Feature for cross-compilation with zig +# +[feature.dist.dependencies] +zig = ">=0.15.1,<0.16" +# +# Feature for documentation building and deployment +# +[feature.docs.dependencies] +cairosvg = ">=2.8.2,<3" +git-cliff = ">=2.11.0,<3" +mdx_truly_sane_lists = ">=1.3,<2" +mike = ">=2.1.3,<3" +mkdocs-llmstxt = ">=0.4.0,<0.5" +mkdocs-material = ">=9.6.21,<10" +mkdocs-redirects = ">=1.2.1,<2" +nushell = ">=0.109.1,<0.110" +pillow = ">=12,<13" + +[feature.docs.tasks] +build-docs = { cmd = "mkdocs build --strict", depends-on = [ + "download-font", +], description = "Build documentation" } +bump-changelog = { cmd = "git-cliff --unreleased --prepend CHANGELOG.md --tag $RELEASE_VERSION", description = "Update changelog with unreleased changes" } +deploy-dev = { cmd = "mike deploy --push dev devel", description = "Deploy development docs" } +deploy-latest = { cmd = "mike deploy --push --update-aliases $RELEASE_VERSION latest", description = "Deploy latest release docs" } +docs = { cmd = "mkdocs serve", depends-on = [ + "download-font", +], description = "Serve the docs locally" } +download-font = { cmd = "nu docs/layouts/download-font-to-cache.nu", description = "Download fonts for documentation" } +mike-serve = { cmd = "mike serve", description = "Serve versioned docs with mike" } + +# +# Feature for linting and formatting tools +# [feature.lint.dependencies] actionlint = ">=1.7.7,<2" basedpyright = ">=1.31.6,<2" @@ -150,12 +119,12 @@ typos = ">=1.38.1,<2" zizmor = ">=1.18.0,<2" [feature.lint.tasks] -actionlint = { cmd = "actionlint", env = { SHELLCHECK_OPTS = "-e SC2086" } } -cargo-clippy = "cargo clippy --all-targets --workspace -- -D warnings" -cargo-deny = "cargo deny --workspace check license --deny warnings" -cargo-fmt = "cargo fmt --all" -cargo-shear = "cargo shear --fix" -check-openssl = "python tests/scripts/check-openssl.py" +actionlint = { cmd = "actionlint", env = { SHELLCHECK_OPTS = "-e SC2086" }, description = "Lint GitHub Actions workflows" } +cargo-clippy = { cmd = "cargo clippy --all-targets --workspace -- -D warnings", description = "Run clippy on all targets" } +cargo-deny = { cmd = "cargo deny --workspace check license --deny warnings", description = "Check cargo dependencies licenses" } +cargo-fmt = { cmd = "cargo fmt --all", description = "Format Rust code" } +cargo-shear = { cmd = "cargo shear --fix", description = "Remove unused dependencies" } +check-openssl = { cmd = "python tests/scripts/check-openssl.py", description = "Check OpenSSL configuration" } dprint-check = { cmd = "dprint check --log-level=silent", description = "Check formatting with dprint" } dprint-fmt = { cmd = "dprint fmt --incremental=false", description = "Format with dprint" } lefthook = { cmd = "lefthook", description = "Run lefthook" } @@ -163,190 +132,247 @@ lint = { depends-on = [ "lint-fast", "lint-slow", ], description = "Run all linters and formatters on all code" } -lint-fast = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all fast linters and formatters on all code (no clippy)" } -lint-slow = { cmd = "lefthook run pre-push --all-files --force", description = "Run all slow linters and formatters on all code" } -pre-commit-install = "lefthook install" -pre-commit-install-minimal = "lefthook install pre-commit" -ruff-format = "ruff format --exit-non-zero-on-format --force-exclude" -ruff-lint = "ruff check --fix --exit-non-zero-on-fix --force-exclude" -shell-format = "shfmt --write --indent=4 --simplify --binary-next-line" -toml-format = { cmd = "taplo fmt", env = { RUST_LOG = "warn" } } -toml-lint = "taplo lint --verbose **/pixi.toml" -typecheck-python = "basedpyright" -typos = "typos --force-exclude" -zizmor = "zizmor .github/ --min-severity=medium" - -[feature.rust.dependencies] -rust = ">=1.90.0,<1.91" - -[feature.build.dependencies] -# Needed for building -compilers = ">=1.11.0,<2" -git = ">=2.51.0,<3" -openssl = ">=3.5.4,<4" -pkg-config = ">=0.29.2,<0.30" -rust-src = ">=1.90.0,<2" - -[feature.build.target.linux.dependencies] -clang = ">=21.1.2,<22" -compilers = ">=1.6.0" -make = ">=4.4.1,<5" -mold = ">=2.40.2,<3" - -[feature.build.target.win-64.dependencies] -vs2017_win-64 = ">=19.16.27033,<20" - -[feature.build.target.unix.activation] -scripts = ["scripts/activate.sh"] +lint-fast = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all fast linters and formatters (no clippy)" } +lint-slow = { cmd = "lefthook run pre-push --all-files --force", description = "Run all slow linters and formatters" } +pre-commit-install = { cmd = "lefthook install", description = "Install all git hooks" } +pre-commit-install-minimal = { cmd = "lefthook install pre-commit", description = "Install only pre-commit hook" } +ruff-format = { cmd = "ruff format --exit-non-zero-on-format --force-exclude", description = "Format Python code with ruff" } +ruff-lint = { cmd = "ruff check --fix --exit-non-zero-on-fix --force-exclude", description = "Lint Python code with ruff" } +shell-format = { cmd = "shfmt --write --indent=4 --simplify --binary-next-line", description = "Format shell scripts" } +toml-format = { cmd = "taplo fmt", env = { RUST_LOG = "warn" }, description = "Format TOML files" } +toml-lint = { cmd = "taplo lint --verbose **/pixi.toml", description = "Lint TOML files" } +typecheck-python = { cmd = "basedpyright", description = "Type check Python code" } +typos = { cmd = "typos --force-exclude", description = "Check for typos" } +zizmor = { cmd = "zizmor .github/ --min-severity=medium", description = "Security audit GitHub Actions" } -[feature.build.activation] -env.CARGO_TARGET_DIR = "target/pixi" - -[feature.build.tasks] -build-debug = "cargo build" -build-release = "cargo build --release" -generate-cli-docs = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml" - -[feature.docs.dependencies] -cairosvg = ">=2.8.2,<3" -git-cliff = ">=2.11.0,<3" -mdx_truly_sane_lists = ">=1.3,<2" -mike = ">=2.1.3,<3" -mkdocs-llmstxt = ">=0.4.0,<0.5" -mkdocs-material = ">=9.6.21,<10" -mkdocs-redirects = ">=1.2.1,<2" -nushell = ">=0.109.1,<0.110" -pillow = ">=12,<13" - -[feature.docs.tasks] -build-docs = { cmd = "mkdocs build --strict", depends-on = ["download-font"] } -bump-changelog = "git-cliff --unreleased --prepend CHANGELOG.md --tag $RELEASE_VERSION" -deploy-dev = "mike deploy --push dev devel" -deploy-latest = "mike deploy --push --update-aliases $RELEASE_VERSION latest" -docs = { cmd = "mkdocs serve", description = "Serve the docs locally", depends-on = [ - "download-font", -] } -download-font = "nu docs/layouts/download-font-to-cache.nu" -mike-serve = "mike serve" +# +# Feature for micromamba export testing +# +[feature.micromamba.dependencies] +micromamba = ">=2.3.2,<3" -[feature.schema.tasks] -generate-schema = { cmd = "python model.py > schema.json", cwd = "schema" } -test-schema = { cmd = "pytest -s", depends-on = "generate-schema", cwd = "schema", description = "Test the manifest json schema" } +[feature.micromamba.tasks] +test-export = { cmd = "bash tests/scripts/test-export.sh", description = "Test micromamba export functionality" } -[feature.schema.dependencies] -jsonschema = ">=3.2.0,<4" -pydantic = ">=2.11.10,<3" -pytest = ">=9.0.2,<10" -pyyaml = ">=6.0.3,<7" +# +# Feature for native-certs testing with local HTTPS server +# +[feature.native-certs-test.dependencies] +mkcert = ">=1.4.4,<2" +pip = ">=25,<26" +rich = ">=14,<15" +testcontainers = ">=4,<5" +[feature.native-certs-test.tasks] +test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CARGO_TARGET_DIR/release/pixi", depends-on = [ + "build-release", +], description = "Test native-certs feature with local HTTPS PyPI server" } +# +# Feature for generating PyPI test indexes +# [feature.pypi-gen.dependencies] hatchling = ">=1.27.0,<2" python-build = ">=1.3.0,<2" [feature.pypi-gen.tasks] -pypi-gen-indexes = "python tests/data/pypi-indexes/generate-indexes.py" +pypi-gen-indexes = { cmd = "python tests/data/pypi-indexes/generate-indexes.py", description = "Generate PyPI test indexes" } + +# +# Feature for Python integration tests with pytest +# +[feature.pytest.tasks] +test-common-wheels = { cmd = "pytest -s --numprocesses=auto tests/wheel_tests/", depends-on = [ + "build-release", +], description = "Run common wheel tests" } +test-common-wheels-ci = { cmd = "pytest --numprocesses=auto --verbose tests/wheel_tests/", description = "Run common wheel tests in CI" } +test-integration-ci = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=100 --verbose -m 'not extra_slow' tests/integration_python", description = "Run integration tests in CI" } +test-integration-extra-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=600 tests/integration_python", depends-on = [ + "build-release", +], description = "Run all integration tests including extra slow" } +test-integration-extra-slow-ci = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=600 tests/integration_python", description = "Run all integration tests in CI" } +test-integration-fast = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=100 -m 'not slow and not extra_slow' tests/integration_python", depends-on = [ + "build-debug", +], description = "Run fast integration tests with debug build" } +test-integration-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=100 -m 'not extra_slow' tests/integration_python", depends-on = [ + "build-release", +], description = "Run integration tests excluding extra slow" } +test-pixi-build = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ + "build-release", +], description = "Run pixi-build integration tests" } +test-pixi-build-debug = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=300 tests/integration_python/pixi_build/", depends-on = [ + "build-debug", +], description = "Run pixi-build integration tests with debug build" } -[feature.micromamba] -dependencies = { micromamba = ">=2.3.2,<3" } -tasks = { test-export = "bash tests/scripts/test-export.sh" } +[feature.pytest.tasks.test-specific-test] +args = ["test_substring"] +cmd = "pytest -k '{{ test_substring }}'" +depends-on = ["build-release"] +description = "Run specific test by substring match (e.g. test_substring or path/to/test.py::test_function)" -[feature.trampoline.dependencies] -python = ">=3.14.0,<3.15" -zstd = ">=1.5.7,<2" +[feature.pytest.tasks.test-specific-test-debug] +args = ["test_substring"] +cmd = "pytest --pixi-build=debug -k '{{ test_substring }}'" +depends-on = ["build-debug"] +description = "Run specific test by substring match with debug build" -[feature.trampoline.tasks.build-trampoline] -cmd = "python trampoline/build-trampoline.py" -description = "Build the trampolines" +[feature.pytest.tasks.update-test-channel] +args = ["channel"] +cmd = "python update-channels.py {{ channel }}" +cwd = "tests/data/channels" +description = "Update one test channel by passing a value from mappings.toml (e.g. multiple_versions_channel_1)" # -# Feature to build recipes +# Feature for Python test dependencies # -[feature.recipes.dependencies] +[feature.python-test-deps.dependencies] +dirty-equals = ">=0.11,<0.12" +filelock = ">=3.19.1,<4" +git = ">=2.51.0,<3" +inline-snapshot = ">=0.31.1,<0.32" +py-rattler = ">=0.20,<0.21" +pytest = ">=9.0.2,<10" +pytest-rerunfailures = ">=16.0.1,<17" +pytest-timeout = ">=2.4.0,<3" +pytest-xdist = ">=3.8.0,<4" +pyyaml = ">=6.0.3,<7" rattler-build = ">=0.55,<0.56" +rich = ">=14.1.0,<15" +tomli-w = ">=1.2.0,<2" +types-pyyaml = ">=6.0.12.20250915,<7" -[feature.recipes.tasks.build-backends] -cmd = "rattler-build build --recipe-dir empty --output-dir ." -cwd = "tests/build-backends" -description = "Build build-backends used for testing purposes" +# +# Feature for building rattler-build recipes +# +[feature.recipes.dependencies] +rattler-build = ">=0.55,<0.56" -[feature.dist.dependencies] -zig = ">=0.15.1,<0.16" +[feature.recipes.tasks] +build-backends = { cmd = "rattler-build build --recipe-dir empty --output-dir .", cwd = "tests/build-backends", description = "Build build-backends used for testing purposes" } # -# Feature for building and releasing pixi-build-backends +# Feature for Rust building and compilation # -[feature.backends-release.dependencies] -python = ">=3.12,<4" -rattler-build = ">=0.55.0,<0.56" -sccache = ">=0.12,<0.13" +[feature.rust-build.activation] +env.CARGO_TARGET_DIR = "target/pixi" -[feature.backends-release.activation.env] -RUSTC_WRAPPER = "sccache" +[feature.rust-build.dependencies] +compilers = ">=1.11.0,<2" +git = ">=2.51.0,<3" +openssl = ">=3.5.4,<4" +pkg-config = ">=0.29.2,<0.30" +python = ">=3.13.5,<3.15" +rust = ">=1.90.0,<1.91" +rust-src = ">=1.90.0,<2" -[feature.backends-release.tasks] -generate-matrix = { cmd = "python pixi-build-backends/scripts/generate-matrix.py", description = "Generate build matrix for backends release" } +[feature.rust-build.target.linux.dependencies] +clang = ">=21.1.2,<22" +compilers = ">=1.6.0" +make = ">=4.4.1,<5" +mold = ">=2.40.2,<3" -[feature.backends-release.tasks.build-recipe-ci] -args = ["output_dir", "recipe", { arg = "target_platform", default = "" }] -cmd = "rattler-build build --test native --channel https://prefix.dev/pixi-build-backends --channel https://prefix.dev/conda-forge --variant-config pixi-build-backends/recipe/variants.yaml --output-dir={{ output_dir }} --recipe {{ recipe }}{% if target_platform is defined and target_platform %} --target-platform {{ target_platform }}{% endif %}" -description = "Build a backend recipe for CI" +[feature.rust-build.target.unix.activation] +scripts = ["scripts/activate.sh"] -# Feature for native-certs testing -[feature.native-certs-test.dependencies] -mkcert = ">=1.4.4,<2" -pip = ">=25,<26" -rich = ">=14,<15" -testcontainers = ">=4,<5" +[feature.rust-build.target.win-64.dependencies] +vs2017_win-64 = ">=19.16.27033,<20" -[feature.native-certs-test.tasks] -test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CARGO_TARGET_DIR/release/pixi", description = "Test native-certs feature with local HTTPS PyPI server", depends-on = [ +[feature.rust-build.tasks] +build-debug = { cmd = "cargo build", description = "Build pixi in debug mode" } +build-release = { cmd = "cargo build --release", description = "Build pixi in release mode" } +generate-cli-docs = { cmd = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml", description = "Generate CLI documentation" } +install = { cmd = "cargo install --path crates/pixi --locked", description = "Install pixi itself locally using cargo" } +install-as = { cmd = "python scripts/install.py", depends-on = [ + "build-release", +], description = "Install release build to a custom location" } +install-debug-as = { cmd = "python scripts/install.py --debug", depends-on = [ + "build-debug", +], description = "Install debug build to a custom location" } +run-all-examples = { cmd = "python tests/scripts/run-all-examples.py --pixi-exec $CARGO_TARGET_DIR/release/pixi", depends-on = [ "build-release", -] } +], description = "Run all example projects" } # -# Environment descriptions +# Feature for Rust testing with cargo-nextest and cargo-insta # +[feature.rust-test.dependencies] +cargo-insta = "*" +[feature.rust-test.tasks] +insta = { cmd = "cargo insta", description = "Run cargo-insta commands" } +test = { depends-on = ["test-all-fast"], description = "Run all fast tests" } +test-all-extra-slow = { depends-on = [ + "test-slow", + "test-integration-extra-slow", +], description = "Run all tests including extra slow" } +test-all-fast = { depends-on = [ + "test-fast", + "test-integration-fast", +], description = "Run all fast Rust and Python tests" } +test-all-slow = { depends-on = [ + "test-slow", + "test-integration-slow", +], description = "Run all slow tests" } +test-fast = { cmd = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets""", description = "Run fast Rust tests" } +test-slow = { cmd = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets --features slow_integration_tests,online_tests --status-level skip --failure-output immediate-final --no-fail-fast --final-status-level slow""", description = "Run slow Rust tests with integration and online features" } + +# +# Feature for JSON schema generation and testing +# +[feature.schema.dependencies] +jsonschema = ">=3.2.0,<4" +pydantic = ">=2.11.10,<3" +pytest = ">=9.0.2,<10" +pyyaml = ">=6.0.3,<7" + +[feature.schema.tasks] +generate-schema = { cmd = "python model.py > schema.json", cwd = "schema", description = "Generate JSON schema from model" } +test-schema = { cmd = "pytest -s", depends-on = "generate-schema", cwd = "schema", description = "Test the manifest JSON schema" } + +# +# Feature for building Python trampolines +# +[feature.trampoline.dependencies] +python = ">=3.14.0,<3.15" +zstd = ">=1.5.7,<2" + +[feature.trampoline.tasks] +build-trampoline = { cmd = "python trampoline/build-trampoline.py", description = "Build the trampolines" } + +# +# Environment definitions +# [environments] -backends-release = { features = [ - "backends-release", -], no-default-feature = true } +backends-release = { features = ["backends-release"] } default = { features = [ - "build", + "rust-build", "dev", "schema", - "rust", ], solve-group = "default" } -dist = { features = ["dist"], no-default-feature = true } -docs = { features = [ - "docs", -], no-default-feature = true, solve-group = "default" } +dist = { features = ["dist"] } +docs = { features = ["docs"] } lint = { features = [ "lint", "python-test-deps", - "rust", + "rust-build", "schema", "pypi-gen", -], no-default-feature = true, solve-group = "default" } -pypi-gen = { features = ["pypi-gen"] } -pytest = { features = [ - "pytest", - "python-test-deps", -], no-default-feature = true } -recipes = { features = ["recipes"], no-default-feature = true } -schema = { features = [ - "schema", -], no-default-feature = true, solve-group = "default" } -test-export = { features = ["micromamba"], no-default-feature = true } -test-native-certs = { features = ["native-certs-test"] } -trampoline = { features = ["trampoline"], no-default-feature = true } - +], solve-group = "default" } +pypi-gen = { features = ["pypi-gen", "rust-build"], solve-group = "default" } +python-test = { features = ["pytest", "python-test-deps"] } +recipes = { features = ["recipes"] } +rust-test = { features = ["rust-test", "dev"], solve-group = "default" } +schema = { features = ["schema"], solve-group = "default" } +test-export = { features = ["micromamba"] } +test-native-certs = { features = [ + "native-certs-test", + "rust-build", +], solve-group = "default" } +trampoline = { features = ["trampoline"] } # -# Package descriptions +# Package definitions # - [package] name = "pixi" From 55e8b0c8b25d51bbad43af45b54222b5fc4f81ba Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 15:51:32 +0100 Subject: [PATCH 45/70] Fix test --- .../src/workspace/export/conda_environment.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/crates/pixi_cli/src/workspace/export/conda_environment.rs b/crates/pixi_cli/src/workspace/export/conda_environment.rs index f8e2a97265..4e45ab9621 100644 --- a/crates/pixi_cli/src/workspace/export/conda_environment.rs +++ b/crates/pixi_cli/src/workspace/export/conda_environment.rs @@ -441,17 +441,8 @@ mod tests { python = "3.9" "#; let workspace = Workspace::from_str(Path::new("pixi.toml"), toml).unwrap(); - let args = Args { - output_path: None, - platform: Some(Platform::Osx64), - environment: None, - workspace_config: WorkspaceConfig::default(), - name: None, - }; - let environment = workspace - .environment_from_name_or_env_var(args.environment) - .unwrap(); - let platform = args.platform.unwrap_or_else(|| environment.best_platform()); + let environment = workspace.default_environment(); + let platform = Platform::Osx64; let env_yaml = build_env_yaml( &platform, From 1176fa8de0308a210d447326f9e1e8ddfa06c601 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 16:37:29 +0100 Subject: [PATCH 46/70] Re-organize pixi.toml --- pixi.lock | 2645 ++++++++++++----- pixi.toml | 143 +- .../test_external_commands.py | 10 +- 3 files changed, 1911 insertions(+), 887 deletions(-) diff --git a/pixi.lock b/pixi.lock index be506f0889..a545297fb0 100644 --- a/pixi.lock +++ b/pixi.lock @@ -122,6 +122,12 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda default: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: {} + dev: channels: - url: https://prefix.dev/conda-forge/ options: @@ -130,88 +136,57 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_105.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-he8b2097_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-h76987e4_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda @@ -219,135 +194,72 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-hda29b82_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda @@ -355,68 +267,29 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.15-py314h2e8dab5_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-64: - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda @@ -424,41 +297,22 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda @@ -466,16 +320,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h745d5cb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda @@ -484,70 +335,30 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314hd330473_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda @@ -555,59 +366,39 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.3-hfe11c1f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda @@ -616,154 +407,71 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314ha14b1ff_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda win-64: - - conda: https://prefix.dev/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/icu-78.2-h637d24d_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda dist: channels: - url: https://prefix.dev/conda-forge/ @@ -838,8 +546,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda @@ -847,9 +559,19 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda - conda: https://prefix.dev/conda-forge/noarch/cssselect2-0.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -858,9 +580,18 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - conda: https://prefix.dev/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-he8b2097_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - conda: https://prefix.dev/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-cliff-2.11.0-h66dc0b5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -870,33 +601,43 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://prefix.dev/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgit2-1.9.2-hc20babb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.2-h6548e54_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda @@ -907,12 +648,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdx_truly_sane_lists-1.3-pyh29332c3_2.conda - conda: https://prefix.dev/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-llmstxt-0.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-redirects-1.2.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/nushell-0.109.1-h25c72ac_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda @@ -923,6 +666,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pillow-12.0.0-py313h80991f8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://prefix.dev/conda-forge/noarch/pyaml-25.7.0-pyhe01879c_0.conda @@ -939,8 +683,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/noarch/tinycss2-1.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -969,8 +718,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda @@ -978,9 +731,19 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda - conda: https://prefix.dev/conda-forge/noarch/cssselect2-0.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -989,9 +752,18 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-hda29b82_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - conda: https://prefix.dev/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-cliff-2.11.0-h911cc49_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -1001,33 +773,43 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/lerc-4.0.0-hfdc4d58_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgit2-1.9.2-hf175a32_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libpng-1.6.51-h1abf092_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda @@ -1038,12 +820,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdx_truly_sane_lists-1.3-pyh29332c3_2.conda - conda: https://prefix.dev/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-llmstxt-0.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-redirects-1.2.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/nushell-0.109.1-ha2bec05_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda @@ -1054,6 +838,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pillow-12.0.0-py313h20c1486_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://prefix.dev/conda-forge/noarch/pyaml-25.7.0-pyhe01879c_0.conda @@ -1070,8 +855,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/noarch/tinycss2-1.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1096,21 +886,37 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cairo-1.18.4-h950ec3b_0.conda - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cairosvg-2.8.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/noarch/cssselect2-0.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1119,9 +925,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/fontconfig-2.15.0-h37eeddb_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://prefix.dev/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-cliff-2.11.0-h0e6d0c0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -1130,29 +940,44 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libfreetype-2.14.1-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libfreetype6-2.14.1-h6912278_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgit2-1.9.2-h2720a56_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.2-hf241ffe_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libpng-1.6.51-h380d223_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda @@ -1169,6 +994,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-redirects-1.2.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/nushell-0.109.1-hd6c8b4f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda @@ -1179,6 +1006,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pillow-12.0.0-py313h8d2ffa5_2.conda - conda: https://prefix.dev/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - conda: https://prefix.dev/conda-forge/noarch/pyaml-25.7.0-pyhe01879c_0.conda @@ -1195,8 +1023,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/tinycss2-1.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1212,25 +1046,42 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-ng-2.3.2-h53ec75d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cairosvg-2.8.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/noarch/cssselect2-0.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1239,9 +1090,13 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://prefix.dev/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-cliff-2.11.0-h354fa51_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -1250,29 +1105,44 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgit2-1.9.2-had2deda_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.51-hfab5511_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda @@ -1289,6 +1159,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mkdocs-redirects-1.2.1-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nushell-0.109.1-hf35feb8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda @@ -1299,6 +1171,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-12.0.0-py313ha86496b_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://prefix.dev/conda-forge/noarch/pyaml-25.7.0-pyhe01879c_0.conda @@ -1315,8 +1188,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/tinycss2-1.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda @@ -1332,6 +1211,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-ng-2.3.2-h248ca61_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda @@ -1342,6 +1222,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda @@ -1349,10 +1230,19 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/noarch/cssselect2-0.8.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1360,9 +1250,9 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/win-64/git-cliff-2.11.0-hbe11609_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -1377,25 +1267,29 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_14.conda - - conda: https://prefix.dev/conda-forge/win-64/libgit2-1.9.2-hce7164d_0.conda - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - conda: https://prefix.dev/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_14.conda - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - conda: https://prefix.dev/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.51-h7351971_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://prefix.dev/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://prefix.dev/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://prefix.dev/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda @@ -1421,6 +1315,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/win-64/pillow-12.0.0-py313h38f99e1_2.conda - conda: https://prefix.dev/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://prefix.dev/conda-forge/noarch/pyaml-25.7.0-pyhe01879c_0.conda @@ -1436,6 +1331,9 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tinycss2-1.5.0-pyhcf101f3_0.conda @@ -1450,6 +1348,9 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda @@ -2172,7 +2073,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda @@ -2194,7 +2094,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda @@ -2202,13 +2101,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda @@ -2221,15 +2115,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -2241,8 +2132,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -2267,7 +2156,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda @@ -2289,7 +2177,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda @@ -2297,13 +2184,8 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda @@ -2317,15 +2199,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda @@ -2338,7 +2217,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -2360,7 +2238,6 @@ environments: osx-64: - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda @@ -2383,22 +2260,17 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda @@ -2406,14 +2278,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda @@ -2426,8 +2295,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -2451,7 +2318,6 @@ environments: osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda @@ -2474,22 +2340,17 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda @@ -2502,10 +2363,8 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -2519,7 +2378,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -2556,7 +2414,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -2612,20 +2469,23 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda @@ -2635,15 +2495,18 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -2663,13 +2526,17 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2682,20 +2549,23 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-habb1d5c_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda @@ -2705,15 +2575,18 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda @@ -2733,13 +2606,17 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2755,7 +2632,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda @@ -2793,13 +2670,16 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.11-h17c18a5_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2815,7 +2695,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda @@ -2854,13 +2734,16 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2875,7 +2758,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda + - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://prefix.dev/conda-forge/noarch/dirty-equals-0.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda @@ -2901,12 +2784,15 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda - - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2918,6 +2804,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda recipes: channels: - url: https://prefix.dev/conda-forge/ @@ -2953,7 +2840,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - rust-test: + release: channels: - url: https://prefix.dev/conda-forge/ options: @@ -2962,256 +2849,254 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/git-cliff-2.11.0-h66dc0b5_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgit2-1.9.2-hc20babb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyrsistent-0.20.0-py314h5bd0f2a_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/git-cliff-2.11.0-h911cc49_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgit2-1.9.2-hf175a32_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pyrsistent-0.20.0-py314hafb4487_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruamel.yaml.clib-0.2.15-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-64: - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/git-cliff-2.11.0-h0e6d0c0_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgit2-1.9.2-h2720a56_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pyrsistent-0.20.0-py314h03d016b_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314hd330473_1.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/git-cliff-2.11.0-h354fa51_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgit2-1.9.2-had2deda_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyrsistent-0.20.0-py314hb84d1df_2.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314ha14b1ff_1.conda - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda win-64: - - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/cli-ui-0.17.2-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/contextlib2-21.6.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docopt-0.6.2-pyhd8ed1ab_2.conda + - conda: https://prefix.dev/conda-forge/win-64/git-cliff-2.11.0-hbe11609_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -3220,38 +3105,770 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libgit2-1.9.2-hce7164d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda + - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda + - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + rust-build: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-he8b2097_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-hda29b82_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda + - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h745d5cb_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.3-hfe11c1f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda + - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + rust-test: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-edit-0.13.8-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-insta-1.44.3-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cargo-nextest-0.9.106-hb17b654_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-he8b2097_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-h76987e4_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_116.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-edit-0.13.8-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-insta-1.44.3-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cargo-nextest-0.9.106-h069e38c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-hda29b82_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_16.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_116.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-edit-0.13.8-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-insta-1.44.3-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cargo-nextest-0.9.106-h3c2ae71_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda + - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda + - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-edit-0.13.8-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-insta-1.44.3-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cargo-nextest-0.9.106-h8d80559_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda + - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.3-hfe11c1f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda + - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-edit-0.13.8-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-insta-1.44.3-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cargo-nextest-0.9.106-h18a1a76_0.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda + - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda + - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda + - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda + - conda: https://prefix.dev/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda + - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pykwalify-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pyrsistent-0.20.0-py314h5a2d7ad_2.conda - - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/ruamel.yaml.clib-0.2.15-py314hc5dbbe4_1.conda - - conda: https://prefix.dev/conda-forge/noarch/schema-0.7.7-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://prefix.dev/conda-forge/noarch/tbump-6.9.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/unidecode-1.4.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda schema: channels: @@ -3473,6 +4090,12 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda + test: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: {} test-export: channels: - url: https://prefix.dev/conda-forge/ @@ -3510,7 +4133,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda @@ -3535,7 +4157,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda @@ -3546,13 +4167,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda @@ -3565,16 +4181,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -3588,8 +4201,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -3627,7 +4238,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda @@ -3652,7 +4262,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda @@ -3663,13 +4272,8 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda @@ -3683,16 +4287,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda @@ -3707,7 +4308,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -3742,7 +4342,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/bcrypt-5.0.0-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda @@ -3768,7 +4367,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/git-2.52.0-pl5321hfcb5ae3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -3777,16 +4375,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda @@ -3794,15 +4388,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda @@ -3817,8 +4408,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -3855,7 +4444,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/bcrypt-5.0.0-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda @@ -3881,7 +4469,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/git-2.52.0-pl5321h8012a55_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -3890,16 +4477,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda @@ -3912,11 +4495,9 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -3932,7 +4513,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -3985,7 +4565,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - - conda: https://prefix.dev/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -4314,6 +4893,16 @@ packages: license_family: MIT size: 60101 timestamp: 1759762331492 +- conda: https://prefix.dev/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f + md5: 537296d57ea995666c68c821b00e360b + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + size: 64759 + timestamp: 1764875182184 - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac md5: 0a01c169f0ab0f91b26e77a3301fbfe4 @@ -4324,6 +4913,15 @@ packages: license_family: BSD size: 6938256 timestamp: 1738490268466 +- conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + noarch: generic + sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 + md5: a2ac7763a9ac75055b68f325d3255265 + depends: + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + size: 7514 + timestamp: 1767044983590 - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda sha256: 3a0af23d357a07154645c41d035a4efbd15b7a642db397fa9ea0193fd58ae282 md5: b16e2595d3a9042aa9d570375978835f @@ -4454,6 +5052,17 @@ packages: license_family: GPL size: 3747046 timestamp: 1764007847963 +- conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda + sha256: 17fbb32191430310d3eb8309f80a8df54f0d66eda9cf84b2ae5113e6d74e24d8 + md5: e410a8f80e22eb6d840e39ac6a34bd0e + depends: + - ld_impl_linux-64 2.45 default_hbd61a6d_105 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + size: 3719982 + timestamp: 1766513109980 - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda sha256: b7694c53943941a5234406b77b168e28d92227f8e69c697edda3faf436dd26c1 md5: 8107322440b07ab4234815368d1785a9 @@ -4465,6 +5074,17 @@ packages: license_family: GPL size: 4850743 timestamp: 1764007931341 +- conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda + sha256: 7398706fe428530777a7b1e69925c94e46cd45182c52f8a84f34cd601c8d2584 + md5: 3cee44d70779b513523a9a46146da3f9 + depends: + - ld_impl_linux-aarch64 2.45 default_h1979696_105 + - sysroot_linux-aarch64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + size: 4848132 + timestamp: 1766513201703 - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda sha256: ed23fee4db69ad82320cca400fc77404c3874cd866606651a20bf743acd1a9b1 md5: e30e71d685e23cc1e5ac1c1990ba1f81 @@ -4474,6 +5094,15 @@ packages: license_family: GPL size: 36180 timestamp: 1764007883258 +- conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_105.conda + sha256: 0eae8088e00edc7fe7a728d64f6614d2cf17a2df010e835eccefe30bfc726759 + md5: 4b1e4ae87a52e9724a9ec0c7b822bc89 + depends: + - binutils_impl_linux-64 2.45 default_hfdba357_105 + license: GPL-3.0-only + license_family: GPL + size: 36310 + timestamp: 1766513143566 - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda sha256: c93628f369264e5c7375915a5f589624d3211b5f4eb26a49395b1824976aeeb9 md5: ddc3eece92177305e59ed62f95342d4b @@ -4483,6 +5112,15 @@ packages: license_family: GPL size: 36380 timestamp: 1764007966890 +- conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_105.conda + sha256: e9441a6802726d72d36f3c814e98388bd6167ba44c480c4a168911a37b501734 + md5: 5ac81369b4efb28d9215b858f92aee07 + depends: + - binutils_impl_linux-aarch64 2.45 default_h5f4c503_105 + license: GPL-3.0-only + license_family: GPL + size: 36406 + timestamp: 1766513234691 - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda sha256: dadec2879492adede0a9af0191203f9b023f788c18efd45ecac676d424c458ae md5: 6c4d3597cf43f3439a51b2b13e29a4ba @@ -5340,6 +5978,14 @@ packages: license: ISC size: 157131 timestamp: 1762976260320 +- conda: https://prefix.dev/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda + sha256: 110338066d194a715947808611b763857c15458f8b3b97197387356844af9450 + md5: eacc711330cd46939f66cd401ff9c44b + depends: + - python >=3.10 + license: ISC + size: 150969 + timestamp: 1767500900768 - conda: https://prefix.dev/conda-forge/noarch/cffconvert-2.0.0-pyhd8ed1ab_1.conda sha256: 22e75e5bccf583f0f591abb2566608ccaeaebe12d3be0ed7aa21a8df8c1a6be7 md5: c344c2e03cee091f3a0f79f3d65dfade @@ -6059,26 +6705,6 @@ packages: license_family: PSF size: 18056 timestamp: 1734475348772 -- conda: https://prefix.dev/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda - noarch: generic - sha256: b88c76a6d6b45378552ccfd9e88b2a073161fe83fd1294c8fa103ffd32f7934a - md5: 99d689ccc1a360639eec979fd7805be9 - depends: - - python >=3.12,<3.13.0a0 - - python_abi * *_cp312 - license: Python-2.0 - size: 45767 - timestamp: 1761175217281 -- conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_100.conda - noarch: generic - sha256: 63f677762304e6f8dc55e11dff6aafe71129cbbd0a77d176b99ba1f6a5053b77 - md5: 5bf347916a543bcb290c780fa449bf73 - depends: - - python >=3.13,<3.14.0a0 - - python_abi * *_cp313 - license: Python-2.0 - size: 48369 - timestamp: 1765019689213 - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda noarch: generic sha256: 9e345f306446500956ffb1414b773f5476f497d7a2b5335a59edd2c335209dbb @@ -6640,6 +7266,16 @@ packages: license_family: BSD size: 28872 timestamp: 1764276713308 +- conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_16.conda + sha256: 4581ce836a04a591a2622c2a0f15b81d7a87cec614facb3a405c070c8fdb7ac8 + md5: dcaf539ffe75649239192101037f1406 + depends: + - conda-gcc-specs + - gcc_impl_linux-64 14.3.0 he8b2097_16 + license: BSD-3-Clause + license_family: BSD + size: 29022 + timestamp: 1765256332962 - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda sha256: cb4fa9e323bea26bfc6efae5ec96226b9d6c02947e193630988df8d3e50a43ac md5: 170aa085bbe897793aadf7c9f29146dd @@ -6650,6 +7286,16 @@ packages: license_family: BSD size: 28858 timestamp: 1764276460095 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_16.conda + sha256: bebeefc5271f2564584d69fb0a8de5a0d7f67febfb66797a71ef6383edebbfc8 + md5: d4495fad7efde408149a2bedf22a9cdd + depends: + - conda-gcc-specs + - gcc_impl_linux-aarch64 14.3.0 hda29b82_16 + license: BSD-3-Clause + license_family: BSD + size: 29062 + timestamp: 1765256869890 - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda sha256: f0d7031d4bd6fea9a0abd01454972f06c02c9ee6b425ab45b1aad3d9d107e88d md5: e6b9e795d27f9f524c67ad8803157056 @@ -6666,6 +7312,38 @@ packages: license_family: GPL size: 75290862 timestamp: 1764276418162 +- conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-he8b2097_16.conda + sha256: 4acf50b7d5673250d585a256a40aabdd922e0947ca12cdbad0cef960ee1a9509 + md5: d274bf1343507683e6eb2954d1871569 + depends: + - binutils_impl_linux-64 >=2.45 + - libgcc >=14.3.0 + - libgcc-devel_linux-64 14.3.0 hf649bbc_116 + - libgomp >=14.3.0 + - libsanitizer 14.3.0 h8f1669f_16 + - libstdcxx >=14.3.0 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_116 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 75290045 + timestamp: 1765256021903 +- conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda + sha256: dfd180b9df441b57aa539dfcfcc416c804638b3bc5ec9dbb5d7bdbc009eba497 + md5: 83c672f0e373c37436953413b2272a42 + depends: + - binutils_impl_linux-64 >=2.45 + - libgcc >=15.2.0 + - libgcc-devel_linux-64 15.2.0 hcc6f6b0_116 + - libgomp >=15.2.0 + - libsanitizer 15.2.0 h90f66d4_16 + - libstdcxx >=15.2.0 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_116 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 80309755 + timestamp: 1765256937267 - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda sha256: 6147e26961e53cf2ab9344d90805a2481270a8e5399b030f2d5ace9adf648cd3 md5: ea3ffa9c0f78561919863d3f62591c00 @@ -6682,6 +7360,38 @@ packages: license_family: GPL size: 68987573 timestamp: 1764276158144 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-hda29b82_16.conda + sha256: b00ba1fdeaeb5869cde719f6c3d25de3eae0afa3dec42983f3275cac746ec8e8 + md5: 773a1fcf84e229456d4b15689f5d35ae + depends: + - binutils_impl_linux-aarch64 >=2.45 + - libgcc >=14.3.0 + - libgcc-devel_linux-aarch64 14.3.0 h25ba3ff_116 + - libgomp >=14.3.0 + - libsanitizer 14.3.0 hedb4206_16 + - libstdcxx >=14.3.0 + - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_116 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 69075162 + timestamp: 1765256604036 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-habb1d5c_16.conda + sha256: 9b7e56534fa3029e0caf6dbbf4daa2d567e630672f977f01ad0c356933fb1b0d + md5: af391ca6347927b4e067a8be221d1b3a + depends: + - binutils_impl_linux-aarch64 >=2.45 + - libgcc >=15.2.0 + - libgcc-devel_linux-aarch64 15.2.0 h55c397f_116 + - libgomp >=15.2.0 + - libsanitizer 15.2.0 he19c465_16 + - libstdcxx >=15.2.0 + - libstdcxx-devel_linux-aarch64 15.2.0 ha7b1723_116 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 74461928 + timestamp: 1765257095042 - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda sha256: 7b9585c201c175c024c56b46658d9e4b5db85a32df54517798109281a90d03bb md5: 50dc15ac993bb5859f923979c81fafc8 @@ -6704,6 +7414,17 @@ packages: license_family: BSD size: 28654 timestamp: 1766347983463 +- conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-h76987e4_16.conda + sha256: 5c985d4c2e3963b996891da6f5b1169e6b2271479d4f286d10c72d7a0475acb1 + md5: f5b82e3d5f4d345e8e1a227636eeb64f + depends: + - gcc 14.3.0 h0dff253_16 + - gcc_impl_linux-64 14.3.0 he8b2097_16 + - gfortran_impl_linux-64 14.3.0 h1a219da_16 + license: BSD-3-Clause + license_family: BSD + size: 28426 + timestamp: 1765256352017 - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda sha256: 7ab008dd3dc5e6ca0de2614771019a1d35480d51df6216c96b1cf6a5e660ee40 md5: 94394acdc56dcb4d55dddf0393134966 @@ -6726,6 +7447,17 @@ packages: license_family: BSD size: 30531 timestamp: 1759967819421 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_16.conda + sha256: 30d5bc2b865c445f601667e50a541c619e4859340e228fa13000139097712200 + md5: 23c904cc53cdcb56b734d8f2a2d6f1df + depends: + - gcc 14.3.0 h2e72a27_16 + - gcc_impl_linux-aarch64 14.3.0 hda29b82_16 + - gfortran_impl_linux-aarch64 14.3.0 h6b0ea1e_16 + license: BSD-3-Clause + license_family: BSD + size: 28530 + timestamp: 1765256882437 - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda sha256: e99605f629a4baceba28bfda6305f6898a42a1a05a5833a92808b737457a0711 md5: 6077316830986f224d771f9e6ba5c516 @@ -7073,6 +7805,16 @@ packages: license_family: BSD size: 1936111 timestamp: 1764199789798 +- conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-h76987e4_16.conda + sha256: 5a4174e7723a95eca2305f4e4b3d19fa8c714eadd921b993e1a893fe47e5d3d7 + md5: a3aa64ee3486f51eb61018939c88ef12 + depends: + - gcc 14.3.0 h0dff253_16 + - gxx_impl_linux-64 14.3.0 h2185e75_16 + license: BSD-3-Clause + license_family: BSD + size: 28403 + timestamp: 1765256369945 - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda sha256: 7acf0ee3039453aa69f16da063136335a3511f9c157e222def8d03c8a56a1e03 md5: 91dc0abe7274ac5019deaa6100643265 @@ -7093,6 +7835,16 @@ packages: license_family: BSD size: 30526 timestamp: 1759967828504 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_16.conda + sha256: a6957b656cabbaa11206e4316b4312ad81b5d63eacf4c28a8e2c012e96407b97 + md5: 232deada90533c2621a13e3535317cb9 + depends: + - gcc 14.3.0 h2e72a27_16 + - gxx_impl_linux-aarch64 14.3.0 h0d4f5d4_16 + license: BSD-3-Clause + license_family: BSD + size: 28489 + timestamp: 1765256896301 - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda sha256: b7143edcd71ad48b8cb73083a03e874e36bff4defc034397772b361cb0ac3691 md5: 54ae44a161f3e492c654582c5fc47537 @@ -7105,6 +7857,18 @@ packages: license_family: GPL size: 14548897 timestamp: 1764276675761 +- conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_16.conda + sha256: 71a6672af972c4d072d79514e9755c9e9ea359d46613fd9333adcb3b08c0c008 + md5: 8729b9d902631b9ee604346a90a50031 + depends: + - gcc_impl_linux-64 14.3.0 he8b2097_16 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_116 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 15255410 + timestamp: 1765256273332 - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda sha256: c1319e508635fa7e85a364b0ac6d9db006a9e1687be2a12a5d66ccdf72ec1e16 md5: e844eacd4e1db7deceef5a0cec611f3e @@ -7117,6 +7881,18 @@ packages: license_family: GPL size: 13727340 timestamp: 1764276426320 +- conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_16.conda + sha256: 060c16a21fa60ba7ff632a7dfa56167a5b8e833b199b270ffc8831313370aa49 + md5: c31908937ef3f628f64728135b7fa6b3 + depends: + - gcc_impl_linux-aarch64 14.3.0 hda29b82_16 + - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_116 + - sysroot_linux-aarch64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 13534642 + timestamp: 1765256828434 - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda sha256: 90ccb0df50254feb5b4e539b06e3d2c3baf5c37e40579224a277ab164566a6a0 md5: 94474857477981fedf74cf7c47c88ba5 @@ -7268,6 +8044,17 @@ packages: license_family: MIT size: 14544252 timestamp: 1720853966338 +- conda: https://prefix.dev/conda-forge/win-64/icu-78.2-h637d24d_0.conda + sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a + md5: 0ee3bb487600d5e71ab7d28951b2016a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 13222158 + timestamp: 1767970128854 - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -7398,6 +8185,15 @@ packages: license_family: GPL size: 1272697 timestamp: 1752669126073 +- conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 1278712 + timestamp: 1765578681495 - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda sha256: 9d0a86bd0c52c39db8821405f6057bc984789d36e15e70fa5c697f8ba83c1a19 md5: 2ab884dda7f1a08758fe12c32cc31d08 @@ -7407,6 +8203,15 @@ packages: license_family: GPL size: 1244709 timestamp: 1752669116535 +- conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + sha256: 5d224bf4df9bac24e69de41897c53756108c5271a0e5d2d2f66fd4e2fbc1d84b + md5: bb3b7cad9005f2cbf9d169fb30263f3e + constrains: + - sysroot_linux-aarch64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 1248134 + timestamp: 1765578613607 - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 md5: b38117a3c920364aff79f870c984b4a3 @@ -8456,6 +9261,24 @@ packages: license_family: GPL size: 3090640 timestamp: 1764276123176 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_116.conda + sha256: 812f2b3f523fc0aabaf4e5e1b44a029c5205671179e574dd32dc57b65e072e0f + md5: 0141e19cb0cd5602c49c84f920e81921 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3082749 + timestamp: 1765255729247 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda + sha256: 48d7d8dded34100d9065d1c0df86a11ab2cd8ddfd1590512b304527ed25b6d93 + md5: e67832fdbf2382757205bb4b38800643 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3094906 + timestamp: 1765256682321 - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda sha256: 03ab3f2efbd0002a955ca126455bdbbeea2403732d04821277d933b04128323d md5: f86b3ec2e8c1e13cfd3bfaee210f2fb8 @@ -8465,6 +9288,24 @@ packages: license_family: GPL size: 2332772 timestamp: 1764275926559 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_116.conda + sha256: d9443aff6c8421f32ec79cd2801567b78cddc4e9bd1ba001adce0de98e53c5be + md5: c72ff594b1830f8e0b205965281620ad + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2371620 + timestamp: 1765256387487 +- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_116.conda + sha256: 594e4f22a4b6aae1bca5e22ea3a075c070642ca4c27c53e0c0973926ca711e09 + md5: 8ba6e9b5866b6a5429ca5d9fa12bc964 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2343262 + timestamp: 1765256811670 - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda sha256: 48a77fde940b4b877c0ed24efd562c135170a46d100c07cd2d7b67e842e30642 md5: 6c13aaae36d7514f28bd5544da1a7bb8 @@ -8683,6 +9524,20 @@ packages: license: LGPL-2.1-or-later size: 4039186 timestamp: 1763735602749 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda + sha256: 35f4262131e4d42514787fdc3d45c836e060e18fcb2441abd9dd8ecd386214f4 + md5: f226b9798c6c176d2a94eea1350b3b6b + depends: + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + constrains: + - glib 2.86.3 *_0 + license: LGPL-2.1-or-later + size: 4041779 + timestamp: 1765221790843 - conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.2-hf241ffe_1.conda sha256: 42584e893c81839ef630c0258dba03630443f9e79ed389d36c717b264ca5bf65 md5: 368c2b6486c19534b56ab1244b0f2c23 @@ -8713,6 +9568,21 @@ packages: license: LGPL-2.1-or-later size: 3639603 timestamp: 1763736657339 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.3-hfe11c1f_0.conda + sha256: 801c1835aa35a4f6e45e2192ad668bd7238d95c90ef8f02c52ce859c20117285 + md5: 057c7247514048ebdaf89373b263ebee + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + constrains: + - glib 2.86.3 *_0 + license: LGPL-2.1-or-later + size: 3670602 + timestamp: 1765223125237 - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda sha256: 04fbac5225af19f6b54f10ebb29da4dfa4f37bdce91f938d076a240be66e3f39 md5: e3296cac780785e2c7fd33a3d905772b @@ -8730,6 +9600,23 @@ packages: license: LGPL-2.1-or-later size: 3771133 timestamp: 1763735662152 +- conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda + sha256: 84b74fc81fff745f3d21a26c317ace44269a563a42ead3500034c27e407e1021 + md5: c2d5b6b790ef21abac0b5331094ccb56 + depends: + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - glib 2.86.3 *_0 + license: LGPL-2.1-or-later + size: 3818991 + timestamp: 1765222145992 - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda sha256: 2017cbc0f0f3b1d15df9ca681960eef015f9f58ba0d6e841694277a9f7eae0fc md5: 91349c276f84f590487e4c7f6e90e077 @@ -9195,16 +10082,6 @@ packages: license_family: MIT size: 575454 timestamp: 1756835746393 -- conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 - md5: d864d34357c3b65a4b731f78c0801dc4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-only - license_family: GPL - size: 33731 - timestamp: 1750274110928 - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda sha256: 1eb769c0f2778d07428947f64272592cc2d3b9bce63b41600abe5dc2b683d829 md5: d8b81203d08435eb999baa249427884e @@ -9261,12 +10138,34 @@ packages: md5: b1b15da9757caaa0814d7dc3112b3e06 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=14.3.0 - - libstdcxx >=14.3.0 + - libgcc >=14.3.0 + - libstdcxx >=14.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 7569795 + timestamp: 1764276337284 +- conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda + sha256: 21765d3fa780eb98055a9f40e9d4defa1eaffe254ee271a3e49555a89e37d6c9 + md5: 0617b134e4dc4474c1038707499f7eed + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.3.0 + - libstdcxx >=14.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 7946383 + timestamp: 1765255939536 +- conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda + sha256: 50d8082749e760454fb1489c2a47c6fa80cbf3893ec1c1a085747d46484ffd7f + md5: 0841a98bda756af037eb07d36cacada5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 7569795 - timestamp: 1764276337284 + size: 7660762 + timestamp: 1765256861607 - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda sha256: 24c3e2bc8d49d1d223b9fda17a7a90b4d472949bbc322ec4ae75328ab61ae512 md5: c5880215a1c021727ba6e5fce8a35482 @@ -9277,6 +10176,26 @@ packages: license_family: GPL size: 7286927 timestamp: 1764276087848 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_16.conda + sha256: b11c446a551d26cd117d26062ba3e782247b4462d1e2a8aacd22fc87333308ea + md5: bb08040cd8e7924026a2ad42b100ec7a + depends: + - libgcc >=14.3.0 + - libstdcxx >=14.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 7545993 + timestamp: 1765256538975 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda + sha256: 71be6819f928574caf929aa4764a69e3df0429d686a4c5d6a8985b4c2c14b965 + md5: 4e30740acf8527cc06ca6a8d81432536 + depends: + - libgcc >=15.2.0 + - libstdcxx >=15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 7460968 + timestamp: 1765257008136 - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda sha256: f87b743d5ab11c1a8ddd800dd9357fc0fabe47686068232ddc1d1eed0d7321ec md5: 3576aba85ce5e9ab15aa0ea376ab864b @@ -9549,6 +10468,24 @@ packages: license_family: GPL size: 20199758 timestamp: 1764276167178 +- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_116.conda + sha256: 278a6b7ebb02f1e983db06c6091b130c9a99f967acb526eac1a67077fd863da8 + md5: badba6a9f0e90fdaff87b06b54736ea6 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 20538116 + timestamp: 1765255773242 +- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda + sha256: cb331c51739cc68257c7d7eef0e29c355b46b2d72f630854506dbc99240057c1 + md5: 2730e07e576ffbd7bf13f8de34835d41 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 20763949 + timestamp: 1765256724565 - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda sha256: 5dc6133ebad9b2fd37579c185f36fad9b8e49364271be56e9435db201ab2ac80 md5: b5110c27a57f77d145ebf54cfcd7dbcf @@ -9558,6 +10495,24 @@ packages: license_family: GPL size: 17638852 timestamp: 1764275952359 +- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_116.conda + sha256: cddbbef6da59eafaf3067329f54b1011e99a959fdf200453564823b38f45dbd4 + md5: 8608a3438eabba3f9af24ffff0b8094b + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 17508577 + timestamp: 1765256413043 +- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_116.conda + sha256: 06be0d20cb3784e1d625f316f26962085dd14f74e166bd668ee9c089b5fa3efa + md5: 48cfd02ec4f1308109e5daaccb99aa30 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 17639950 + timestamp: 1765256847600 - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda sha256: 63336f51b88029a9557a430aecbb08a11365aa03ec47ec8d14e542fec5dc80fb md5: 9531f671a13eec0597941fa19e489b96 @@ -9929,6 +10884,21 @@ packages: license_family: MIT size: 45283 timestamp: 1761015644057 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda + sha256: 047be059033c394bd32ae5de66ce389824352120b3a7c0eff980195f7ed80357 + md5: 417955234eccd8f252b86a265ccdab7f + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 hca6bf5a_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 45402 + timestamp: 1766327161688 - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda sha256: db0a568e0853ee38b7a4db1cb4ee76e57fe7c32ccb1d5b75f6618a1041d3c6e4 md5: a0e7779b7625b88e37df9bd73f0638dc @@ -9943,6 +10913,20 @@ packages: license_family: MIT size: 47192 timestamp: 1761015739999 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda + sha256: 9fe997c3e5a8207161d093a5d73f586ae46dc319cb054220086395e150dd1469 + md5: eb4665cdf78fd02d4abc4edf8c15b7b9 + depends: + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h79dcc73_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 47725 + timestamp: 1766327143205 - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h23bb396_0.conda sha256: a40ec252d9c50fee7cb0b15be7e358a10888c89dadb23deac254789fcb047de7 md5: 65dd26de1eea407dda59f0da170aed22 @@ -9958,6 +10942,21 @@ packages: license_family: MIT size: 40433 timestamp: 1761016207984 +- conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h745d5cb_1.conda + sha256: 96fe14f775ae1bd9a3c464898fbc3fa6d784b867eadcf7d58a2d510d80a6fbfb + md5: 1fd2c75a8a9adc629983ed629dec42e1 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 hd57b93d_1 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + license: MIT + license_family: MIT + size: 40460 + timestamp: 1766327727478 - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda sha256: ddf87bf05955d7870a41ca6f0e9fbd7b896b5a26ec1a98cd990883ac0b4f99bb md5: e7ed73b34f9d43d80b7e80eba9bce9f3 @@ -9972,6 +10971,20 @@ packages: license_family: MIT size: 39985 timestamp: 1761015935429 +- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda + sha256: 59f96fa27cce6a9a27414c5bb301eedda1a1b85cd0d8f5d68f77e46b86e7c95f + md5: fd804ee851e20faca4fecc7df0901d07 + depends: + - __osx >=11.0 + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h5ef1a60_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 40607 + timestamp: 1766327501392 - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda sha256: c409e384ddf5976a42959265100d6b2c652017d250171eb10bae47ef8166193f md5: fb5ce61da27ee937751162f86beba6d1 @@ -9986,6 +10999,22 @@ packages: license_family: MIT size: 40607 timestamp: 1761016108361 +- conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d + md5: 68dc154b8d415176c07b6995bd3a65d9 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h3cfd58e_1 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 43387 + timestamp: 1766327259710 - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda sha256: fb51b91a01eac9ee5e26c67f4e081f09f970c18a3da5231b8172919a1e1b3b6b md5: 87116b9de9c1825c3fd4ef92c984877b @@ -10018,6 +11047,22 @@ packages: license_family: MIT size: 556302 timestamp: 1761015637262 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda + sha256: 8331284bf9ae641b70cdc0e5866502dd80055fc3b9350979c74bb1d192e8e09e + md5: 3fdd8d99683da9fe279c2f4cecd1e048 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 555747 + timestamp: 1766327145986 - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 md5: 23720d17346b21efb08d68c2255c8431 @@ -10034,6 +11079,21 @@ packages: license_family: MIT size: 554734 timestamp: 1761015772672 +- conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda + sha256: c76951407554d69dd348151f91cc2dc164efbd679b4f4e77deb2f9aa6eba3c12 + md5: e42758e7b065c34fd1b0e5143752f970 + depends: + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 599721 + timestamp: 1766327134458 - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda sha256: 7a13450bce2eeba8f8fb691868b79bf0891377b707493a527bd930d64d9b98af md5: e7177c6fbbf815da7b215b4cc3e70208 @@ -10079,6 +11139,21 @@ packages: license_family: MIT size: 494318 timestamp: 1761015899881 +- conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda + sha256: abdeaea43d0e882679942cc2385342d701873e18669828e40637a70a140ce614 + md5: 060f6892620dc862f3b54b9b2da8f177 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + - icu <0.0a0 + license: MIT + license_family: MIT + size: 493505 + timestamp: 1766327696842 - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda sha256: ebe2dd9da94280ad43da936efa7127d329b559f510670772debc87602b49b06d md5: 438c97d1e9648dd7342f86049dd44638 @@ -10094,6 +11169,21 @@ packages: license_family: MIT size: 464952 timestamp: 1761016087733 +- conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda + sha256: 2d5ab15113b0ba21f4656d387d26ab59e4fbaf3027f5e58a2a4fe370821eb106 + md5: 7eed1026708e26ee512f43a04d9d0027 + depends: + - __osx >=11.0 + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 464886 + timestamp: 1766327479416 - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda sha256: 3f65ea0f04c7738116e74ca87d6e40f8ba55b3df31ef42b8cb4d78dd96645e90 md5: 4a5ea6ec2055ab0dfd09fd0c498f834a @@ -10111,6 +11201,23 @@ packages: license_family: MIT size: 518616 timestamp: 1761016240185 +- conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc + md5: 07d73826fde28e7dbaec52a3297d7d26 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 518964 + timestamp: 1766327232819 - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -12001,33 +13108,6 @@ packages: license_family: MIT size: 39300 timestamp: 1751452761594 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda - build_number: 1 - sha256: 39898d24769a848c057ab861052e50bdc266310a7509efa3514b840e85a2ae98 - md5: 5c00c8cea14ee8d02941cab9121dce41 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - size: 31537229 - timestamp: 1761176876216 - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda build_number: 101 sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 @@ -12135,31 +13215,6 @@ packages: size: 36790521 timestamp: 1765021515427 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_100_cp313.conda - build_number: 100 - sha256: bbb0b341c3ce460d02087e1c5e0d3bb814c270f4ae61f82c0e2996ec3902d301 - md5: a6e2b5b263090516ec36efdd51dcc35b - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 33896215 - timestamp: 1765020450426 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda build_number: 101 sha256: 95f11d8f8e8007ead0927ff15401a9a48a28df92b284f41a08824955c009e974 @@ -12263,29 +13318,6 @@ packages: size: 37217543 timestamp: 1765020325291 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.11-h17c18a5_100_cp313.conda - build_number: 100 - sha256: 58e23beaf3174a809c785900477c37df9f88993b5a3ccd0d76d57d6688a1be37 - md5: 6ffffd784fe1126b73329e29c80ddf53 - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 17360881 - timestamp: 1765022591905 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda build_number: 101 sha256: b56484229cf83f6c84e8b138dc53f7f2fa9ee850f42bf1f6d6fa1c03c044c2d3 @@ -12381,29 +13413,6 @@ packages: size: 14323056 timestamp: 1765026108189 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_100_cp313.conda - build_number: 100 - sha256: c476f4e9b6d97c46b496b442878924868a54e5727251549ebfc82027aa52af68 - md5: 18a8c69608151098a8fb75eea64cc266 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 12920650 - timestamp: 1765020887340 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda build_number: 101 sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 @@ -12499,29 +13508,6 @@ packages: size: 13575758 timestamp: 1765021280625 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda - build_number: 100 - sha256: 0ee0402368783e1fad10025719530499c517a3dbbdfbe18351841d9b7aef1d6a - md5: 9e4c9a7ee9c4ab5b3778ab73e583283e - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Python-2.0 - size: 16617922 - timestamp: 1765019627175 - python_site_packages_path: Lib/site-packages - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda build_number: 101 sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 @@ -12654,24 +13640,6 @@ packages: license_family: BSD size: 26922 timestamp: 1761503229008 -- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - sha256: 59f17182813f8b23709b7d4cfda82c33b72dd007cb729efa0033c609fbd92122 - md5: c20172b4c59fbe288fa50cdc1b693d73 - depends: - - cpython 3.12.12.* - - python_abi * *_cp312 - license: Python-2.0 - size: 45888 - timestamp: 1761175248278 -- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.13.11-h4df99d1_100.conda - sha256: 4b08d4c2c4b956d306b4868d3faf724eebb5d6e6b170fad2eb0f2d4eb227f1af - md5: d1461b2e63b1909f4f5b41c823bd90ae - depends: - - cpython 3.13.11.* - - python_abi * *_cp313 - license: Python-2.0 - size: 48352 - timestamp: 1765019767640 - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda sha256: 8203dc90a5cb6687f5bfcf332eeaf494ec95d24ed13fca3c82ef840f0bb92a5d md5: 0064ab66736c4814864e808169dc7497 @@ -12681,16 +13649,6 @@ packages: license: Python-2.0 size: 49287 timestamp: 1765020424843 -- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - build_number: 8 - sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 - md5: c3efd25ac4d74b1584d2f7a57195ddf1 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6958 - timestamp: 1752805918820 - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda build_number: 8 sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 @@ -12756,19 +13714,6 @@ packages: license_family: BSD size: 4856 timestamp: 1646866525560 -- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda - sha256: 1b3dc4c25c83093fff08b86a3574bc6b94ba355c8eba1f35d805c5e256455fc7 - md5: fba10c2007c8b06f77c5a23ce3a635ad - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 204539 - timestamp: 1758892248166 - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af md5: 4794ea0adaebd9f844414e594b142cb2 @@ -13050,6 +13995,22 @@ packages: license_family: GPL size: 313930 timestamp: 1765813902568 +- conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 + md5: c65df89a0b2e321045a9e01d1337b182 + depends: + - python >=3.10 + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.21.1,<3 + - python + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 63602 + timestamp: 1766926974520 - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b md5: db0c6b99149880c8ba515cf4abe93ee4 @@ -13531,6 +14492,17 @@ packages: license_family: GPL size: 24210909 timestamp: 1752669140965 +- conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 24008591 + timestamp: 1765578833462 - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda sha256: 8ab275b5c5fbe36416c7d3fb8b71241eca2d024e222361f8e15c479f17050c0e md5: 1263d6ac8dadaea7c60b29f1b4af45b8 @@ -13542,15 +14514,27 @@ packages: license_family: GPL size: 23863575 timestamp: 1752669129101 -- conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - sha256: 090023bddd40d83468ef86573976af8c514f64119b2bd814ee63a838a542720a - md5: 959484a66b4b76befcddc4fa97c95567 +- conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + sha256: 1bd2db6b2e451247bab103e4a0128cf6c7595dd72cb26d70f7fadd9edd1d1bc3 + md5: fdf07ab944a222ff28c754914fdb0740 depends: - - python >=3.9 + - __glibc >=2.28 + - kernel-headers_linux-aarch64 4.18.0 h05a177a_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 23644746 + timestamp: 1765578629426 +- conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda + sha256: 795e03d14ce50ae409e86cf2a8bd8441a8c459192f97841449f33d2221066fef + md5: de98449f11d48d4b52eefb354e2bfe35 + depends: + - python >=3.10 + - python license: MIT license_family: MIT - size: 37554 - timestamp: 1733589854804 + size: 40319 + timestamp: 1765140047040 - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda sha256: 2602632f7923fd59042a897bfb22f050d78f2b5960d53565eae5fa6a79308caa md5: aae272355bc3f038e403130a5f6f5495 @@ -13935,6 +14919,19 @@ packages: license_family: MIT size: 101735 timestamp: 1750271478254 +- conda: https://prefix.dev/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a + md5: 9272daa869e03efe68833e3dc7a02130 + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + size: 103172 + timestamp: 1767817860341 - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf md5: ef02bbe151253a72b8eda264a935db66 diff --git a/pixi.toml b/pixi.toml index 8864009154..aa6f56be63 100644 --- a/pixi.toml +++ b/pixi.toml @@ -16,6 +16,42 @@ requires-pixi = ">=0.45" [workspace.target.linux-64.build-variants] c_stdlib_version = ["2.17"] +# +# Shared feature for C/C++ compilers and build tools +# +[feature.compilers.dependencies] +compilers = ">=1.11.0,<2" +openssl = ">=3.5.4,<4" +pkg-config = ">=0.29.2,<0.30" + +[feature.compilers.target.linux.dependencies] +clang = ">=21.1.2,<22" +compilers = ">=1.6.0" +make = ">=4.4.1,<5" +mold = ">=2.40.2,<3" + +[feature.compilers.target.win-64.dependencies] +vs2017_win-64 = ">=19.16.27033,<20" + +# +# Shared feature for Python +# +[feature.python.dependencies] +python = ">=3.13.5,<3.15" + +# +# Shared feature for Rust toolchain +# +[feature.rust.activation] +env.CARGO_TARGET_DIR = "target/pixi" + +[feature.rust.dependencies] +rust = ">=1.90.0,<1.91" +rust-src = ">=1.90.0,<2" + +[feature.rust.target.unix.activation] +scripts = ["scripts/activate.sh"] + # # Feature for building and releasing pixi-build-backends # @@ -41,14 +77,10 @@ description = "Build a backend recipe for CI" [feature.dev.dependencies] cargo-edit = ">=0.13.7,<0.14" cargo-nextest = ">=0.9.105,<0.10" -cffconvert = ">=2.0.0,<3" # Needed for the citation -tbump = ">=6.9.0,<7" [feature.dev.tasks] -bump = { cmd = "tbump --only-patch $RELEASE_VERSION", description = "Bump the version using tbump" } insta-review = { cmd = "cargo insta review --workspace", description = "Review cargo-insta snapshots" } pypi-proxy = { cmd = "python scripts/pypi-proxy.py", description = "Run PyPI proxy server" } -release = { cmd = "python scripts/release.py", description = "Run the release script" } switch-to-remote-rattler = { cmd = "python scripts/local_patch.py rattler remote", description = "Switch back to remote rattler dependencies" } switch-to-remote-uv = { cmd = "python scripts/local_patch.py uv remote", description = "Switch back to remote uv dependencies" } update-rattler = { cmd = "cargo upgrade --incompatible allow -p rattler -p file_url -p rattler_cache -p rattler_conda_types -p rattler_digest -p rattler_lock -p rattler_networking -p rattler_repodata_gateway -p rattler_shell -p rattler_solve -p rattler_virtual_packages", description = "Update rattler dependencies to latest versions" } @@ -79,7 +111,6 @@ zig = ">=0.15.1,<0.16" # [feature.docs.dependencies] cairosvg = ">=2.8.2,<3" -git-cliff = ">=2.11.0,<3" mdx_truly_sane_lists = ">=1.3,<2" mike = ">=2.1.3,<3" mkdocs-llmstxt = ">=0.4.0,<0.5" @@ -92,13 +123,13 @@ pillow = ">=12,<13" build-docs = { cmd = "mkdocs build --strict", depends-on = [ "download-font", ], description = "Build documentation" } -bump-changelog = { cmd = "git-cliff --unreleased --prepend CHANGELOG.md --tag $RELEASE_VERSION", description = "Update changelog with unreleased changes" } deploy-dev = { cmd = "mike deploy --push dev devel", description = "Deploy development docs" } deploy-latest = { cmd = "mike deploy --push --update-aliases $RELEASE_VERSION latest", description = "Deploy latest release docs" } docs = { cmd = "mkdocs serve", depends-on = [ "download-font", ], description = "Serve the docs locally" } download-font = { cmd = "nu docs/layouts/download-font-to-cache.nu", description = "Download fonts for documentation" } +generate-cli-docs = { cmd = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml", description = "Generate CLI documentation" } mike-serve = { cmd = "mike serve", description = "Serve versioned docs with mike" } # @@ -178,6 +209,19 @@ python-build = ">=1.3.0,<2" [feature.pypi-gen.tasks] pypi-gen-indexes = { cmd = "python tests/data/pypi-indexes/generate-indexes.py", description = "Generate PyPI test indexes" } +# +# Feature for release tasks +# +[feature.release.dependencies] +cffconvert = ">=2.0.0,<3" +git-cliff = ">=2.11.0,<3" +tbump = ">=6.9.0,<7" + +[feature.release.tasks] +bump = { cmd = "tbump --only-patch $RELEASE_VERSION", description = "Bump the version using tbump" } +bump-changelog = { cmd = "git-cliff --unreleased --prepend CHANGELOG.md --tag $RELEASE_VERSION", description = "Update changelog with unreleased changes" } +release = { cmd = "python scripts/release.py", description = "Run the release script" } + # # Feature for Python integration tests with pytest # @@ -235,6 +279,7 @@ pytest = ">=9.0.2,<10" pytest-rerunfailures = ">=16.0.1,<17" pytest-timeout = ">=2.4.0,<3" pytest-xdist = ">=3.8.0,<4" +python = ">=3.14.0,<3.15" pyyaml = ">=6.0.3,<7" rattler-build = ">=0.55,<0.56" rich = ">=14.1.0,<15" @@ -251,36 +296,14 @@ rattler-build = ">=0.55,<0.56" build-backends = { cmd = "rattler-build build --recipe-dir empty --output-dir .", cwd = "tests/build-backends", description = "Build build-backends used for testing purposes" } # -# Feature for Rust building and compilation +# Feature for Rust building and compilation tasks # -[feature.rust-build.activation] -env.CARGO_TARGET_DIR = "target/pixi" - [feature.rust-build.dependencies] -compilers = ">=1.11.0,<2" git = ">=2.51.0,<3" -openssl = ">=3.5.4,<4" -pkg-config = ">=0.29.2,<0.30" -python = ">=3.13.5,<3.15" -rust = ">=1.90.0,<1.91" -rust-src = ">=1.90.0,<2" - -[feature.rust-build.target.linux.dependencies] -clang = ">=21.1.2,<22" -compilers = ">=1.6.0" -make = ">=4.4.1,<5" -mold = ">=2.40.2,<3" - -[feature.rust-build.target.unix.activation] -scripts = ["scripts/activate.sh"] - -[feature.rust-build.target.win-64.dependencies] -vs2017_win-64 = ">=19.16.27033,<20" [feature.rust-build.tasks] build-debug = { cmd = "cargo build", description = "Build pixi in debug mode" } build-release = { cmd = "cargo build --release", description = "Build pixi in release mode" } -generate-cli-docs = { cmd = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml", description = "Generate CLI documentation" } install = { cmd = "cargo install --path crates/pixi --locked", description = "Install pixi itself locally using cargo" } install-as = { cmd = "python scripts/install.py", depends-on = [ "build-release", @@ -300,19 +323,6 @@ cargo-insta = "*" [feature.rust-test.tasks] insta = { cmd = "cargo insta", description = "Run cargo-insta commands" } -test = { depends-on = ["test-all-fast"], description = "Run all fast tests" } -test-all-extra-slow = { depends-on = [ - "test-slow", - "test-integration-extra-slow", -], description = "Run all tests including extra slow" } -test-all-fast = { depends-on = [ - "test-fast", - "test-integration-fast", -], description = "Run all fast Rust and Python tests" } -test-all-slow = { depends-on = [ - "test-slow", - "test-integration-slow", -], description = "Run all slow tests" } test-fast = { cmd = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets""", description = "Run fast Rust tests" } test-slow = { cmd = """RUST_LOG="debug,resolvo=info" cargo nextest run --workspace --all-targets --features slow_integration_tests,online_tests --status-level skip --failure-output immediate-final --no-fail-fast --final-status-level slow""", description = "Run slow Rust tests with integration and online features" } @@ -329,6 +339,24 @@ pyyaml = ">=6.0.3,<7" generate-schema = { cmd = "python model.py > schema.json", cwd = "schema", description = "Generate JSON schema from model" } test-schema = { cmd = "pytest -s", depends-on = "generate-schema", cwd = "schema", description = "Test the manifest JSON schema" } +# +# Feature for test wrapper/aggregator tasks +# +[feature.test.tasks] +test = { depends-on = ["test-all-fast"], description = "Run all fast tests" } +test-all-extra-slow = { depends-on = [ + "test-slow", + "test-integration-extra-slow", +], description = "Run all tests including extra slow" } +test-all-fast = { depends-on = [ + "test-fast", + "test-integration-fast", +], description = "Run all fast Rust and Python tests" } +test-all-slow = { depends-on = [ + "test-slow", + "test-integration-slow", +], description = "Run all slow tests" } + # # Feature for building Python trampolines # @@ -344,30 +372,33 @@ build-trampoline = { cmd = "python trampoline/build-trampoline.py", description # [environments] backends-release = { features = ["backends-release"] } -default = { features = [ - "rust-build", - "dev", - "schema", -], solve-group = "default" } +dev = { features = ["rust", "compilers", "python", "dev"] } dist = { features = ["dist"] } -docs = { features = ["docs"] } +docs = { features = ["rust", "compilers", "python", "docs"] } lint = { features = [ + "rust", + "compilers", + "python", "lint", "python-test-deps", - "rust-build", "schema", "pypi-gen", -], solve-group = "default" } -pypi-gen = { features = ["pypi-gen", "rust-build"], solve-group = "default" } -python-test = { features = ["pytest", "python-test-deps"] } +] } +pypi-gen = { features = ["rust", "compilers", "python", "pypi-gen"] } +python-test = { features = ["rust", "pytest", "python-test-deps"] } recipes = { features = ["recipes"] } -rust-test = { features = ["rust-test", "dev"], solve-group = "default" } -schema = { features = ["schema"], solve-group = "default" } +release = { features = ["release"] } +rust-build = { features = ["rust", "compilers", "python", "rust-build"] } +rust-test = { features = ["rust", "compilers", "python", "dev", "rust-test"] } +schema = { features = ["schema"] } +test = { features = ["test"] } test-export = { features = ["micromamba"] } test-native-certs = { features = [ + "rust", + "compilers", + "python", "native-certs-test", - "rust-build", -], solve-group = "default" } +] } trampoline = { features = ["trampoline"] } # diff --git a/tests/integration_python/test_external_commands.py b/tests/integration_python/test_external_commands.py index 47aa85045b..fa5e0b72e3 100644 --- a/tests/integration_python/test_external_commands.py +++ b/tests/integration_python/test_external_commands.py @@ -2,8 +2,7 @@ import stat from pathlib import Path - -from .common import ExitCode, verify_cli_command +from .common import PIXI_VERSION, ExitCode, verify_cli_command def create_external_command(command_path: Path, script_content: str) -> Path: @@ -125,11 +124,8 @@ def test_pixi_internal_wins_over_external( # We want to make sure that pixi list is executed instead of the # external command ( pixi-foobar that we exposed as pixi-list ) verify_cli_command( - [pixi, "list"], + [pixi, "--version"], env=env, cwd=tmp_pixi_workspace, - stdout_contains=[ - "Kind", - "Build", - ], + stdout_contains=[PIXI_VERSION], ) From efced3fbdec3e1c6449904a27175acba3eacbb72 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 17:16:28 +0100 Subject: [PATCH 47/70] Update features --- pixi.lock | 767 +++++++++++------------------------------------------- pixi.toml | 13 +- 2 files changed, 153 insertions(+), 627 deletions(-) diff --git a/pixi.lock b/pixi.lock index a545297fb0..524e034781 100644 --- a/pixi.lock +++ b/pixi.lock @@ -549,7 +549,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda @@ -557,7 +557,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cairosvg-2.8.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda @@ -641,7 +641,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-tables-1.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -664,7 +664,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pillow-12.0.0-py313h80991f8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/pillow-12.1.0-py314h8ec4b1a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda @@ -675,11 +675,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pymdown-extensions-10.17.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda @@ -698,7 +698,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda @@ -711,7 +711,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 @@ -721,7 +721,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda @@ -729,7 +729,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cairosvg-2.8.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda @@ -813,7 +813,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-tables-1.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -836,7 +836,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pillow-12.0.0-py313h20c1486_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/pillow-12.1.0-py314hac3e5ec_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda @@ -847,11 +847,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pymdown-extensions-10.17.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda @@ -870,7 +870,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/watchdog-6.0.0-py313h1258fbd_2.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/watchdog-6.0.0-py314ha42fa4b_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda @@ -883,14 +883,14 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zlib-ng-2.3.2-h7ac5ae9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda + - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda @@ -901,7 +901,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda @@ -981,7 +981,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-tables-1.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -1004,7 +1004,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pillow-12.0.0-py313h8d2ffa5_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pillow-12.1.0-py314hf9dbaa9_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda @@ -1015,11 +1015,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pymdown-extensions-10.17.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda @@ -1039,7 +1039,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/watchdog-6.0.0-py313hf050af9_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/watchdog-6.0.0-py314h6482030_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://prefix.dev/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda @@ -1048,14 +1048,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zlib-ng-2.3.2-h53ec75d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda @@ -1066,7 +1066,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda @@ -1146,7 +1146,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-tables-1.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -1169,7 +1169,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-12.0.0-py313ha86496b_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-12.1.0-py314hab283cf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda @@ -1180,11 +1180,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pymdown-extensions-10.17.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda @@ -1204,7 +1204,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/watchdog-6.0.0-py313h6535dbc_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/watchdog-6.0.0-py314h0612a62_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda @@ -1213,14 +1213,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-ng-2.3.2-h248ca61_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda + - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda @@ -1228,7 +1228,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/cairocffi-1.7.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/cairosvg-2.8.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda @@ -1293,7 +1293,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/markdownify-1.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdformat-tables-1.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -1313,7 +1313,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pillow-12.0.0-py313h38f99e1_2.conda + - conda: https://prefix.dev/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - conda: https://prefix.dev/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda @@ -1324,11 +1324,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pymdown-extensions-10.17.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda @@ -1351,7 +1351,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://prefix.dev/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_2.conda + - conda: https://prefix.dev/conda-forge/win-64/watchdog-6.0.0-py314h86ab7b2_2.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda @@ -1360,7 +1360,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zlib-ng-2.3.2-h5112557_0.conda - - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda + - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda lint: channels: @@ -5121,21 +5121,6 @@ packages: license_family: GPL size: 36406 timestamp: 1766513234691 -- conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - sha256: dadec2879492adede0a9af0191203f9b023f788c18efd45ecac676d424c458ae - md5: 6c4d3597cf43f3439a51b2b13e29a4ba - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 hb03c661_1 - license: MIT - license_family: MIT - size: 367721 - timestamp: 1764017371123 - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 md5: 8910d2c46f7e7b519129f486e0fe927a @@ -5151,21 +5136,6 @@ packages: license_family: MIT size: 367376 timestamp: 1764017265553 -- conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - sha256: 5fe27389162240ab9a5cd8d112d51bdd9019f9a68c5593b5298e54f0437f714f - md5: 523c55147ba15d3e0e0cdb9f67cda339 - depends: - - libgcc >=14 - - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 he30d5cf_1 - license: MIT - license_family: MIT - size: 372678 - timestamp: 1764017653333 - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 md5: a1b5c571a0923a205d663d8678df4792 @@ -5181,20 +5151,6 @@ packages: license_family: MIT size: 373193 timestamp: 1764017486851 -- conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - sha256: 3d328413ff65a12af493066d721d12f5ee82a0adf3565629ce4c797c4680162c - md5: 7c5e382b4d5161535f1dd258103fea51 - depends: - - __osx >=10.13 - - libcxx >=19 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 h8616949_1 - license: MIT - license_family: MIT - size: 389859 - timestamp: 1764018040907 - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda sha256: 2e34922abda4ac5726c547887161327b97c3bbd39f1204a5db162526b8b04300 md5: 389d75a294091e0d7fa5a6fc683c4d50 @@ -5209,21 +5165,6 @@ packages: license_family: MIT size: 390153 timestamp: 1764017784596 -- conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - sha256: 2e21dccccd68bedd483300f9ab87a425645f6776e6e578e10e0dd98c946e1be9 - md5: b03732afa9f4f54634d94eb920dfb308 - depends: - - __osx >=11.0 - - libcxx >=19 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 hc919400_1 - license: MIT - license_family: MIT - size: 359568 - timestamp: 1764018359470 - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 md5: f9501812fe7c66b6548c7fcaa1c1f252 @@ -5239,21 +5180,6 @@ packages: license_family: MIT size: 359854 timestamp: 1764018178608 -- conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py313h3ebfc14_1.conda - sha256: 3558006cd6e836de8dff53cbe5f0b9959f96ea6a6776b4e14f1c524916dd956c - md5: 916a39a0261621b8c33e9db2366dd427 - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - libbrotlicommon 1.2.0 hfd05255_1 - license: MIT - license_family: MIT - size: 335605 - timestamp: 1764018132514 - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b md5: 1302b74b93c44791403cbeee6a0f62a3 @@ -6000,20 +5926,6 @@ packages: license_family: APACHE size: 54965 timestamp: 1736073317785 -- conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 - md5: d0616e7935acab407d1543b28c446f6f - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - size: 298357 - timestamp: 1761202966461 - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e md5: cf45f4278afd6f4e6d03eda0f435d527 @@ -6028,19 +5940,6 @@ packages: license_family: MIT size: 300271 timestamp: 1761203085220 -- conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - sha256: 10f6ca0e48bbed90b252fca49b188df0016b7033a9fcb472479585056fd38433 - md5: 59837145ebd94715f75b0f0aef732d5c - depends: - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - size: 316294 - timestamp: 1761203943693 - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda sha256: 728e55b32bf538e792010308fbe55d26d02903ddc295fbe101167903a123dd6f md5: f333c475896dbc8b15efd8f7c61154c7 @@ -6054,19 +5953,6 @@ packages: license_family: MIT size: 318357 timestamp: 1761203973223 -- conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - sha256: 16c8c80bebe1c3d671382a64beaa16996e632f5b75963379e2b084eb6bc02053 - md5: b10f64f2e725afc9bf2d9b30eff6d0ea - depends: - - __osx >=10.13 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - size: 290946 - timestamp: 1761203173891 - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda sha256: e2c58cc2451cc96db2a3c8ec34e18889878db1e95cc3e32c85e737e02a7916fb md5: 71c2caaa13f50fe0ebad0f961aee8073 @@ -6080,20 +5966,6 @@ packages: license_family: MIT size: 293633 timestamp: 1761203106369 -- conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c - md5: 050374657d1c7a4f2ea443c0d0cbd9a0 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - size: 291376 - timestamp: 1761203583358 - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98 md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7 @@ -6108,20 +5980,6 @@ packages: license_family: MIT size: 292983 timestamp: 1761203354051 -- conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - sha256: f867a11f42bb64a09b232e3decf10f8a8fe5194d7e3a216c6bac9f40483bd1c6 - md5: 55b44664f66a2caf584d72196aa98af9 - depends: - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - size: 292681 - timestamp: 1761203203673 - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda sha256: 924f2f01fa7a62401145ef35ab6fc95f323b7418b2644a87fea0ea68048880ed md5: c360170be1c9183654a240aadbedad94 @@ -11480,75 +11338,19 @@ packages: license_family: MIT size: 21734 timestamp: 1760956933495 -- conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 - md5: c14389156310b8ed3520d84f854be1ee +- conda: https://prefix.dev/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + sha256: e0cbfea51a19b3055ca19428bd9233a25adca956c208abb9d00b21e7259c7e03 + md5: fab1be106a50e20f10fe5228fd1d1651 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 25909 - timestamp: 1759055357045 -- conda: https://prefix.dev/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda - sha256: c03eb8f5a4659ce31e698a328372f6b0357644d557ea0dc01fe0c5897c231c48 - md5: 59fc93a010d6e8a08a4fa32424d86a82 - depends: - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 26403 - timestamp: 1759056219797 -- conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda - sha256: 9c698da56e3bdae80be2a7bc0d19565971b36060155374d16fce14271c8b695c - md5: 884a82dc80ecd251e38d647808c424b3 - depends: - - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 25105 - timestamp: 1759055575973 -- conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 - md5: 3df5979cc0b761dda0053ffdb0bca3ea - depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 25778 - timestamp: 1759055530601 -- conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - sha256: 988d14095c1392e055fd75e24544da2db01ade73b0c2f99ddc8e2b8678ead4cc - md5: 47eaaa4405741beb171ea6edc6eaf874 - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 + - python >=3.10 constrains: - jinja2 >=3.0.0 + track_features: + - markupsafe_no_compile license: BSD-3-Clause license_family: BSD - size: 28959 - timestamp: 1759055685616 + size: 15499 + timestamp: 1759055275624 - conda: https://prefix.dev/conda-forge/noarch/mdformat-0.7.22-pyhd8ed1ab_0.conda sha256: b27fc9ea628794500403f05bf245ba1ec355a9dba88b320bd8d0a54b0ea8e321 md5: a8901729d5dd45565b737ddfe83fa312 @@ -12356,111 +12158,111 @@ packages: license: GPL-1.0-or-later OR Artistic-1.0-Perl size: 14439531 timestamp: 1703311335652 -- conda: https://prefix.dev/conda-forge/linux-64/pillow-12.0.0-py313h80991f8_2.conda - sha256: 5319da7c24f4f876c966fc6e83789aa4530779d4454c37c4169f79050555bc26 - md5: 37ca27d2f726f29a068230d8f6917ce4 +- conda: https://prefix.dev/conda-forge/linux-64/pillow-12.1.0-py314h8ec4b1a_0.conda + sha256: 6d8e32dc44165cff96ec9c00383e998fd035983d971c5f35ebed6f5f51c4022a + md5: f9b6a8fbb8dcb840a0c1c052dc5092e4 depends: - python - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libwebp-base >=1.6.0,<2.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 + - libgcc >=14 - lcms2 >=2.17,<3.0a0 - - libxcb >=1.17.0,<2.0a0 - - python_abi 3.13.* *_cp313 - - zlib-ng >=2.3.1,<2.4.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 + - libjpeg-turbo >=3.1.2,<4.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 + - libxcb >=1.17.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 - openjpeg >=2.5.4,<3.0a0 + - python_abi 3.14.* *_cp314 - libtiff >=4.7.1,<4.8.0a0 - tk >=8.6.13,<8.7.0a0 license: HPND - size: 1040806 - timestamp: 1764330106863 -- conda: https://prefix.dev/conda-forge/linux-aarch64/pillow-12.0.0-py313h20c1486_2.conda - sha256: 3b38635e8fa16b150ef9716a65992c70125dd28a4a4e63f3767e7e799d695ac6 - md5: 44dcde383f0f19336750c7816df00947 + size: 1072995 + timestamp: 1767353193452 +- conda: https://prefix.dev/conda-forge/linux-aarch64/pillow-12.1.0-py314hac3e5ec_0.conda + sha256: 528fecfaaf67a98473dc0a8bff619bc6e2a2d3ec0b747127250eaf0cd22e3584 + md5: 43893d1b232a58fbd5299ab341d36f98 depends: - python + - python 3.14.* *_cp314 - libgcc >=14 - - python 3.13.* *_cp313 + - lcms2 >=2.17,<3.0a0 - openjpeg >=2.5.4,<3.0a0 - - tk >=8.6.13,<8.7.0a0 + - python_abi 3.14.* *_cp314 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 + - libwebp-base >=1.6.0,<2.0a0 + - tk >=8.6.13,<8.7.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 - libtiff >=4.7.1,<4.8.0a0 - - python_abi 3.13.* *_cp313 - libxcb >=1.17.0,<2.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - zlib-ng >=2.3.1,<2.4.0a0 - - lcms2 >=2.17,<3.0a0 license: HPND - size: 1019643 - timestamp: 1764330103017 -- conda: https://prefix.dev/conda-forge/osx-64/pillow-12.0.0-py313h8d2ffa5_2.conda - sha256: 5ee2562f8fd14aa6e1e77708c1f66fc9557f76e1c9deef3df8461b18aff48788 - md5: 7681f51d660830db9c65b20e32e47350 + size: 1051742 + timestamp: 1767353151893 +- conda: https://prefix.dev/conda-forge/osx-64/pillow-12.1.0-py314hf9dbaa9_0.conda + sha256: f7cf133ea24a3ba8fa66c787305951a80a90f50f8922e496b70dae72a36d3101 + md5: ca55b2df1530e093f26d25ed503aafe8 depends: - python - __osx >=10.13 + - python_abi 3.14.* *_cp314 - openjpeg >=2.5.4,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - python_abi 3.13.* *_cp313 - - lcms2 >=2.17,<3.0a0 - tk >=8.6.13,<8.7.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - libwebp-base >=1.6.0,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 - libxcb >=1.17.0,<2.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - - zlib-ng >=2.3.1,<2.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - lcms2 >=2.17,<3.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 license: HPND - size: 975260 - timestamp: 1764330319001 -- conda: https://prefix.dev/conda-forge/osx-arm64/pillow-12.0.0-py313ha86496b_2.conda - sha256: cb85e8c90c107dc81f783a42f996808eaa384b307e8becdfd1619e6fe09cc27c - md5: d52bb6207093e90d6b70649728257e3f + size: 1004566 + timestamp: 1767353261553 +- conda: https://prefix.dev/conda-forge/osx-arm64/pillow-12.1.0-py314hab283cf_0.conda + sha256: 3f88f2600862583c8bed3d37f4b95f0f96a459e9fdd36ca680472bc89a46e7bb + md5: 1f9dae6213643ac883e300c11df611eb depends: - python - - python 3.13.* *_cp313 - __osx >=11.0 + - python 3.14.* *_cp314 - libjpeg-turbo >=3.1.2,<4.0a0 + - openjpeg >=2.5.4,<3.0a0 + - python_abi 3.14.* *_cp314 + - zlib-ng >=2.3.2,<2.4.0a0 + - libxcb >=1.17.0,<2.0a0 + - lcms2 >=2.17,<3.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - - lcms2 >=2.17,<3.0a0 - - openjpeg >=2.5.4,<3.0a0 - libtiff >=4.7.1,<4.8.0a0 - - zlib-ng >=2.3.1,<2.4.0a0 - - python_abi 3.13.* *_cp313 - - libxcb >=1.17.0,<2.0a0 - - libwebp-base >=1.6.0,<2.0a0 - tk >=8.6.13,<8.7.0a0 + - libwebp-base >=1.6.0,<2.0a0 license: HPND - size: 963893 - timestamp: 1764330196017 -- conda: https://prefix.dev/conda-forge/win-64/pillow-12.0.0-py313h38f99e1_2.conda - sha256: 6c7a26238d0ee7e05df272e98103ad1deb91bd2d73c4cefc8445d1c876b08227 - md5: ac88da43d42b7c5badddb6bf3e6f8bc5 + size: 995543 + timestamp: 1767353279681 +- conda: https://prefix.dev/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda + sha256: b30a83db337dab8579a46e3da7906851f53d6cf8c09695aef6d2a38b17636c1c + md5: 17dbdfedee39f31166b7e548f3ccc58a depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libtiff >=4.7.1,<4.8.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - tk >=8.6.13,<8.7.0a0 - libwebp-base >=1.6.0,<2.0a0 - lcms2 >=2.17,<3.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 + - openjpeg >=2.5.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - python_abi 3.13.* *_cp313 - - zlib-ng >=2.3.1,<2.4.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - libxcb >=1.17.0,<2.0a0 - - openjpeg >=2.5.4,<3.0a0 + - python_abi 3.14.* *_cp314 license: HPND - size: 943960 - timestamp: 1764330112081 + size: 973387 + timestamp: 1767353195064 - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda sha256: 4d5e2faca810459724f11f78d19a0feee27a7be2b3fc5f7abbbec4c9fdcae93d md5: bf47878473e5ab9fdb4115735230e191 @@ -13108,32 +12910,6 @@ packages: license_family: MIT size: 39300 timestamp: 1751452761594 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - build_number: 101 - sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 - md5: 4780fe896e961722d0623fa91d0d3378 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 37174029 - timestamp: 1761178179147 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda build_number: 102 sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 @@ -13215,31 +12991,6 @@ packages: size: 36790521 timestamp: 1765021515427 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - build_number: 101 - sha256: 95f11d8f8e8007ead0927ff15401a9a48a28df92b284f41a08824955c009e974 - md5: b62a2e7c210e4bffa9aaa041f7152a25 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 33737136 - timestamp: 1761175607146 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda build_number: 102 sha256: a930ea81356110d84993527772577276af034d689e7333f937005ee527bd11bf @@ -13318,29 +13069,6 @@ packages: size: 37217543 timestamp: 1765020325291 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - build_number: 101 - sha256: b56484229cf83f6c84e8b138dc53f7f2fa9ee850f42bf1f6d6fa1c03c044c2d3 - md5: fb1e51574ce30d2a4d5e4facb9b2cbd5 - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 17521522 - timestamp: 1761177097697 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda build_number: 102 sha256: 2470866eee70e75d6be667aa537424b63f97c397a0a90f05f2bab347b9ed5a51 @@ -13413,29 +13141,6 @@ packages: size: 14323056 timestamp: 1765026108189 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - build_number: 101 - sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 - md5: a4241bce59eecc74d4d2396e108c93b8 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - size: 11915380 - timestamp: 1761176793936 - python_site_packages_path: lib/python3.13/site-packages - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda build_number: 102 sha256: 3ca1da026fe5df8a479d60e1d3ed02d9bc50fcbafd5f125d86abe70d21a34cc7 @@ -13508,29 +13213,6 @@ packages: size: 13575758 timestamp: 1765021280625 python_site_packages_path: lib/python3.14/site-packages -- conda: https://prefix.dev/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - build_number: 101 - sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 - md5: 89d992b9d4b9e88ed54346c9c4a24c1c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Python-2.0 - size: 16613183 - timestamp: 1761175050438 - python_site_packages_path: Lib/site-packages - conda: https://prefix.dev/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda build_number: 102 sha256: 2b8c8fcafcc30690b4c5991ee28eb80c962e50e06ce7da03b2b302e2d39d6a81 @@ -13649,16 +13331,6 @@ packages: license: Python-2.0 size: 49287 timestamp: 1765020424843 -- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313.conda - build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 - constrains: - - python 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - size: 7002 - timestamp: 1752805902938 - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 @@ -13714,32 +13386,6 @@ packages: license_family: BSD size: 4856 timestamp: 1646866525560 -- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af - md5: 4794ea0adaebd9f844414e594b142cb2 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 207109 - timestamp: 1758892173548 -- conda: https://prefix.dev/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - sha256: 4aca079224068d1a7fa2d2cbdb6efe11eec76737472c01f02d9e147c5237c37d - md5: cd0891668088a005cb45b344d84a3955 - depends: - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 198001 - timestamp: 1758891959168 - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda sha256: 828af2fd7bb66afc9ab1c564c2046be391aaf66c0215f05afaf6d7a9a270fe2a md5: b12f41c0d7fb5ab81709fcc86579688f @@ -13752,45 +13398,6 @@ packages: license_family: MIT size: 45223 timestamp: 1758891992558 -- conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py313h0f4d31d_0.conda - sha256: 8420815e10d455b012db39cb7dc0d86f0ac3a287d5a227892fa611fe3d467df9 - md5: e0c9e257970870212c449106964a5ace - depends: - - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 193608 - timestamp: 1758892017635 -- conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - sha256: f5be0d84f72a567b7333b9efa74a65bfa44a25658cf107ffa3fc65d3ae6660d7 - md5: 0e8e3235217b4483a7461b63dca5826b - depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 191630 - timestamp: 1758892258120 -- conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - sha256: 5d9fd32d318b9da615524589a372b33a6f3d07db2708de16570d70360bf638c2 - md5: c067122d76f8dcbe0848822942ba07be - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 182043 - timestamp: 1758892011955 - conda: https://prefix.dev/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda sha256: 69ab63bd45587406ae911811fc4d4c1bf972d643fa57a009de7c01ac978c4edd md5: e8e53c4150a1bba3b160eacf9d53a51b @@ -15045,64 +14652,64 @@ packages: license_family: MIT size: 238764 timestamp: 1745560912727 -- conda: https://prefix.dev/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_2.conda - sha256: 2ac9fa6fe7f771244dda964485617be55e7d3329da1347b22efb911700eea5cc - md5: 283321e8f46f8102ee3b5d1c282ff0fa +- conda: https://prefix.dev/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_2.conda + sha256: 45d141a99385d53bde38db3f8a45534f8401f27f4cb23a5c5c58f83599e574de + md5: 63ecab5c42d962e2c5bfdab8252c0880 depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 - pyyaml >=3.10 license: Apache-2.0 license_family: APACHE - size: 144332 - timestamp: 1763021754141 -- conda: https://prefix.dev/conda-forge/linux-aarch64/watchdog-6.0.0-py313h1258fbd_2.conda - sha256: deec1015cab25a702dd2f4c7f8d910ebf20debf1650abb15d82b23ca1bc93c6d - md5: 9198df563582f8bbed2deb30ce6b7988 - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + size: 151798 + timestamp: 1763021736811 +- conda: https://prefix.dev/conda-forge/linux-aarch64/watchdog-6.0.0-py314ha42fa4b_2.conda + sha256: 3a49352d016ecbd0cf1dac23e7b890787f626133794d76f0dccf12c6f363027a + md5: 55928bb865d89e6dcbe32add5e5a4b71 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 - pyyaml >=3.10 license: Apache-2.0 license_family: APACHE - size: 143464 - timestamp: 1763022519511 -- conda: https://prefix.dev/conda-forge/osx-64/watchdog-6.0.0-py313hf050af9_2.conda - sha256: 38d3595b560c74635acedc7c0300042d155640f8dccc2ba096cd98f57a217538 - md5: ea12d2a212ac4010892006a339e9d35d + size: 152046 + timestamp: 1763022885329 +- conda: https://prefix.dev/conda-forge/osx-64/watchdog-6.0.0-py314h6482030_2.conda + sha256: 17bbadf45780e904fc6ee25a2ed15e5623fcb1d8df089274fd76d0bc47b0e840 + md5: cdcbdf97ab294fd0650c93885901c067 depends: - __osx >=10.13 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 - pyyaml >=3.10 license: Apache-2.0 license_family: APACHE - size: 151391 - timestamp: 1763022338658 -- conda: https://prefix.dev/conda-forge/osx-arm64/watchdog-6.0.0-py313h6535dbc_2.conda - sha256: 14357dd29019b4c03813ba2e60abbde70c26bb0bd2b80229bb1dfb7ce8cefc96 - md5: 75178475e411be3d70b9725d850d6aba + size: 158871 + timestamp: 1763021924013 +- conda: https://prefix.dev/conda-forge/osx-arm64/watchdog-6.0.0-py314h0612a62_2.conda + sha256: ebbed86961de90524033b92a6d8938d73116cda198fc8ff58c08f905f226ecca + md5: ebf26848dda35b5223483d7fe6677e1c depends: - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 - pyyaml >=3.10 license: Apache-2.0 license_family: APACHE - size: 152560 - timestamp: 1763022038634 -- conda: https://prefix.dev/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_2.conda - sha256: fede6e7ed557aa8290973ceda605b29dffec01c8a97ee6bd1e52ad02b897906f - md5: ce01d1bdf4558aee247efb613ff77e2a - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + size: 159429 + timestamp: 1763022276083 +- conda: https://prefix.dev/conda-forge/win-64/watchdog-6.0.0-py314h86ab7b2_2.conda + sha256: 5de9c68d8b1938f581f7e8816bf460e9bf3f42efab16093988a167e9e7315d6d + md5: f23186f382c078cc736e0120cc8ce180 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 - pyyaml >=3.10 license: Apache-2.0 license_family: APACHE - size: 169318 - timestamp: 1763021892678 + size: 176892 + timestamp: 1763021840142 - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda sha256: e311b64e46c6739e2a35ab8582c20fa30eb608da130625ed379f4467219d4813 md5: 7e1e5ff31239f9cd5855714df8a3783d @@ -15651,21 +15258,6 @@ packages: license: Zlib size: 134848 timestamp: 1764715928393 -- conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - sha256: e6921de3669e1bbd5d050a3b771b46a887e7f4ffeb1ddd5e4d9fb01062a2f6e9 - md5: 710d4663806d0f72b2fb414e936223b5 - depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 471496 - timestamp: 1762512679097 - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda sha256: e589f694b44084f2e04928cabd5dda46f20544a512be2bdb0d067d498e4ac8d0 md5: 2930a6e1c7b3bc5f66172e324a8f5fc3 @@ -15681,21 +15273,6 @@ packages: license_family: BSD size: 473605 timestamp: 1762512687493 -- conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_1.conda - sha256: 4c7cf2116538200ce4ed2faac831b1bea7c5c73343ce0576e695361b52fe86a4 - md5: 16c5b3d2874e1b5162a114565bb20a8f - depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - libgcc >=14 - - python 3.13.* *_cp313 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 464061 - timestamp: 1762512695211 - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda sha256: 051f12494f28f9de8b1bf1a787646c1f675d8eba0ba0eac79ab96ef960d24746 md5: db33d0e8888bef6ef78207c5e6106a5b @@ -15711,20 +15288,6 @@ packages: license_family: BSD size: 465094 timestamp: 1762512736835 -- conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py313hcb05632_1.conda - sha256: eed36460cfd4afdcb5e3dbca1f493dd9251e90ad793680064efdeb72d95f16a0 - md5: da657125cfc67fe18e4499cf88dbe512 - depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - __osx >=10.13 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 468984 - timestamp: 1762512716065 - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda sha256: cf12b4c138eef5160b12990278ac77dec5ca91de60638dd6cf1e60e4331d8087 md5: b94712955dc017da312e6f6b4c6d4866 @@ -15739,21 +15302,6 @@ packages: license_family: BSD size: 470136 timestamp: 1762512696464 -- conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - sha256: c8525ae1a739db3c9b4f901d08fd7811402cf46b61ddf5d63419a3c533e02071 - md5: 7ac13a947d4d9f57859993c06faf887b - depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - __osx >=11.0 - - python 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - size: 396449 - timestamp: 1762512722894 - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda sha256: cdeb350914094e15ec6310f4699fa81120700ca7ab7162a6b3421f9ea9c690b4 md5: 8a92a736ab23b4633ac49dcbfcc81e14 @@ -15769,25 +15317,6 @@ packages: license_family: BSD size: 397786 timestamp: 1762512730914 -- conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda - sha256: 5f751687a64cf5a6d69ad79aa437f45d6cc388d9e887dcdecff9d3b08cf7fd87 - md5: 46f6f9bb324a58a9b081bbc56ade37f2 - depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 380854 - timestamp: 1762512720226 - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda sha256: 87bf6ba2dcc59dfbb8d977b9c29d19b6845ad54e092ea8204dcec62d7b461a30 md5: c1ef46c3666be935fbb7460c24950cff diff --git a/pixi.toml b/pixi.toml index aa6f56be63..7a96d646ff 100644 --- a/pixi.toml +++ b/pixi.toml @@ -37,7 +37,7 @@ vs2017_win-64 = ">=19.16.27033,<20" # Shared feature for Python # [feature.python.dependencies] -python = ">=3.13.5,<3.15" +python = ">=3.14,<3.15" # # Shared feature for Rust toolchain @@ -59,7 +59,6 @@ scripts = ["scripts/activate.sh"] RUSTC_WRAPPER = "sccache" [feature.backends-release.dependencies] -python = ">=3.12,<4" rattler-build = ">=0.55.0,<0.56" sccache = ">=0.12,<0.13" @@ -279,7 +278,6 @@ pytest = ">=9.0.2,<10" pytest-rerunfailures = ">=16.0.1,<17" pytest-timeout = ">=2.4.0,<3" pytest-xdist = ">=3.8.0,<4" -python = ">=3.14.0,<3.15" pyyaml = ">=6.0.3,<7" rattler-build = ">=0.55,<0.56" rich = ">=14.1.0,<15" @@ -361,7 +359,6 @@ test-all-slow = { depends-on = [ # Feature for building Python trampolines # [feature.trampoline.dependencies] -python = ">=3.14.0,<3.15" zstd = ">=1.5.7,<2" [feature.trampoline.tasks] @@ -371,21 +368,21 @@ build-trampoline = { cmd = "python trampoline/build-trampoline.py", description # Environment definitions # [environments] -backends-release = { features = ["backends-release"] } +backends-release = { features = ["backends-release", "python"] } dev = { features = ["rust", "compilers", "python", "dev"] } dist = { features = ["dist"] } docs = { features = ["rust", "compilers", "python", "docs"] } lint = { features = [ "rust", "compilers", - "python", "lint", + "python", "python-test-deps", "schema", "pypi-gen", ] } pypi-gen = { features = ["rust", "compilers", "python", "pypi-gen"] } -python-test = { features = ["rust", "pytest", "python-test-deps"] } +python-test = { features = ["rust", "pytest", "python-test-deps", "python"] } recipes = { features = ["recipes"] } release = { features = ["release"] } rust-build = { features = ["rust", "compilers", "python", "rust-build"] } @@ -399,7 +396,7 @@ test-native-certs = { features = [ "python", "native-certs-test", ] } -trampoline = { features = ["trampoline"] } +trampoline = { features = ["trampoline", "python"] } # # Package definitions From 4b19849246aff95cd129316de96fab38e4fcbc55 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 17:19:32 +0100 Subject: [PATCH 48/70] No need for setup-pixi in cargo vendor --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 667e4e616c..f4ca7c8805 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -126,9 +126,6 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: persist-credentials: false - - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 - with: - cache-write: ${{ github.ref == 'refs/heads/main' }} - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: workspaces: ". -> target/pixi" From 91a113a2c440633f859c7035abf282ccd7d9a6e3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 17:21:27 +0100 Subject: [PATCH 49/70] Set environment --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4ca7c8805..c8b109dbd6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -141,6 +141,8 @@ jobs: with: persist-credentials: false - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 + with: + environments: "docs" - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: From c18726b33d58a2c730249d6a83c641f77b13832f Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 17:24:30 +0100 Subject: [PATCH 50/70] Specify envs in more places --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8b109dbd6..43131429fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,6 +183,7 @@ jobs: - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: cache-write: ${{ github.ref == 'refs/heads/main' }} + environments: rust-test - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: workspaces: ". -> target/pixi" @@ -207,6 +208,7 @@ jobs: - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: cache-write: ${{ github.ref == 'refs/heads/main' }} + environments: rust-test - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: workspaces: ". -> target/pixi" @@ -231,6 +233,7 @@ jobs: - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: cache-write: ${{ github.ref == 'refs/heads/main' }} + environments: rust-test - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: workspaces: ". -> target/pixi" @@ -258,6 +261,7 @@ jobs: - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: cache-write: ${{ github.ref == 'refs/heads/main' }} + environments: rust-test - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: cache-directories: ${{ env.DEV_DRIVE }}/target From 00a7e110764cb4ffd1f8efb5e1ea0285b8b3c4c3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Wed, 14 Jan 2026 17:26:20 +0100 Subject: [PATCH 51/70] Format --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43131429fc..c4028a1a95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,7 +142,7 @@ jobs: persist-credentials: false - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: - environments: "docs" + environments: "docs" - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: From 9d8739c1925506a830f1c4f15bd68996d28f872e Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 09:12:34 +0100 Subject: [PATCH 52/70] Move lefthook in it's own env --- .github/workflows/ci.yml | 2 +- pixi.toml | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4028a1a95..3c4610ea84 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: - name: Set up pixi uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3 with: - environments: lint + environments: lefthook cache-write: ${{ github.ref == 'refs/heads/main' }} - name: lint (if this step fails, please 'pixi run lint' locally and push the changes) run: pixi run lint diff --git a/pixi.toml b/pixi.toml index 7a96d646ff..7c81281ed6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -131,6 +131,23 @@ download-font = { cmd = "nu docs/layouts/download-font-to-cache.nu", description generate-cli-docs = { cmd = "cargo run --locked --manifest-path crates/pixi_docs/Cargo.toml", description = "Generate CLI documentation" } mike-serve = { cmd = "mike serve", description = "Serve versioned docs with mike" } +# +# Feature for running lefthook (lint orchestration) +# +[feature.lefthook.dependencies] +lefthook = ">=2.0.11,<3" + +[feature.lefthook.tasks] +lefthook = { cmd = "lefthook", description = "Run lefthook" } +lint = { depends-on = [ + "lint-fast", + "lint-slow", +], description = "Run all linters and formatters on all code" } +lint-fast = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all fast linters and formatters (no clippy)" } +lint-slow = { cmd = "lefthook run pre-push --all-files --force", description = "Run all slow linters and formatters" } +pre-commit-install = { cmd = "lefthook install", description = "Install all git hooks" } +pre-commit-install-minimal = { cmd = "lefthook install pre-commit", description = "Install only pre-commit hook" } + # # Feature for linting and formatting tools # @@ -141,7 +158,6 @@ cargo-deny = ">=0.19,<0.19.1" # 0.18.5 breaks license checking for uv crates cargo-shear = ">=1.7.1,<2" dprint = ">=0.49.1,<0.51" go-shfmt = ">=3.12.0,<4" -lefthook = ">=2.0.11,<3" ruff = ">=0.14.0,<0.15" shellcheck = ">=0.10.0,<0.11" taplo = ">=0.10.0,<0.11" @@ -157,15 +173,6 @@ cargo-shear = { cmd = "cargo shear --fix", description = "Remove unused dependen check-openssl = { cmd = "python tests/scripts/check-openssl.py", description = "Check OpenSSL configuration" } dprint-check = { cmd = "dprint check --log-level=silent", description = "Check formatting with dprint" } dprint-fmt = { cmd = "dprint fmt --incremental=false", description = "Format with dprint" } -lefthook = { cmd = "lefthook", description = "Run lefthook" } -lint = { depends-on = [ - "lint-fast", - "lint-slow", -], description = "Run all linters and formatters on all code" } -lint-fast = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all fast linters and formatters (no clippy)" } -lint-slow = { cmd = "lefthook run pre-push --all-files --force", description = "Run all slow linters and formatters" } -pre-commit-install = { cmd = "lefthook install", description = "Install all git hooks" } -pre-commit-install-minimal = { cmd = "lefthook install pre-commit", description = "Install only pre-commit hook" } ruff-format = { cmd = "ruff format --exit-non-zero-on-format --force-exclude", description = "Format Python code with ruff" } ruff-lint = { cmd = "ruff check --fix --exit-non-zero-on-fix --force-exclude", description = "Lint Python code with ruff" } shell-format = { cmd = "shfmt --write --indent=4 --simplify --binary-next-line", description = "Format shell scripts" } @@ -372,6 +379,7 @@ backends-release = { features = ["backends-release", "python"] } dev = { features = ["rust", "compilers", "python", "dev"] } dist = { features = ["dist"] } docs = { features = ["rust", "compilers", "python", "docs"] } +lefthook = { features = ["lefthook"] } lint = { features = [ "rust", "compilers", From 9cd4c106f0788c4a8e148aee218fd821fb8b5a0b Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 09:39:17 +0100 Subject: [PATCH 53/70] Run all linting tasks in lefthook --- lefthook.yaml | 57 +++++++++---- .../backends/pixi-build-ros/pixi.lock | 39 --------- .../backends/pixi-build-ros/pixi.toml | 6 +- .../py-pixi-build-backend/pixi.toml | 4 +- pixi.lock | 80 +++++++++++-------- 5 files changed, 90 insertions(+), 96 deletions(-) diff --git a/lefthook.yaml b/lefthook.yaml index 1c98ed86f9..f77605587a 100644 --- a/lefthook.yaml +++ b/lefthook.yaml @@ -2,7 +2,7 @@ lefthook: pixi run --no-progress lefthook no_auto_install: true templates: - run: run --quiet --no-progress --frozen --environment=lint + run: run --quiet --no-progress colors: true @@ -18,16 +18,16 @@ output: - skips # Print "skip" (i.e. no files matched) pre-commit: - parallel: true + parallel: false jobs: - name: actionlint - run: pixi {run} actionlint + run: pixi {run} -e lint actionlint - name: zizmor - run: pixi {run} zizmor + run: pixi {run} -e lint zizmor - name: cargo-fmt glob: "*.rs" stage_fixed: true - run: pixi {run} cargo-fmt + run: pixi {run} -e lint cargo-fmt - name: ruff glob: "*.{py,pyi}" stage_fixed: true @@ -35,46 +35,69 @@ pre-commit: piped: true jobs: - name: ruff lint - run: pixi {run} ruff-lint {staged_files} + run: pixi {run} -e lint ruff-lint {staged_files} - name: ruff format - run: pixi {run} ruff-format {staged_files} + run: pixi {run} -e lint ruff-format {staged_files} - name: cargo-shear glob: "*.rs,Cargo.toml" stage_fixed: true - run: pixi {run} cargo-shear + run: pixi {run} -e lint cargo-shear - name: shell-format glob: "*.{sh, bash}" - run: pixi {run} shell-format {staged_files} + run: pixi {run} -e lint shell-format {staged_files} - name: taplo stage_fixed: true glob: "*.toml" exclude: - schema/examples/invalid/*.toml - run: pixi {run} toml-format {staged_files} + run: pixi {run} -e lint toml-format {staged_files} - name: dprint glob: "*.{yaml,yml}" group: jobs: - name: dprint check - run: pixi {run} dprint-check {staged_files} + run: pixi {run} -e lint dprint-check {staged_files} - name: dprint fmt - run: pixi {run} dprint-fmt {staged_files} + run: pixi {run} -e lint dprint-fmt {staged_files} stage_fixed: true - name: typos stage_fixed: true - run: pixi {run} typos + run: pixi {run} -e lint typos + - name: pixi-build-ros-ruff + root: pixi-build-backends/backends/pixi-build-ros + glob: "*.{py,pyi}" + stage_fixed: true + run: pixi {run} -e lint lint-ruff + - name: py-pixi-build-backend-fmt-rust + root: pixi-build-backends/py-pixi-build-backend + glob: "*.rs" + stage_fixed: true + run: pixi {run} -e default fmt-rust + - name: py-pixi-build-backend-lint-python + root: pixi-build-backends/py-pixi-build-backend + glob: "*.{py,pyi}" + stage_fixed: true + run: pixi {run} -e default lint-python pre-push: jobs: - name: typecheck-python glob: "*.{py,pyi}" - run: pixi {run} typecheck-python + run: pixi {run} -e lint typecheck-python - name: cargo-clippy glob: "*.rs" - run: pixi {run} cargo-clippy + run: pixi {run} -e lint cargo-clippy - name: cargo-deny glob: "Cargo.lock,Cargo.toml" stage_fixed: true - run: pixi {run} cargo-deny + run: pixi {run} -e lint cargo-deny - name: check-openssl - run: pixi {run} check-openssl + run: pixi {run} -e lint check-openssl + - name: pixi-build-ros-mypy + root: pixi-build-backends/backends/pixi-build-ros + glob: "*.{py,pyi}" + run: pixi {run} -e default lint-mypy + - name: py-pixi-build-backend-clippy + root: pixi-build-backends/py-pixi-build-backend + glob: "*.rs" + run: pixi {run} -e default lint-rust diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.lock b/pixi-build-backends/backends/pixi-build-ros/pixi.lock index 1e8b599663..6f58d6f0d5 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.lock +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.lock @@ -73,7 +73,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.7.7-py314h0f05182_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/rattler-index-0.25.2-h942d4a7_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -82,7 +81,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -150,14 +148,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-librt-0.7.7-py312hd41f8a7_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-index-0.25.2-h782aefe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -214,14 +210,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.7.7-py312hb3ab3e3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-index-0.25.2-h515db0c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -277,13 +271,11 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.7.7-py314hc5dbbe4_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/rattler-index-0.25.2-h9fbdfe2_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda - conda: https://prefix.dev/conda-forge/noarch/syrupy-5.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -337,11 +329,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.14.10-h4196e79_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: @@ -364,11 +354,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.2-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ruff-0.14.10-hc0dabaa_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: @@ -384,11 +372,9 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.14.10-hb0cad00_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda win-64: @@ -403,10 +389,8 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/ruff-0.14.10-h37e10c4_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda @@ -2494,18 +2478,6 @@ packages: purls: [] size: 6989 timestamp: 1752805904792 -- conda: https://prefix.dev/conda-forge/noarch/pyupgrade-3.21.2-pyhd8ed1ab_0.conda - sha256: a36ea7841495798a66007a3bd27080953f7955cd1af475cae9db8679f2a97b85 - md5: 76d8bb670990f40536e4158b14fb8377 - depends: - - python >=3.10 - - tokenize-rt >=6.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyupgrade?source=hash-mapping - size: 46652 - timestamp: 1763517885466 - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl name: pyyaml version: 6.0.3 @@ -2904,17 +2876,6 @@ packages: purls: [] size: 3472313 timestamp: 1763055164278 -- conda: https://prefix.dev/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda - sha256: b8da0c728e1313e116a06084ea770c6ad752b9cd086d52b20fcd464bdce52e4b - md5: 0a42378794e0425eb5defc9d63e60607 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tokenize-rt?source=hash-mapping - size: 12383 - timestamp: 1748092106333 - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl name: toml version: 0.10.2 diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 613df4970b..6c461a58d9 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -78,14 +78,10 @@ types-pyyaml = "*" py-pixi-build-backend = { path = "../../py-pixi-build-backend" } [feature.lint.dependencies] -pyupgrade = ">=3.20.0,<4" ruff = "*" [feature.lint.tasks] -fmt = { depends-on = ["fmt-pyupgrade", "fmt-ruff"] } -fmt-pyupgrade = "pyupgrade --py310-plus **/**/*.py" -fmt-ruff = "ruff format src tests" -lint-ruff = "ruff check ." +lint-ruff = "ruff check --fix --exit-non-zero-on-fix --force-exclude" ## Package section [package.build.backend] diff --git a/pixi-build-backends/py-pixi-build-backend/pixi.toml b/pixi-build-backends/py-pixi-build-backend/pixi.toml index 905277a6b8..2ec202535f 100644 --- a/pixi-build-backends/py-pixi-build-backend/pixi.toml +++ b/pixi-build-backends/py-pixi-build-backend/pixi.toml @@ -65,12 +65,10 @@ build-release = "maturin develop --release" test = { cmd = "pytest --doctest-modules", depends-on = ["build"] } test-fast = "pytest --doctest-modules" -fmt = { depends-on = ["fmt-python", "fmt-rust"] } -fmt-python = "ruff format pixi_build_backend examples tests" fmt-rust = "cargo fmt --all" lint = { depends-on = ["lint-python", "lint-rust"] } -lint-python = "ruff check ." +lint-python = "ruff check --fix --exit-non-zero-on-fix --force-exclude" lint-rust = "cargo clippy --all -- -D warnings" [environments] diff --git a/pixi.lock b/pixi.lock index 524e034781..2e43b78a6d 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1362,6 +1362,22 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/zlib-ng-2.3.2-h5112557_0.conda - conda: https://prefix.dev/conda-forge/win-64/zstandard-0.25.0-py314hc5dbbe4_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda + lefthook: + channels: + - url: https://prefix.dev/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.15-hfc2019e_0.conda + linux-aarch64: + - conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.15-h22914b5_0.conda + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.15-hccc6df8_0.conda + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.15-h820172f_0.conda + win-64: + - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.15-h11686cb_0.conda lint: channels: - url: https://prefix.dev/conda-forge/ @@ -1427,7 +1443,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -1574,7 +1589,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.11-h22914b5_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda @@ -1718,7 +1732,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda @@ -1860,7 +1873,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda @@ -1988,7 +2000,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda @@ -8307,38 +8318,43 @@ packages: license_family: GPL size: 876257 timestamp: 1766513180236 -- conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.11-hfc2019e_0.conda - sha256: 7b3388ab7f557e05262f6cce8e42ed1a063929e6f73584a25df3cb138529df0c - md5: 0707fe20430462e7b8398b2f9b0ed04c - license: MIT - size: 5395351 - timestamp: 1765672029410 -- conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.11-h22914b5_0.conda - sha256: 6799879ad52378d201571f0c7794204bbae78448e70dcbc1bc477cbd67cc3c92 - md5: 76efd62ef7917ef602a73e32d59a7153 - license: MIT - size: 4831545 - timestamp: 1765672061571 -- conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.11-hccc6df8_0.conda - sha256: 42572e10c078e34e4a6b2a49817cf0dd1ed970cfc329d49598ca80ab65c187db - md5: ee573baeab6de50876a913ac76331bb3 +- conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.0.15-hfc2019e_0.conda + sha256: 1ccfc7f67dda743c4de0975933d8048952bea808531119defbe3e37a1720bf75 + md5: 41dd94842340c5d2c3b07aeb24d41629 + license: MIT + license_family: MIT + size: 5334239 + timestamp: 1768369512301 +- conda: https://prefix.dev/conda-forge/linux-aarch64/lefthook-2.0.15-h22914b5_0.conda + sha256: 494d70151764dd4b9b4e9de55207bb2a45d24a9834632b5484566f29d286d6cd + md5: 2f83fe4d9ee93e3aa5a8dcc541a5c513 + license: MIT + license_family: MIT + size: 4776607 + timestamp: 1768369525582 +- conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.0.15-hccc6df8_0.conda + sha256: 14f310f9b1a38b787aaaabe49c446326a8811dcf4ceb10443d717d7ee77ccb06 + md5: 46db531664722f29898179797d6b60fc constrains: - __osx >=10.12 license: MIT - size: 5432670 - timestamp: 1765672026626 -- conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.11-h820172f_0.conda - sha256: a4bc0b4e601e23da782bd70b85e2fa3397670a095be533181c696bf5ae3fa9eb - md5: 25c87a1921ed5fb395b35ab785c346e3 + license_family: MIT + size: 5346784 + timestamp: 1768369505591 +- conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.0.15-h820172f_0.conda + sha256: 4289d20aa01f8b03e68682489ead586e4f0fb2358ac641354561d324f1cd6711 + md5: 675e8f20f0629c54c156e95e9ce92583 license: MIT - size: 4857028 - timestamp: 1765672071391 -- conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.11-h11686cb_0.conda - sha256: 0f475dc08b1039daa57d49b3082c23fe97fa253039f39dd450e8ed5b9a1aea18 - md5: 333a00aa0a9e99d4291970cf5bafe4ea + license_family: MIT + size: 4798269 + timestamp: 1768369547697 +- conda: https://prefix.dev/conda-forge/win-64/lefthook-2.0.15-h11686cb_0.conda + sha256: 672a6e361ee11bea7cdb77120f5fe38af29f435dc57f5d930f02a14292777a16 + md5: 23198878df3752ddb1f142ac77a3cfa2 license: MIT - size: 5345989 - timestamp: 1765672059584 + license_family: MIT + size: 5278514 + timestamp: 1768369546590 - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff md5: 9344155d33912347b37f0ae6c410a835 From 2b585d7c5d4019a64d97e9375c093fa0c95a7c6c Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 09:45:28 +0100 Subject: [PATCH 54/70] Another attempt to fix long paths issues --- .../backends/pixi-build-ros/tests/integration/conftest.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py index 5d42729277..7d1c1a0ff3 100644 --- a/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py +++ b/pixi-build-backends/backends/pixi-build-ros/tests/integration/conftest.py @@ -55,8 +55,10 @@ def tmp_pixi_workspace(tmp_path: Path) -> Iterator[Path]: The build process creates deeply nested paths that can exceed this limit. """ if sys.platform == "win32": - # Use a short base path on Windows to avoid MAX_PATH issues - short_base = Path(tempfile.gettempdir()) / "pxros" + # Use a very short base path on Windows to avoid MAX_PATH issues. + # The standard temp directory (e.g. C:\Users\\AppData\Local\Temp) + # is already quite long, so we use C:\.r instead. + short_base = Path("C:/.r") short_base.mkdir(parents=True, exist_ok=True) workspace = Path(tempfile.mkdtemp(dir=short_base)) try: From 15463b53ffbc7f7728458e922c27c786e58fa1f0 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 10:18:54 +0100 Subject: [PATCH 55/70] Fix ROS --- .github/workflows/backends-ros.yml | 2 +- lefthook.yaml | 4 ---- pixi-build-backends/backends/pixi-build-ros/pixi.toml | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/backends-ros.yml b/.github/workflows/backends-ros.yml index 8aed217313..029810c8c3 100644 --- a/.github/workflows/backends-ros.yml +++ b/.github/workflows/backends-ros.yml @@ -42,7 +42,7 @@ jobs: run: | chmod a+x ${{ github.workspace }}/${{ env.TARGET_RELEASE }}/pixi echo "${{ github.workspace }}/${{ env.TARGET_RELEASE }}" >> $GITHUB_PATH - - name: Run mypy + - name: Lint run: | cd pixi-build-backends/backends/pixi-build-ros pixi run lint diff --git a/lefthook.yaml b/lefthook.yaml index f77605587a..56994b06c4 100644 --- a/lefthook.yaml +++ b/lefthook.yaml @@ -93,10 +93,6 @@ pre-push: run: pixi {run} -e lint cargo-deny - name: check-openssl run: pixi {run} -e lint check-openssl - - name: pixi-build-ros-mypy - root: pixi-build-backends/backends/pixi-build-ros - glob: "*.{py,pyi}" - run: pixi {run} -e default lint-mypy - name: py-pixi-build-backend-clippy root: pixi-build-backends/py-pixi-build-backend glob: "*.rs" diff --git a/pixi-build-backends/backends/pixi-build-ros/pixi.toml b/pixi-build-backends/backends/pixi-build-ros/pixi.toml index 6c461a58d9..7c11ba87ab 100644 --- a/pixi-build-backends/backends/pixi-build-ros/pixi.toml +++ b/pixi-build-backends/backends/pixi-build-ros/pixi.toml @@ -10,7 +10,7 @@ preview = ["pixi-build"] CARGO_TARGET_DIR = "target/pixi" [tasks] -lint.depends-on = ["fmt", "lint-ruff", "lint-mypy"] +lint.depends-on = ["lint-ruff", "lint-mypy"] [target.linux-64.dependencies] clang = ">=21.1,<21.2" From d44e64ee85baf79c763dece1cb3068938f85bbdc Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 10:20:01 +0100 Subject: [PATCH 56/70] Adapt lefthook --- lefthook.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lefthook.yaml b/lefthook.yaml index 56994b06c4..984b4dc71f 100644 --- a/lefthook.yaml +++ b/lefthook.yaml @@ -92,8 +92,4 @@ pre-push: stage_fixed: true run: pixi {run} -e lint cargo-deny - name: check-openssl - run: pixi {run} -e lint check-openssl - - name: py-pixi-build-backend-clippy - root: pixi-build-backends/py-pixi-build-backend - glob: "*.rs" - run: pixi {run} -e default lint-rust + run: pixi {run} -e lint check-openssl \ No newline at end of file From 3dcdac3d63e2c80c6a5158716c8a74397c627ff9 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 10:25:18 +0100 Subject: [PATCH 57/70] Format --- lefthook.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lefthook.yaml b/lefthook.yaml index 984b4dc71f..3e23aacece 100644 --- a/lefthook.yaml +++ b/lefthook.yaml @@ -92,4 +92,4 @@ pre-push: stage_fixed: true run: pixi {run} -e lint cargo-deny - name: check-openssl - run: pixi {run} -e lint check-openssl \ No newline at end of file + run: pixi {run} -e lint check-openssl From cbb5fdf973cd525b700098e3e565a8c199cebeca Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 11:43:08 +0100 Subject: [PATCH 58/70] Fix merge gone wrong --- Cargo.lock | 38 +- Cargo.toml | 10 +- .../pixi/tests/integration_rust/add_tests.rs | 4 +- .../src/backend_source_build/mod.rs | 25 +- .../src/build/build_cache.rs | 19 +- .../src/build/dependencies.rs | 10 +- .../src/build/move_file.rs | 18 +- .../src/build/pin_compatible.rs | 2 +- .../src/build_backend_metadata/mod.rs | 48 ++- .../src/cache/build_backend_metadata.rs | 7 +- .../src/cache/source_metadata.rs | 7 +- .../command_dispatcher/instantiate_backend.rs | 53 ++- .../build_backend_metadata.rs | 6 +- .../dev_source_metadata.rs | 6 +- .../src/command_dispatcher_processor/git.rs | 21 +- .../instantiate_tool_env.rs | 6 +- .../src/command_dispatcher_processor/mod.rs | 77 ++-- .../source_build.rs | 6 +- .../source_build_cache_status.rs | 6 +- .../source_metadata.rs | 6 +- .../src/command_dispatcher_processor/url.rs | 35 +- .../src/dev_source_metadata/mod.rs | 4 +- .../src/instantiate_tool_env/mod.rs | 29 +- .../src/solve_pixi/mod.rs | 52 ++- .../solve_pixi/source_metadata_collector.rs | 2 +- .../src/source_build/mod.rs | 92 ++-- .../src/source_build_cache_status/mod.rs | 18 +- .../src/source_checkout/mod.rs | 4 +- .../src/source_metadata/cycle.rs | 4 +- .../src/source_metadata/mod.rs | 34 +- .../tests/integration/main.rs | 63 ++- crates/pixi_config/src/lib.rs | 10 +- crates/pixi_core/Cargo.toml | 1 + crates/pixi_core/src/lock_file/outdated.rs | 49 ++- .../pixi_core/src/lock_file/resolve/pypi.rs | 166 +++---- .../src/lock_file/satisfiability/mod.rs | 404 ++++++++++++------ ...ing_satisfiability@changed-env-marker.snap | 8 + ...satisfiability@wheels-with-wrong-tags.snap | 7 + crates/pixi_git/src/lib.rs | 36 +- crates/pixi_git/src/sha.rs | 2 +- crates/pixi_pypi_spec/src/lib.rs | 88 +++- crates/pixi_pypi_spec/src/pep508.rs | 37 +- ...pypi_spec__tests__deserialize_failing.snap | 10 +- ...i_spec__tests__deserialize_succeeding.snap | 10 + .../pixi_pypi_spec__tests__from_args-3.snap | 6 + crates/pixi_pypi_spec/src/toml.rs | 57 ++- crates/pixi_url/src/error.rs | 45 +- crates/pixi_uv_conversions/src/conversions.rs | 24 +- .../pixi_uv_conversions/src/requirements.rs | 39 +- 49 files changed, 1101 insertions(+), 610 deletions(-) create mode 100644 crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@changed-env-marker.snap create mode 100644 crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@wheels-with-wrong-tags.snap create mode 100644 crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__from_args-3.snap diff --git a/Cargo.lock b/Cargo.lock index 7ba9113129..e13b5aa8f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2015,9 +2015,9 @@ dependencies = [ [[package]] name = "deno_task_shell" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb3527b0dc64fb6c1cb19023ef92a949b54c735c37af9bfb9fe4095922278da" +checksum = "d6c8906a44dee412f17bf3ec79da41548612c5da3741fd0023c718408d6fe685" dependencies = [ "anyhow", "deno_path_util", @@ -2025,7 +2025,6 @@ dependencies = [ "glob", "monch", "nix 0.29.0", - "os_pipe", "path-dedot", "sys_traits", "thiserror 2.0.17", @@ -4959,16 +4958,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "os_str_bytes" version = "6.6.1" @@ -5899,6 +5888,7 @@ dependencies = [ "url", "uv-build-frontend", "uv-cache", + "uv-cache-key", "uv-client", "uv-configuration", "uv-dispatch", @@ -6403,7 +6393,7 @@ dependencies = [ "rattler_networking", "reqwest", "reqwest-middleware", - "sevenz-rust2 0.19.4", + "sevenz-rust2", "tar", "tempfile", "thiserror 2.0.17", @@ -7160,7 +7150,7 @@ dependencies = [ "serde_json", "serde_with", "serde_yaml", - "sevenz-rust2 0.20.1", + "sevenz-rust2", "sha1", "sha2", "spdx 0.13.3", @@ -8825,24 +8815,6 @@ dependencies = [ "unsafe-libyaml", ] -[[package]] -name = "sevenz-rust2" -version = "0.19.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414256b6bb303a2a38ad800096664c3b332295c17b7ef0674bf0acf44284036c" -dependencies = [ - "aes", - "bzip2 0.6.1", - "cbc", - "crc32fast", - "getrandom 0.3.4", - "js-sys", - "lzma-rust2", - "ppmd-rust", - "sha2", - "wasm-bindgen", -] - [[package]] name = "sevenz-rust2" version = "0.20.1" diff --git a/Cargo.toml b/Cargo.toml index 311ffe76e5..2b9d21c0fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,17 +47,15 @@ clap = { version = "4.5.31", default-features = false } clap-verbosity-flag = "3.0.2" clap_complete = "4.5.46" clap_complete_nushell = "4.5.5" -# Rattler crates coalesced_map = "0.1.2" comfy-table = "7.2.1" console = "0.16.1" -# Force crc to 3.3.0 to satisfy both lzma-rs (^3.0.0) and lzma-rust2 (=3.3.0) console-subscriber = "0.5.0" crossbeam-channel = "0.5.14" csv = "1.3.1" ctrlc = "3.4.5" dashmap = "6.1.0" -deno_task_shell = "0.26.0" +deno_task_shell = "0.26.2" derive_more = "2.0.1" dialoguer = "0.12.0" digest = "0.10" @@ -99,6 +97,7 @@ pep440_rs = "0.7.3" pep508_rs = "0.9.2" percent-encoding = "2.3.1" pin-project-lite = "0.2.16" +pixi-build-backend = { path = "crates/pixi-build-backend" } pixi_allocator = { path = "crates/pixi_allocator" } pixi_api = { path = "crates/pixi_api" } pixi_auth = { path = "crates/pixi_auth", default-features = false } @@ -136,8 +135,6 @@ pixi_utils = { path = "crates/pixi_utils", default-features = false } pixi_uv_context = { path = "crates/pixi_uv_context" } pixi_uv_conversions = { path = "crates/pixi_uv_conversions" } pixi_variant = { path = "crates/pixi_variant" } -# Pixi build backends -pixi-build-backend = { path = "crates/pixi-build-backend" } pypi_mapping = { path = "crates/pypi_mapping" } pypi_modifiers = { path = "crates/pypi_modifiers" } pyproject-toml = "0.13.7" @@ -186,7 +183,7 @@ serde_ignored = "0.1.10" serde_json = "1.0.139" serde_with = "=3.16.1" serde_yaml = "0.9.34" -sevenz-rust2 = "0.19.4" +sevenz-rust2 = "0.20.0" shlex = "1.3.0" signal-hook = "0.3.17" simple_spawn_blocking = { version = "1.1.0", default-features = false } @@ -217,6 +214,7 @@ uv-auth = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-build-frontend = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-cache = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-cache-info = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } +uv-cache-key = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-client = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-configuration = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } uv-dispatch = { git = "https://github.com/astral-sh/uv", tag = "0.9.5" } diff --git a/crates/pixi/tests/integration_rust/add_tests.rs b/crates/pixi/tests/integration_rust/add_tests.rs index 80f1c75655..669b0d7d7a 100644 --- a/crates/pixi/tests/integration_rust/add_tests.rs +++ b/crates/pixi/tests/integration_rust/add_tests.rs @@ -1,5 +1,6 @@ use std::str::FromStr; +use pep508_rs::MarkerTree; use pixi_cli::cli_config::GitRev; use pixi_consts::consts; use pixi_core::{DependencyType, Workspace}; @@ -545,7 +546,8 @@ index-url = "{index_url}" source: PixiPypiSource::Registry { version: VersionOrStar::from_str("==24.8.0").unwrap(), index: None, - } + }, + env_markers: MarkerTree::default(), } ); } diff --git a/crates/pixi_command_dispatcher/src/backend_source_build/mod.rs b/crates/pixi_command_dispatcher/src/backend_source_build/mod.rs index 86506c4bdd..6470c922e2 100644 --- a/crates/pixi_command_dispatcher/src/backend_source_build/mod.rs +++ b/crates/pixi_command_dispatcher/src/backend_source_build/mod.rs @@ -4,6 +4,7 @@ use std::{ collections::{BTreeMap, BTreeSet, BinaryHeap}, fmt::Display, path::PathBuf, + sync::Arc, }; use futures::{SinkExt, channel::mpsc::UnboundedSender}; @@ -270,7 +271,7 @@ impl BackendSourceBuildSpec { }, ) .await - .map_err(BackendSourceBuildError::BuildError) + .map_err(BackendSourceBuildError::from) .map_err(CommandDispatcherError::Failed)?; // Make sure that the built package matches the expected output. @@ -296,7 +297,7 @@ impl BackendSourceBuildSpec { let glob_set = GlobSet::create(built_package.input_globs.iter().map(String::as_str)); let input_files = glob_set .collect_matching(&source_dir) - .map_err(BackendSourceBuildError::GlobSet) + .map_err(BackendSourceBuildError::from) .map_err(CommandDispatcherError::Failed)? .into_iter() .filter_map(|entry| { @@ -396,22 +397,34 @@ fn convert_binary_spec_to_match_spec( )) } -#[derive(Debug, thiserror::Error, Diagnostic)] +#[derive(Debug, Clone, thiserror::Error, Diagnostic)] pub enum BackendSourceBuildError { #[error(transparent)] #[diagnostic(transparent)] - BuildError(#[from] CommunicationError), + BuildError(Arc), #[error(transparent)] UnexpectedPackage(UnexpectedPackageError), #[error(transparent)] - GlobSet(#[from] pixi_glob::GlobSetError), + GlobSet(Arc), +} + +impl From for BackendSourceBuildError { + fn from(err: CommunicationError) -> Self { + Self::BuildError(Arc::new(err)) + } +} + +impl From for BackendSourceBuildError { + fn from(err: pixi_glob::GlobSetError) -> Self { + Self::GlobSet(Arc::new(err)) + } } /// An error that can occur when the build backend did not return the expected /// package. -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub struct UnexpectedPackageError { pub subdir: String, pub name: String, diff --git a/crates/pixi_command_dispatcher/src/build/build_cache.rs b/crates/pixi_command_dispatcher/src/build/build_cache.rs index f0113cbb0c..ef5e33b9ff 100644 --- a/crates/pixi_command_dispatcher/src/build/build_cache.rs +++ b/crates/pixi_command_dispatcher/src/build/build_cache.rs @@ -3,6 +3,7 @@ use std::{ hash::{Hash, Hasher}, io::SeekFrom, path::PathBuf, + sync::Arc, }; use crate::build::{SourceCodeLocation, source_checkout_cache_key}; @@ -27,11 +28,11 @@ pub struct BuildCache { pub(crate) root: AbsPresumedDirPathBuf, } -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum BuildCacheError { /// An I/O error occurred while reading or writing the cache. #[error("an IO error occurred while {0} {1}")] - IoError(String, AbsPathBuf, #[source] std::io::Error), + IoError(String, AbsPathBuf, #[source] Arc), } /// Defines additional input besides the source files that are used to compute @@ -157,7 +158,7 @@ impl BuildCache { BuildCacheError::IoError( "creating cache directory".to_string(), cache_dir.clone(), - e, + Arc::new(e), ) })? .to_path_buf(); @@ -175,7 +176,7 @@ impl BuildCache { BuildCacheError::IoError( "opening cache file".to_string(), cache_file_path.clone().into(), - e, + Arc::new(e), ) })?; @@ -183,7 +184,7 @@ impl BuildCache { BuildCacheError::IoError( "locking cache file".to_string(), cache_file_path.clone().into(), - e.error, + Arc::new(e.error), ) })?; @@ -196,7 +197,7 @@ impl BuildCache { BuildCacheError::IoError( "reading cache file".to_string(), cache_file_path.clone().into(), - e, + Arc::new(e), ) })?; @@ -304,7 +305,7 @@ impl BuildCacheEntry { BuildCacheError::IoError( "seeking to start of cache file".to_string(), self.cache_file_path.clone().into(), - e, + Arc::new(e), ) })?; let bytes = serde_json::to_vec(&metadata).expect("serialization to JSON should not fail"); @@ -312,7 +313,7 @@ impl BuildCacheEntry { BuildCacheError::IoError( "writing metadata to cache file".to_string(), self.cache_file_path.clone().into(), - e, + Arc::new(e), ) })?; self.file @@ -323,7 +324,7 @@ impl BuildCacheEntry { BuildCacheError::IoError( "setting length of cache file".to_string(), self.cache_file_path.clone().into(), - e, + Arc::new(e), ) })?; diff --git a/crates/pixi_command_dispatcher/src/build/dependencies.rs b/crates/pixi_command_dispatcher/src/build/dependencies.rs index 6197e22ff0..005b0bd4e8 100644 --- a/crates/pixi_command_dispatcher/src/build/dependencies.rs +++ b/crates/pixi_command_dispatcher/src/build/dependencies.rs @@ -21,15 +21,21 @@ use rattler_conda_types::{ use rattler_repodata_gateway::{Gateway, RunExportExtractorError, RunExportsReporter}; use serde::Serialize; -#[derive(Debug, thiserror::Error)] +#[derive(Debug, Clone, thiserror::Error)] pub enum DependenciesError { #[error(transparent)] - InvalidPackageName(#[from] InvalidPackageNameError), + InvalidPackageName(Arc), #[error(transparent)] PinCompatibleError(#[from] PinCompatibleError), } +impl From for DependenciesError { + fn from(err: InvalidPackageNameError) -> Self { + Self::InvalidPackageName(Arc::new(err)) + } +} + #[derive(Debug, Clone, Default, Serialize)] pub struct Dependencies { pub dependencies: DependencyMap>, diff --git a/crates/pixi_command_dispatcher/src/build/move_file.rs b/crates/pixi_command_dispatcher/src/build/move_file.rs index b2531c3029..1bc1eec0d4 100644 --- a/crates/pixi_command_dispatcher/src/build/move_file.rs +++ b/crates/pixi_command_dispatcher/src/build/move_file.rs @@ -1,17 +1,17 @@ -use std::io::ErrorKind; -use std::path::Path; +use std::{io::ErrorKind, path::Path, sync::Arc}; + use thiserror::Error; -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum MoveError { #[error(transparent)] - CopyFailed(std::io::Error), + CopyFailed(Arc), #[error(transparent)] - FailedToRemove(std::io::Error), + FailedToRemove(Arc), #[error(transparent)] - MoveFailed(std::io::Error), + MoveFailed(Arc), } /// A utility function to move a file from one location to another by renaming @@ -21,10 +21,10 @@ pub(crate) fn move_file(from: &Path, to: &Path) -> Result<(), MoveError> { match fs_err::rename(from, to) { Ok(_) => Ok(()), Err(e) if e.kind() == ErrorKind::CrossesDevices => { - fs_err::copy(from, to).map_err(MoveError::CopyFailed)?; - fs_err::remove_file(from).map_err(MoveError::FailedToRemove)?; + fs_err::copy(from, to).map_err(|e| MoveError::CopyFailed(Arc::new(e)))?; + fs_err::remove_file(from).map_err(|e| MoveError::FailedToRemove(Arc::new(e)))?; Ok(()) } - Err(e) => Err(MoveError::MoveFailed(e)), + Err(e) => Err(MoveError::MoveFailed(Arc::new(e))), } } diff --git a/crates/pixi_command_dispatcher/src/build/pin_compatible.rs b/crates/pixi_command_dispatcher/src/build/pin_compatible.rs index a26fdf1331..acbd2f3260 100644 --- a/crates/pixi_command_dispatcher/src/build/pin_compatible.rs +++ b/crates/pixi_command_dispatcher/src/build/pin_compatible.rs @@ -72,7 +72,7 @@ impl Display for PinExpression { } } -#[derive(Debug, thiserror::Error)] +#[derive(Debug, Clone, thiserror::Error)] pub enum PinCompatibleError { #[error("Could not apply pin_compatible. Package '{}' is not in the compatibility environment", .0.as_normalized())] PackageNotFound(PackageName), diff --git a/crates/pixi_command_dispatcher/src/build_backend_metadata/mod.rs b/crates/pixi_command_dispatcher/src/build_backend_metadata/mod.rs index 569010a27d..8ea4ef63e1 100644 --- a/crates/pixi_command_dispatcher/src/build_backend_metadata/mod.rs +++ b/crates/pixi_command_dispatcher/src/build_backend_metadata/mod.rs @@ -13,7 +13,7 @@ use std::{ collections::{BTreeMap, HashSet}, hash::Hash, path::PathBuf, - sync::Mutex, + sync::{Arc, Mutex}, }; use thiserror::Error; use tracing::instrument; @@ -130,7 +130,7 @@ impl BuildBackendMetadataSpec { self.enabled_protocols.clone(), ) .await - .map_err_with(BuildBackendMetadataError::Discovery)?; + .map_err_with(|e| BuildBackendMetadataError::Discovery(Arc::new(e)))?; // Determine the location of the source to build from. let manifest_source_anchor = @@ -547,7 +547,7 @@ impl BuildBackendMetadataSpec { let _err = futures::executor::block_on(log_sink.send(line)); }) .await - .map_err(BuildBackendMetadataError::Communication) + .map_err(|e| BuildBackendMetadataError::Communication(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; let timestamp = SystemTime::now(); @@ -611,7 +611,7 @@ impl BuildBackendMetadataSpec { } } -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum BuildBackendMetadataError { #[error(transparent)] #[diagnostic(transparent)] @@ -619,7 +619,7 @@ pub enum BuildBackendMetadataError { #[error(transparent)] #[diagnostic(transparent)] - Discovery(#[from] pixi_build_discovery::DiscoveryError), + Discovery(Arc), #[error("could not initialize the build-backend")] Initialize( @@ -630,7 +630,7 @@ pub enum BuildBackendMetadataError { #[error(transparent)] #[diagnostic(transparent)] - Communication(#[from] pixi_build_frontend::json_rpc::CommunicationError), + Communication(Arc), #[error("the build backend {0} does not support the `conda/outputs` procedure")] BackendMissingCapabilities(String), @@ -641,16 +641,46 @@ pub enum BuildBackendMetadataError { DuplicateVariants { package: String, duplicates: String }, #[error("could not compute hash of input files")] - GlobHash(#[from] pixi_glob::GlobHashError), + GlobHash(Arc), #[error("failed to determine input file modification times")] - GlobSet(#[from] pixi_glob::GlobSetError), + GlobSet(Arc), #[error(transparent)] Cache(#[from] build_backend_metadata::BuildBackendMetadataCacheError), #[error("failed to normalize path")] - NormalizePath(#[from] pixi_path::NormalizeError), + NormalizePath(Arc), +} + +impl From for BuildBackendMetadataError { + fn from(err: pixi_build_discovery::DiscoveryError) -> Self { + Self::Discovery(Arc::new(err)) + } +} + +impl From for BuildBackendMetadataError { + fn from(err: pixi_build_frontend::json_rpc::CommunicationError) -> Self { + Self::Communication(Arc::new(err)) + } +} + +impl From for BuildBackendMetadataError { + fn from(err: pixi_glob::GlobHashError) -> Self { + Self::GlobHash(Arc::new(err)) + } +} + +impl From for BuildBackendMetadataError { + fn from(err: pixi_glob::GlobSetError) -> Self { + Self::GlobSet(Arc::new(err)) + } +} + +impl From for BuildBackendMetadataError { + fn from(err: pixi_path::NormalizeError) -> Self { + Self::NormalizePath(Arc::new(err)) + } } #[cfg(test)] diff --git a/crates/pixi_command_dispatcher/src/cache/build_backend_metadata.rs b/crates/pixi_command_dispatcher/src/cache/build_backend_metadata.rs index 1145d9bac3..7178d7db69 100644 --- a/crates/pixi_command_dispatcher/src/cache/build_backend_metadata.rs +++ b/crates/pixi_command_dispatcher/src/cache/build_backend_metadata.rs @@ -16,6 +16,7 @@ use std::{ collections::BTreeMap, hash::{DefaultHasher, Hash, Hasher}, path::{Path, PathBuf}, + sync::Arc, }; use thiserror::Error; @@ -35,11 +36,11 @@ pub struct BuildBackendMetadataCache { root: AbsPathBuf, } -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum BuildBackendMetadataCacheError { /// An I/O error occurred while reading or writing the cache. #[error("an IO error occurred while {0} {1}")] - IoError(String, PathBuf, #[source] std::io::Error), + IoError(String, PathBuf, #[source] Arc), } /// Defines additional input besides the source files that are used to compute @@ -112,7 +113,7 @@ impl CacheKey for BuildBackendMetadataCacheShard { impl CacheError for BuildBackendMetadataCacheError { fn from_io_error(operation: String, path: PathBuf, error: std::io::Error) -> Self { - BuildBackendMetadataCacheError::IoError(operation, path, error) + BuildBackendMetadataCacheError::IoError(operation, path, Arc::new(error)) } } diff --git a/crates/pixi_command_dispatcher/src/cache/source_metadata.rs b/crates/pixi_command_dispatcher/src/cache/source_metadata.rs index 8321f53cf4..2ef0963f01 100644 --- a/crates/pixi_command_dispatcher/src/cache/source_metadata.rs +++ b/crates/pixi_command_dispatcher/src/cache/source_metadata.rs @@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize}; use std::{ hash::{DefaultHasher, Hash, Hasher}, path::{Path, PathBuf}, + sync::Arc, }; use thiserror::Error; @@ -31,11 +32,11 @@ pub struct SourceMetadataCache { root: AbsPathBuf, } -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum SourceMetadataCacheError { /// An I/O error occurred while reading or writing the cache. #[error("an IO error occurred while {0} {1}")] - IoError(String, PathBuf, #[source] std::io::Error), + IoError(String, PathBuf, #[source] Arc), } /// Defines additional input besides the source files that are used to compute @@ -113,7 +114,7 @@ impl CacheKey for SourceMetadataCacheShard { impl CacheError for SourceMetadataCacheError { fn from_io_error(operation: String, path: PathBuf, error: std::io::Error) -> Self { - SourceMetadataCacheError::IoError(operation, path, error) + SourceMetadataCacheError::IoError(operation, path, Arc::new(error)) } } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher/instantiate_backend.rs b/crates/pixi_command_dispatcher/src/command_dispatcher/instantiate_backend.rs index d3a2b9138d..c40211e146 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher/instantiate_backend.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher/instantiate_backend.rs @@ -25,6 +25,7 @@ use rattler_shell::{ shell::ShellEnum, }; use rattler_virtual_packages::DetectVirtualPackageError; +use std::sync::Arc; use thiserror::Error; #[derive(Debug)] @@ -69,13 +70,13 @@ impl CommandDispatcher { // Canonicalize the source_dir to ensure it's a fully resolved absolute path // without any relative components like ".." or "." let source_dir = dunce::canonicalize(&spec.build_source_dir).map_err(|e| { - CommandDispatcherError::Failed(InstantiateBackendError::SpecConversionError( + CommandDispatcherError::Failed(InstantiateBackendError::SpecConversionError(Arc::new( SpecConversionError::InvalidPath(format!( "failed to canonicalize source directory '{}': {}", spec.build_source_dir.display(), e )), - )) + ))) })?; let command_spec = match self.build_backend_overrides() { @@ -96,7 +97,7 @@ impl CommandDispatcher { configuration: spec.configuration, target_configuration: spec.target_configuration, }) - .map_err(InstantiateBackendError::InMemoryError) + .map_err(InstantiateBackendError::from) .map_err(CommandDispatcherError::Failed)?; return Ok(Backend::new(memory.into(), in_mem.api_version())); } else { @@ -184,7 +185,9 @@ impl CommandDispatcher { .is_some_and(|p| p.name.is_none()) { return Err(CommandDispatcherError::Failed( - InstantiateBackendError::SpecConversionError(SpecConversionError::MissingName), + InstantiateBackendError::SpecConversionError(Arc::new( + SpecConversionError::MissingName, + )), )); } @@ -205,33 +208,63 @@ impl CommandDispatcher { } } -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum InstantiateBackendError { /// The command dispatcher could not be initialized. #[error(transparent)] #[diagnostic(transparent)] - JsonRpc(#[from] json_rpc::InitializeError), + JsonRpc(Arc), /// The command dispatcher could not be initialized. #[error(transparent)] #[diagnostic(transparent)] - InMemoryError(Box), + InMemoryError(Arc), /// Could not detect the virtual packages for the system #[error(transparent)] - VirtualPackages(#[from] DetectVirtualPackageError), + VirtualPackages(Arc), #[error(transparent)] #[diagnostic(transparent)] InstantiateToolEnvironment(#[from] InstantiateToolEnvironmentError), #[error("failed to run activation for the backend tool")] - Activation(#[from] ActivationError), + Activation(Arc), #[error(transparent)] - SpecConversionError(#[from] SpecConversionError), + SpecConversionError(Arc), #[error(transparent)] #[diagnostic(transparent)] SourceCheckout(#[from] SourceCheckoutError), } + +impl From for InstantiateBackendError { + fn from(err: json_rpc::InitializeError) -> Self { + Self::JsonRpc(Arc::new(err)) + } +} + +impl From> for InstantiateBackendError { + fn from(err: Box) -> Self { + Self::InMemoryError(Arc::new(*err)) + } +} + +impl From for InstantiateBackendError { + fn from(err: DetectVirtualPackageError) -> Self { + Self::VirtualPackages(Arc::new(err)) + } +} + +impl From for InstantiateBackendError { + fn from(err: ActivationError) -> Self { + Self::Activation(Arc::new(err)) + } +} + +impl From for InstantiateBackendError { + fn from(err: SpecConversionError) -> Self { + Self::SpecConversionError(Arc::new(err)) + } +} diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/build_backend_metadata.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/build_backend_metadata.rs index 2614eac1b7..923497aa2c 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/build_backend_metadata.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/build_backend_metadata.rs @@ -41,10 +41,10 @@ impl CommandDispatcherProcessor { match self.build_backend_metadata.entry(source_metadata_id) { Entry::Occupied(mut entry) => match entry.get_mut() { PendingDeduplicatingTask::Pending(pending, _) => pending.push(task.tx), - PendingDeduplicatingTask::Result(fetch, _) => { - let _ = task.tx.send(Ok(fetch.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/dev_source_metadata.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/dev_source_metadata.rs index 3d3dbe2363..03101a519c 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/dev_source_metadata.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/dev_source_metadata.rs @@ -43,10 +43,10 @@ impl CommandDispatcherProcessor { match self.dev_source_metadata.entry(dev_source_metadata_id) { Entry::Occupied(mut entry) => match entry.get_mut() { PendingDeduplicatingTask::Pending(pending, _) => pending.push(task.tx), - PendingDeduplicatingTask::Result(result, _) => { - let _ = task.tx.send(Ok(result.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/git.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/git.rs index c93610af5b..eaa7cc0b64 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/git.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/git.rs @@ -17,7 +17,10 @@ impl CommandDispatcherProcessor { PendingGitCheckout::CheckedOut(fetch) => { let _ = task.tx.send(Ok(fetch.clone())); } - PendingGitCheckout::Errored => { + PendingGitCheckout::Errored(err) => { + let _ = task.tx.send(Err(err.clone())); + } + PendingGitCheckout::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } @@ -99,22 +102,18 @@ impl CommandDispatcherProcessor { self.git_checkouts .insert(repository_reference, PendingGitCheckout::CheckedOut(fetch)); } - Err(CommandDispatcherError::Failed(mut err)) => { - // Only send the error to the first channel, drop the rest, which cancels them. - for tx in pending.drain(..) { - match tx.send(Err(err)) { - Ok(_) => return, - Err(Err(failed_to_send)) => err = failed_to_send, - Err(Ok(_)) => unreachable!(), - } + Err(CommandDispatcherError::Failed(err)) => { + // Clone the error and send to all waiting channels. + for tx in std::mem::take(pending) { + let _ = tx.send(Err(err.clone())); } self.git_checkouts - .insert(repository_reference, PendingGitCheckout::Errored); + .insert(repository_reference, PendingGitCheckout::Errored(err)); } Err(CommandDispatcherError::Cancelled) => { self.git_checkouts - .insert(repository_reference, PendingGitCheckout::Errored); + .insert(repository_reference, PendingGitCheckout::Cancelled); } } } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/instantiate_tool_env.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/instantiate_tool_env.rs index 4b8ea4b810..04aa170c08 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/instantiate_tool_env.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/instantiate_tool_env.rs @@ -36,10 +36,10 @@ impl CommandDispatcherProcessor { PendingDeduplicatingTask::Pending(pending, _) => { pending.push(task.tx); } - PendingDeduplicatingTask::Result(result, _) => { - let _ = task.tx.send(Ok(result.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/mod.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/mod.rs index 702df1d056..6a797fbe1f 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/mod.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/mod.rs @@ -222,8 +222,11 @@ enum PendingGitCheckout { /// The repository was checked out and the result is available. CheckedOut(Fetch), - /// A previous attempt failed - Errored, + /// A previous attempt failed, error is stored for future requests. + Errored(GitError), + + /// The checkout was cancelled. + Cancelled, } // We store spec here to double-check that hashes are correct. @@ -239,8 +242,11 @@ enum PendingUrlCheckout { /// The URL was checked out and the result is available. CheckedOut(UrlCheckout), - /// A previous attempt failed - Errored, + /// A previous attempt failed, error is stored for future requests. + Errored(UrlError), + + /// The checkout was cancelled. + Cancelled, } /// Information about a pending conda environment solve. This is used by the @@ -282,46 +288,33 @@ enum PendingDeduplicatingTask { Option, ), - /// Task has completed successfully, result is cached - Result(T, Option), + /// Task has completed (either successfully or with an error), result is cached + Completed(Result, Option), - /// Task has failed, future requests will also fail - Errored, + /// Task has been cancelled. + Cancelled, } -impl PendingDeduplicatingTask { +impl PendingDeduplicatingTask { /// The result was received and all pending tasks can be notified. + /// + /// Both success and error results are cloned and sent to all waiting channels. pub fn on_pending_result(&mut self, result: Result>) { let Self::Pending(pending, context) = self else { unreachable!("cannot get a result for a task that is not pending"); }; let Some(result) = result.into_ok_or_failed() else { - *self = Self::Errored; + *self = Self::Cancelled; return; }; - match result { - Ok(output) => { - for tx in pending.drain(..) { - let _ = tx.send(Ok(output.clone())); - } - - *self = Self::Result(output, *context); - } - Err(mut err) => { - // Only send the error to the first channel, drop the rest, which cancels them. - for tx in pending.drain(..) { - match tx.send(Err(err)) { - Ok(_) => break, - Err(Err(failed_to_send)) => err = failed_to_send, - Err(Ok(_)) => unreachable!(), - } - } - - *self = Self::Errored; - } + // Clone and send the result to all waiting channels + for tx in std::mem::take(pending) { + let _ = tx.send(result.clone()); } + + *self = Self::Completed(result, *context); } } @@ -521,9 +514,9 @@ impl CommandDispatcherProcessor { self.build_backend_metadata .get(&id) .and_then(|pending| match pending { - PendingDeduplicatingTask::Pending(_, context) => Some(*context), - PendingDeduplicatingTask::Result(_, context) => Some(*context), - PendingDeduplicatingTask::Errored => None, + PendingDeduplicatingTask::Pending(_, context) + | PendingDeduplicatingTask::Completed(_, context) => Some(*context), + PendingDeduplicatingTask::Cancelled => None, })? } CommandDispatcherContext::SourceMetadata(id) => { @@ -539,9 +532,9 @@ impl CommandDispatcherProcessor { self.source_metadata .get(&id) .and_then(|pending| match pending { - PendingDeduplicatingTask::Pending(_, context) => Some(*context), - PendingDeduplicatingTask::Result(_, context) => Some(*context), - PendingDeduplicatingTask::Errored => None, + PendingDeduplicatingTask::Pending(_, context) + | PendingDeduplicatingTask::Completed(_, context) => Some(*context), + PendingDeduplicatingTask::Cancelled => None, })? } CommandDispatcherContext::InstallPixiEnvironment(id) => { @@ -562,9 +555,9 @@ impl CommandDispatcherProcessor { self.instantiated_tool_envs .get(&id) .and_then(|pending| match pending { - PendingDeduplicatingTask::Pending(_, context) => Some(*context), - PendingDeduplicatingTask::Result(_, context) => Some(*context), - PendingDeduplicatingTask::Errored => None, + PendingDeduplicatingTask::Pending(_, context) + | PendingDeduplicatingTask::Completed(_, context) => Some(*context), + PendingDeduplicatingTask::Cancelled => None, })? } CommandDispatcherContext::SourceBuild(id) => { @@ -580,9 +573,9 @@ impl CommandDispatcherProcessor { self.source_build .get(&id) .and_then(|pending| match pending { - PendingDeduplicatingTask::Pending(_, context) => Some(*context), - PendingDeduplicatingTask::Result(_, context) => Some(*context), - PendingDeduplicatingTask::Errored => None, + PendingDeduplicatingTask::Pending(_, context) + | PendingDeduplicatingTask::Completed(_, context) => Some(*context), + PendingDeduplicatingTask::Cancelled => None, })? } CommandDispatcherContext::BackendSourceBuild(id) => { diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build.rs index d01a73aeba..6ea764b81a 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build.rs @@ -35,10 +35,10 @@ impl CommandDispatcherProcessor { match self.source_build.entry(source_build_id) { Entry::Occupied(mut entry) => match entry.get_mut() { PendingDeduplicatingTask::Pending(pending, _) => pending.push(task.tx), - PendingDeduplicatingTask::Result(result, _) => { - let _ = task.tx.send(Ok(result.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build_cache_status.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build_cache_status.rs index 31c518102c..864abdda50 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build_cache_status.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_build_cache_status.rs @@ -53,10 +53,10 @@ impl CommandDispatcherProcessor { { Entry::Occupied(mut entry) => match entry.get_mut() { PendingDeduplicatingTask::Pending(pending, _) => pending.push(task.tx), - PendingDeduplicatingTask::Result(result, _) => { - let _ = task.tx.send(Ok(result.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_metadata.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_metadata.rs index de803e9f3d..b2190d701c 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_metadata.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/source_metadata.rs @@ -46,10 +46,10 @@ impl CommandDispatcherProcessor { match self.source_metadata.entry(source_metadata_id) { Entry::Occupied(mut entry) => match entry.get_mut() { PendingDeduplicatingTask::Pending(pending, _) => pending.push(task.tx), - PendingDeduplicatingTask::Result(result, _) => { - let _ = task.tx.send(Ok(result.clone())); + PendingDeduplicatingTask::Completed(result, _) => { + let _ = task.tx.send(result.clone()); } - PendingDeduplicatingTask::Errored => { + PendingDeduplicatingTask::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(task.tx); } diff --git a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/url.rs b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/url.rs index f6ce5df4b6..c3354b77ae 100644 --- a/crates/pixi_command_dispatcher/src/command_dispatcher_processor/url.rs +++ b/crates/pixi_command_dispatcher/src/command_dispatcher_processor/url.rs @@ -30,10 +30,13 @@ impl CommandDispatcherProcessor { spec: spec.clone(), tx, }), - PendingUrlCheckout::CheckedOut(fetch) => { - let _ = tx.send(validate_checkout(&spec, fetch).map(|_| fetch.clone())); + PendingUrlCheckout::CheckedOut(checkout) => { + let _ = tx.send(validate_checkout(&spec, checkout).map(|_| checkout.clone())); } - PendingUrlCheckout::Errored => { + PendingUrlCheckout::Errored(err) => { + let _ = tx.send(Err(err.clone())); + } + PendingUrlCheckout::Cancelled => { // Drop the sender, this will cause a cancellation on the other side. drop(tx) } @@ -125,30 +128,28 @@ impl CommandDispatcherProcessor { } match result { - Ok(fetch) => { + Ok(checkout) => { for waiter in pending.drain(..) { - fulfill_waiter(waiter, &fetch); + fulfill_waiter(waiter, &checkout); } - // Store the fetch in the url map. + // Store the checkout in the url map. self.url_checkouts - .insert(url, PendingUrlCheckout::CheckedOut(fetch)); + .insert(url, PendingUrlCheckout::CheckedOut(checkout)); } - Err(CommandDispatcherError::Failed(mut err)) => { - // Only send the error to the first channel, drop the rest, which cancels them. - for waiter in pending.drain(..) { + Err(CommandDispatcherError::Failed(err)) => { + // Clone the error and send to all waiting channels. + for waiter in std::mem::take(pending) { let PendingUrlWaiter { tx, .. } = waiter; - match tx.send(Err(err)) { - Ok(_) => return, - Err(Err(failed_to_send)) => err = failed_to_send, - Err(Ok(_)) => unreachable!(), - } + let _ = tx.send(Err(err.clone())); } - self.url_checkouts.insert(url, PendingUrlCheckout::Errored); + self.url_checkouts + .insert(url, PendingUrlCheckout::Errored(err)); } Err(CommandDispatcherError::Cancelled) => { - self.url_checkouts.insert(url, PendingUrlCheckout::Errored); + self.url_checkouts + .insert(url, PendingUrlCheckout::Cancelled); } } } diff --git a/crates/pixi_command_dispatcher/src/dev_source_metadata/mod.rs b/crates/pixi_command_dispatcher/src/dev_source_metadata/mod.rs index 3345c5c87a..ef9996f540 100644 --- a/crates/pixi_command_dispatcher/src/dev_source_metadata/mod.rs +++ b/crates/pixi_command_dispatcher/src/dev_source_metadata/mod.rs @@ -40,7 +40,7 @@ pub struct DevSourceMetadata { } /// An error that can occur while retrieving dev source metadata. -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum DevSourceMetadataError { #[error(transparent)] #[diagnostic(transparent)] @@ -60,7 +60,7 @@ pub enum DevSourceMetadataError { } /// Error for when a package is not provided by the source. -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub struct PackageNotProvidedError { /// The name of the package that was requested pub name: PackageName, diff --git a/crates/pixi_command_dispatcher/src/instantiate_tool_env/mod.rs b/crates/pixi_command_dispatcher/src/instantiate_tool_env/mod.rs index 5906e7bde0..0a573878ec 100644 --- a/crates/pixi_command_dispatcher/src/instantiate_tool_env/mod.rs +++ b/crates/pixi_command_dispatcher/src/instantiate_tool_env/mod.rs @@ -2,6 +2,7 @@ use std::{ collections::BTreeMap, hash::{Hash, Hasher}, path::PathBuf, + sync::Arc, }; use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD, prelude::BASE64_URL_SAFE_NO_PAD}; @@ -221,8 +222,7 @@ impl InstantiateToolEnvironmentSpec { preferred_build_source: BTreeMap::new(), }) .await - .map_err_with(Box::new) - .map_err_with(InstantiateToolEnvironmentError::SolveEnvironment)?; + .map_err_with(|e| InstantiateToolEnvironmentError::SolveEnvironment(Arc::new(e)))?; // Ensure that the solution contains matching api version package let Some(api_version) = solved_environment @@ -249,21 +249,21 @@ impl InstantiateToolEnvironmentSpec { // Construct the prefix for the tool environment. let prefix = Prefix::create(command_queue.cache_dirs().build_backends().join(cache_key)) - .map_err(InstantiateToolEnvironmentError::CreatePrefix) + .map_err(|e| InstantiateToolEnvironmentError::CreatePrefix(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; // Acquire a lock on the tool prefix. let mut prefix_guard = AsyncPrefixGuard::new(prefix.path()) .and_then(|guard| guard.write()) .await - .map_err(InstantiateToolEnvironmentError::AcquireLock) + .map_err(|e| InstantiateToolEnvironmentError::AcquireLock(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; // Update the prefix to indicate that we are install it. prefix_guard .begin() .await - .map_err(InstantiateToolEnvironmentError::UpdateLock) + .map_err(|e| InstantiateToolEnvironmentError::UpdateLock(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; // Install the environment @@ -283,14 +283,13 @@ impl InstantiateToolEnvironmentSpec { enabled_protocols: self.enabled_protocols, }) .await - .map_err_with(Box::new) - .map_err_with(InstantiateToolEnvironmentError::InstallEnvironment)?; + .map_err_with(|e| InstantiateToolEnvironmentError::InstallEnvironment(Arc::new(e)))?; // Mark the environment as finished. prefix_guard .finish() .await - .map_err(InstantiateToolEnvironmentError::UpdateLock) + .map_err(|e| InstantiateToolEnvironmentError::UpdateLock(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; Ok(InstantiateToolEnvironmentResult { @@ -302,27 +301,27 @@ impl InstantiateToolEnvironmentSpec { } /// An error that may occur while trying to instantiate a tool environment. -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum InstantiateToolEnvironmentError { #[error("failed to construct a tool prefix")] - CreatePrefix(#[source] std::io::Error), + CreatePrefix(#[source] Arc), #[error("failed to acquire a lock for the tool prefix")] - AcquireLock(#[source] std::io::Error), + AcquireLock(#[source] Arc), #[error("failed to release lock for the tool prefix")] - ReleaseLock(#[source] std::io::Error), + ReleaseLock(#[source] Arc), #[error("failed to update lock for the tool prefix")] - UpdateLock(#[source] std::io::Error), + UpdateLock(#[source] Arc), #[error(transparent)] #[diagnostic(transparent)] - SolveEnvironment(Box), + SolveEnvironment(Arc), #[error(transparent)] #[diagnostic(transparent)] - InstallEnvironment(Box), + InstallEnvironment(Arc), #[error("The environment for the build backend package (`{} {}`) does not depend on `{}`. Without this package pixi has no way of knowing the API to use to communicate with the backend.", .build_backend.0.as_normalized(), .build_backend.1.to_string(), PIXI_BUILD_API_VERSION_NAME.as_normalized() )] diff --git a/crates/pixi_command_dispatcher/src/solve_pixi/mod.rs b/crates/pixi_command_dispatcher/src/solve_pixi/mod.rs index 54d449c3b2..65078ba7d6 100644 --- a/crates/pixi_command_dispatcher/src/solve_pixi/mod.rs +++ b/crates/pixi_command_dispatcher/src/solve_pixi/mod.rs @@ -1,7 +1,7 @@ mod reporter; mod source_metadata_collector; -use std::{borrow::Borrow, collections::BTreeMap, path::PathBuf, time::Instant}; +use std::{borrow::Borrow, collections::BTreeMap, path::PathBuf, sync::Arc, time::Instant}; use chrono::{DateTime, Utc}; use indexmap::IndexMap; @@ -180,12 +180,12 @@ impl PixiEnvironmentSpec { let binary_match_specs = binary_specs .clone() .into_match_specs(&self.channel_config) - .map_err(SolvePixiEnvironmentError::SpecConversionError) + .map_err(SolvePixiEnvironmentError::from) .map_err(CommandDispatcherError::Failed)?; let dev_source_binary_match_specs = dev_source_binary_specs .into_match_specs(&self.channel_config) - .map_err(SolvePixiEnvironmentError::SpecConversionError) + .map_err(SolvePixiEnvironmentError::from) .map_err(CommandDispatcherError::Failed)?; // Query the gateway for conda repodata. This fetches the repodata for both the @@ -213,7 +213,7 @@ impl PixiEnvironmentSpec { let binary_repodata = query .await - .map_err(SolvePixiEnvironmentError::QueryError) + .map_err(SolvePixiEnvironmentError::from) .map_err(CommandDispatcherError::Failed)?; let total_records = binary_repodata.iter().map(RepoData::len).sum::(); tracing::debug!( @@ -330,7 +330,9 @@ impl PixiEnvironmentSpec { let base_url = channel .clone() .into_base_url(channel_config) - .map_err(|err| Box::new(SolvePixiEnvironmentError::ParseChannelError(err)))?; + .map_err(|err| { + Box::new(SolvePixiEnvironmentError::ParseChannelError(Arc::new(err))) + })?; if !channels.iter().any(|c| c == &base_url) { return Err(Box::new(SolvePixiEnvironmentError::MissingChannel( @@ -348,26 +350,26 @@ impl PixiEnvironmentSpec { } /// An error that might be returned when solving a pixi environment. -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum SolvePixiEnvironmentError { #[error(transparent)] - QueryError(#[from] rattler_repodata_gateway::GatewayError), + QueryError(Arc), #[error("failed to solve the environment")] - SolveError(#[from] rattler_solve::SolveError), + SolveError(#[source] Arc), #[error(transparent)] #[diagnostic(transparent)] CollectSourceMetadataError(CollectSourceMetadataError), #[error(transparent)] - SpecConversionError(#[from] SpecConversionError), + SpecConversionError(Arc), #[error("detected a cyclic dependency:\n\n{0}")] Cycle(Cycle), #[error(transparent)] - ParseChannelError(#[from] ParseChannelError), + ParseChannelError(Arc), #[error(transparent)] #[diagnostic(transparent)] @@ -382,8 +384,32 @@ pub enum SolvePixiEnvironmentError { SourceCheckoutError(crate::SourceCheckoutError), } +impl From for SolvePixiEnvironmentError { + fn from(err: rattler_repodata_gateway::GatewayError) -> Self { + Self::QueryError(Arc::new(err)) + } +} + +impl From for SolvePixiEnvironmentError { + fn from(err: rattler_solve::SolveError) -> Self { + Self::SolveError(Arc::new(err)) + } +} + +impl From for SolvePixiEnvironmentError { + fn from(err: SpecConversionError) -> Self { + Self::SpecConversionError(Arc::new(err)) + } +} + +impl From for SolvePixiEnvironmentError { + fn from(err: ParseChannelError) -> Self { + Self::ParseChannelError(Arc::new(err)) + } +} + /// An error for a missing channel in the solve request -#[derive(Debug, Diagnostic, Error)] +#[derive(Debug, Clone, Diagnostic, Error)] #[error("Package '{package}' requested unavailable channel '{channel}'")] pub struct MissingChannelError { pub package: String, @@ -402,10 +428,10 @@ impl From for SolvePixiEnvironmentError { fn from(err: SolveCondaEnvironmentError) -> Self { match err { SolveCondaEnvironmentError::SolveError(err) => { - SolvePixiEnvironmentError::SolveError(err) + SolvePixiEnvironmentError::SolveError(Arc::new(err)) } SolveCondaEnvironmentError::SpecConversionError(err) => { - SolvePixiEnvironmentError::SpecConversionError(err) + SolvePixiEnvironmentError::SpecConversionError(Arc::new(err)) } } } diff --git a/crates/pixi_command_dispatcher/src/solve_pixi/source_metadata_collector.rs b/crates/pixi_command_dispatcher/src/solve_pixi/source_metadata_collector.rs index 279c96b20b..85fa1dd8e4 100644 --- a/crates/pixi_command_dispatcher/src/solve_pixi/source_metadata_collector.rs +++ b/crates/pixi_command_dispatcher/src/solve_pixi/source_metadata_collector.rs @@ -45,7 +45,7 @@ pub struct CollectedSourceMetadata { } /// An error that can occur while collecting source metadata. -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum CollectSourceMetadataError { #[error("failed to extract metadata for package '{}'", .name.as_source())] SourceMetadataError { diff --git a/crates/pixi_command_dispatcher/src/source_build/mod.rs b/crates/pixi_command_dispatcher/src/source_build/mod.rs index 1a24e05f70..6ade2f2cc5 100644 --- a/crates/pixi_command_dispatcher/src/source_build/mod.rs +++ b/crates/pixi_command_dispatcher/src/source_build/mod.rs @@ -244,7 +244,7 @@ impl SourceBuildSpec { self.enabled_protocols.clone(), ) .await - .map_err_with(SourceBuildError::Discovery)?; + .map_err_with(|e| SourceBuildError::Discovery(Arc::new(e)))?; // Compute the package input hash for caching purposes. let package_build_input_hash = PackageBuildInputHash::from(discovered_backend.as_ref()); @@ -346,7 +346,7 @@ impl SourceBuildSpec { && let Err(err) = fs_err::remove_dir_all(&work_directory) { return Err(CommandDispatcherError::Failed( - SourceBuildError::CleanWorkingDirectory(work_directory, err), + SourceBuildError::CleanWorkingDirectory(work_directory, Arc::new(err)), )); } @@ -371,13 +371,13 @@ impl SourceBuildSpec { // Create the output directory if it does not exist. fs_err::create_dir_all(&output_directory).map_err(|err| { - CommandDispatcherError::Failed(SourceBuildError::CreateOutputDirectory(err)) + CommandDispatcherError::Failed(SourceBuildError::CreateOutputDirectory(Arc::new(err))) })?; // At this point, the directory should exist, so we can canonicalize the path. let output_directory = fs_err::canonicalize(&output_directory) .map_err(CommandDispatcherError::Failed) - .map_err_with(SourceBuildError::CreateOutputDirectory)?; + .map_err_with(|e| SourceBuildError::CreateOutputDirectory(Arc::new(e)))?; // The output file should also exist. tracing::debug!( @@ -417,8 +417,9 @@ impl SourceBuildSpec { // this during the build? let output_file = built_source.output_file.clone(); let read_index_json_fut = simple_spawn_blocking::tokio::run_blocking_task(move || { - rattler_package_streaming::seek::read_package_file(&output_file) - .map_err(|err| CommandDispatcherError::Failed(SourceBuildError::ReadIndexJson(err))) + rattler_package_streaming::seek::read_package_file(&output_file).map_err(|err| { + CommandDispatcherError::Failed(SourceBuildError::ReadIndexJson(Arc::new(err))) + }) }); // Read the SHA256 hash of the package file. @@ -431,7 +432,7 @@ impl SourceBuildSpec { let record = RepoDataRecord { package_record: PackageRecord::from_index_json(index_json, None, Some(sha), None) .map_err(|err| { - CommandDispatcherError::Failed(SourceBuildError::ConvertSubdir(err)) + CommandDispatcherError::Failed(SourceBuildError::ConvertSubdir(Arc::new(err))) })?, file_name: built_source .output_file @@ -570,7 +571,7 @@ impl SourceBuildSpec { }, ) .await - .map_err(BackendSourceBuildError::BuildError) + .map_err(BackendSourceBuildError::from) .map_err(SourceBuildError::from) .map_err(CommandDispatcherError::Failed)?; @@ -638,7 +639,9 @@ impl SourceBuildSpec { reporter.clone(), ) .await - .map_err(|err| SourceBuildError::RunExportsExtraction(String::from("build"), err)) + .map_err(|err| { + SourceBuildError::RunExportsExtraction(String::from("build"), Arc::new(err)) + }) .map_err(CommandDispatcherError::Failed)?; compatibility_map.extend( @@ -676,7 +679,9 @@ impl SourceBuildSpec { reporter, ) .await - .map_err(|err| SourceBuildError::RunExportsExtraction(String::from("host"), err)) + .map_err(|err| { + SourceBuildError::RunExportsExtraction(String::from("host"), Arc::new(err)) + }) .map_err(CommandDispatcherError::Failed)?; // Install the build environment @@ -689,7 +694,9 @@ impl SourceBuildSpec { name: format!("{} (build)", self.package.name.as_source()), records: build_records.clone(), prefix: Prefix::create(&directories.build_prefix) - .map_err(SourceBuildError::CreateBuildEnvironmentDirectory) + .map_err(|e| { + SourceBuildError::CreateBuildEnvironmentDirectory(Arc::new(e)) + }) .map_err(CommandDispatcherError::Failed)?, installed: None, ignore_packages: None, @@ -702,14 +709,13 @@ impl SourceBuildSpec { enabled_protocols: self.enabled_protocols.clone(), }) .await - .map_err_with(Box::new) - .map_err_with(SourceBuildError::InstallBuildEnvironment)?, + .map_err_with(|e| SourceBuildError::InstallBuildEnvironment(Arc::new(e)))?, ) }; // We always create the host prefix so that $PREFIX exists during the build. let host_prefix_directory = Prefix::create(&directories.host_prefix) - .map_err(SourceBuildError::CreateBuildEnvironmentDirectory) + .map_err(|e| SourceBuildError::CreateBuildEnvironmentDirectory(Arc::new(e))) .map_err(CommandDispatcherError::Failed)?; // Install the host environment. @@ -733,14 +739,13 @@ impl SourceBuildSpec { enabled_protocols: self.enabled_protocols, }) .await - .map_err_with(Box::new) - .map_err_with(SourceBuildError::InstallBuildEnvironment)?, + .map_err_with(|e| SourceBuildError::InstallHostEnvironment(Arc::new(e)))?, ) }; // Ensure the work directory exists. fs_err::create_dir_all(&work_directory).map_err(|err| { - CommandDispatcherError::Failed(SourceBuildError::CreateWorkDirectory(err)) + CommandDispatcherError::Failed(SourceBuildError::CreateWorkDirectory(Arc::new(err))) })?; compatibility_map.extend( @@ -909,13 +914,14 @@ async fn compute_package_sha256( ) -> Result> { let path = package_path.to_path_buf(); simple_spawn_blocking::tokio::run_blocking_task(move || { - rattler_digest::compute_file_digest::(&path) - .map_err(|e| CommandDispatcherError::Failed(SourceBuildError::CalculateSha256(path, e))) + rattler_digest::compute_file_digest::(&path).map_err(|e| { + CommandDispatcherError::Failed(SourceBuildError::CalculateSha256(path, Arc::new(e))) + }) }) .await } -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum SourceBuildError { #[error(transparent)] #[diagnostic(transparent)] @@ -925,14 +931,14 @@ pub enum SourceBuildError { BuildCache(#[from] BuildCacheError), #[error("failed to amend run exports for {0} environment")] - RunExportsExtraction(String, #[source] RunExportExtractorError), + RunExportsExtraction(String, #[source] Arc), #[error(transparent)] - CreateWorkDirectory(std::io::Error), + CreateWorkDirectory(Arc), #[error(transparent)] #[diagnostic(transparent)] - Discovery(#[from] pixi_build_discovery::DiscoveryError), + Discovery(Arc), #[error(transparent)] #[diagnostic(transparent)] @@ -953,16 +959,16 @@ pub enum SourceBuildError { ), #[error("failed to create the build environment directory")] - CreateBuildEnvironmentDirectory(#[source] std::io::Error), + CreateBuildEnvironmentDirectory(#[source] Arc), #[error("failed to create the host environment directory")] - CreateHostEnvironmentDirectory(#[source] std::io::Error), + CreateHostEnvironmentDirectory(#[source] Arc), #[error("failed to install the build environment")] - InstallBuildEnvironment(#[source] Box), + InstallBuildEnvironment(#[source] Arc), #[error("failed to install the host environment")] - InstallHostEnvironment(#[source] Box), + InstallHostEnvironment(#[source] Arc), #[error( "The build backend does not provide the requested output: {subdir}/{name}={version}={build}." @@ -980,7 +986,7 @@ pub enum SourceBuildError { MissingOutputFile(PathBuf), #[error("backend returned a dependency on an invalid package name")] - InvalidPackageName(#[from] InvalidPackageNameError), + InvalidPackageName(#[source] Arc), #[error(transparent)] PinCompatibleError(#[from] PinCompatibleError), @@ -990,25 +996,43 @@ pub enum SourceBuildError { BackendBuildError(#[from] BackendSourceBuildError), #[error("failed to clean the working directory: {0}")] - CleanWorkingDirectory(PathBuf, #[source] std::io::Error), + CleanWorkingDirectory(PathBuf, #[source] Arc), #[error("moving the built package from {0} to the output directory {1} failed")] Move(PathBuf, PathBuf, #[source] MoveError), #[error("failed to create the output directory")] - CreateOutputDirectory(#[source] std::io::Error), + CreateOutputDirectory(#[source] Arc), #[error("failed to read metadata from the output package")] - ReadIndexJson(#[source] rattler_package_streaming::ExtractError), + ReadIndexJson(#[source] Arc), #[error("failed to calculate sha256 hash of {}", .0.display())] - CalculateSha256(std::path::PathBuf, #[source] std::io::Error), + CalculateSha256(std::path::PathBuf, #[source] Arc), #[error("the package does not contain a valid subdir")] - ConvertSubdir(#[source] ConvertSubdirError), + ConvertSubdir(#[source] Arc), #[error(transparent)] - GlobSet(#[from] pixi_glob::GlobSetError), + GlobSet(Arc), +} + +impl From for SourceBuildError { + fn from(err: InvalidPackageNameError) -> Self { + Self::InvalidPackageName(Arc::new(err)) + } +} + +impl From for SourceBuildError { + fn from(err: pixi_glob::GlobSetError) -> Self { + Self::GlobSet(Arc::new(err)) + } +} + +impl From for SourceBuildError { + fn from(err: pixi_build_discovery::DiscoveryError) -> Self { + Self::Discovery(Arc::new(err)) + } } impl From for SourceBuildError { diff --git a/crates/pixi_command_dispatcher/src/source_build_cache_status/mod.rs b/crates/pixi_command_dispatcher/src/source_build_cache_status/mod.rs index 47c1f5b372..3ae4a3910c 100644 --- a/crates/pixi_command_dispatcher/src/source_build_cache_status/mod.rs +++ b/crates/pixi_command_dispatcher/src/source_build_cache_status/mod.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, fmt, path::PathBuf}; +use std::{collections::BTreeMap, fmt, path::PathBuf, sync::Arc}; use itertools::chain; use miette::Diagnostic; @@ -339,7 +339,7 @@ impl SourceBuildCacheStatusSpec { self.enabled_protocols.clone(), ) .await - .map_err_with(SourceBuildCacheStatusError::Discovery)?; + .map_err_with(|e| SourceBuildCacheStatusError::Discovery(Arc::new(e)))?; // Compute a hash of the package configuration. let package_build_input_hash = PackageBuildInputHashBuilder { @@ -422,7 +422,7 @@ impl SourceBuildCacheStatusSpec { let glob_set = GlobSet::create(source_info.input_globs.iter().map(String::as_str)); let matching_files = glob_set .collect_matching(source_dir.as_std_path()) - .map_err(SourceBuildCacheStatusError::GlobSet) + .map_err(SourceBuildCacheStatusError::from) .map_err(CommandDispatcherError::Failed)?; for matching_file in matching_files { @@ -446,7 +446,7 @@ impl SourceBuildCacheStatusSpec { } } -#[derive(Debug, thiserror::Error, Diagnostic)] +#[derive(Debug, Clone, thiserror::Error, Diagnostic)] pub enum SourceBuildCacheStatusError { #[error(transparent)] BuildCache(BuildCacheError), @@ -457,11 +457,17 @@ pub enum SourceBuildCacheStatusError { #[error(transparent)] #[diagnostic(transparent)] - Discovery(pixi_build_discovery::DiscoveryError), + Discovery(Arc), #[error(transparent)] - GlobSet(#[from] pixi_glob::GlobSetError), + GlobSet(Arc), #[error("a cycle was detected in the build/host dependencies of the package")] Cycle, } + +impl From for SourceBuildCacheStatusError { + fn from(err: pixi_glob::GlobSetError) -> Self { + Self::GlobSet(Arc::new(err)) + } +} diff --git a/crates/pixi_command_dispatcher/src/source_checkout/mod.rs b/crates/pixi_command_dispatcher/src/source_checkout/mod.rs index 8c144d28c4..22953722a1 100644 --- a/crates/pixi_command_dispatcher/src/source_checkout/mod.rs +++ b/crates/pixi_command_dispatcher/src/source_checkout/mod.rs @@ -25,7 +25,7 @@ impl SourceCheckout { } } -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum SourceCheckoutError { #[error(transparent)] InvalidPath(#[from] InvalidPathError), @@ -46,7 +46,7 @@ pub enum SourceCheckoutError { SubdirIsAFile(PathBuf), } -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum InvalidPathError { #[error("the path escapes the root directory: {0}")] RelativePathEscapesRoot(PathBuf), diff --git a/crates/pixi_command_dispatcher/src/source_metadata/cycle.rs b/crates/pixi_command_dispatcher/src/source_metadata/cycle.rs index 62ef06d250..8ca97f3704 100644 --- a/crates/pixi_command_dispatcher/src/source_metadata/cycle.rs +++ b/crates/pixi_command_dispatcher/src/source_metadata/cycle.rs @@ -4,14 +4,14 @@ use itertools::Itertools; use rattler_conda_types::PackageName; /// Defines a package and in which dependency set the cycle occurred. -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum CycleEnvironment { Host, Build, Run, } -#[derive(Debug, Default)] +#[derive(Debug, Clone, Default)] pub struct Cycle { /// A list of package and in which environment the next package is used. /// Together, these form a cycle. diff --git a/crates/pixi_command_dispatcher/src/source_metadata/mod.rs b/crates/pixi_command_dispatcher/src/source_metadata/mod.rs index 9ba2e739c1..788487f833 100644 --- a/crates/pixi_command_dispatcher/src/source_metadata/mod.rs +++ b/crates/pixi_command_dispatcher/src/source_metadata/mod.rs @@ -249,7 +249,9 @@ impl SourceMetadataSpec { reporter.clone(), ) .await - .map_err(|err| SourceMetadataError::RunExportsExtraction(String::from("build"), err)) + .map_err(|err| { + SourceMetadataError::RunExportsExtraction(String::from("build"), Arc::new(err)) + }) .map_err(CommandDispatcherError::Failed)?; compatibility_map.extend( @@ -286,7 +288,9 @@ impl SourceMetadataSpec { reporter, ) .await - .map_err(|err| SourceMetadataError::RunExportsExtraction(String::from("host"), err)) + .map_err(|err| { + SourceMetadataError::RunExportsExtraction(String::from("host"), Arc::new(err)) + }) .map_err(CommandDispatcherError::Failed)?; compatibility_map.extend( @@ -311,7 +315,7 @@ impl SourceMetadataSpec { constrains, mut sources, } = PackageRecordDependencies::new(run_dependencies, &self.backend_metadata.channel_config) - .map_err(SourceMetadataError::SpecConversionError) + .map_err(SourceMetadataError::from) .map_err(CommandDispatcherError::Failed)?; // Convert the run exports @@ -350,7 +354,7 @@ impl SourceMetadataSpec { Either::Right(binary) => { let spec = binary .try_into_nameless_match_spec(&self.backend_metadata.channel_config) - .map_err(SourceMetadataError::SpecConversionError)?; + .map_err(SourceMetadataError::from)?; Ok(MatchSpec::from_nameless(spec, Some(name.clone().into()))) } } @@ -378,7 +382,7 @@ impl SourceMetadataSpec { .map(|(name, spec)| { let nameless_spec = spec .try_into_nameless_match_spec(&self.backend_metadata.channel_config) - .map_err(SourceMetadataError::SpecConversionError)?; + .map_err(SourceMetadataError::from)?; Ok(MatchSpec::from_nameless(nameless_spec, Some(name.into())).to_string()) }) .collect::, SourceMetadataError>>() @@ -583,14 +587,14 @@ impl PackageRecordDependencies { } } -#[derive(Debug, Error, Diagnostic)] +#[derive(Debug, Clone, Error, Diagnostic)] pub enum SourceMetadataError { #[error(transparent)] #[diagnostic(transparent)] BuildBackendMetadata(#[from] BuildBackendMetadataError), #[error("failed to amend run exports for {0} environment")] - RunExportsExtraction(String, #[source] RunExportExtractorError), + RunExportsExtraction(String, #[source] Arc), #[error("while trying to solve the build environment for the package")] SolveBuildEnvironment( @@ -607,10 +611,10 @@ pub enum SourceMetadataError { ), #[error(transparent)] - SpecConversionError(#[from] SpecConversionError), + SpecConversionError(Arc), #[error(transparent)] - InvalidPackageName(#[from] InvalidPackageNameError), + InvalidPackageName(Arc), #[error(transparent)] PinCompatibleError(#[from] crate::build::pin_compatible::PinCompatibleError), @@ -634,6 +638,18 @@ pub enum SourceMetadataError { PackageNotProvided(#[from] PackageNotProvidedError), } +impl From for SourceMetadataError { + fn from(err: SpecConversionError) -> Self { + Self::SpecConversionError(Arc::new(err)) + } +} + +impl From for SourceMetadataError { + fn from(err: InvalidPackageNameError) -> Self { + Self::InvalidPackageName(Arc::new(err)) + } +} + impl From for SourceMetadataError { fn from(value: DependenciesError) -> Self { match value { diff --git a/crates/pixi_command_dispatcher/tests/integration/main.rs b/crates/pixi_command_dispatcher/tests/integration/main.rs index 1effeb3416..19e45c098e 100644 --- a/crates/pixi_command_dispatcher/tests/integration/main.rs +++ b/crates/pixi_command_dispatcher/tests/integration/main.rs @@ -77,33 +77,6 @@ fn workspaces_dir() -> PathBuf { cargo_workspace_dir().join("tests/data/workspaces") } -/// Recursively copies a directory and its contents to a destination. -fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { - fs::create_dir_all(dst)?; - for entry in fs::read_dir(src)? { - let entry = entry?; - let src_path = entry.path(); - let dst_path = dst.join(entry.file_name()); - if src_path.is_dir() { - copy_dir_recursive(&src_path, &dst_path)?; - } else { - fs::copy(&src_path, &dst_path)?; - } - } - Ok(()) -} - -/// Copies a workspace to a temporary directory for isolated testing. -/// -/// Returns the temp directory handle (must be kept alive) and the path to the workspace copy. -fn copy_workspace_to_temp(workspace_name: &str) -> (TempDir, PathBuf) { - let temp = tempfile::tempdir().unwrap(); - let src = workspaces_dir().join(workspace_name); - let dst = temp.path().join(workspace_name); - copy_dir_recursive(&src, &dst).unwrap(); - (temp, dst) -} - /// Returns the default build environment to use for tests. fn default_build_environment() -> BuildEnvironment { let (tool_platform, tool_virtual_packages) = tool_platform(); @@ -293,7 +266,7 @@ pub async fn instantiate_backend_without_compatible_api_version_cancels_duplicat dispatcher.instantiate_tool_environment(spec), ); - // Exactly one result should be a failure and the other should be cancelled. + // Both results should be failures since errors are now cloned and sent to all channels. let is_cancelled = |r: &Result< _, CommandDispatcherError, @@ -307,10 +280,13 @@ pub async fn instantiate_backend_without_compatible_api_version_cancels_duplicat let failed_count = usize::from(is_failed(&r1)) + usize::from(is_failed(&r2)); assert_eq!( - cancelled_count, 1, - "expected exactly one request to be cancelled" + cancelled_count, 0, + "no requests should be cancelled - errors are cloned to all channels" + ); + assert_eq!( + failed_count, 2, + "both requests should fail with the same error" ); - assert_eq!(failed_count, 1, "expected exactly one request to fail"); } /// Dropping the returned future should cancel the background task promptly. @@ -586,6 +562,22 @@ pub async fn instantiate_backend_with_from_source() { let source_dir = workspaces_dir().join("source-backends"); let tmp_dir = tempfile::tempdir().unwrap(); let root_dir = tmp_dir.path().to_path_buf(); + + // Copy all files from source to temp + fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { + fs_err::create_dir_all(dst)?; + for entry in fs_err::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path)?; + } else { + fs_err::copy(&src_path, &dst_path)?; + } + } + Ok(()) + } copy_dir_recursive(&source_dir, &root_dir).unwrap(); // Update workspace pixi.toml to use local channel instead of conda-forge @@ -1262,8 +1254,7 @@ pub async fn pin_and_checkout_url_validates_cached_results() { /// and verifies that the cache is properly reused (CacheStatus::UpToDate). #[tokio::test] pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { - // Copy workspace to temp directory for isolation from other tests - let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); + let root_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1350,8 +1341,7 @@ pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { /// and verifies that file changes are detected and trigger a rebuild. #[tokio::test] pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { - // Copy workspace to temp directory for isolation from other tests - let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); + let root_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1445,8 +1435,7 @@ pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { /// without testing dependency chains or force rebuild flags. #[tokio::test] pub async fn test_package_rebuilt_when_source_file_modified() { - // Copy workspace to temp directory for isolation from other tests - let (_workspace_temp, root_dir) = copy_workspace_to_temp("host-dependency"); + let root_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); diff --git a/crates/pixi_config/src/lib.rs b/crates/pixi_config/src/lib.rs index 9072014f5c..626e6d1504 100644 --- a/crates/pixi_config/src/lib.rs +++ b/crates/pixi_config/src/lib.rs @@ -39,11 +39,11 @@ const EXPERIMENTAL: &str = "experimental"; #[serde(rename_all = "lowercase")] pub enum TlsRootCerts { /// Use bundled Mozilla root certificates - #[default] Webpki, /// Use the system's native certificate store Native, /// Use both webpki and native certificates + #[default] All, } @@ -2791,14 +2791,6 @@ UNUSED = "unused" config.set("unknown-key", None).unwrap_err(); } - #[test] - fn test_tls_root_certs_default() { - let config = Config::default(); - // Default should be Webpki (bundled Mozilla roots) - assert_eq!(config.tls_root_certs(), TlsRootCerts::Webpki); - assert_eq!(config.tls_root_certs, None); - } - #[rstest] #[case("pinning-strategy", None, None)] #[case("pinning-strategy", Some("semver".to_string()), Some(PinningStrategy::Semver))] diff --git a/crates/pixi_core/Cargo.toml b/crates/pixi_core/Cargo.toml index f55d26176b..e67a764571 100644 --- a/crates/pixi_core/Cargo.toml +++ b/crates/pixi_core/Cargo.toml @@ -79,6 +79,7 @@ typed-path = { workspace = true } url = { workspace = true } uv-build-frontend = { workspace = true } uv-cache = { workspace = true } +uv-cache-key = { workspace = true } uv-client = { workspace = true } uv-configuration = { workspace = true } uv-dispatch = { workspace = true } diff --git a/crates/pixi_core/src/lock_file/outdated.rs b/crates/pixi_core/src/lock_file/outdated.rs index 9d974c3fba..a39f78f3b9 100644 --- a/crates/pixi_core/src/lock_file/outdated.rs +++ b/crates/pixi_core/src/lock_file/outdated.rs @@ -1,5 +1,3 @@ -use std::collections::{HashMap, HashSet}; - use super::{verify_environment_satisfiability, verify_platform_satisfiability}; use crate::{ Workspace, @@ -7,12 +5,16 @@ use crate::{ workspace::{Environment, SolveGroup}, }; use fancy_display::FancyDisplay; +use futures::FutureExt; +use futures::StreamExt; +use futures::stream::FuturesUnordered; use itertools::Itertools; use pixi_command_dispatcher::CommandDispatcher; use pixi_consts::consts; use pixi_manifest::FeaturesExt; use rattler_conda_types::Platform; use rattler_lock::{LockFile, LockedPackageRef}; +use std::collections::{HashMap, HashSet}; /// A struct that contains information about specific outdated environments. /// @@ -201,20 +203,11 @@ async fn find_unsatisfiable_targets<'p>( } EnvironmentUnsat::IndexesMismatch(_) + | EnvironmentUnsat::InvalidDistExtensionInNoBuild(_) + | EnvironmentUnsat::NoBuildWithNonBinaryPackages(_) + | EnvironmentUnsat::PypiWheelTagsMismatch { .. } | EnvironmentUnsat::PypiPrereleaseModeMismatch { .. } => { - // If the indexes mismatched we cannot trust any of the locked content. - unsatisfiable_targets - .disregard_locked_content - .pypi - .insert(environment.clone()); - } - EnvironmentUnsat::InvalidDistExtensionInNoBuild(_) => { - unsatisfiable_targets - .disregard_locked_content - .pypi - .insert(environment.clone()); - } - EnvironmentUnsat::NoBuildWithNonBinaryPackages(_) => { + // We cannot trust the python part of the locked contents. unsatisfiable_targets .disregard_locked_content .pypi @@ -225,17 +218,23 @@ async fn find_unsatisfiable_targets<'p>( continue; } - // Verify each individual platform + // Verify each individual platform concurrently + let mut verify_futures = FuturesUnordered::new(); for platform in platforms { - match verify_platform_satisfiability( - &environment, - command_dispatcher.clone(), - locked_environment, - platform, - project.root(), - ) - .await - { + verify_futures.push( + verify_platform_satisfiability( + &environment, + command_dispatcher.clone(), + locked_environment, + platform, + project.root(), + ) + .map(move |result| (platform, result)), + ); + } + + while let Some((platform, verify_result)) = verify_futures.next().await { + match verify_result { Ok(verified_env) => { verified_environments.insert((environment.clone(), platform), verified_env); } diff --git a/crates/pixi_core/src/lock_file/resolve/pypi.rs b/crates/pixi_core/src/lock_file/resolve/pypi.rs index 991412bf62..5f15506787 100644 --- a/crates/pixi_core/src/lock_file/resolve/pypi.rs +++ b/crates/pixi_core/src/lock_file/resolve/pypi.rs @@ -18,7 +18,6 @@ use indicatif::ProgressBar; use itertools::{Either, Itertools}; use miette::{Context, IntoDiagnostic}; use pixi_consts::consts; -use pixi_git::git::GitReference; use pixi_manifest::{ EnvironmentName, SolveStrategy, SystemRequirements, pypi::pypi_options::PypiOptions, }; @@ -27,9 +26,10 @@ use pixi_record::{LockedGitUrl, PixiRecord}; use pixi_reporters::{UvReporter, UvReporterOptions}; use pixi_uv_conversions::{ ConversionError, as_uv_req, configure_insecure_hosts_for_tls_bypass, - convert_uv_requirements_to_pep508, into_pinned_git_spec, pypi_options_to_build_options, - pypi_options_to_index_locations, to_exclude_newer, to_index_strategy, to_normalize, - to_prerelease_mode, to_requirements, to_uv_normalize, to_uv_version, to_version_specifiers, + convert_uv_requirements_to_pep508, into_pinned_git_spec, into_uv_git_reference, + into_uv_git_sha, pypi_options_to_build_options, pypi_options_to_index_locations, + to_exclude_newer, to_index_strategy, to_normalize, to_prerelease_mode, to_requirements, + to_uv_normalize, to_uv_version, to_version_specifiers, }; use pypi_modifiers::{ pypi_marker_env::determine_marker_environment, @@ -41,6 +41,7 @@ use rattler_lock::{ }; use typed_path::Utf8TypedPathBuf; use url::Url; +use uv_cache_key::RepositoryUrl; use uv_client::{ BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClient, RegistryClientBuilder, }; @@ -51,10 +52,8 @@ use uv_distribution_types::{ IndexCapabilities, IndexUrl, Name, RequirementSource, RequiresPython, Resolution, ResolvedDist, SourceDist, ToUrlError, }; -use uv_git_types::GitUrl; -use uv_pep508::VerbatimUrl; +use uv_git::RepositoryReference; use uv_pypi_types::{Conflicts, HashAlgorithm, HashDigests}; -use uv_redacted::DisplaySafeUrl; use uv_requirements::LookaheadResolver; use uv_resolver::{ AllowedYanks, DefaultResolverProvider, FlatIndex, InMemoryIndex, Manifest, Options, Preference, @@ -347,14 +346,49 @@ pub async fn resolve_pypi( tracing::info!("there are no python packages installed by conda"); } - let mut requirements = dependencies - .into_iter() - .flat_map(|(name, req)| { - req.into_iter() - .map(move |r| as_uv_req(&r, name.as_ref(), project_root)) + // Build a lookup map of original git references before consuming dependencies. + // This is used later to preserve branch/tag info in the lock file that uv normalizes away. + let original_git_references = dependencies + .iter() + .filter_map(|(name, specs)| { + specs.iter().find_map(|spec| { + spec.source + .as_git() + .and_then(|git_spec| git_spec.rev.clone()) + .map(|rev| (name.clone(), rev)) + }) }) - .collect::, _>>() - .into_diagnostic()?; + .collect(); + + // Pre-populate the git resolver with locked git references. + // This ensures that when uv resolves git dependencies, it will find the cached commit + // and not panic in `url_to_precise` function. + for (package_data, _) in locked_pypi_packages { + if let Some(location) = package_data.location.as_url() + && LockedGitUrl::is_locked_git_url(location) + { + let locked_url = LockedGitUrl::new(location.clone()); + if let Ok(pinned_git_spec) = locked_url.to_pinned_git_spec() { + // Convert pixi types to uv types and insert into the git resolver + // pixi_spec::GitReference -> pixi_git::git::GitReference -> uv_git_types::GitReference + let pixi_git_ref = pinned_git_spec.source.reference.clone().into(); + + let uv_reference = into_uv_git_reference(pixi_git_ref); + let uv_sha = into_uv_git_sha(pinned_git_spec.source.commit); + + let display_safe_url = pinned_git_spec.git.clone().into(); + + let repository_url = RepositoryUrl::new(&display_safe_url); + let reference = RepositoryReference { + url: repository_url, + reference: uv_reference, + }; + + tracing::debug!("pre-populating git resolver: {:?} -> {}", reference, uv_sha); + context.shared_state.git().insert(reference, uv_sha); + } + } + } // Determine the python interpreter that is installed as part of the conda // packages. @@ -371,6 +405,16 @@ pub async fn resolve_pypi( // Construct the marker environment for the target platform let marker_environment = determine_marker_environment(platform, python_record.as_ref())?; + let requirements = dependencies + .into_iter() + .flat_map(|(name, req)| { + req.into_iter() + .map(move |r| as_uv_req(&r, name.as_ref(), project_root)) + }) + .filter_ok(|uv_req| uv_req.evaluate_markers(Some(&marker_environment), &uv_req.extras)) + .collect::, _>>() + .into_diagnostic()?; + // Determine the tags for this particular solve. let tags = get_pypi_tags(platform, &system_requirements, python_record.as_ref())?; @@ -572,9 +616,6 @@ pub async fn resolve_pypi( #[error(transparent)] GitUrlParse(#[from] uv_git_types::GitUrlParseError), - - #[error("{0}")] - Other(miette::ErrReport), } // Create preferences from the locked pypi packages @@ -597,69 +638,26 @@ pub async fn resolve_pypi( origin: None, }; - // When iterating over locked packages, - // instead of adding git requirements as preferences - // we enrich previous defined requirements in the `requirements` list - // as they have been pinned to a precise commit - // This will help the resolver to pick the commit that we already have locked - // instead of updating to a newer commit that also matches the requirement. - if let Some(location) = package_data.location.as_url() { - // now check if it's a git url - if LockedGitUrl::is_locked_git_url(location) { - // we need to parse back `LockedGitUrl` in order to get the `PinnedGitSpec` - // then we will precise commit to set for the `GitUrl` - // that will be used in the `RequirementSource::Git` below - let git_locked_url = LockedGitUrl::from(location.clone()); - let pinned_git_spec = git_locked_url - .to_pinned_git_spec() - .map_err(PixiPreferencesError::Other)?; - // we need to create VerbatimUrl from the original location - let verbatim_url = VerbatimUrl::from(location.clone()); - - // but the display safe url should come from the `PinnedGitSpec` url - // which don't have anymore git+ prefix - let display_safe = DisplaySafeUrl::from(pinned_git_spec.git.clone()); - - let git_oid = - uv_git_types::GitOid::from_str(&pinned_git_spec.source.commit.to_string())?; - - let git_url = GitUrl::try_from(display_safe)?.with_precise(git_oid); - - let constraint_source = RequirementSource::Git { - git: git_url, - subdirectory: None, - url: verbatim_url, - }; + // For git packages, we don't add them as preferences. + // because they are resolved based on the reference (branch/tag/rev) in the manifest. + // This matches how uv handles git dependencies - it doesn't try to pin them via preferences. + // The git resolver cache (pre-populated above) ensures the locked commit is preferred. + if let Some(location) = package_data.location.as_url() + && LockedGitUrl::is_locked_git_url(location) + { + // Skip git packages - they'll be resolved based on manifest reference + // with the cached commit from the git resolver + return Ok(None); + } - // find this requirements in dependencies and skip adding it as preference - let req_from_dep = requirements.iter_mut().find(|r| r.name == requirement.name); - if let Some(req) = req_from_dep { - // we need to update the requirement source in the requirements list - // to use the precise git commit - // only if the requirements do not already have a source set with something specific - if let RequirementSource::Git { git, .. } = &req.source { - // only update if the git url does not already have a precise commit - if git.precise().is_none() && !GitReference::looks_like_commit_hash(git.reference().as_rev()) { - tracing::debug!( - "updating requirement source to precise git commit for requirement: {:?}", - &req - ); - req.source = constraint_source.clone(); - } - - } - } - } - Ok(None) - } else { - let named = uv_requirements_txt::RequirementsTxtRequirement::Named(requirement); - let entry = uv_requirements_txt::RequirementEntry { - requirement: named, - hashes: Default::default(), - }; + // Create preference for registry and URL packages + let named = uv_requirements_txt::RequirementsTxtRequirement::Named(requirement); + let entry = uv_requirements_txt::RequirementEntry { + requirement: named, + hashes: Default::default(), + }; - Ok(Preference::from_entry(entry)?) - } + Ok(Preference::from_entry(entry)?) }) .filter_map(|pref| pref.transpose()) .collect::, PixiPreferencesError>>() @@ -815,6 +813,7 @@ pub async fn resolve_pypi( &context.capabilities, context.concurrency.downloads, project_root, + &original_git_references, ) .await?; @@ -937,6 +936,7 @@ fn get_url_or_path( } /// Create a vector of locked packages from a resolution +#[allow(clippy::too_many_arguments)] async fn lock_pypi_packages( conda_python_packages: CondaPythonPackages, pixi_build_dispatch: &LazyBuildDispatch<'_>, @@ -945,6 +945,7 @@ async fn lock_pypi_packages( index_capabilities: &IndexCapabilities, concurrent_downloads: usize, abs_project_root: &Path, + original_git_references: &HashMap, ) -> miette::Result> { let mut locked_packages = LockedPypiPackages::with_capacity(resolution.len()); let database = @@ -1064,8 +1065,15 @@ async fn lock_pypi_packages( (direct_url.into(), hash, false) } SourceDist::Git(git) => { + // Look up the original git reference from the manifest dependencies + // to preserve branch/tag info that uv normalizes away + let package_name = git.name.clone(); + let original_reference = + original_git_references.get(&package_name).cloned(); + // convert resolved source dist into a pinned git spec - let pinned_git_spec = into_pinned_git_spec(git.clone()); + let pinned_git_spec = + into_pinned_git_spec(git.clone(), original_reference); ( pinned_git_spec.into_locked_git_url().to_url().into(), hash, diff --git a/crates/pixi_core/src/lock_file/satisfiability/mod.rs b/crates/pixi_core/src/lock_file/satisfiability/mod.rs index bad25f49e3..70b1ab8b0f 100644 --- a/crates/pixi_core/src/lock_file/satisfiability/mod.rs +++ b/crates/pixi_core/src/lock_file/satisfiability/mod.rs @@ -34,7 +34,7 @@ use pixi_uv_conversions::{ AsPep508Error, as_uv_req, into_pixi_reference, pep508_requirement_to_uv_requirement, to_normalize, to_uv_specifiers, to_uv_version, }; -use pypi_modifiers::pypi_marker_env::determine_marker_environment; +use pypi_modifiers::{Tags, pypi_marker_env::determine_marker_environment}; use rattler_conda_types::{ ChannelUrl, GenericVirtualPackage, MatchSpec, Matches, NamedChannelOrUrl, PackageName, PackageRecord, ParseChannelError, ParseMatchSpecError, ParseStrictness::Lenient, Platform, @@ -46,7 +46,7 @@ use rattler_lock::{ use thiserror::Error; use typed_path::Utf8TypedPathBuf; use url::Url; -use uv_distribution_filename::{DistExtension, ExtensionError, SourceDistExtension}; +use uv_distribution_filename::{DistExtension, ExtensionError, SourceDistExtension, WheelFilename}; use uv_distribution_types::{RequirementSource, RequiresPython}; use uv_git_types::GitReference; use uv_pypi_types::ParsedUrlError; @@ -108,6 +108,10 @@ pub enum EnvironmentUnsat { locked_mode: PrereleaseMode, expected_mode: PrereleaseMode, }, + #[error( + "the lock-file was solved with system requirements incompatible with the tags on wheel ({wheel})" + )] + PypiWheelTagsMismatch { wheel: String }, #[error(transparent)] ExcludeNewerMismatch(#[from] ExcludeNewerMismatch), @@ -533,6 +537,7 @@ pub fn verify_environment_satisfiability( // 1. Check if the PyPI indexes are present and match // 2. Check if we have a no-build option set, that we only have binary packages, // or an editable source + // 3. Check that wheel tags still are possible with current system requirements if !environment.pypi_dependencies(None).is_empty() { let group_pypi_options = grouped_env.pypi_options(); let indexes = rattler_lock::PypiIndexes::from(group_pypi_options.clone()); @@ -540,10 +545,15 @@ pub fn verify_environment_satisfiability( // Check if the indexes in the lock file match our current configuration. verify_pypi_indexes(locked_environment, indexes)?; - // Check that if `no-build` is set, we only have binary packages - // or that the package that we disallow are not built from source - if let Some(no_build) = group_pypi_options.no_build.as_ref() { - verify_pypi_no_build(no_build, locked_environment)?; + let no_build_check = PypiNoBuildCheck::new(group_pypi_options.no_build.as_ref()); + let pypi_wheel_tags_check = PypiWheelTagsCheck::new(environment, &locked_environment); + + // Actually check all pypi packages in one iteration + for (platform, package_it) in locked_environment.pypi_packages_by_platform() { + for (package_data, _) in package_it { + no_build_check.check(package_data)?; + pypi_wheel_tags_check.check(platform, package_data)?; + } } } @@ -598,99 +608,169 @@ pub fn verify_environment_satisfiability( Ok(()) } -fn verify_pypi_no_build( - no_build: &NoBuild, - locked_environment: rattler_lock::Environment<'_>, -) -> Result<(), EnvironmentUnsat> { - // Check if we are disallowing all source packages or only a subset - #[derive(Eq, PartialEq)] - enum Check { - All, - Packages(HashSet), +struct PypiWheelTagsCheck { + platform_wheel_tags: HashMap, +} + +impl PypiWheelTagsCheck { + pub fn new( + environment: &Environment, + locked_environment: &rattler_lock::Environment<'_>, + ) -> Self { + let platform_wheel_tags = { + let system_requirements = environment.system_requirements(); + locked_environment + .packages_by_platform() + .flat_map(|(platform, packages)| packages.map(move |package| (platform, package))) + .filter_map(|(platform, package)| match package { + LockedPackageRef::Conda(rattler_lock::CondaPackageData::Binary(package)) => { + Some((platform, package)) + } + _ => None, + }) + .filter(move |(_, package)| { + pypi_modifiers::pypi_tags::is_python_record(&package.package_record) + }) + .filter_map(|(platform, package)| { + pypi_modifiers::pypi_tags::get_pypi_tags( + platform, + &system_requirements, + &package.package_record, + ) + .ok() + .map(|tags| (platform, tags)) + }) + .collect::>() + }; + + PypiWheelTagsCheck { + platform_wheel_tags, + } } - let check = match no_build { - // Ok, so we are allowed to build any source package - NoBuild::None => return Ok(()), - // We are not allowed to build any source package - NoBuild::All => Check::All, - // We are not allowed to build a subset of source packages - NoBuild::Packages(hash_set) => { - let packages = hash_set - .iter() - .filter_map(|name| pep508_rs::PackageName::new(name.to_string()).ok()) - .collect(); - Check::Packages(packages) + pub fn check( + &self, + platform: Platform, + package_data: &PypiPackageData, + ) -> Result<(), EnvironmentUnsat> { + let Some(package_file_name) = package_data.location.file_name() else { + return Ok(()); + }; + let Some(platform_tags) = self.platform_wheel_tags.get(&platform) else { + return Ok(()); + }; + let Ok(wheel) = WheelFilename::from_str(package_file_name) else { + return Ok(()); + }; + if !wheel.is_compatible(platform_tags) { + Err(EnvironmentUnsat::PypiWheelTagsMismatch { + wheel: wheel.name.to_string(), + }) + } else { + Ok(()) } - }; + } +} + +// Check if we are disallowing all source packages or only a subset +#[derive(Eq, PartialEq)] +enum Check { + All, + Packages(HashSet), +} - // Small helper function to get the dist extension from a url - fn pypi_dist_extension_from_url(url: &Url) -> Result { - // Take the file name from the url - let path = url - .path_segments() - .and_then(|mut s| s.next_back()) - .unwrap_or_default(); - // Convert the path to a dist extension - DistExtension::from_path(Path::new(path)) +pub struct PypiNoBuildCheck { + check: Option, +} + +impl PypiNoBuildCheck { + pub fn new(no_build: Option<&NoBuild>) -> Self { + let check = match no_build { + // Ok, so we are allowed to build any source package + Some(NoBuild::None) | None => None, + // We are not allowed to build any source package + Some(NoBuild::All) => Some(Check::All), + // We are not allowed to build a subset of source packages + Some(NoBuild::Packages(hash_set)) => { + let packages = hash_set + .iter() + .filter_map(|name| pep508_rs::PackageName::new(name.to_string()).ok()) + .collect(); + Some(Check::Packages(packages)) + } + }; + + Self { check } } - // Determine if we do not accept non-wheels for all packages or only for a - // subset Check all the currently locked packages if we are making any - // violations - for (_, packages) in locked_environment.pypi_packages_by_platform() { - for (package, _) in packages { - let extension = match &package.location { - // Get the extension from the url - UrlOrPath::Url(url) => { - if url.scheme().starts_with("git+") { - // Just choose some source extension, does not really matter, cause it is - // actually a directory, this is just for the check - Ok(DistExtension::Source(SourceDistExtension::TarGz)) + pub fn check(&self, package_data: &PypiPackageData) -> Result<(), EnvironmentUnsat> { + let Some(check) = &self.check else { + return Ok(()); + }; + + // Determine if we do not accept non-wheels for all packages or only for a + // subset Check all the currently locked packages if we are making any + // violations + // Small helper function to get the dist extension from a url + fn pypi_dist_extension_from_url(url: &Url) -> Result { + // Take the file name from the url + let path = url + .path_segments() + .and_then(|mut s| s.next_back()) + .unwrap_or_default(); + // Convert the path to a dist extension + DistExtension::from_path(Path::new(path)) + } + + let extension = match &package_data.location { + // Get the extension from the url + UrlOrPath::Url(url) => { + if url.scheme().starts_with("git+") { + // Just choose some source extension, does not really matter, cause it is + // actually a directory, this is just for the check + Ok(DistExtension::Source(SourceDistExtension::TarGz)) + } else { + pypi_dist_extension_from_url(url) + } + } + UrlOrPath::Path(path) => { + let path = Path::new(path.as_str()); + if path.is_dir() { + // Editables are allowed with no-build + if package_data.editable { + return Ok(()); } else { - pypi_dist_extension_from_url(url) + // Non-editable source packages might not be allowed + Ok(DistExtension::Source(SourceDistExtension::TarGz)) } + } else { + // Could be a reference to a wheel or sdist + DistExtension::from_path(path) } - UrlOrPath::Path(path) => { - let path = Path::new(path.as_str()); - if path.is_dir() { - // Editables are allowed with no-build - if package.editable { - continue; - } else { - // Non-editable source packages might not be allowed - Ok(DistExtension::Source(SourceDistExtension::TarGz)) - } + } + }?; + + match extension { + // Wheels are fine + DistExtension::Wheel => Ok(()), + // Check if we have a source package that we are not allowed to build + // it could be that we are only disallowing for certain source packages + DistExtension::Source(_) => match check { + Check::All => Err(EnvironmentUnsat::NoBuildWithNonBinaryPackages( + package_data.name.to_string(), + )), + Check::Packages(hash_set) => { + if hash_set.contains(&package_data.name) { + Err(EnvironmentUnsat::NoBuildWithNonBinaryPackages( + package_data.name.to_string(), + )) } else { - // Could be a reference to a wheel or sdist - DistExtension::from_path(path) + Ok(()) } } - }?; - - match extension { - // Wheels are fine - DistExtension::Wheel => continue, - // Check if we have a source package that we are not allowed to build - // it could be that we are only disallowing for certain source packages - DistExtension::Source(_) => match check { - Check::All => { - return Err(EnvironmentUnsat::NoBuildWithNonBinaryPackages( - package.name.to_string(), - )); - } - Check::Packages(ref hash_set) => { - if hash_set.contains(&package.name) { - return Err(EnvironmentUnsat::NoBuildWithNonBinaryPackages( - package.name.to_string(), - )); - } - } - }, - } + }, } } - Ok(()) } fn verify_pypi_indexes( @@ -972,10 +1052,28 @@ pub(crate) fn pypi_satisfies_requirement( } .into()); } - // If the spec does not specify a revision than any will do - // E.g `git.com/user/repo` is the same as `git.com/user/repo@adbdd` + // If the spec uses DefaultBranch, we need to check what the lock has + // DefaultBranch in it + // otherwise any explicit ref in lock is not satisfiable if *reference == GitReference::DefaultBranch { - return Ok(()); + match &pinned_git_spec.source.reference { + // Any explicit reference in lock is not satisfiable + // when manifest has DefaultBranch (user removed the explicit ref) + pixi_spec::GitReference::Branch(_) + | pixi_spec::GitReference::Tag(_) + | pixi_spec::GitReference::Rev(_) => { + return Err(PlatformUnsat::LockedPyPIGitRefMismatch { + name: spec.name.clone().to_string(), + expected_ref: reference.to_string(), + found_ref: pinned_git_spec.source.reference.to_string(), + } + .into()); + } + // Only DefaultBranch in lock is satisfiable + pixi_spec::GitReference::DefaultBranch => { + return Ok(()); + } + } } // Normalize the input requirement subdirectory the same way we do in our @@ -1355,7 +1453,7 @@ pub async fn resolve_dev_dependencies( build_environment: &BuildEnvironment, variants: &std::collections::BTreeMap>, variant_files: &[PathBuf], -) -> Result, PlatformUnsat> { +) -> Result, Box> { // Collect all dev source package names to filter out interdependencies let dev_source_names: HashSet = dev_dependencies .iter() @@ -1391,7 +1489,7 @@ pub async fn resolve_dev_dependencies( let mut resolved_dependencies = Vec::new(); for result in results { - resolved_dependencies.extend(result?); + resolved_dependencies.extend(result.map_err(Box::new)?); } Ok(resolved_dependencies) @@ -1528,22 +1626,56 @@ pub(crate) async fn verify_package_platform_satisfiability( }) .collect::, _>>()?; + // Find the python interpreter from the list of conda packages. Note that this + // refers to the locked python interpreter, it might not match the specs + // from the environment. That is ok because we will find that out when we + // check all the records. + let python_interpreter_record = locked_pixi_records.python_interpreter_record(); + + // Determine the marker environment from the python interpreter package. + let marker_environment = python_interpreter_record + .map(|interpreter| determine_marker_environment(platform, &interpreter.package_record)) + .transpose() + .map_err(|err| { + Box::new(PlatformUnsat::FailedToDetermineMarkerEnvironment( + err.into(), + )) + }); + + let pypi_dependencies = environment.pypi_dependencies(Some(platform)); + + // We cannot determine the marker environment, for example if installing + // `wasm32` dependencies. However, it also doesn't really matter if we don't + // have any pypi requirements. + let marker_environment = match marker_environment { + Err(err) => { + if !pypi_dependencies.is_empty() { + return Err(err); + } else { + None + } + } + Ok(marker_environment) => marker_environment, + }; + // Transform from PyPiPackage name into UV Requirement type - let pypi_requirements = environment - .pypi_dependencies(Some(platform)) + let pypi_requirements = pypi_dependencies .iter() .flat_map(|(name, reqs)| { - reqs.iter().map(move |req| { - Ok::>(Dependency::PyPi( - as_uv_req(req, name.as_source(), project_root).map_err(|e| { - Box::new(PlatformUnsat::AsPep508Error( - name.as_normalized().clone(), - e, - )) - })?, - "".into(), - )) - }) + reqs.iter() + .map(|req| as_uv_req(req, name.as_source(), project_root)) + .filter_ok(|req| req.evaluate_markers(marker_environment.as_ref(), &req.extras)) + .map(move |req| { + Ok::>(Dependency::PyPi( + req.map_err(|e| { + Box::new(PlatformUnsat::AsPep508Error( + name.as_normalized().clone(), + e, + )) + })?, + "".into(), + )) + }) }) .collect::, _>>()?; @@ -1615,11 +1747,8 @@ pub(crate) async fn verify_package_platform_satisfiability( platform, ); - let (resolved_dev_dependencies, source_metadata_result) = - futures::join!(dev_deps_future, source_metadata_future); - - let resolved_dev_dependencies = resolved_dev_dependencies?; - source_metadata_result?; + let (resolved_dev_dependencies, _source_metadata_result) = + futures::try_join!(dev_deps_future, source_metadata_future)?; if (environment_dependencies.is_empty() && resolved_dev_dependencies.is_empty()) && !locked_pixi_records.is_empty() @@ -1627,36 +1756,6 @@ pub(crate) async fn verify_package_platform_satisfiability( return Err(Box::new(PlatformUnsat::TooManyCondaPackages(Vec::new()))); } - // Find the python interpreter from the list of conda packages. Note that this - // refers to the locked python interpreter, it might not match the specs - // from the environment. That is ok because we will find that out when we - // check all the records. - let python_interpreter_record = locked_pixi_records.python_interpreter_record(); - - // Determine the marker environment from the python interpreter package. - let marker_environment = python_interpreter_record - .map(|interpreter| determine_marker_environment(platform, &interpreter.package_record)) - .transpose() - .map_err(|err| { - Box::new(PlatformUnsat::FailedToDetermineMarkerEnvironment( - err.into(), - )) - }); - - // We cannot determine the marker environment, for example if installing - // `wasm32` dependencies. However, it also doesn't really matter if we don't - // have any pypi requirements. - let marker_environment = match marker_environment { - Err(err) => { - if !pypi_requirements.is_empty() { - return Err(err); - } else { - None - } - } - Ok(marker_environment) => marker_environment, - }; - // Determine the pypi packages provided by the locked conda packages. let locked_conda_pypi_packages = locked_pixi_records .by_pypi_name() @@ -2498,7 +2597,6 @@ mod tests { } } - #[cfg_attr(not(feature = "slow_integration_tests"), ignore)] #[rstest] #[tokio::test] #[traced_test] @@ -2620,15 +2718,37 @@ mod tests { pep508_rs::Requirement::from_str("mypkg @ git+https://github.com/mypkg@defgd").unwrap(), ) .unwrap(); - // This should not pypi_satisfies_requirement(&non_matching_spec, &locked_data, &project_root).unwrap_err(); - // Removing the rev from the Requirement should satisfy any revision + // Removing the rev from the Requirement should NOT satisfy when lock has + // explicit Rev. This ensures that when a user removes an explicit ref + // from the manifest, the lock file gets re-resolved. let spec_without_rev = pep508_requirement_to_uv_requirement( pep508_rs::Requirement::from_str("mypkg @ git+https://github.com/mypkg").unwrap(), ) .unwrap(); - pypi_satisfies_requirement(&spec_without_rev, &locked_data, &project_root).unwrap(); + pypi_satisfies_requirement(&spec_without_rev, &locked_data, &project_root).unwrap_err(); + + // When lock has DefaultBranch (no explicit ref), removing rev from manifest + // should satisfy + let locked_data_default_branch = PypiPackageData { + name: "mypkg".parse().unwrap(), + version: Version::from_str("0.1.0").unwrap(), + // No ?rev= query param, only the fragment with commit hash + location: "git+https://github.com/mypkg.git#29932f3915935d773dc8d52c292cadd81c81071d" + .parse() + .expect("failed to parse url"), + hash: None, + requires_dist: vec![], + requires_python: None, + editable: false, + }; + pypi_satisfies_requirement( + &spec_without_rev, + &locked_data_default_branch, + &project_root, + ) + .unwrap(); } // Currently this test is missing from `good_satisfiability`, so we test the diff --git a/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@changed-env-marker.snap b/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@changed-env-marker.snap new file mode 100644 index 0000000000..2229ce068c --- /dev/null +++ b/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@changed-env-marker.snap @@ -0,0 +1,8 @@ +--- +source: crates/pixi_core/src/lock_file/satisfiability/mod.rs +expression: s +snapshot_kind: text +--- +environment 'default' does not satisfy the requirements of the project for platform 'osx-arm64' + Diagnostic severity: error + Caused by: the requirement 'numpy==2.* ; sys_platform == 'darwin'' could not be satisfied (required by '') diff --git a/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@wheels-with-wrong-tags.snap b/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@wheels-with-wrong-tags.snap new file mode 100644 index 0000000000..7f9d36dda8 --- /dev/null +++ b/crates/pixi_core/src/lock_file/satisfiability/snapshots/pixi_core__lock_file__satisfiability__tests__failing_satisfiability@wheels-with-wrong-tags.snap @@ -0,0 +1,7 @@ +--- +source: crates/pixi_core/src/lock_file/satisfiability/mod.rs +expression: s +--- +environment 'default' does not satisfy the requirements of the project + Diagnostic severity: error + Caused by: the lock-file was solved with system requirements incompatible with the tags on wheel (cryptography) diff --git a/crates/pixi_git/src/lib.rs b/crates/pixi_git/src/lib.rs index 42090d2991..f08b7295e8 100644 --- a/crates/pixi_git/src/lib.rs +++ b/crates/pixi_git/src/lib.rs @@ -1,6 +1,8 @@ /// Derived from `uv-git` implementation /// Source: https://github.com/astral-sh/uv/blob/4b8cc3e29e4c2a6417479135beaa9783b05195d3/crates/uv-git/src/lib.rs /// This module expose types and functions to interact with Git repositories. +use std::sync::Arc; + use ::url::Url; use git::{GitBinaryError, GitReference}; use sha::{GitSha, OidParseError}; @@ -174,13 +176,13 @@ pub trait Reporter: Send + Sync { fn on_checkout_complete(&self, url: &Url, rev: &str, index: usize); } -#[derive(Debug, thiserror::Error)] +#[derive(Debug, Clone, thiserror::Error)] pub enum GitError { #[error(transparent)] GitBinary(#[from] GitBinaryError), #[error(transparent)] - Io(#[from] std::io::Error), + Io(Arc), #[error(transparent)] FromUtf8(#[from] std::string::FromUtf8Error), @@ -198,11 +200,35 @@ pub enum GitError { GitUrlFormat(String, String), #[error(transparent)] - ReqwestMiddleware(#[from] reqwest_middleware::Error), + ReqwestMiddleware(Arc), #[error(transparent)] - Reqwest(#[from] reqwest::Error), + Reqwest(Arc), #[error(transparent)] - Join(#[from] tokio::task::JoinError), + Join(Arc), +} + +impl From for GitError { + fn from(err: std::io::Error) -> Self { + Self::Io(Arc::new(err)) + } +} + +impl From for GitError { + fn from(err: reqwest_middleware::Error) -> Self { + Self::ReqwestMiddleware(Arc::new(err)) + } +} + +impl From for GitError { + fn from(err: reqwest::Error) -> Self { + Self::Reqwest(Arc::new(err)) + } +} + +impl From for GitError { + fn from(err: tokio::task::JoinError) -> Self { + Self::Join(Arc::new(err)) + } } diff --git a/crates/pixi_git/src/sha.rs b/crates/pixi_git/src/sha.rs index 1423d1ae02..5423988034 100644 --- a/crates/pixi_git/src/sha.rs +++ b/crates/pixi_git/src/sha.rs @@ -27,7 +27,7 @@ impl GitOid { } } -#[derive(Debug, Error, PartialEq)] +#[derive(Debug, Clone, Error, PartialEq)] pub enum OidParseError { #[error("Object ID can be at most 40 hex characters")] TooLong, diff --git a/crates/pixi_pypi_spec/src/lib.rs b/crates/pixi_pypi_spec/src/lib.rs index e33035889f..3717cfdc21 100644 --- a/crates/pixi_pypi_spec/src/lib.rs +++ b/crates/pixi_pypi_spec/src/lib.rs @@ -10,7 +10,7 @@ use std::{ }; use pep440_rs::VersionSpecifiers; -use pep508_rs::ExtraName; +use pep508_rs::{ExtraName, MarkerTree}; use pixi_spec::{GitSpec, Subdirectory}; use serde::Serialize; use thiserror::Error; @@ -119,6 +119,16 @@ impl Default for PixiPypiSource { } } +/// Serialize a `pep508_rs::MarkerTree` into a string representation +fn serialize_markertree(value: &MarkerTree, s: S) -> Result +where + S: serde::Serializer, +{ + // `.expect()` succeeds because we don't serialize when + // `value.is_true()`, which is the default. + value.contents().expect("contents were null").serialize(s) +} + /// A complete PyPI dependency specification. /// /// This is the main type used throughout pixi for PyPI dependencies. It combines @@ -131,6 +141,14 @@ pub struct PixiPypiSpec { /// Optional package extras to install. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub extras: Vec, + /// The environment markers that decide if/when this package gets installed + #[serde( + default, + // Needed because `pep508_rs::MarkerTree` doesn't implement `serde::Serialize` + serialize_with = "serialize_markertree", + skip_serializing_if = "MarkerTree::is_true" + )] + pub env_markers: MarkerTree, /// The source for this package. #[serde(flatten)] pub source: PixiPypiSource, @@ -181,6 +199,7 @@ impl From for PixiPypiSpec { PixiPypiSpec { extras: Vec::new(), source, + env_markers: MarkerTree::default(), } } } @@ -188,15 +207,20 @@ impl From for PixiPypiSpec { impl PixiPypiSpec { /// Creates a new spec with the given source and no extras. pub fn new(source: PixiPypiSource) -> Self { - PixiPypiSpec { - extras: Vec::new(), - source, - } + source.into() } /// Creates a new spec with the given source and extras. - pub fn with_extras(source: PixiPypiSource, extras: Vec) -> Self { - PixiPypiSpec { extras, source } + pub fn with_extras_and_markers( + source: PixiPypiSource, + extras: Vec, + env_markers: MarkerTree, + ) -> Self { + PixiPypiSpec { + extras, + source, + env_markers, + } } /// Returns a reference to the source. @@ -253,6 +277,11 @@ impl PixiPypiSpec { &self.extras } + /// Returns the environment markers for this spec. + pub fn env_markers(&self) -> &MarkerTree { + &self.env_markers + } + /// Returns the editability setting from the manifest. /// Only `Path` specs can be editable. Returns `None` for non-path specs /// or if editability is not explicitly specified. @@ -293,6 +322,8 @@ impl PixiPypiSpec { updated.extras = self.extras.clone(); } + updated.env_markers.or(requirement.marker.clone()); + Ok(updated) } } @@ -359,7 +390,7 @@ mod tests { let extra = ExtraName::new("test".to_string()).unwrap(); // Spec with extras - let spec = PixiPypiSpec::with_extras( + let spec = PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Git { git: GitSpec { git: Url::parse("https://github.com/example/repo").unwrap(), @@ -368,10 +399,11 @@ mod tests { }, }, vec![extra.clone()], + MarkerTree::default(), ); assert_eq!(spec.extras(), std::slice::from_ref(&extra)); - // Spec without extras + // Spec without extras and markers let spec = PixiPypiSpec::new(PixiPypiSource::Registry { version: VersionOrStar::Star, index: None, @@ -379,6 +411,31 @@ mod tests { assert!(spec.extras().is_empty()); } + #[test] + fn test_env_markers_accessor() { + let markers = MarkerTree::from_str("python_version >= '3.12'").unwrap(); + // Spec with markers + let spec = PixiPypiSpec::with_extras_and_markers( + PixiPypiSource::Git { + git: GitSpec { + git: Url::parse("https://github.com/example/repo").unwrap(), + rev: None, + subdirectory: Default::default(), + }, + }, + vec![], + markers.clone(), + ); + assert_eq!(spec.env_markers(), &markers); + + // Spec without extras and markers + let spec = PixiPypiSpec::new(PixiPypiSource::Registry { + version: VersionOrStar::Star, + index: None, + }); + assert!(spec.env_markers().is_true()); + } + #[test] fn test_source_accessor() { let spec = PixiPypiSpec::new(PixiPypiSource::Path { @@ -447,12 +504,14 @@ mod tests { let spec: PixiPypiSpec = source.clone().into(); assert_eq!(spec.source, source); assert!(spec.extras.is_empty()); + assert!(spec.env_markers.is_true()); } #[test] fn test_default_spec() { let spec = PixiPypiSpec::default(); assert!(spec.extras.is_empty()); + assert!(spec.env_markers.is_true()); assert!(matches!( spec.source, PixiPypiSource::Registry { @@ -469,7 +528,7 @@ mod tests { let pypi = PixiPypiSpec::try_from(req).unwrap(); assert_eq!( pypi.to_string(), - "{ version = \"==1.0.0\", extras = [\"testing\"] }" + "{ version = \"==1.0.0\", extras = [\"testing\"], env-markers = \"os_name == 'posix'\" }" ); let req = pep508_rs::Requirement::from_str("numpy").unwrap(); @@ -525,7 +584,11 @@ mod tests { let pypi: Requirement = "boltons[nichita] @ https://files.pythonhosted.org/packages/46/35/e50d4a115f93e2a3fbf52438435bb2efcf14c11d4fcd6bdcd77a6fc399c9/boltons-24.0.0-py3-none-any.whl".parse().unwrap(); let as_pypi_req: PixiPypiSpec = pypi.try_into().unwrap(); - assert_eq!(as_pypi_req, PixiPypiSpec::with_extras(PixiPypiSource::Url { url: Url::parse("https://files.pythonhosted.org/packages/46/35/e50d4a115f93e2a3fbf52438435bb2efcf14c11d4fcd6bdcd77a6fc399c9/boltons-24.0.0-py3-none-any.whl").unwrap(), subdirectory: Default::default() }, vec![ExtraName::new("nichita".to_string()).unwrap()])); + assert_eq!(as_pypi_req, PixiPypiSpec::with_extras_and_markers(PixiPypiSource::Url { url: Url::parse("https://files.pythonhosted.org/packages/46/35/e50d4a115f93e2a3fbf52438435bb2efcf14c11d4fcd6bdcd77a6fc399c9/boltons-24.0.0-py3-none-any.whl").unwrap(), subdirectory: Default::default() }, vec![ExtraName::new("nichita".to_string()).unwrap()], MarkerTree::default())); + + let pypi: Requirement = "potato[habbasi]; sys_platform == 'linux'".parse().unwrap(); + let as_pypi_req: PixiPypiSpec = pypi.try_into().unwrap(); + assert_snapshot!(as_pypi_req); #[cfg(target_os = "windows")] let pypi: Requirement = "boltons @ file:///C:/path/to/boltons".parse().unwrap(); @@ -601,6 +664,8 @@ mod tests { r#"pkg = { git = "https://github.com/prefix-dev/rattler-build", "rev" = "123456" }"#, r#"pkg = { git = "https://github.com/prefix-dev/rattler-build", "subdirectory" = "pyrattler" }"#, r#"pkg = { git = "https://github.com/prefix-dev/rattler-build", "extras" = ["test"] }"#, + r#"pkg = { version = "*", "env-markers" = "sys_platform == 'win32'" }"#, + r#"pkg = { git = "https://github.com/prefix-dev/rattler-build", "extras" = ["test"], "env-markers" = "sys_platform == 'linux'" }"#, ]; #[derive(Serialize)] @@ -639,6 +704,7 @@ mod tests { r#"pkg = "~/path/style""#, r#"pkg = "https://example.com""#, r#"pkg = "https://github.com/conda-forge/21cmfast-feedstock""#, + r#"pkg = { version = "*", "env-markers" = "potato == 'potato'" }"#, ]; struct Snapshot { diff --git a/crates/pixi_pypi_spec/src/pep508.rs b/crates/pixi_pypi_spec/src/pep508.rs index f3ab232bbd..c47776bab3 100644 --- a/crates/pixi_pypi_spec/src/pep508.rs +++ b/crates/pixi_pypi_spec/src/pep508.rs @@ -10,13 +10,16 @@ impl TryFrom for PixiPypiSpec { fn try_from(req: pep508_rs::Requirement) -> Result { let converted = if let Some(version_or_url) = req.version_or_url { match version_or_url { - pep508_rs::VersionOrUrl::VersionSpecifier(v) => PixiPypiSpec::with_extras( - PixiPypiSource::Registry { - version: v.into(), - index: None, - }, - req.extras, - ), + pep508_rs::VersionOrUrl::VersionSpecifier(v) => { + PixiPypiSpec::with_extras_and_markers( + PixiPypiSource::Registry { + version: v.into(), + index: None, + }, + req.extras, + req.marker, + ) + } pep508_rs::VersionOrUrl::Url(u) => { let url = u.to_url(); if let Some((prefix, ..)) = url.scheme().split_once('+') { @@ -30,9 +33,10 @@ impl TryFrom for PixiPypiSpec { subdirectory, }; - PixiPypiSpec::with_extras( + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Git { git: git_spec }, req.extras, + req.marker, ) } "bzr" => { @@ -75,35 +79,42 @@ impl TryFrom for PixiPypiSpec { rev: Some(git_url.reference().clone().into()), subdirectory, }; - PixiPypiSpec::with_extras(PixiPypiSource::Git { git: git_spec }, req.extras) + PixiPypiSpec::with_extras_and_markers( + PixiPypiSource::Git { git: git_spec }, + req.extras, + req.marker, + ) } else if url.scheme().eq_ignore_ascii_case("file") { // Convert the file url to a path. let file = url.to_file_path().map_err(|_| { Pep508ToPyPiRequirementError::PathUrlIntoPath(url.clone()) })?; - PixiPypiSpec::with_extras( + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Path { path: file, editable: None, }, req.extras, + req.marker, ) } else { let subdirectory = extract_directory_from_url(&url); - PixiPypiSpec::with_extras( + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Url { url, subdirectory }, req.extras, + req.marker, ) } } } - } else if !req.extras.is_empty() { - PixiPypiSpec::with_extras( + } else if !req.extras.is_empty() || !req.marker.is_true() { + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Registry { version: VersionOrStar::Star, index: None, }, req.extras, + req.marker, ) } else { PixiPypiSpec::new(PixiPypiSource::Registry { diff --git a/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_failing.snap b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_failing.snap index 78e608f28e..b6a906096a 100644 --- a/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_failing.snap +++ b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_failing.snap @@ -3,7 +3,7 @@ source: crates/pixi_pypi_spec/src/lib.rs expression: "snapshot.into_iter().map(|Snapshot { input, result }|\nformat!(\"input: {input}\\nresult: {} \",\nresult.as_object().unwrap().get(\"error\").unwrap().as_str().unwrap())).join(\"\\n\")" --- input: pkg = { ver = "1.2.3" } -result: × Unexpected keys, expected only 'version', 'extras', 'path', 'editable', 'git', 'branch', 'tag', 'rev', 'url', 'subdirectory', 'index' +result: × Unexpected keys, expected only 'version', 'extras', 'path', 'editable', 'git', 'branch', 'tag', 'rev', 'url', 'subdirectory', 'index', 'env-markers' ╭─[pixi.toml:1:9] 1 │ pkg = { ver = "1.2.3" } · ─┬─ @@ -96,4 +96,12 @@ result: × it seems you're trying to add a git dependency, please specify as a ╭─[pixi.toml:1:8] 1 │ pkg = "https://github.com/conda-forge/21cmfast-feedstock" · ───────────────────────────────────────────────── + ╰──── +input: pkg = { version = "*", "env-markers" = "potato == 'potato'" } +result: × Expected a quoted string or a valid marker name, found `potato` + │ potato == 'potato' + │ ^^^^^^ + ╭─[pixi.toml:1:41] + 1 │ pkg = { version = "*", "env-markers" = "potato == 'potato'" } + · ────────────────── ╰──── diff --git a/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_succeeding.snap b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_succeeding.snap index 4a9a1f1688..c07db0c7a6 100644 --- a/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_succeeding.snap +++ b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__deserialize_succeeding.snap @@ -44,3 +44,13 @@ expression: snapshot extras: - test git: "https://github.com/prefix-dev/rattler-build" +- input: "pkg = { version = \"*\", \"env-markers\" = \"sys_platform == 'win32'\" }" + result: + env_markers: "sys_platform == 'win32'" + version: "*" +- input: "pkg = { git = \"https://github.com/prefix-dev/rattler-build\", \"extras\" = [\"test\"], \"env-markers\" = \"sys_platform == 'linux'\" }" + result: + extras: + - test + env_markers: "sys_platform == 'linux'" + git: "https://github.com/prefix-dev/rattler-build" diff --git a/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__from_args-3.snap b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__from_args-3.snap new file mode 100644 index 0000000000..d4e7684e37 --- /dev/null +++ b/crates/pixi_pypi_spec/src/snapshots/pixi_pypi_spec__tests__from_args-3.snap @@ -0,0 +1,6 @@ +--- +source: crates/pixi_pypi_spec/src/lib.rs +expression: as_pypi_req +snapshot_kind: text +--- +{ version = "*", extras = ["habbasi"], env-markers = "sys_platform == 'linux'" } diff --git a/crates/pixi_pypi_spec/src/toml.rs b/crates/pixi_pypi_spec/src/toml.rs index 68184a1ed3..4fb3b441da 100644 --- a/crates/pixi_pypi_spec/src/toml.rs +++ b/crates/pixi_pypi_spec/src/toml.rs @@ -1,6 +1,6 @@ use crate::{PixiPypiSource, PixiPypiSpec, VersionOrStar}; use itertools::Itertools; -use pep508_rs::ExtraName; +use pep508_rs::{ExtraName, MarkerTree}; use pixi_spec::{GitReference, GitSpec, SubdirectoryError}; use pixi_toml::{TomlFromStr, TomlWith}; use std::fmt::Display; @@ -60,6 +60,8 @@ struct RawPyPiRequirement { extras: Vec, + marker: MarkerTree, + // Path Only pub path: Option, pub editable: Option, @@ -113,7 +115,7 @@ impl RawPyPiRequirement { } let req = match (self.url, self.path, self.git, self.index) { - (Some(url), None, None, None) => PixiPypiSpec::with_extras( + (Some(url), None, None, None) => PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Url { url, subdirectory: self @@ -123,13 +125,15 @@ impl RawPyPiRequirement { .unwrap_or_default(), }, self.extras, + self.marker, ), - (None, Some(path), None, None) => PixiPypiSpec::with_extras( + (None, Some(path), None, None) => PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Path { path, editable: self.editable, }, self.extras, + self.marker, ), (None, None, Some(git), None) => { let rev = match (self.branch, self.rev, self.tag) { @@ -141,7 +145,7 @@ impl RawPyPiRequirement { return Err(SpecConversion::MultipleGitSpecifiers); } }; - PixiPypiSpec::with_extras( + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Git { git: GitSpec { git, @@ -154,14 +158,16 @@ impl RawPyPiRequirement { }, }, self.extras, + self.marker, ) } - (None, None, None, index) => PixiPypiSpec::with_extras( + (None, None, None, index) => PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Registry { version: self.version.unwrap_or(VersionOrStar::Star), index, }, self.extras, + self.marker, ), _ => { return Err(SpecConversion::MultipleVersionSpecifiers); @@ -206,6 +212,11 @@ impl<'de> toml_span::Deserialize<'de> for RawPyPiRequirement { .optional::>("index") .map(TomlFromStr::into_inner); + let marker = th + .optional::>("env-markers") + .map(TomlFromStr::into_inner) + .unwrap_or_default(); + th.finalize(None)?; Ok(RawPyPiRequirement { @@ -220,6 +231,7 @@ impl<'de> toml_span::Deserialize<'de> for RawPyPiRequirement { url, subdirectory, index, + marker, }) } } @@ -274,6 +286,16 @@ impl From for toml_edit::Value { } } + fn insert_markers(table: &mut toml_edit::InlineTable, markers: &MarkerTree) { + let markers_str = markers.try_to_string(); + if let Some(markers_str) = markers_str { + table.insert( + "env-markers", + toml_edit::Value::String(toml_edit::Formatted::new(markers_str)), + ); + } + } + fn insert_index(table: &mut toml_edit::InlineTable, index: &Option) { if let Some(index) = index { table.insert( @@ -284,10 +306,13 @@ impl From for toml_edit::Value { } let extras = &val.extras; + let markers = &val.env_markers; match &val.source { // Simple version string (no extras, no index) - PixiPypiSource::Registry { version, index } if extras.is_empty() && index.is_none() => { + PixiPypiSource::Registry { version, index } + if extras.is_empty() && index.is_none() && markers.is_true() => + { toml_edit::Value::from(version.to_string()) } // Registry with extras or index @@ -299,6 +324,7 @@ impl From for toml_edit::Value { ); insert_extras(&mut table, extras); insert_index(&mut table, index); + insert_markers(&mut table, markers); toml_edit::Value::InlineTable(table.to_owned()) } PixiPypiSource::Git { @@ -348,6 +374,7 @@ impl From for toml_edit::Value { ); } insert_extras(&mut table, extras); + insert_markers(&mut table, markers); toml_edit::Value::InlineTable(table.to_owned()) } PixiPypiSource::Path { path, editable } => { @@ -365,6 +392,7 @@ impl From for toml_edit::Value { ); } insert_extras(&mut table, extras); + insert_markers(&mut table, markers); toml_edit::Value::InlineTable(table.to_owned()) } PixiPypiSource::Url { url, subdirectory } => { @@ -382,6 +410,7 @@ impl From for toml_edit::Value { ); } insert_extras(&mut table, extras); + insert_markers(&mut table, markers); toml_edit::Value::InlineTable(table.to_owned()) } } @@ -482,12 +511,13 @@ mod test { ); assert_eq!( requirement.first().unwrap().1, - &PixiPypiSpec::with_extras( + &PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Registry { version: ">=3.12".parse().unwrap(), index: None, }, vec![ExtraName::from_str("bar").unwrap()], + pep508_rs::MarkerTree::default(), ) ); @@ -502,7 +532,7 @@ mod test { ); assert_eq!( requirement.first().unwrap().1, - &PixiPypiSpec::with_extras( + &PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Registry { version: ">=3.12,<3.13.0".parse().unwrap(), index: None, @@ -511,6 +541,7 @@ mod test { ExtraName::from_str("bar").unwrap(), ExtraName::from_str("foo").unwrap(), ], + pep508_rs::MarkerTree::default(), ) ); } @@ -521,13 +552,14 @@ mod test { r#" version = "==1.2.3" extras = ["feature1", "feature2"] + env-markers = "python_version >= '3.11'" "#, ) .unwrap(); assert_eq!( pypi_requirement, - PixiPypiSpec::with_extras( + PixiPypiSpec::with_extras_and_markers( PixiPypiSource::Registry { version: "==1.2.3".parse().unwrap(), index: None, @@ -536,6 +568,7 @@ mod test { ExtraName::from_str("feature1").unwrap(), ExtraName::from_str("feature2").unwrap() ], + pep508_rs::MarkerTree::from_str("python_version >= '3.11'").unwrap(), ) ); } @@ -597,14 +630,14 @@ mod test { #[test] fn test_deserialize_fail_on_unknown() { let input = r#"foo = { borked = "bork"}"#; - assert_snapshot!(format_parse_error(input, from_toml_str::>(input).unwrap_err()), @r###" - × Unexpected keys, expected only 'version', 'extras', 'path', 'editable', 'git', 'branch', 'tag', 'rev', 'url', 'subdirectory', 'index' + assert_snapshot!(format_parse_error(input, from_toml_str::>(input).unwrap_err()), @r#" + × Unexpected keys, expected only 'version', 'extras', 'path', 'editable', 'git', 'branch', 'tag', 'rev', 'url', 'subdirectory', 'index', 'env-markers' ╭─[pixi.toml:1:9] 1 │ foo = { borked = "bork"} · ───┬── · ╰── 'borked' was not expected here ╰──── - "###); + "#); } #[test] diff --git a/crates/pixi_url/src/error.rs b/crates/pixi_url/src/error.rs index 8ff58e400a..ec92998a67 100644 --- a/crates/pixi_url/src/error.rs +++ b/crates/pixi_url/src/error.rs @@ -1,23 +1,24 @@ use rattler_digest::{Md5Hash, Sha256Hash}; use reqwest::StatusCode; use reqwest_middleware::Error as ReqwestMiddlewareError; +use std::sync::Arc; use thiserror::Error; use url::Url; /// Errors that can occur while fetching and unpacking a URL source. -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum UrlError { #[error(transparent)] - Io(#[from] std::io::Error), + Io(Arc), #[error("failed to download {url}: {status}")] HttpStatus { url: Url, status: StatusCode }, #[error(transparent)] - Reqwest(#[from] reqwest::Error), + Reqwest(Arc), #[error(transparent)] - ReqwestMiddleware(#[from] ReqwestMiddlewareError), + ReqwestMiddleware(Arc), #[error("sha256 mismatch for {url}: expected {expected:x}, got {actual:x}")] Sha256Mismatch { @@ -40,14 +41,38 @@ pub enum UrlError { UnsupportedArchive(String), #[error(transparent)] - Join(#[from] tokio::task::JoinError), + Join(Arc), +} + +impl From for UrlError { + fn from(err: std::io::Error) -> Self { + Self::Io(Arc::new(err)) + } +} + +impl From for UrlError { + fn from(err: reqwest::Error) -> Self { + Self::Reqwest(Arc::new(err)) + } +} + +impl From for UrlError { + fn from(err: ReqwestMiddlewareError) -> Self { + Self::ReqwestMiddleware(Arc::new(err)) + } +} + +impl From for UrlError { + fn from(err: tokio::task::JoinError) -> Self { + Self::Join(Arc::new(err)) + } } /// Errors emitted while unpacking an archive. -#[derive(Debug, Error)] +#[derive(Debug, Clone, Error)] pub enum ExtractError { #[error(transparent)] - Io(#[from] std::io::Error), + Io(Arc), #[error("failed to extract tar archive: {0}")] TarExtractionError(String), @@ -64,3 +89,9 @@ pub enum ExtractError { #[error("compression format `{0}` is currently unsupported")] UnsupportedCompression(&'static str), } + +impl From for ExtractError { + fn from(err: std::io::Error) -> Self { + Self::Io(Arc::new(err)) + } +} diff --git a/crates/pixi_uv_conversions/src/conversions.rs b/crates/pixi_uv_conversions/src/conversions.rs index 9ffb999dc5..e9d495c8e9 100644 --- a/crates/pixi_uv_conversions/src/conversions.rs +++ b/crates/pixi_uv_conversions/src/conversions.rs @@ -292,9 +292,21 @@ pub fn into_pixi_reference(git_reference: uv_git_types::GitReference) -> PixiRef } /// Convert a solved [`GitSourceDist`] into [`PinnedGitSpec`] -pub fn into_pinned_git_spec(dist: GitSourceDist) -> PinnedGitSpec { - let reference = into_pixi_reference(dist.git.reference().clone()); - +/// +/// The `original_reference` parameter allows preserving the original git reference +/// from the manifest (e.g., `Branch("main")`). When uv resolves a git dependency, +/// it may normalize branch references to `DefaultBranch`, losing the original +/// branch information. If provided, this original reference will be used instead +/// of the one from uv's resolution. +/// +/// If no original reference is provided (user didn't specify branch/tag/rev), +/// we store the resolved commit as `Rev(commit)` rather than `DefaultBranch`. +/// This ensures the lock file has a precise reference that doesn't require +/// cache lookups when re-resolving (similar to how uv's lockfile works). +pub fn into_pinned_git_spec( + dist: GitSourceDist, + original_reference: Option, +) -> PinnedGitSpec { // Necessary to convert between our gitsha and uv gitsha. let git_sha = PixiGitSha::from_str( &dist @@ -305,6 +317,12 @@ pub fn into_pinned_git_spec(dist: GitSourceDist) -> PinnedGitSpec { ) .expect("we expect it to be a valid sha"); + // Use the original reference from the manifest if provided. + // If no explicit reference was specified, use DefaultBranch. + // The precise commit is already captured in the fragment (`#commit`), + // so we don't need to duplicate it in the query string as `?rev=commit`. + let reference = original_reference.unwrap_or(PixiReference::DefaultBranch); + let pinned_checkout = PinnedGitCheckout::new( git_sha, dist.subdirectory diff --git a/crates/pixi_uv_conversions/src/requirements.rs b/crates/pixi_uv_conversions/src/requirements.rs index fadb0428cc..d2c0225ed0 100644 --- a/crates/pixi_uv_conversions/src/requirements.rs +++ b/crates/pixi_uv_conversions/src/requirements.rs @@ -224,7 +224,7 @@ pub fn as_uv_req( .iter() .map(|e| uv_normalize::ExtraName::from_str(e.as_ref()).expect("conversion failed")) .collect(), - marker: Default::default(), + marker: to_uv_marker_tree(req.env_markers()).expect("marker conversion failed"), groups: Default::default(), source, origin: None, @@ -313,10 +313,47 @@ pub fn pep508_requirement_to_uv_requirement( #[cfg(test)] mod tests { + use pep508_rs::MarkerTree; use uv_redacted::DisplaySafeUrl; use super::*; + #[test] + fn test_markers() { + let pypi_req = PixiPypiSpec::with_extras_and_markers( + PixiPypiSource::Registry { + version: VersionOrStar::Star, + index: None, + }, + vec![], + MarkerTree::from_str("sys_platform == 'linux'").unwrap(), + ); + let uv_req = as_uv_req(&pypi_req, "test", Path::new("")).unwrap(); + + let expected_uv_source = RequirementSource::Registry { + specifier: VersionSpecifiers::empty(), + index: None, + conflict: None, + }; + + assert_eq!( + uv_req.source, expected_uv_source, + "Expected {} but got {}", + expected_uv_source, uv_req.source + ); + + let expected_uv_markers = + uv_pep508::MarkerTree::from_str("sys_platform == 'linux'").unwrap(); + + assert_eq!( + uv_req.marker, + expected_uv_markers, + "Expected {:?} but got {:?}", + expected_uv_markers.try_to_string(), + uv_req.marker.try_to_string(), + ); + } + #[test] fn test_git_url() { let pypi_req = PixiPypiSpec::new(PixiPypiSource::Git { From 19ec31e3132ff2c949130626ded428a7ce054b00 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 11:46:56 +0100 Subject: [PATCH 59/70] Revert more and fix race condition --- .../pixi/tests/integration_rust/pypi_tests.rs | 77 +++++++++++++++++++ crates/pixi_cli/src/upgrade.rs | 5 +- .../src/workspace/export/conda_environment.rs | 23 +++++- .../tests/integration/main.rs | 25 ++++-- 4 files changed, 119 insertions(+), 11 deletions(-) diff --git a/crates/pixi/tests/integration_rust/pypi_tests.rs b/crates/pixi/tests/integration_rust/pypi_tests.rs index 6a9b6275c5..ea297cd1d2 100644 --- a/crates/pixi/tests/integration_rust/pypi_tests.rs +++ b/crates/pixi/tests/integration_rust/pypi_tests.rs @@ -150,6 +150,83 @@ test = {{features = ["test"]}} ); } +#[tokio::test] +async fn pyproject_environment_markers_resolved() { + setup_tracing(); + + // Add a dependency that's present only on linux-64 + let simple = PyPIDatabase::new() + .with(PyPIPackage::new("nvidia-nccl-cu12", "1.0.0").with_tag( + "cp311", + "cp311", + "manylinux1_x86_64", + )) + .into_simple_index() + .unwrap(); + + // Create a TOML with two platforms + let platform1 = Platform::Linux64; + let platform2 = Platform::OsxArm64; + let platform_str = format!("\"{}\", \"{}\"", platform1, platform2); + + let mut package_db = MockRepoData::default(); + package_db.add_package( + Package::build("python", "3.11.0") + .with_subdir(platform1) + .finish(), + ); + package_db.add_package( + Package::build("python", "3.11.0") + .with_subdir(platform2) + .finish(), + ); + let channel = package_db.into_channel().await.unwrap(); + let channel_url = channel.url(); + let index_url = simple.index_url(); + + // Make sure that the TOML contains an env marker to allow linux-64. + let pyproject = format!( + r#" +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "environment-markers" +dependencies = [ + "nvidia-nccl-cu12; sys_platform == 'linux'" +] + +[tool.pixi.workspace] +channels = ["{channel_url}"] +platforms = [{platform_str}] +conda-pypi-map = {{}} + +[tool.pixi.dependencies] +python = "==3.11.0" + +[tool.pixi.pypi-options] +index-url = "{index_url}" +"#, + ); + + let pixi = PixiControl::from_pyproject_manifest(&pyproject).unwrap(); + + let lock = pixi.update_lock_file().await.unwrap(); + + let nccl_req = Requirement::from_str("nvidia-nccl-cu12; sys_platform == 'linux'").unwrap(); + // Check that the requirement is present in the lockfile for linux-64 + assert!( + lock.contains_pep508_requirement("default", platform1, nccl_req.clone()), + "default environment should include nccl for linux-64" + ); + // But not for osx-arm64 + assert!( + !lock.contains_pep508_requirement("default", platform2, nccl_req.clone()), + "default environment shouldn't include nccl for osx-arm64" + ); +} + #[tokio::test] async fn test_flat_links_based_index_returns_path() { setup_tracing(); diff --git a/crates/pixi_cli/src/upgrade.rs b/crates/pixi_cli/src/upgrade.rs index b323b0ae54..b88976a67b 100644 --- a/crates/pixi_cli/src/upgrade.rs +++ b/crates/pixi_cli/src/upgrade.rs @@ -5,7 +5,7 @@ use fancy_display::FancyDisplay; use indexmap::{IndexMap, IndexSet}; use itertools::Itertools; use miette::{IntoDiagnostic, MietteDiagnostic, WrapErr}; -use pep508_rs::{MarkerTree, Requirement}; +use pep508_rs::Requirement; use pixi_config::ConfigCli; use pixi_core::{ WorkspaceLocator, @@ -473,8 +473,7 @@ pub fn parse_specs_for_platform( Requirement { name: name.as_normalized().clone(), extras: req.extras.clone(), - // TODO: Add marker support here to avoid overwriting existing markers - marker: MarkerTree::default(), + marker: req.env_markers.clone(), origin: None, version_or_url: None, }, diff --git a/crates/pixi_cli/src/workspace/export/conda_environment.rs b/crates/pixi_cli/src/workspace/export/conda_environment.rs index 4e45ab9621..44eb268aff 100644 --- a/crates/pixi_cli/src/workspace/export/conda_environment.rs +++ b/crates/pixi_cli/src/workspace/export/conda_environment.rs @@ -50,8 +50,9 @@ fn format_pip_extras(extras: &[ExtraName]) -> String { fn format_pip_dependency(name: &PypiPackageName, requirement: &PixiPypiSpec) -> String { let extras = &requirement.extras; + let markers = &requirement.env_markers; - match &requirement.source { + let mut dependency = match &requirement.source { PixiPypiSource::Git { git: git_url } => { let mut git_string = format!( "{name}{extras} @ git+{url}", @@ -115,7 +116,14 @@ fn format_pip_dependency(name: &PypiPackageName, requirement: &PixiPypiSpec) -> extras = format_pip_extras(extras) ), }, + }; + + let marker_str = markers.try_to_string(); + if let Some(marker_str) = marker_str { + dependency.push_str(&format!("; {marker_str}")); } + + dependency } fn build_env_yaml( @@ -441,8 +449,17 @@ mod tests { python = "3.9" "#; let workspace = Workspace::from_str(Path::new("pixi.toml"), toml).unwrap(); - let environment = workspace.default_environment(); - let platform = Platform::Osx64; + let args = Args { + output_path: None, + platform: Some(Platform::Osx64), + environment: None, + workspace_config: WorkspaceConfig::default(), + name: None, + }; + let environment = workspace + .environment_from_name_or_env_var(args.environment) + .unwrap(); + let platform = args.platform.unwrap_or_else(|| environment.best_platform()); let env_yaml = build_env_yaml( &platform, diff --git a/crates/pixi_command_dispatcher/tests/integration/main.rs b/crates/pixi_command_dispatcher/tests/integration/main.rs index 19e45c098e..71fd134b5d 100644 --- a/crates/pixi_command_dispatcher/tests/integration/main.rs +++ b/crates/pixi_command_dispatcher/tests/integration/main.rs @@ -1341,8 +1341,26 @@ pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { /// and verifies that file changes are detected and trigger a rebuild. #[tokio::test] pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory so we can modify files without affecting other tests + let source_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); + let root_dir = tempdir.path().join("workspace"); + fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { + fs_err::create_dir_all(dst)?; + for entry in fs_err::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path)?; + } else { + fs_err::copy(&src_path, &dst_path)?; + } + } + Ok(()) + } + copy_dir_recursive(&source_dir, &root_dir).unwrap(); + let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1393,10 +1411,7 @@ pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { drop(dispatcher); // Create a file that matches package-b's build glob pattern ("TOUCH*") - let _touch_file = tempfile::Builder::new() - .prefix("TOUCH") - .tempfile_in(root_dir.join("package-b")) - .unwrap(); + fs_err::write(root_dir.join("package-b/TOUCH_FILE"), "trigger rebuild").unwrap(); // Second session: reinstall after file modification let (reporter, events) = EventReporter::new(); From c8332c33ac1fc0727af00a3fb9ac33ef64d0ac32 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 12:17:02 +0100 Subject: [PATCH 60/70] Fix test --- crates/pixi_cli/src/workspace/export/conda_environment.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pixi_cli/src/workspace/export/conda_environment.rs b/crates/pixi_cli/src/workspace/export/conda_environment.rs index 44eb268aff..9fcd13d332 100644 --- a/crates/pixi_cli/src/workspace/export/conda_environment.rs +++ b/crates/pixi_cli/src/workspace/export/conda_environment.rs @@ -452,7 +452,7 @@ mod tests { let args = Args { output_path: None, platform: Some(Platform::Osx64), - environment: None, + environment: Some("default".to_string()), workspace_config: WorkspaceConfig::default(), name: None, }; From 31735b59d3f3fdf77747868e763174a584164ea0 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 12:30:51 +0100 Subject: [PATCH 61/70] Ignore failing test --- crates/pixi_command_dispatcher/tests/integration/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/pixi_command_dispatcher/tests/integration/main.rs b/crates/pixi_command_dispatcher/tests/integration/main.rs index 71fd134b5d..7426f484f7 100644 --- a/crates/pixi_command_dispatcher/tests/integration/main.rs +++ b/crates/pixi_command_dispatcher/tests/integration/main.rs @@ -1253,6 +1253,7 @@ pub async fn pin_and_checkout_url_validates_cached_results() { /// This test simulates a program restart by dropping and recreating the dispatcher, /// and verifies that the cache is properly reused (CacheStatus::UpToDate). #[tokio::test] +#[ignore] // TODO: this test has a race condition with other tests modifying the same workspace pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { let root_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); From 2bd1089af218b5ae4de32f51bb3efdfc058b3956 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 13:25:37 +0100 Subject: [PATCH 62/70] Ignore hanging test --- crates/pixi-build-backend/tests/integration/protocol.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/pixi-build-backend/tests/integration/protocol.rs b/crates/pixi-build-backend/tests/integration/protocol.rs index e45af1853b..b6147caf57 100644 --- a/crates/pixi-build-backend/tests/integration/protocol.rs +++ b/crates/pixi-build-backend/tests/integration/protocol.rs @@ -73,6 +73,7 @@ mod imp { } #[tokio::test] +#[ignore] // TODO: this test since it sometimes hangs in CI async fn test_conda_build_v1() { let tmp_dir = TempDir::new().unwrap(); let tmp_dir_path = tmp_dir.path().to_path_buf(); From 7a25d6938883d77babc884f2220519c78a6bd7b3 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 13:28:23 +0100 Subject: [PATCH 63/70] Set sysroot --- pixi-build-backends/recipe/variants.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pixi-build-backends/recipe/variants.yaml b/pixi-build-backends/recipe/variants.yaml index 5810b47396..760c09350f 100644 --- a/pixi-build-backends/recipe/variants.yaml +++ b/pixi-build-backends/recipe/variants.yaml @@ -1,6 +1,6 @@ # This is a semi distilled variant config from conda-forge. # -# It adds sysroot (2.34) for linux, macosx_deployment_target for osx +# It adds sysroot (2.17) for linux, macosx_deployment_target for osx # and uses vs2022 for windows. # c_stdlib: @@ -12,7 +12,7 @@ c_stdlib: then: vs c_stdlib_version: - if: linux - then: 2.34 + then: 2.17 - if: osx and x86_64 then: 10.13 - if: osx and arm64 From af86af7920d4e29494e601ad8318e3afe5c61be4 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Thu, 15 Jan 2026 16:12:20 +0100 Subject: [PATCH 64/70] Failsafe in case lefthook doesn't report exit code 1 --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c4610ea84..1020803ade 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,6 +101,14 @@ jobs: cache-write: ${{ github.ref == 'refs/heads/main' }} - name: lint (if this step fails, please 'pixi run lint' locally and push the changes) run: pixi run lint + - name: Check if lint made any changes + run: | + if ! git diff --quiet; then + echo "Error: Linting made changes to the code" + echo "Please run 'pixi run lint' locally and commit the changes." + git diff + exit 1 + fi # Check that all the code references are correct. check-rustdoc-links: From a2a85e10429f8502eb293217681e526a51ae555f Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 10:53:18 +0100 Subject: [PATCH 65/70] Make lefthook parallel again --- lefthook.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lefthook.yaml b/lefthook.yaml index 3e23aacece..502132ea6a 100644 --- a/lefthook.yaml +++ b/lefthook.yaml @@ -18,7 +18,7 @@ output: - skips # Print "skip" (i.e. no files matched) pre-commit: - parallel: false + parallel: true jobs: - name: actionlint run: pixi {run} -e lint actionlint From bd6db6c853003421af6ed333b55b20c3a5db7bc8 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 10:53:31 +0100 Subject: [PATCH 66/70] Let basedpyright ignore site folder --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 9df365494f..886e53e10c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ ignore = [ "scripts/test_native_certs.py", "pixi-build-backends", "tests/data", + "site", ] pythonPlatform = "All" pythonVersion = "3.13" From 1f315c6806d3ba6ee3a18f4b81729991389e4107 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 11:01:21 +0100 Subject: [PATCH 67/70] Add test data back --- .../changed-env-marker/pixi.lock | 171 ++++++++ .../changed-env-marker/pixi.toml | 14 + .../wheels-with-wrong-tags/pixi.lock | 371 ++++++++++++++++++ .../wheels-with-wrong-tags/pixi.toml | 17 + .../satisfiability/added-env-marker/pixi.lock | 171 ++++++++ .../satisfiability/added-env-marker/pixi.toml | 14 + .../wheel-with-correct-tags/pixi.lock | 371 ++++++++++++++++++ .../wheel-with-correct-tags/pixi.toml | 17 + 8 files changed, 1146 insertions(+) create mode 100644 tests/data/non-satisfiability/changed-env-marker/pixi.lock create mode 100644 tests/data/non-satisfiability/changed-env-marker/pixi.toml create mode 100644 tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.lock create mode 100644 tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.toml create mode 100644 tests/data/satisfiability/added-env-marker/pixi.lock create mode 100644 tests/data/satisfiability/added-env-marker/pixi.toml create mode 100644 tests/data/satisfiability/wheel-with-correct-tags/pixi.lock create mode 100644 tests/data/satisfiability/wheel-with-correct-tags/pixi.toml diff --git a/tests/data/non-satisfiability/changed-env-marker/pixi.lock b/tests/data/non-satisfiability/changed-env-marker/pixi.lock new file mode 100644 index 0000000000..e853640b19 --- /dev/null +++ b/tests/data/non-satisfiability/changed-env-marker/pixi.lock @@ -0,0 +1,171 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 + md5: b79875dbb5b1db9a4a22a4520f918e1a + depends: + - __osx >=11.0 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 67800 + timestamp: 1763549994166 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40251 + timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + sha256: f2c3cbf2ca7d697098964a748fbf19d6e4adcefa23844ec49f0166f1d36af83c + md5: 8c3951797658e10b610929c3e57e9ad9 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 905861 + timestamp: 1766319901587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3108371 + timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_2_cpython.conda + build_number: 2 + sha256: 64a2bc6be8582fae75f1f2da7bdc49afd81c2793f65bb843fc37f53c99734063 + md5: da948e6cd735249ab4cfbb3fdede785e + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 14788204 + timestamp: 1761174033541 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125484 + timestamp: 1763055028377 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 diff --git a/tests/data/non-satisfiability/changed-env-marker/pixi.toml b/tests/data/non-satisfiability/changed-env-marker/pixi.toml new file mode 100644 index 0000000000..1ba99e4ecd --- /dev/null +++ b/tests/data/non-satisfiability/changed-env-marker/pixi.toml @@ -0,0 +1,14 @@ +[workspace] +authors = ["Hameer Abbasi <2190658+hameerabbasi@users.noreply.github.com>"] +channels = ["conda-forge"] +name = "sattest" +platforms = ["osx-arm64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = "3.11.*" + +[pypi-dependencies] +numpy = { version = "==2.*", env-markers = "sys_platform == 'darwin'" } diff --git a/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.lock b/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.lock new file mode 100644 index 0000000000..e003393d45 --- /dev/null +++ b/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.lock @@ -0,0 +1,371 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cffi + version: 2.0.0 + sha256: afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl + name: cryptography + version: 46.0.3 + sha256: a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec + requires_dist: + - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' + - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - bcrypt>=3.1.5 ; extra == 'ssh' + - nox[uv]>=2024.4.15 ; extra == 'nox' + - cryptography-vectors==46.0.3 ; extra == 'test' + - pytest>=7.4.0 ; extra == 'test' + - pytest-benchmark>=4.0 ; extra == 'test' + - pytest-cov>=2.10.1 ; extra == 'test' + - pytest-xdist>=3.5.0 ; extra == 'test' + - pretend>=0.7 ; extra == 'test' + - certifi>=2024 ; extra == 'test' + - pytest-randomly ; extra == 'test-randomorder' + - sphinx>=5.3.0 ; extra == 'docs' + - sphinx-rtd-theme>=3.0.0 ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - pyenchant>=3 ; extra == 'docstest' + - readme-renderer>=30.0 ; extra == 'docstest' + - sphinxcontrib-spelling>=7.3.1 ; extra == 'docstest' + - build>=1.0.0 ; extra == 'sdist' + - ruff>=0.11.11 ; extra == 'pep8test' + - mypy>=1.14 ; extra == 'pep8test' + - check-sdist ; extra == 'pep8test' + - click>=8.0.1 ; extra == 'pep8test' + requires_python: '>=3.8,!=3.9.0,!=3.9.1' +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 + md5: 186a18e3ba246eccfc7cff00cd19a870 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + purls: [] + size: 12728445 + timestamp: 1767969922681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca + md5: 3ec0aa5037d39b06554109a01e6fb0c6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 730831 + timestamp: 1766513089214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f + md5: 8b09ae86839581147ef2e5c5e229d164 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 76643 + timestamp: 1763549731408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 57821 + timestamp: 1760295480630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 + md5: 6d0363467e6ed84f11435eb309f2ff06 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1042798 + timestamp: 1765256792743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 + md5: 26c46f90d0e727e95c6c9498a33a09f3 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603284 + timestamp: 1765256703881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 + md5: da5be73701eecd0e8454423fd6ffcf30 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 942808 + timestamp: 1768147973361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 + md5: 68f68355000ec3f1d6f26ea13e8f525f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5856456 + timestamp: 1765256838573 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3165399 + timestamp: 1762839186699 +- pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl + name: pycparser + version: '2.23' + sha256: e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + build_number: 100 + sha256: a120fb2da4e4d51dd32918c149b04a08815fd2bd52099dad1334647984bb07f1 + md5: 1cef1236a05c3a98f68c33ae9425f656 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 36790521 + timestamp: 1765021515427 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3284905 + timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 diff --git a/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.toml b/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.toml new file mode 100644 index 0000000000..fccb74c955 --- /dev/null +++ b/tests/data/non-satisfiability/wheels-with-wrong-tags/pixi.toml @@ -0,0 +1,17 @@ +[workspace] +authors = ["Tobias Hunger "] +channels = ["conda-forge"] +name = "pixi-test" +platforms = ["linux-64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = ">=3.14.2,<3.15" + +[pypi-dependencies] +cryptography = ">=46.0.3, <47" + +[system-requirements] +libc = "2.17" diff --git a/tests/data/satisfiability/added-env-marker/pixi.lock b/tests/data/satisfiability/added-env-marker/pixi.lock new file mode 100644 index 0000000000..e853640b19 --- /dev/null +++ b/tests/data/satisfiability/added-env-marker/pixi.lock @@ -0,0 +1,171 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 + md5: b79875dbb5b1db9a4a22a4520f918e1a + depends: + - __osx >=11.0 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 67800 + timestamp: 1763549994166 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40251 + timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda + sha256: f2c3cbf2ca7d697098964a748fbf19d6e4adcefa23844ec49f0166f1d36af83c + md5: 8c3951797658e10b610929c3e57e9ad9 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 905861 + timestamp: 1766319901587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3108371 + timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_2_cpython.conda + build_number: 2 + sha256: 64a2bc6be8582fae75f1f2da7bdc49afd81c2793f65bb843fc37f53c99734063 + md5: da948e6cd735249ab4cfbb3fdede785e + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 14788204 + timestamp: 1761174033541 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125484 + timestamp: 1763055028377 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 diff --git a/tests/data/satisfiability/added-env-marker/pixi.toml b/tests/data/satisfiability/added-env-marker/pixi.toml new file mode 100644 index 0000000000..7bfecf17d5 --- /dev/null +++ b/tests/data/satisfiability/added-env-marker/pixi.toml @@ -0,0 +1,14 @@ +[workspace] +authors = ["Hameer Abbasi <2190658+hameerabbasi@users.noreply.github.com>"] +channels = ["conda-forge"] +name = "sattest" +platforms = ["osx-arm64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = "3.11.*" + +[pypi-dependencies] +numpy = { version = "==2.*", env-markers = "sys_platform == 'linux'" } diff --git a/tests/data/satisfiability/wheel-with-correct-tags/pixi.lock b/tests/data/satisfiability/wheel-with-correct-tags/pixi.lock new file mode 100644 index 0000000000..990a7748f7 --- /dev/null +++ b/tests/data/satisfiability/wheel-with-correct-tags/pixi.lock @@ -0,0 +1,371 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cffi + version: 2.0.0 + sha256: afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cryptography + version: 46.0.3 + sha256: 01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d + requires_dist: + - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' + - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - bcrypt>=3.1.5 ; extra == 'ssh' + - nox[uv]>=2024.4.15 ; extra == 'nox' + - cryptography-vectors==46.0.3 ; extra == 'test' + - pytest>=7.4.0 ; extra == 'test' + - pytest-benchmark>=4.0 ; extra == 'test' + - pytest-cov>=2.10.1 ; extra == 'test' + - pytest-xdist>=3.5.0 ; extra == 'test' + - pretend>=0.7 ; extra == 'test' + - certifi>=2024 ; extra == 'test' + - pytest-randomly ; extra == 'test-randomorder' + - sphinx>=5.3.0 ; extra == 'docs' + - sphinx-rtd-theme>=3.0.0 ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - pyenchant>=3 ; extra == 'docstest' + - readme-renderer>=30.0 ; extra == 'docstest' + - sphinxcontrib-spelling>=7.3.1 ; extra == 'docstest' + - build>=1.0.0 ; extra == 'sdist' + - ruff>=0.11.11 ; extra == 'pep8test' + - mypy>=1.14 ; extra == 'pep8test' + - check-sdist ; extra == 'pep8test' + - click>=8.0.1 ; extra == 'pep8test' + requires_python: '>=3.8,!=3.9.0,!=3.9.1' +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 + md5: 186a18e3ba246eccfc7cff00cd19a870 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + purls: [] + size: 12728445 + timestamp: 1767969922681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca + md5: 3ec0aa5037d39b06554109a01e6fb0c6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 730831 + timestamp: 1766513089214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f + md5: 8b09ae86839581147ef2e5c5e229d164 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + purls: [] + size: 76643 + timestamp: 1763549731408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 57821 + timestamp: 1760295480630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 + md5: 6d0363467e6ed84f11435eb309f2ff06 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1042798 + timestamp: 1765256792743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 + md5: 26c46f90d0e727e95c6c9498a33a09f3 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603284 + timestamp: 1765256703881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 + md5: da5be73701eecd0e8454423fd6ffcf30 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 942808 + timestamp: 1768147973361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 + md5: 68f68355000ec3f1d6f26ea13e8f525f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5856456 + timestamp: 1765256838573 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3165399 + timestamp: 1762839186699 +- pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl + name: pycparser + version: '2.23' + sha256: e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda + build_number: 100 + sha256: a120fb2da4e4d51dd32918c149b04a08815fd2bd52099dad1334647984bb07f1 + md5: 1cef1236a05c3a98f68c33ae9425f656 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + size: 36790521 + timestamp: 1765021515427 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3284905 + timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 diff --git a/tests/data/satisfiability/wheel-with-correct-tags/pixi.toml b/tests/data/satisfiability/wheel-with-correct-tags/pixi.toml new file mode 100644 index 0000000000..fccb74c955 --- /dev/null +++ b/tests/data/satisfiability/wheel-with-correct-tags/pixi.toml @@ -0,0 +1,17 @@ +[workspace] +authors = ["Tobias Hunger "] +channels = ["conda-forge"] +name = "pixi-test" +platforms = ["linux-64"] +version = "0.1.0" + +[tasks] + +[dependencies] +python = ">=3.14.2,<3.15" + +[pypi-dependencies] +cryptography = ">=46.0.3, <47" + +[system-requirements] +libc = "2.17" From c851fd9b7705d0eedeef9066884a76a856fc1371 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 11:15:00 +0100 Subject: [PATCH 68/70] Always remove PIXI_ env vars --- tests/integration_python/conftest.py | 15 +++++++++++++++ .../test_specified_build_source/conftest.py | 4 ---- tests/integration_python/test_run_cli.py | 10 ++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index be5ade832a..a6acd13f8a 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -1,3 +1,4 @@ +import os from pathlib import Path import pytest @@ -5,6 +6,20 @@ from .common import CONDA_FORGE_CHANNEL, exec_extension +@pytest.fixture(autouse=True) +def clean_pixi_env_vars(monkeypatch: pytest.MonkeyPatch) -> None: + """Remove all PIXI_ prefixed environment variables before each test. + + Since tests are run via `pixi run`, the environment contains PIXI_ variables + (like PIXI_IN_SHELL, PIXI_PROJECT_ROOT, etc.) that can interfere with the + pixi commands being tested. This fixture ensures each test starts with a + clean environment. + """ + for key in list(os.environ.keys()): + if key.startswith("PIXI_"): + monkeypatch.delenv(key, raising=False) + + def pytest_addoption(parser: pytest.Parser) -> None: parser.addoption( "--pixi-build", diff --git a/tests/integration_python/pixi_build/test_specified_build_source/conftest.py b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py index 872e03b14a..d200a887d5 100644 --- a/tests/integration_python/pixi_build/test_specified_build_source/conftest.py +++ b/tests/integration_python/pixi_build/test_specified_build_source/conftest.py @@ -1,4 +1,3 @@ -import os import subprocess from dataclasses import dataclass from pathlib import Path @@ -39,14 +38,11 @@ def local_cpp_git_repo( original_source = main_source_path.read_text(encoding="utf-8") def run_git(*args: str) -> str: - # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment - env = {k: v for k, v in os.environ.items() if not k.startswith("PIXI_")} result = subprocess.run( [str(pixi), "run", "git", *args], cwd=repo_path, capture_output=True, text=True, - env=env, ) if result.returncode != 0: raise RuntimeError( diff --git a/tests/integration_python/test_run_cli.py b/tests/integration_python/test_run_cli.py index 5ba6112a23..e63384f122 100644 --- a/tests/integration_python/test_run_cli.py +++ b/tests/integration_python/test_run_cli.py @@ -1,5 +1,4 @@ import json -import os import platform import shutil import signal @@ -1683,16 +1682,11 @@ def test_signal_forwarding(pixi: Path, tmp_pixi_workspace: Path) -> None: # Use the manifest from the copied run_signals directory manifest = tmp_data_path.joinpath("pixi.toml") - # Remove all PIXI_ prefixed env vars to avoid interference from the outer environment - env = {k: v for k, v in os.environ.items() if not k.startswith("PIXI_")} - # install the dependencies - subprocess.check_call( - [pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path, env=env - ) + subprocess.check_call([pixi, "install", "--manifest-path", manifest], cwd=tmp_data_path) # run the `start` task in the background and send some signals to it process = subprocess.Popen( - [pixi, "run", "--manifest-path", manifest, "start"], cwd=tmp_data_path, env=env + [pixi, "run", "--manifest-path", manifest, "start"], cwd=tmp_data_path ) time.sleep(1) # wait for the process to start From 8ba0940404e7211b441d4c0dbdb986d574200714 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 11:24:15 +0100 Subject: [PATCH 69/70] Fix race condition --- .../tests/integration/main.rs | 69 ++++++++----------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/crates/pixi_command_dispatcher/tests/integration/main.rs b/crates/pixi_command_dispatcher/tests/integration/main.rs index 7426f484f7..b34a91a04c 100644 --- a/crates/pixi_command_dispatcher/tests/integration/main.rs +++ b/crates/pixi_command_dispatcher/tests/integration/main.rs @@ -77,6 +77,22 @@ fn workspaces_dir() -> PathBuf { cargo_workspace_dir().join("tests/data/workspaces") } +/// Recursively copies a directory from `src` to `dst`. +fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { + fs::create_dir_all(dst)?; + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path)?; + } else { + fs::copy(&src_path, &dst_path)?; + } + } + Ok(()) +} + /// Returns the default build environment to use for tests. fn default_build_environment() -> BuildEnvironment { let (tool_platform, tool_virtual_packages) = tool_platform(); @@ -432,15 +448,11 @@ pub async fn test_cycle() { /// package and any package that specifies it as a host dependency. #[tokio::test] pub async fn test_stale_host_dependency_triggers_rebuild() { - // Construct a command dispatcher with: - // - a root directory located in the `cycle` workspace - // - the default cache directories but with a temporary workspace cache - // directory - // - the default tool platform and virtual packages - // - a backend override that uses a passthrough backend to avoid any actual - // backend calls - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory so we can modify files without affecting other tests + let source_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); + let root_dir = tempdir.path().join("workspace"); + copy_dir_recursive(&source_dir, &root_dir).unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); let build_command_dispatcher = || { @@ -562,22 +574,6 @@ pub async fn instantiate_backend_with_from_source() { let source_dir = workspaces_dir().join("source-backends"); let tmp_dir = tempfile::tempdir().unwrap(); let root_dir = tmp_dir.path().to_path_buf(); - - // Copy all files from source to temp - fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { - fs_err::create_dir_all(dst)?; - for entry in fs_err::read_dir(src)? { - let entry = entry?; - let src_path = entry.path(); - let dst_path = dst.join(entry.file_name()); - if src_path.is_dir() { - copy_dir_recursive(&src_path, &dst_path)?; - } else { - fs_err::copy(&src_path, &dst_path)?; - } - } - Ok(()) - } copy_dir_recursive(&source_dir, &root_dir).unwrap(); // Update workspace pixi.toml to use local channel instead of conda-forge @@ -1253,7 +1249,6 @@ pub async fn pin_and_checkout_url_validates_cached_results() { /// This test simulates a program restart by dropping and recreating the dispatcher, /// and verifies that the cache is properly reused (CacheStatus::UpToDate). #[tokio::test] -#[ignore] // TODO: this test has a race condition with other tests modifying the same workspace pub async fn test_package_not_rebuilt_across_sessions_when_no_files_changed() { let root_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); @@ -1346,20 +1341,6 @@ pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { let source_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); let root_dir = tempdir.path().join("workspace"); - fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { - fs_err::create_dir_all(dst)?; - for entry in fs_err::read_dir(src)? { - let entry = entry?; - let src_path = entry.path(); - let dst_path = dst.join(entry.file_name()); - if src_path.is_dir() { - copy_dir_recursive(&src_path, &dst_path)?; - } else { - fs_err::copy(&src_path, &dst_path)?; - } - } - Ok(()) - } copy_dir_recursive(&source_dir, &root_dir).unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); @@ -1451,8 +1432,11 @@ pub async fn test_package_rebuilt_across_sessions_when_source_file_modified() { /// without testing dependency chains or force rebuild flags. #[tokio::test] pub async fn test_package_rebuilt_when_source_file_modified() { - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory so we can modify files without affecting other tests + let source_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); + let root_dir = tempdir.path().join("workspace"); + copy_dir_recursive(&source_dir, &root_dir).unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_env = BuildEnvironment::simple(tool_platform, tool_virtual_packages.clone()); @@ -1729,8 +1713,11 @@ pub async fn test_metadata_refetched_when_source_file_modified() { use pixi_command_dispatcher::{BuildBackendMetadataSpec, DevSourceMetadataSpec}; use pixi_record::PinnedPathSpec; - let root_dir = workspaces_dir().join("host-dependency"); + // Copy workspace to temp directory so we can modify files without affecting other tests + let source_dir = workspaces_dir().join("host-dependency"); let tempdir = tempfile::tempdir().unwrap(); + let root_dir = tempdir.path().join("workspace"); + copy_dir_recursive(&source_dir, &root_dir).unwrap(); let (tool_platform, tool_virtual_packages) = tool_platform(); let build_command_dispatcher = || { From 1df2b8681bd0ca573583c81a7f2224dd5e311c24 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Fri, 16 Jan 2026 11:39:30 +0100 Subject: [PATCH 70/70] Minimize environments --- pixi.lock | 588 +----------------------------------------------------- pixi.toml | 12 +- 2 files changed, 10 insertions(+), 590 deletions(-) diff --git a/pixi.lock b/pixi.lock index 2e43b78a6d..293d3835d3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2080,81 +2080,32 @@ environments: linux-64: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.1-h32b2ec7_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2163,83 +2114,32 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/python-3.14.1-hb06a95a_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2247,215 +2147,85 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.1-hf88997e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.1-h40d2674_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda - - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.14.1-h4b44e0e_100_cp314.conda - conda: https://prefix.dev/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/trove-classifiers-2025.11.14.15-pyhd8ed1ab_0.conda @@ -2464,9 +2234,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda - - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h1b5488d_4.conda python-test: @@ -2480,7 +2247,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -2491,12 +2257,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - conda: https://prefix.dev/conda-forge/linux-64/git-2.52.0-pl5321h6d3cee1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda @@ -2506,18 +2270,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -2544,10 +2305,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/rattler-build-0.55.1-he64ecbb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2560,7 +2317,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -2571,12 +2327,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-habb1d5c_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/git-2.52.0-pl5321h5dcfaa0_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/inline-snapshot-0.31.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda @@ -2586,18 +2340,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_116.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda @@ -2624,10 +2375,6 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/rattler-build-0.55.1-hb434046_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2688,9 +2435,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/rattler-build-0.55.1-h4728fb8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2752,9 +2496,6 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/rattler-build-0.55.1-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -2801,9 +2542,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://prefix.dev/conda-forge/win-64/rattler-build-0.55.1-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -4139,81 +3877,39 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/bcrypt-5.0.0-py314h2e6c369_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils-2.45-default_h4852527_105.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21-21.1.8-default_h99862b1_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang-21.1.8-default_cfg_hcbb2b3e_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/clang_impl_linux-64-21.1.8-default_h0a60c25_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt-21.1.8-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compiler-rt21-21.1.8-hb700be7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-64-21.1.8-hffcefe0_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-64-21.1.8-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_16.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc-14.3.0-h0dff253_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h442bea5_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/gfortran_linux-64-14.3.0-h9ce9316_17.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/gxx_linux-64-14.3.0-h310e576_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_114.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_114.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-21.1.8-h4922eb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mimalloc-3.2.6-h54a6638_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mkcert-1.4.4-he91c749_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mold-2.40.4-ha66fc49_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pynacl-1.6.1-py314h5bd0f2a_0.conda @@ -4225,12 +3921,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/rust-1.90.0-h53717f1_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.90.0-h2c6d0dc_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://prefix.dev/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4244,83 +3935,39 @@ environments: linux-aarch64: - conda: https://prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-aarch64/bcrypt-5.0.0-py314h451b6cc_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_105.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21-21.1.8-default_he95a3c9_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang-21.1.8-default_cfg_h99ebb92_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/clang_impl_linux-aarch64-21.1.8-default_h1168dbd_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt-21.1.8-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compiler-rt21-21.1.8-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt21_linux-aarch64-21.1.8-hfefdfc9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_linux-aarch64-21.1.8-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_16.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/cryptography-46.0.3-py314h606d956_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-hf63571e_17.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h7476c01_17.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libglib-2.86.2-hf53f6bf_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda - - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/llvm-openmp-21.1.8-he40846f_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mimalloc-3.2.6-h7ac5ae9_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/mkcert-1.4.4-hd24410f_1.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/mold-2.40.4-hcb73027_2.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/pynacl-1.6.1-py314h51f160d_0.conda @@ -4332,12 +3979,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/rust-1.90.0-h6cf38e9_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.90.0-hbe8e118_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://prefix.dev/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4349,78 +3991,36 @@ environments: - conda: https://prefix.dev/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda - conda: https://prefix.dev/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda osx-64: - - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bcrypt-5.0.0-py314ha7b6dee_1.conda - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://prefix.dev/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h3b512aa_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_30.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_30.conda - - conda: https://prefix.dev/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/cryptography-46.0.3-py314h61e53f1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - - conda: https://prefix.dev/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/mkcert-1.4.4-hc7f0b10_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/pynacl-1.6.1-py314h6482030_0.conda @@ -4432,13 +4032,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/rust-1.90.0-h34a2095_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.90.0-h38e4360_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda - - conda: https://prefix.dev/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4447,85 +4041,38 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-64/wrapt-2.0.1-py314h6482030_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://prefix.dev/conda-forge/osx-64/zstandard-0.25.0-py314hd1e8ddb_1.conda - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h281d3d1_4.conda osx-arm64: - - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bcrypt-5.0.0-py314haad56a0_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_h8c76c84_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_3.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_30.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_30.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cryptography-46.0.3-py314h7e8dc1c_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.7-hf598326_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - - conda: https://prefix.dev/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - - conda: https://prefix.dev/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.2-hfe11c1f_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mkcert-1.4.4-h87715bd_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pynacl-1.6.1-py314h0612a62_0.conda @@ -4537,13 +4084,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/rust-1.90.0-h4ff7c5d_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-unix_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.90.0-hf6ec828_0.conda - - conda: https://prefix.dev/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-hc6f8731_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4552,60 +4093,36 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/wrapt-2.0.1-py314h0612a62_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda win-64: - conda: https://prefix.dev/conda-forge/win-64/bcrypt-5.0.0-py314h9f07db2_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://prefix.dev/conda-forge/win-64/c-compiler-1.11.0-h528c1b4_0.conda - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19-19.1.7-default_hac490eb_7.conda - - conda: https://prefix.dev/conda-forge/win-64/clang-19.1.7-default_hac490eb_7.conda - - conda: https://prefix.dev/conda-forge/win-64/compiler-rt-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/noarch/compiler-rt_win-64-19.1.7-h49e36cd_1.conda - - conda: https://prefix.dev/conda-forge/win-64/compilers-1.11.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/cryptography-46.0.3-py314hb42d478_0.conda - - conda: https://prefix.dev/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://prefix.dev/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/flang-19.1.7-hbeecb71_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_impl_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/flang_win-64-19.1.7-h719f0c7_0.conda - - conda: https://prefix.dev/conda-forge/win-64/fortran-compiler-1.11.0-h95e3450_0.conda - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libflang-19.1.7-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libglib-2.86.2-h0c9aed9_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://prefix.dev/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://prefix.dev/conda-forge/win-64/libllvm19-19.1.7-h830ff33_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/lld-21.1.8-hc465015_0.conda - - conda: https://prefix.dev/conda-forge/win-64/llvm-tools-19.1.7-h752b59f_2.conda - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/mkcert-1.4.4-h36c15f3_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://prefix.dev/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://prefix.dev/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pkg-config-0.29.2-h88c491f_1009.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pynacl-1.6.1-py314h5a2d7ad_0.conda @@ -4617,9 +4134,6 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/rust-1.90.0-hf8d6059_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-src-1.90.0-win_0.conda - - conda: https://prefix.dev/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.90.0-h17fc481_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://prefix.dev/conda-forge/noarch/testcontainers-4.13.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -4631,9 +4145,6 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2017_win-64-19.16.27033-hddac466_20.conda - - conda: https://prefix.dev/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda - - conda: https://prefix.dev/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://prefix.dev/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/wrapt-2.0.1-py314h5a2d7ad_1.conda @@ -7197,22 +6708,6 @@ packages: license_family: GPL size: 75290045 timestamp: 1765256021903 -- conda: https://prefix.dev/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - sha256: dfd180b9df441b57aa539dfcfcc416c804638b3bc5ec9dbb5d7bdbc009eba497 - md5: 83c672f0e373c37436953413b2272a42 - depends: - - binutils_impl_linux-64 >=2.45 - - libgcc >=15.2.0 - - libgcc-devel_linux-64 15.2.0 hcc6f6b0_116 - - libgomp >=15.2.0 - - libsanitizer 15.2.0 h90f66d4_16 - - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_116 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 80309755 - timestamp: 1765256937267 - conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-ha428995_14.conda sha256: 6147e26961e53cf2ab9344d90805a2481270a8e5399b030f2d5ace9adf648cd3 md5: ea3ffa9c0f78561919863d3f62591c00 @@ -7245,22 +6740,6 @@ packages: license_family: GPL size: 69075162 timestamp: 1765256604036 -- conda: https://prefix.dev/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-habb1d5c_16.conda - sha256: 9b7e56534fa3029e0caf6dbbf4daa2d567e630672f977f01ad0c356933fb1b0d - md5: af391ca6347927b4e067a8be221d1b3a - depends: - - binutils_impl_linux-aarch64 >=2.45 - - libgcc >=15.2.0 - - libgcc-devel_linux-aarch64 15.2.0 h55c397f_116 - - libgomp >=15.2.0 - - libsanitizer 15.2.0 he19c465_16 - - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-aarch64 15.2.0 ha7b1723_116 - - sysroot_linux-aarch64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 74461928 - timestamp: 1765257095042 - conda: https://prefix.dev/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_17.conda sha256: 7b9585c201c175c024c56b46658d9e4b5db85a32df54517798109281a90d03bb md5: 50dc15ac993bb5859f923979c81fafc8 @@ -9144,15 +8623,6 @@ packages: license_family: GPL size: 3082749 timestamp: 1765255729247 -- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - sha256: 48d7d8dded34100d9065d1c0df86a11ab2cd8ddfd1590512b304527ed25b6d93 - md5: e67832fdbf2382757205bb4b38800643 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 3094906 - timestamp: 1765256682321 - conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_114.conda sha256: 03ab3f2efbd0002a955ca126455bdbbeea2403732d04821277d933b04128323d md5: f86b3ec2e8c1e13cfd3bfaee210f2fb8 @@ -9171,15 +8641,6 @@ packages: license_family: GPL size: 2371620 timestamp: 1765256387487 -- conda: https://prefix.dev/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_116.conda - sha256: 594e4f22a4b6aae1bca5e22ea3a075c070642ca4c27c53e0c0973926ca711e09 - md5: 8ba6e9b5866b6a5429ca5d9fa12bc964 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 2343262 - timestamp: 1765256811670 - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda sha256: 48a77fde940b4b877c0ed24efd562c135170a46d100c07cd2d7b67e842e30642 md5: 6c13aaae36d7514f28bd5544da1a7bb8 @@ -10029,17 +9490,6 @@ packages: license_family: GPL size: 7946383 timestamp: 1765255939536 -- conda: https://prefix.dev/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - sha256: 50d8082749e760454fb1489c2a47c6fa80cbf3893ec1c1a085747d46484ffd7f - md5: 0841a98bda756af037eb07d36cacada5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15.2.0 - - libstdcxx >=15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 7660762 - timestamp: 1765256861607 - conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_14.conda sha256: 24c3e2bc8d49d1d223b9fda17a7a90b4d472949bbc322ec4ae75328ab61ae512 md5: c5880215a1c021727ba6e5fce8a35482 @@ -10060,16 +9510,6 @@ packages: license_family: GPL size: 7545993 timestamp: 1765256538975 -- conda: https://prefix.dev/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda - sha256: 71be6819f928574caf929aa4764a69e3df0429d686a4c5d6a8985b4c2c14b965 - md5: 4e30740acf8527cc06ca6a8d81432536 - depends: - - libgcc >=15.2.0 - - libstdcxx >=15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 7460968 - timestamp: 1765257008136 - conda: https://prefix.dev/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda sha256: f87b743d5ab11c1a8ddd800dd9357fc0fabe47686068232ddc1d1eed0d7321ec md5: 3576aba85ce5e9ab15aa0ea376ab864b @@ -10351,15 +9791,6 @@ packages: license_family: GPL size: 20538116 timestamp: 1765255773242 -- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - sha256: cb331c51739cc68257c7d7eef0e29c355b46b2d72f630854506dbc99240057c1 - md5: 2730e07e576ffbd7bf13f8de34835d41 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 20763949 - timestamp: 1765256724565 - conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_114.conda sha256: 5dc6133ebad9b2fd37579c185f36fad9b8e49364271be56e9435db201ab2ac80 md5: b5110c27a57f77d145ebf54cfcd7dbcf @@ -10378,15 +9809,6 @@ packages: license_family: GPL size: 17508577 timestamp: 1765256413043 -- conda: https://prefix.dev/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_116.conda - sha256: 06be0d20cb3784e1d625f316f26962085dd14f74e166bd668ee9c089b5fa3efa - md5: 48cfd02ec4f1308109e5daaccb99aa30 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 17639950 - timestamp: 1765256847600 - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda sha256: 63336f51b88029a9557a430aecbb08a11365aa03ec47ec8d14e542fec5dc80fb md5: 9531f671a13eec0597941fa19e489b96 diff --git a/pixi.toml b/pixi.toml index 7c81281ed6..7d0c0ce3f5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -194,13 +194,13 @@ test-export = { cmd = "bash tests/scripts/test-export.sh", description = "Test m # # Feature for native-certs testing with local HTTPS server # -[feature.native-certs-test.dependencies] +[feature.test-native-certs.dependencies] mkcert = ">=1.4.4,<2" pip = ">=25,<26" rich = ">=14,<15" testcontainers = ">=4,<5" -[feature.native-certs-test.tasks] +[feature.test-native-certs.tasks] test-native-certs = { cmd = "python scripts/test_native_certs.py --pixi-bin $CARGO_TARGET_DIR/release/pixi", depends-on = [ "build-release", ], description = "Test native-certs feature with local HTTPS PyPI server" } @@ -389,8 +389,8 @@ lint = { features = [ "schema", "pypi-gen", ] } -pypi-gen = { features = ["rust", "compilers", "python", "pypi-gen"] } -python-test = { features = ["rust", "pytest", "python-test-deps", "python"] } +pypi-gen = { features = ["python", "pypi-gen"] } +python-test = { features = ["pytest", "python-test-deps", "python"] } recipes = { features = ["recipes"] } release = { features = ["release"] } rust-build = { features = ["rust", "compilers", "python", "rust-build"] } @@ -399,10 +399,8 @@ schema = { features = ["schema"] } test = { features = ["test"] } test-export = { features = ["micromamba"] } test-native-certs = { features = [ - "rust", - "compilers", "python", - "native-certs-test", + "test-native-certs", ] } trampoline = { features = ["trampoline", "python"] }